EC2のSSHアクセスをIAMで制御できるEC2 Instance Connectが発表されました
大栗です。
先程EC2に対してIAMでログイン制御を行えるEC2 Instance Connectが発表されました。
- Introducing Amazon EC2 Instance Connect
- New: Using Amazon EC2 Instance Connect for SSH access to your EC2 Instances
EC2 Instance Connect
EC2 Instance ConnectではIAMの権限でアクセス制御が行えて、一時的に生成した公開鍵でSSHログインが可能となります。
全体の概要は以下のような流れでログインします。ユーザーは自分のローカルマシンからログインできますし、Management Consoleからもログイン可能です。
- クライアントで公開鍵/秘密鍵のペアを生成する。
- EC2 Instance ConnectのAPI (SendSSHPublicKey) で公開鍵を登録する。
- EC2 Instance Connectが対象EC2のInstance Metadataに公開鍵を60秒間保存する。
- EC2上のEC2 Instance ConnectのエージェントがInstance Metadataから公開鍵を取得してsshdに登録する。
- クライアントから秘密鍵でEC2に対してSSHでログインする。
公開鍵は毎回登録し直すため秘密鍵が漏洩することはありませんし、公開鍵の登録はEC2 Instance ConnectのAPIで行うためIAMでSSHのアクセス制御が行なえると行った特徴があります。またCloudTrailにログが残るので監査も簡単になります。
Management ConsoleやEC2 Instance Connect CLI(mssh)を使用すると毎回公開鍵/秘密鍵を生成し直してアクセスするので、秘密鍵の管理も不要になります。
Session Managerとの比較
EC2上のコマンドを実行する機能としてAWS Systems ManagerのSession Managerもありますので比較してみます。
EC2 Instance Connectのメリット
以下のエントリで述べているようにSession Managerは.bashrc
などが読み込まれておらず、「ログイン」をしていない状態です。しかしEC2 Instance Connectは公開鍵の登録をする機能なのでアクセスは普通のSSHとして行います。そのためEC2 Instance Connectでは以下のエントリのような問題が発生しません。
AWS Systems Manager のセッションマネージャで EC2 (Linux) にアクセスした際に気をつけたいこととその緩和策
EC2 Instance Connectのデメリット
EC2 Instance Connectでは基本的にパブリックIPとネットワークの接続性が必要となります。しかしSession ManagerではPrivateLinkを経由することでプライベートサブネットにも接続可能です。
プライベートサブネットに配置したEC2にAWS Systems Manager Session Managerを使ってアクセスする
利用可能なOS
EC2 Instance Connectでは以下のディストリビューションがサポートされています。また、Amazon Linux 2のバージョン2.0.20190618以降ではEC2 Instance Connectが設定済みです。
- Amazon Linux 2 (任意のバージョン)
- Ubuntu 16.04 以降
利用可能なリージョン
現在利用可能なリージョンは以下になっています。無事に東京リージョンも入っています。
- 米国東部 (バージニア北部)
- 米国東部 (オハイオ)
- 米国西部 (北カリフォルニア)
- 米国西部 (オレゴン)
- アジアパシフィック (ムンバイ)
- アジアパシフィック (ソウル)
- アジアパシフィック (シンガポール)
- アジアパシフィック (シドニー)
- アジアパシフィック (東京)
- カナダ (中部)
- EU (フランクフルト)
- EU (アイルランド)
- EU (ロンドン)
- EU (パリ)
- 南米 (サンパウロ)
注意点
SSHはクライアントから接続するので、EC2インスタンスにはパブリックIPが必要となります。またアクセス元IPアドレスからの22/tcpアクセス許可を行う必要があります。Management Console経由でアクセスする場合は公開されているIPブロックを許可する必要があります。
やってみる
実際にアクセスして試してみます。今回はバージニア北部リージョンで試しています。
IAMの権限設定
IAMのマネージドポリシーにEC2InstanceConnect
が増えているので使用するIAMグループ/ユーザやIAM Roleに設定します。
ポリシーの中身は以下になっています。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EC2InstanceConnect", "Action": [ "ec2:DescribeInstances", "ec2-instance-connect:SendSSHPublicKey" ], "Effect": "Allow", "Resource": "*" } ] }
EC2の起動
EC2のコンソールからインスタンスの作成
をクリックします。
Amazon Linux 2のx86のAMI (ami-0b898040803850657)を選択して選択
をクリックします。
任意のインスタンスタイプを選択してください。ここではt3.small
を選択します。選択したら次の手順: インスタンスの詳細の設定
をクリックします。
EC2の詳細を設定します。EIPを設定しない場合にはパブリック IPが割り当てられるようにしてください。次の手順: ストレージの追加
をクリックします。
ストレージは必要に応じて設定してください。次の手順: タグの追加
をクリックします。
タグも必要に応じて設定してください。次の手順: セキュリティグループの設定
をクリックします。
ここでは新しいセキュリティグループを作成して、全てのIPアドレスからSSHを許可しています。これはManagement Consoleからのアクセスを想定していますが、実際の運用ではAWSサービスのIPアドレスの範囲に絞るなどの設定を行ってください。確認と作成
をクリックします。
内容を確認して起動
をクリックします。
キーペアを選択してインスタンスの作成
をクリックします。キーペアなしでもEC2 Instance Connectは利用可能ですが、現在はキーペアを指定しないと何故かManagement Console経由でEC2 Instance Connectを利用できないので設定しています。
起動するまで少し待ちます。
Management Consoleからのログイン
Management Consoleからログインしてみます。Management Consoleからのアクセスではアクセス元のIPアドレスを大きく開ける必要があるので注意してください。
対象のEC2を選択して、メニューの接続
をクリックします。
ブラウザから直接マネージド SSH クライアント
を選択してUser nameでデフォルトのec2-user
のままConnect
をクリックします。日本語では「アルファ」との記載がありますが、英語では記載がないので安心して使いましょう。
別ウィンドウが開いてログインできます。これだけでログインできます。
コマンドラインでのログイン
コマンドラインでログインします。
まずAWS CLIを最新にしましょう。
$ pip install -U awscli
次にEC2 Instance Connectで簡単にログインできるためのコマンドmssh
をインストールします。まずはS3からインストールファイルをダウンロードします。
$ aws s3api get-object --bucket ec2-instance-connect --key cli/ec2instanceconnectcli-latest.tar.gz ec2instanceconnectcli-latest.tar.gz { "AcceptRanges": "bytes", "ContentType": "application/x-gzip", "LastModified": "Thu, 27 Jun 2019 19:16:19 GMT", "ContentLength": 21550, "VersionId": "n117kEUFch4DbmYprejb_i5jDVP8pbR5", "ETag": "\"4f123a5eb28a03e3f62e40e1797e7026\"", "Metadata": {} }
pipでインストールします。
$ sudo pip install ec2instanceconnectcli-latest.tar.gz
インストールが完了すると後は簡単です。mssh
コマンドでインスタンスIDとリージョンを指定するだけです。
mssh i-0a1b2c3d4e5f6g7h8 --region us-east-1 Warning: Permanently added '203.0.113.102' (ECDSA) to the list of known hosts. __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/ [ec2-user@ip-198-51-100-169 ~]$
w
コマンドでログインしていることを確認できます。
$ w 02:17:33 up 2:21, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT ec2-user pts/0 m106073021032.v4 02:17 1.00s 0.01s 0.00s w
コマンドラインでは、mssh
を使用せずに個別に公開鍵を登録して、任意のSSHクライアントを使用することも可能ですが割愛します。気になる方は以下のドキュメントを御覧ください。
Connect Using Your Own Key and Any SSH Client
さいごに
EC2 Instance ConnectやSession Managerに対応しているOSでは自分で鍵を管理/保存することが減っていくと考えています。AWS Systems ManagerのSession Managerでも同様にEC2のコマンドを実行できるので使い分けが難しいですが、メリット/デメリットを踏まえつつ使い分けをしていきましょう。