踏み台不要の新機能「EC2 Instance Connect Endpoint」でプライベートEC2に接続する(その2)
こんにちはこぐまです。
AWSの新機能「EC2 Instance Connect Endpoint (EIC Endpoint)」の備忘録となります。今回はその2です。その1はこちら。
ログはどのように出る?
その1で実施した通り「EIC Endpoint」を利用することで、
自前踏み台サーバなし、パブリックIPなし、さらにキーペアなしで接続することができるようになりました!便利ですね!
「EIC Endpoint」を利用した接続試行については、CloudTrailに記載されます。実際に接続した際、Cloudtrailにはどのように出力されるのかを見てみます。
基本的には、「SendSSHPublicKey」→「OpenTunnel」のアクションが順番で表示されるみたい
実際に接続をしてみて、しばらくしてCloudTrailで確認してみると、
「SendSSHPublicKey」と「OpenTunnel」というイベントが記載されています。
なお、イベントソースは「ec2-instance-connect.amazonaws.com」となっています。イベントソースでフィルタリングするときはこれをキーワードにすると便利かも。以下のようにユーザごとにまとめて表示されます。
この時も必ず「SendSSHPublicKey」と「OpenTunnel」が2組セットで表示されています。(緑の線で分けています。)
「SendSSHPublicKey」とは何か?
正直あっているか自信がないですが、いろんなマニュアルや記事を読み漁り、また実機で確認もしてみて私は以下の理解をしました。もし違っていたらご指摘いただけますと幸いです!
「EIC Endpoint」の前段階のサービスとして、「EIC(EC2 instance Connect)」があります。EICでは、EC2インスタンスはパブリックIPを必要とするという条件がありましたが、接続方法としては今回の「EIC Endpoint」とほぼ同様です。
ユーザが「EIC」を使ってEC2インスタンスへのアクセスを試みるとき、まずは「EIC」と「EC2インスタンス」間で疎通ができる必要があります。この時、EICは接続するEC2インスタンスにアクセスするための一時的なキーペアを動的に作成し、その公開鍵をEC2インスタンスのメタデータ内に送るようです。このキーの生存期間は60秒です。この「一時的接続のために作成した公開鍵をEC2インスタンスのメタデータに送る」というアクションが「SendSSHPublicKey」のようです。「EIC Endpoint」ではキーペアが不要・・というのはキーペア自体が本当に不要なわけではなく、実はここで作っている(意識しない)一時的キーペアがあるため、ユーザ管理のキーペアは不要という理解をしました。
マニュアルには「EC2インスタンスのメタデータ内に送り、その有効期限は1分」と書かれていたのですが、実際それが本当に1分で消えるのかどうか興味が湧いて調べてみました。
「SendSSHPublicKey」でプッシュされる一時公開鍵は本当に1分で消える?
インスタンス内のメタデータとあったので、てっきり以下のマニュアルの
「使用可能なパブリックキーのリストを取得する」結果を定期的にモニタリングしていれば、ひょこっと出てきてひょこっと消えるのかなと考えました。
【使用可能なパブリックキーのリストを取得する】
TOKEN=`curl -X PUT "http://169.254.169.xxx/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.xxx/latest/meta-data/public-keys/
ちなみにマニュアルコピペだと、一番最初の「TOKEN=」が抜けているのでエラーになります。。
上記コマンドを少し編集して「metacollect.sh」というシェルにして、while文で1秒おきに呼び出しました。
★metacollect.shの中身(dateやsleep,curlの出力を少し変更,sleepも1秒入れる)
[ec2-user@ip-XXXXXXXXX ~]$ cat metacollect.sh
#!/bin/bash
date
TOKEN=`curl -s -X PUT "http://169.254.169.xxx/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" `
curl -s -f -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.xxx/latest/meta-data/public-keys/
sleep 1
★while文で回す(CTRL+Cで止める)
[ec2-user@ip-XXXXXXXXX ~]$ while true ; do ./metacollect.sh | tee -a result.log ; done
ところが待てども待てども・・新しい公開鍵がリストに登録されている形跡は見えず・・sleepをusleepにして0.1秒ごとに更新してもダメでした。。
というわけでもう一回マニュアルを見てみると・・・
どうやら、「AuthorizedKeysCommand 」「AuthorizedKeysCommandUser」というものが関わっている模様。
これは一般的に「/etc/ssh/sshd_config」に記載されているとのことなので見てみました。
「AuthorizedKeysCommand 」の実体は「/opt/aws/bin/eic_run_authorized_keys」にあるようなので見てみます。
さらに呼び出されている「eic_curl_authorized_keys」の中身は180行近くありました。正直かなりわけわからない状態でしたが、一つだけヒントそうな場所を見つけました。
# Verify that we have active keys. Fast-exit if we do not.
keys_status="$(/usr/bin/curl -s -m 1 -H "${IMDS_TOKEN_HEADER}" -o /dev/null -I -w %{http_code} "${IMDS}/managed-ssh-keys/active-keys/${1}/")"
おお!最後のところ、、
「"${IMDS}/managed-ssh-keys/active-keys/${1}/"」
もしかするとこれじゃないか!
${IMDS}という変数は「http://169.254.169.xxx/latest/meta-data/」が入るので、結局見るべき場所は
「http://169.254.169.xxx/latest/meta-data/public_keys」ではなくて
「http://169.254.169.xxx/latest/meta-data/managed-ssh-keys/active-keys・・」
なんだろうな・・と。
そこで「metacollect.sh」を以下のように書き換えて、再度while文で回しながら「EIC Endpoint」からの接続を試みました。
★改良した「metacollect_2.sh」
[ec2-user@ip-XXXXXXXXX ~]$ cat metacollect_2.sh
#!/bin/bash
date
TOKEN=`curl -s -X PUT "http://169.254.169.xxx/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" `
curl -s -f -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.xxx/latest/meta-data/managed-ssh-keys/active-keys/
sleep 1
★while文で回す
[ec2-user@ip-XXXXXXXXX ~]$ while true ; do ./metacollect_2.sh | tee -a result.log ; done
すると・・・
出てきましたね!「ec2-user」が!
そしてちゃんと1分で消えていることもわかります。
もう少し深堀してみます。
http://169.254.169.xxx/latest/meta-data/managed-ssh-keys/active-keys/のさらに配下に今出てきた「ec2-user」を追加してみます。
★改良した「metacollect_3.sh」(curlのパスの最後に「ec2-user」を追加)
[ec2-user@ip-XXXXXXXXX ~]$ cat metacollect_3.sh
#!/bin/bash
date
TOKEN=`curl -s -X PUT "http://169.254.169.xxx/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" `
curl -s -f -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.xxx/latest/meta-data/managed-ssh-keys/active-keys/ec2-user
sleep 1
そして、while文で回してみます。
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOy89hDAbuhN6rj0jRGCZRMEtkaF67mQ/testTestAbc
おそらくこれが一時的に作成され、メタデータにプッシュされた公開鍵なのでしょう。ed25519というのは比較的最近出た暗号アルゴリズムということで、私は恥ずかしながらあまり知らなかったです。RSAのようにビット長も長くなく256bit固定だとか。RSAのような素因数分解の困難さではなく、楕円曲線の離散対数・・・云々・・。難しそう。。
そして、CloudTrail側の「SendSSHPublicKey」イベント詳細にもちゃんとこの公開鍵が載っていました。
なのでまとめると
という感じです!もっとたくさん書きたいことあったけど、思いのほか深くのめりこんでしまったのでまたの機会に!
一点だけわからないのは、公開鍵の次の行に書かれている「jwOiIsOM8CaODjYnKOl+kJK・・・」というプッシュされた内容・・これは何だろう・・。秘密鍵ではなさそう(実際復元しようとしてみたけど無理でした・・もし詳しい方いらっしゃいましたら是非教えて頂きたいです。)
読んで下さってありがとうございました!
この記事が気に入ったらサポートをしてみませんか?