長生村本郷Engineers'Blog

千葉県長生村本郷育ちのエンジニアが書いているブログ

EC2 Instance Connect で AWS EC2 への ssh 管理を IAM User or Group で簡単に♪

f:id:kenzo0107:20190628154100p:plain

概要

2019-06-28 に EC2 Instance Conncet が発表されました!

これによって、セキュリティグループと IAM 権限で ssh アクセス許可が可能になります。

例えば、
会社の IP からのみ、特定の IAM User Group に所属している IAM User に ssh アクセス権限を付与、
別のプロジェクトへ異動した、退職した場合は、その IAM User Group から削除で ssh アクセス権限を剥奪できます。

試験環境

macOS 10.14.3 で試しました。

事前準備

$ pip install -U awscli

$ aws s3api get-object --bucket ec2-instance-connect --key cli/ec2instanceconnectcli-latest.tar.gz ec2instanceconnectcli-latest.tar.gz

$ sudo pip install ec2instanceconnectcli-latest.tar.gz

発行した IAM User のパーミッション権限に以下を追加

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EC2InstanceConnect",
            "Action": [
                "ec2:DescribeInstances",
                "ec2-instance-connect:SendSSHPublicKey"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

この辺りは terraform 管理案件ですね。

EC2 Instance Conncect 対応 OS

  • Ubuntu>=16.04
  • AmazonLinux2>=2.0.20190618

ssh ログインする EC2側の設定

Ubuntu>=16.04

ec2-instance-connect をインストールしておく必要があります。

$ sudo apt-get update && sudo apt-get install ec2-instance-connect
$ dpkg -l | grep ec2-instance-connect

ii  ec2-instance-connect           1.1.9-0ubuntu3~18.04.1            all          Configures ssh daemon to accept EC2 Instance Connect ssh keys

AmazonLinux2>=2.0.20190618

ec2-instance-connect は設定済みです。

セキュリティグループ

ssh ログイン先となる EC2 インスタンスのセキュリティグループはアクセス元から ssh (22 port) を開けておく必要があります。

ssh ログインしてみる

local%$ mssh ubuntu@i-0f123456abcdefg --profile <profile> --region ap-northeast-1

一見、誰しもが ubuntu でログインしていて監査が不安になりますが、 CloudTrail はちゃんと誰がログインしたか見ています。

CloudTrail

f:id:kenzo0107:20190628160255p:plain
CloudTrail

以下イベントでログが残っています。

  • SendSSHPublicKey
  • DescribeInstances

SendSSHPublicKey の「イベントの表示」ボタンクリックで JSON が表示されますが、その中で、アクセス元 IP, IAM User Arn、アクセス先 インスタンスIDがわかります。

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "ABCDEFGHIJK....",
        "arn": "arn:aws:iam::123456789012:user/hogehoge",
        "accountId": "123456789012",
        "accessKeyId": "AKIxxxxxxxxxxxxxxxx",
        "userName": "hogehoge",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2019-06-28T06:18:50Z"
            }
        }
    },
    "eventTime": "2019-06-28T06:18:51Z",
    "eventSource": "ec2-instance-connect.amazonaws.com",
    "eventName": "SendSSHPublicKey",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "xx.xxx.xxx.xxx",
    "userAgent": "aws-ec2-instance-connect-cli/1.0.0 Python/2.7.16 Darwin/18.2.0 Botocore/1.12.179",
    "requestParameters": {
        "instanceId": "i-0f.......",
        "osUser": "ubuntu",
        "SSHKey": {
            "publicKey": "ssh-rsa AAAAB....rHb"
        }
    },
    "responseElements": null,
    "requestID": "01234567-890a-1234-5b6d-......",
    "eventID": "f51...",
    "eventType": "AwsApiCall",
    "recipientAccountId": "123456789012"
}

こちらで EC2 インスタンスのアクセス履歴等はわかります。

まとめ

これまで ssh アカウント管理は手間でしたが、IAM 権限での管理によって非常に楽になりました♪

CloudTrail で監査もバッチリ!