🕳️

EC2のSSH公開鍵認証で地味にハマった話

2021/06/13に公開

Amazon EC2のOSユーザー払い出しで、「こんなこといつもやってるから大丈夫だろう」と思っていたら、落とし穴があることを改めて認識しました。

お仕事の関係でなかなかストックを出せてないなか、小ネタくらいは出したいと思います。
ブログ書いていない言い訳

ハマった経緯

EC2の構築で、初期ec2-user以外に、個人用(私ではない別の人)のOSユーザー払出がありました。
OSユーザーのSSH認証は鍵方式だったのですが、今回は「事前に作ってもらった公開鍵をもらい、それをEC2に置いておく」という流れになっておりました。

OSユーザーを作り、事前に頂いた公開鍵を置いて、権限を調整し、SGを開けて、問題なく受け入れられるはずだったのですが、なぜかその人からのSSHでは認証が通らず。
地味にハマってしまいました。
(ちなみに、ec2-userでは通っていました)

※このあたりの流れ参考:https://qiita.com/aiandrox/items/98ad9b7551481d890916#編集用ユーザーを追加する

環境

EC2 (Amazon Linux 2)

SSHするクライアントはWindowsでした。

先に結論

EC2に配置した公開鍵を、SECSH(ssh.com)形式で配置してしまってました。
OpenSSH形式に変換することで無事解消しました。
EC2というよりほぼLinuxのお話かも。。。

上記の形式変換を行うコマンド例は以下です。
「hogeuser」を対象とするなら、

ssh-keygen -i -f /home/hogeuser/.ssh/(もらったSECSH公開鍵ファイル) >> /home/hogeuser/.ssh/authorized_keys

実際の公開鍵例

そもそも私は公開鍵に種類があったことを知りませんでした。

色々なブログにありますが、以下がわかりやすかったです。
引用元:https://qiita.com/ponsuke0531/items/7b34347213660c80bc95

・SECSH形式(ssh.com)

自分が今回ハマったやつ。

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "{コメント}"
AAAA{最初の行}
{改行あり文字列}
---- END SSH2 PUBLIC KEY ----

・OpenSSH形式

いつもの。鍵を何のツール・コマンドで生成したかによって、微妙に差がありそう。

ssh-rsa AAAA{改行なし文字列} {ユーザ名}@{PC名}

実際の流れ

上記の解消方法を踏まえると、今回のOSユーザー追加は以下の通りになりました。

  • OSユーザー作成、sudo権限付与
    ec2-userで実施。
    OSユーザー名:hogeuser
sudo su -
useradd hogeuser
usermod -G wheel hogeuser
passwd hogeuser
  • OSユーザーの.sshディレクトリ作成
su - hogeuser
cd /home/hogeuser
mkdir .ssh
cd .ssh
  • 公開鍵ファイル(SECSH形式)の配置
    色々な置き方ありますが、SCPとかでいいと思います。
    置く場所は、上記で作った/home/[ユーザー名。例だとhogeuser]/.ssh/です。

  • 公開鍵ファイルのSECSH → OpenSSH変換(今回伝えたかった事)

ssh-keygen -i -f /home/hogeuser/.ssh/[もらったSECSH公開鍵ファイル] >> /home/hogeuser/.ssh/authorized_keys

※参考:https://qiita.com/marcie001/items/47a23cfeed00db783d39

  • 権限調整
chown hogeuser:hogeuser authorized_keys
chmod 600 authorized_keys
cd ../
chown -R hogeuser:hogeuser .ssh
chmod 700 .ssh

これでSSHできるようになっているはずです。

もう少し考えてみる

AWSのドキュメントを見ると、EC2のキーペアについては以下の要件が書いてあります。

キーペアの要件
・以下の形式がサポートされています。
 ・OpenSSH パブリックキー形式 (~/.ssh/authorized_keys の形式)EC2 Instance Connect API の使用中に SSH を使用して接続する場合は、SSH2 形式もサポートされます。
 ・Base64 でエンコードされた DER 形式
 ・SSH パブリックキーファイル形式 (RFC4716 で指定)
 ・SSH プライベートキーファイル形式は PEM でなければなりません
・RSA キーを作成します。Amazon EC2 では DSA キーは使用できません。
・サポートされている長さは 1024、2048、および 4096 です。EC2 Instance Connect API の使用中に SSH を使用して接続する場合は、長さ 2048 および 4096 がサポートされます。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html#how-to-generate-your-own-key-and-import-it-to-aws

これっててっきり、EC2の初期キーペアをインポートするときだけのことかと思っていたのですが、このドキュメントをもう少し読み進めると、以下の項目があります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html#replacing-key-pair

ここでは、以下の通りでec2-userのキーペア入れ替え手順が書かれています。
つまり、「入れ替えられる」ってことなので、その際も公開鍵形式には気を付けないといけなく、AWSの「キーペア」の仕様に限った話ではないかもと推測できます。

キーペアの追加または交換
1.Amazon EC2 コンソールまたはサードパーティー製のツールで、新しいキーペアを作成します。
2.新しいキーペアからパブリックキーを取得します。詳細については、「キーペアのパブリックキーの取得」を参照してください。
3.既存のプライベートキーファイルを使用してインスタンスに接続します。
4.任意のテキストエディタを使用して、インスタンス上にある .ssh/authorized_keys ファイルを開きます。既存のパブリックキー情報の下の新しいキーペアからパブリックキーを貼り付けます。ファイルを保存します。
5.インスタンスから切断し、新しいプライベートキーファイルを使用してインスタンスに接続できることを確認します。
6.(オプション) 既存のキーペアを交換している場合は、インスタンスに接続し、.ssh/authorized_keys ファイルからオリジナルのキーペアのパブリックキー情報を削除します。

自分の読解力ではここまでが限界です。

他にこの内容に該当するドキュメント探しましたが「OSユーザーの鍵認証ではOpenSSH方式の公開鍵が必須」という記載はなく、
EC2でのOSユーザー追加のドキュメントでは、とりあえずOpenSSH形式の公開鍵を作成してはいますが、
ほかの形式についての注意等は特にありませんでした。つまり、当たり前ということか
SSHの設定ファイル等にもしかしたらちゃんと証拠あるのかもしれませんが、
今回はここまでとしてしまいます。

正直AWS問わずな内容な気もしますが、公開鍵の形式には気を付けたいと思います。

結論

  • EC2に置く公開鍵はOpenSSH形式にする。
  • ちゃんと送られてきた公開鍵ファイルを見る。
  • そして、見たうえで、OpenSSH形式で無い場合に気付けるようにならないと。。。

Discussion