📝

SSH接続で使われている4つの鍵をEC2で確認する

2024/05/08に公開

この記事ではSSH接続を実際にEC2でやってみつつ、どんな鍵がいくつ使われてSSH接続がセキュアに通信しているかを体験するのを目的にまとめています。

SSH接続の概要をまとめた記事があるので合わせて読んでいただくと理解が深まるかもしれません。

https://zenn.dev/isosa/articles/77a70eb84f3ec2

テスト用EC2起動

以下手順に記載のないものは初期設定のままで進めます。

  1. EC2コンソールから「インスタンスを起動」をクリックします。
  2. 「名前とタグ」を入力します。ここでは後から見た時にわかりやすいようにfor-ssh-studyとします。
  3. インスタンスタイプはt2.microになっていると思いますが違っていたらt2.microにします。ここが違うとお金が大きくなることもありますので確認します。
  4. 「キーペア(ログイン)」から新しいキーペアの作成をクリックします。この鍵はクライアント認証に使用されます。
  5. 「キーペア名」に任意の名前を入力します。
  6. 「キーペアのタイプ」は今回RSAを選択します。
  7. 「プライベートキーファイル形式」はwindowsの方は.ppkでそれ以外は.pemで大丈夫だと思います。
  8. 「キーペアを作成」をクリックします。すると秘密鍵がダウンロードされるのでMacであれば~/.sshディレクトリに保存します。
  9. ローカルPCでターミナルを立ち上げ次のコマンドを実行し秘密鍵の権限を絞ります。(パーミッション設定)
chmod 600 ~/.ssh/for-ssh-study-2024xxxxxx.pem
  1. EC2コンソールに戻ってネットワーク設定という枠の中の「任意の場所」というところをクリックし「自分のIP」を選択します。念の為IPアドレスもメモしておきます。
  2. 「インスタンスを起動」をクリックします。

これでテスト用のECが起動します。

セキュリティグループ確認

この手順は前述のテスト用EC2起動手順10の設定をしていれば特にやることはありませんが仕組みを知るand確認の意味で設定を見ていきます。

  1. 立ち上がったEC2を選択してEC2コンソールを開きます。
  2. 画面中部に「セキュリティタブ」があるのでクリックします。
  3. その中にある「セキュリティーグループ」をクリックします。
  4. 「インバウンドルールの編集」をクリックします。
  5. ここでSSHの項目にテスト用EC2起動手順10でメモしたIPが入っていれば「キャンセルボタン」で閉じてください。
    値が違っている場合は以下の画像ようにタイプをSSHに設定してプルダウンから「マイIP」を選択すると現在自分が使っているIPアドレスが指定されます。このIPからアクセスを許可するというものですね。

これでセキュリティグループの設定が完了しました。
※注意点としてはスマホのテザリングなどでは使うIPが変わるのでその度にSSH接続する際はこの設定も変える必要があります。ちなみに0.0.0.0/0というものは全てのIPからアクセスを許可するというリスクの高い設定なので初期で設定されていたら削除しましょう。今回設定したものも使い終わったら削除しておくのが理想ですね。

ssh接続

  1. EC2コンソールから「接続」をクリックします。
  2. 「SSHクライアント」タブをクリックします。
  3. 「例:」というところに表示されているコマンドをコピーします。
  4. 秘密鍵のパス設定部分を変更します。適宜ご自身で設定した(前述のテスト用EC2起動の手順8)ファイルパス名にします。私は~/.sshディレクトリにfor-ssh-study-2024xxxxxx.pemという名前で保存したので以下のようにコマンドを修正しました。
ssh -i "~/.ssh/for-ssh-study-2024xxxxxx.pem" ec2-user@ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com

※xは伏字です。ec2-以降の部分はコピーしたまま使用してください。
5. ローカルPCでターミナルを立ち上げ次のコマンドを実行します。

ssh -i "~/.ssh/for-ssh-study-2024xxxxxx.pem" ec2-user@ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com
  1. フィンガープリントを聞かれると思いますが今回は学習目的なので「yes」と入力してreturnキーを押します。ここで表示されたフィンガープリントは後で確認するのでメモしておいてください。「ED25519 key fingerprint is SHA256:」の後ろに続く乱数部分がフィンガープリントのハッシュ値になります。
    ちなみにこれはこの接続に使うEC2側の公開鍵をPC内のknown_hostsというファイルに記録しますか?というもので最初の接続時に表示されます。このプロセスは「ホスト認証|サーバ認証」と呼ばれ、クライアントPCが本物のサーバーかどうかを判断しているプロセスになります。
  2. 次のような画面が表示されたら接続成功です。

