AWS CLIでAssumeRoleしてSession Managerを利用する

記事タイトルとURLをコピーする

こんにちは、技術1課 長崎です。

表題の通り、やり方のまとめを記載します。
Session Managerは、Systems Manager(以下SSM)の機能の一つです。

前提

  • Linux OSのEC2インスタンスへの接続
  • クライアント端末はWindows
  • 東京リージョンで実行

全体の流れ

今回、Account AのIAMユーザーが持つ権限でAccount BのIAMロールにスイッチして、SSM Session Managerを利用してEC2へ接続します。
これをAWS CLIでやります。

f:id:swx-nagasaki:20210624170754p:plain


手順

Account B(EC2インスタンスがいるAWSアカウント)の準備

IAMロールの作成

Account AのIAMユーザー権限でAssumeRoleするIAMロールです。
以下が必要最低限のポリシーです。
※環境内全てのEC2へログインしたい場合は、[Resource]プロパティのinstance id*(アスタリスク)にします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ec2:ap-northeast-1:<Account BのAWSアカウントID>:instance/<instance id>"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:session/${aws:username}-*"
            ]
        }
    ]
}

信頼関係のポリシーは以下を記述します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<Account AのAWSアカウントID>:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

EC2のポリシー設定

EC2に割り当てるIAMロールの中で、SSMへの操作権限を付与しておきます。
AmazonSSMManagedInstanceCore」という必要なアクセス権限が含まれたAWSマネージドポリシーの選択がおすすめです。
このポリシーにはS3の操作権限が含まれていない為、操作ログをS3バケットに保管したい場合は追加で以下のポリシーを付与してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "sessionlog",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::<S3 Bucket Name>/*"
            ]
        }
    ]
}

EC2へSSMエージェントをインストール

デフォルトでプリインストールされているOS以外は、手動でインストールする必要があります。

  • ドキュメント:

EC2 インスタンスに SSM エージェントを手動でインストールする (Linux 用) - AWS Systems Manager

SSM エージェントは、以下の Amazon Machine Images (AMIs) にデフォルトでプレインストールされています。

  • Amazon Linux

  • Amazon Linux 2

  • Amazon Linux 2 ECS に最適化された AMIs:

  • Ubuntu Server 16.04、18.04 および 20.04

EC2からSSMエンドポイントへの経路確保

EC2からインターネット上のSSMエンドポイントへの経路を確保します。
EC2がElastic IPを持ってパブリックな環境にいるかNAT経由でインターネットに出られるなら問題ないです。
完全閉域網のEC2の場合は、PrivateLink(VPC EndPoint)を利用します。

ステップ 6: (オプション) AWS PrivateLink を使用して Session Manager 用の VPC エンドポイントをセットアップする - AWS Systems Manager

f:id:swx-nagasaki:20210702155555p:plain

Account A(IAMユーザーがいるAWSアカウント)の準備

IAMユーザーへAssumeRole権限の割り当て

IAMユーザーを作成後、以下のポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam:: <Account BのAWSアカウントID>:role/<AssumeRole先のIAMロール名>"
        }
    ]
}

クライアント端末側の準備

AWS CLIをインストール

以下を参考にインストールします。

AWS CLI バージョン 2 のインストール、更新、およびアンインストール - AWS コマンドラインインターフェイス

Session Manager Pluginをインストール

以下を参考にインストールします。

(オプション) AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager

AWS CLIを設定する

credentialsファイルに作成したIAMユーザーのアクセスキー・シークレットキーを設定します

[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxx

configファイルにはAssumeRole先のIAMロールを設定します。

[profile assumerole]  #profile名は任意です
region = ap-northeast-1
output = json
mfa_serial = arn:aws:iam::<Account AのAWSアカウントID>:mfa/<IAM User Name>  #AssumeRoleする時のMFA認証を有効化
role_arn = <AssumeRoleするIAMロールARN>
source_profile = default

以上で、プロファイル[assumerole]をAWS CLI実行時に指定する事で、role_arnのIAMロールへAssumeRoleしてその際に得た一時的な認証情報でAPIを実行できます。

アクセスしてみる

クライアント端末でコマンドを実行する。

aws ssm start-session --target <instance-id> --profile assumerole

アクセスが成功しました。

Starting session with SessionId: botocore-session-111111111-0000000000000
sh-4.2$

まとめ

Session Managerを利用すれば、SSH鍵や踏み台サーバの管理がいらなくなる為、セキュリティが向上します。
SSMにはRunCommand等、運用を楽にする機能が豊富ですのでぜひ一度利用してみてください。

長崎 将太 (執筆記事の一覧)

クラウドインテグレーション部