EC2のSSHアクセスをIAMで制御できるEC2 Instance Connectが発表されました

398件のシェア(そこそこ話題の記事)

大栗です。

先程EC2に対してIAMでログイン制御を行えるEC2 Instance Connectが発表されました。

EC2 Instance Connect

EC2 Instance ConnectではIAMの権限でアクセス制御が行えて、一時的に生成した公開鍵でSSHログインが可能となります。

全体の概要は以下のような流れでログインします。ユーザーは自分のローカルマシンからログインできますし、Management Consoleからもログイン可能です。

  1. クライアントで公開鍵/秘密鍵のペアを生成する。
  2. EC2 Instance ConnectのAPI (SendSSHPublicKey) で公開鍵を登録する。
  3. EC2 Instance Connectが対象EC2のInstance Metadataに公開鍵を60秒間保存する。
  4. EC2上のEC2 Instance ConnectのエージェントがInstance Metadataから公開鍵を取得してsshdに登録する。
  5. クライアントから秘密鍵で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のコマンドを実行できるので使い分けが難しいですが、メリット/デメリットを踏まえつつ使い分けをしていきましょう。