理系学生日記

おまえはいつまで学生気分なのか

EC2 Instance Connect とは何なのか

通常のプロジェクトにおいては踏み台サーバを用意するのが一般的だと思います。 この踏み台サーバにおいて面倒なのは鍵の扱いです。多くの場合、公開鍵認証を用いると思いますが、ユーザを追加する都度、当該ユーザの公開鍵を踏み台サーバに登録するのは面倒です。同様に、ユーザがプロジェクトを離任したとき、ユーザの鍵を削除するのもまた面倒でしょう。

公開鍵認証以外の選択肢としては証明書による認証も可能です。 証明書による認証であれば、いつまでログインさせることを許容するかという期限設定も可能になるので柔軟性は増します。一方で、CA管理という別の煩雑さを招くことになります。

AWSにおいては、そもそも鍵を管理しないようにすればいいのでは?という、EC2 Instance Connect という機能があります。今日は簡単にその機能についてまとめてみます。

EC2 Instance Connect とは

EC2 Instance Connect (EIC) は、一言でいえばユーザの鍵をサーバ側で一時的にしか保存しないことにより、鍵管理なんかなくしてしまおうぜ、という機能になります。 認証に使用する公開鍵を SendSSHPublicKey というAPIを呼び出してサーバに登録するのですが、サーバはこの鍵を 60 秒だけ instance metdata に保存します(※)。逆にいうと、60秒経過するとこの鍵の情報は揮発してしまうので、それ以上のログインはできなくなります。 揮発する以上、鍵情報はサーバ側(踏み台等)で管理しなくて済みます。

※内部的には、sshd の AuthorizedKeysCommand を指定することで、metadata から公開鍵を取得するように変更しているようです。

EICのミソ

このEICのミソは何かというと、SendSSHPublicKey というAPIを経由させることだろうと思います。必ずAPIを経由するので、IAMでこのAPIを呼び出せるユーザがだれか、という観点で権限管理が可能です。また、このAPIが呼び出されたことをトリガにすることで、CloudTrail にもログを残せます。 sshd レベルで権限を管理していたものが IAM での管理に一元化できますし、同様に sshd レベルでログイン履歴を残していたものが、CloudTrail に一元化できます。

面倒くさいもの

便利そうではあるのですが、公開鍵をサーバへ登録するのは割とだるくて、EC2 Instance Connect を使用して接続 - Amazon Elastic Compute Cloud から引用すると以下のようなコマンドを都度実行しなければなりません。ssh ログインに手間取って60秒が経過してしまうとやり直しになってしまいます。

$ aws ec2-instance-connect send-ssh-public-key --region us-west-2 --instance-id i-001234a4bf70dec41EXAMPLE --availability-zone us-west-2b --instance-os-user ec2-user --ssh-public-key file://my_rsa_key.pub

このあたりは非常に面倒なので、AWS 側で

  1. 鍵ペアの生成
  2. 公開鍵のサーバへの登録
  3. 対象サーバへログイン

という動作を一度に行ってくれる mssh が用意されていますし、sftp 用には msftp もあるようです。 詳細はこちらから。