EC2 に SSM 接続するための IAM ポリシー設定サンプル

2024年2月からの、AWS IPv4 の有料化に伴い、EC2 にパブリック IP を付与しなくなるケースが多くなりました。そして、そうすると、外側から気軽にEC2への SSH 接続ができなくなります。

その時に使えるのが SSM 接続です。

今回はそのサンプルポリシーを書き留めておきます。

# SSM でアクセスできるようにする IAM ポリシー

`[アカウントID]`や `[1台目のインスタンスID]` `[2台目のインスタンスID]`などを書き換え、インスタンス数を増減することも可能。

また IP 制限も加えます。`aws:SourceIp` に許可する IP アドレスの範囲を追加してください。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:document/AWS-StartSSHSession",
                "arn:aws:ec2:ap-northeast-1:[アカウントID]:instance/[1台目のインスタンスID]",
                "arn:aws:ec2:ap-northeast-1:[アカウントID]:instance/[2台目のインスタンスID]"
            ],
            "Condition": {
                "BoolIfExists": {
                    "ssm:SessionDocumentAccessCheck": "true"
                },
                "IpAddress": {
                    "aws:SourceIp": [
                        "【許可するIPアドレス】/32"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession",
                "ssm:ResumeSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:session/${aws:username}-*"
            ]
        }
    ]
}
```


参考
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html


##  IAM ユーザー管理用

IAM ユーザーが自身で、パスワード、MFA を設定変更できるポリシー + MFA を設定しないとパスワード変更、アクセスキー生成、MFA の設定外は何もできない IAM ポリシーを作成し、
上記の IAM ユーザーにアタッチしていただけると、
ユーザー自身で、IAM User のパスワード更新、Aceess Key の更新を行うことができます。


```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowViewAccountInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy",
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowManageOwnPasswords",
            "Effect": "Allow",
            "Action": [
                "iam:ChangePassword",
                "iam:GetUser"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnAccessKeys",
            "Effect": "Allow",
            "Action": [
                "iam:CreateAccessKey",
                "iam:DeleteAccessKey",
                "iam:ListAccessKeys",
                "iam:UpdateAccessKey"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowUserToCreateVirtualMFADevice",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice"
            ],
            "Resource": "arn:aws:iam::*:mfa/*"
        },
        {
            "Sid": "AllowUserToManageTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:EnableMFADevice",
                "iam:GetMFADevice",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowUserToDeactivateTheirOwnMFAOnlyWhenUsingMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice"
            ],
            "Resource": [
                "arn:aws:iam::*:user/${aws:username}"
            ],
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        }
    ]
}
```

参考記事: MFA を有効化しないと、自身の認証設定以外は何もできなくなる IAM ポリシーサンプル
https://qiita.com/katzueno/items/fbcc2088829322f40d5c
私が作成したサンプルから、AccessKey, マネージメントコンソールパスワード、MFAの設定だけを取り出した者です。


# Mac 側 (クライアント側) での設定

Mac のターミナルなどから、

```
ssh [1台目ホストネーム]
ssh [2台目ホストネーム]
```

で SSM を通じて EC2 にログインするための IAM User 設定です。


## インストール手順

- AWS CLI をインストール `brew install awscli`
- エージェントをインストール
    - https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/install-plugin-macos-overview.html

## AWS マネージメントコンソールにログイン

- IAM ユーザーのパスワード設定
- MFA デバイスを設定して ARN を取得

## Mac で、以下の設定ファイルを設定

IAM ユーザーの認証情報は `[profile プロフィール名]` をつけて設定する想定です。

.aws/config

```
[profile プロフィール名]
    region = ap-northeast-1
    mfa_serial = [MFA の ARNをここに書く]
```

.aws/credential

```
[profile プロフィール名]
aws_access_key_id = [アクセスキーを取得]
aws_secret_access_key = [アクセスシークレットを取得]
```

.ssh/config

```
# SSH demo
## 1台目 のインスタンス
host [1台目ホストネーム]
    ProxyCommand    sh -c "aws  --profile=[profile プロフィール名] ssm start-session --target [1台目のインスタンスID] --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
    IdentityFile    "[鍵を保存した場所]"
    IdentitiesOnly  yes
    TCPKeepAlive    yes
    User            ec2-user もしくは他の SSH ユーザー名
## 2台目 のインスタンス
host [2台目ホストネーム]
    ProxyCommand    sh -c "aws  --profile=[profile プロフィール名] ssm start-session --target [2台目のインスタンスID] --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
    IdentityFile    "[鍵を保存した場所]"
    IdentitiesOnly  yes
    TCPKeepAlive    yes
    User            ec2-user もしくは他の SSH ユーザー名
```

## 参考

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html
ポリシーは違う
https://baresupport.jp/blog/2022/03/14/82/