フィンガープリントの値と使われている鍵を確認する

ホストキーの公開鍵を確認&フィンガープリントの値を確認する|1つ目の鍵

  1. まずフィンガープリントで使われている鍵を確認します。ターミナルからEC2にSSH接続してログインした状態で次のコマンドを打ちます。
ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub

ここで表示された値をssh接続の手順でメモしたフィンガープリントの値と確認すると一致していることがわかります。これがサーバ認証|ホスト認証で使われている公開鍵です。
2. さらに確認してみましょう。以下のコマンドを打ちます。

cat /etc/ssh/ssh_host_ed25519_key.pub

ここで表示された乱数をメモします。
ローカルPC内でテキストエディタでknown_hostsファイルを開きメモした値を探すと書き込まれていると思います。
この2つの手順でフィンガープリントの値、すなわちサーバ認証|ホスト認証で使われている公開鍵が確認できました。これが1つ目の鍵になります。

ホストキーの秘密鍵を確認|2つ目の鍵

  1. EC2にsshログインしたターミナルを開き次のコマンドを打ちます。
ls -la /etc/ssh
  1. コマンドの結果に「ssh_host_ed25519_key」というファイルがあるのが確認できると思います。これがサーバ認証|ホスト認証の秘密鍵になります。以下のコマンドを打つと中身が確認できPRIVATE KEYと書かれているのも確認できると思います。
sudo cat /etc/ssh/ssh_host_ed25519_key

これが2つ目の鍵ですね。
ここまででサーバ認証|ホスト認証の公開鍵と秘密鍵が確認できました。これらの鍵はEC2が起動時に自動的に生成してくれるものです。

クライアント認証の公開鍵|3つ目の鍵

  1. EC2にsshログインしたターミナルを開き次のコマンドを打ちます。
cat .ssh/authorized_keys

これがクライアント認証で使われる公開鍵になります。EC2を立ち上げる際にキーペアを作成という手順を踏んだと思いますがあの時生成したのがこの鍵とダウンロードした秘密鍵になります。

クライアント認証の秘密鍵|4つ目の鍵

クライアント認証の秘密鍵はテスト用EC2起動の手順8でローカルPCに保存したものです。ちなみにこの秘密鍵のフィンガープリントがEC2コンソールのキーペアのページに表示されているフィンガープリントになります。以下のコマンドでローカルPC内の秘密鍵からフィンガープリントを確認してみましょう。

openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c

path_to_private_keyの部分を適宜変えて実行してください。表示されたフィンガープリントがEC2コンソールのキーペアのページに表示されているものと一致するはずです。

ここまででサーバ認証|ホスト認証に使われる公開鍵、秘密鍵のペアとクライアント認証で使われる公開鍵、秘密鍵のペア、合計4つの鍵が使われていることと、フィンガープリントについて確認できました。

これが結構ハマりどころだと個人的には思います。

通信暗号化の共通鍵|5つ目〜8つ目の鍵

実はあと4つの鍵が使われているようです。DH鍵交換で共通鍵が生成されてSSHセッションを暗号化するのに使われているのですが、この鍵は特にファイルの形でディスクに保存されるものではないとのことでした。正確にはセッションのたびに新しいものがメモリ上に存在し、セッションが終了すると同時に破棄されるという動きをしているようです。
SSH全体の流れも記事としてまとめてみましたので合わせて参照していただけると理解が進むかもしれません。

https://zenn.dev/isosa/articles/77a70eb84f3ec2

その他の鍵

EC2内の/etc/ssh/ディレクトリを見るとssh_host_ecdsa_key.pubとssh_host_ecdsa_keyという鍵のペアがあります。これも実はサーバ認証|ホスト認証で使われるホストキーになります。暗号のアルゴリズムに楕円曲線暗号を利用したものとのことで、SSH接続する環境によってどちらが使われるかは自動的に決定されるとのことでした。ただed25519の方が使われることが多いようです。

参考

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/verify-keys.html

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-to-linux-instance.html#connection-prereqs-fingerprint

Discussion