はじめに
環境構築時や運用時など、EC2インスタンスにアクセスする機会は多々ありますが、アクセス方法も複数あります。
多くの場合はキーペアを使用したSSH接続を使われていると思いますが、AWSマネジメントコンソールからコンソールアクセスできることはご存じでしょうか。
AWS Systems Manager(以降、SSM)のSession Managerを使うことで、EC2インスタンスへのセキュアなアクセスが可能になります。
この方法では、以下のようなメリットがあります。
- インバウンドでSSHポートを開く必要がないので、セキュリティリスクを軽減できる
- SSHキーを管理する必要が無くなる
- プライベートサブネットのインスタンスにも踏み台ホスト無しでアクセス可能になり、踏み台の管理が不要になる
- AWSコンソールから簡単にアクセスできる
- セッションの記録が残せるため、監査にも使える
この記事では、EC2インスタンスにSession Managerを使用して、AWSコンソールからアクセスするまでの実装方法を紹介します。
前提
よく見かける構成として以下のような環境を想定し、この前提のもと実装手順を紹介します。
- プライベートサブネットに構築したAmazon Linux 2のEC2インスタンス(実行中)
- プライベートサブネットからNATGatewayへの経路を設定済み
- SSM Agentはデフォルトでインストール・稼働している状態
- アクセスするユーザが使用するIAMユーザは作成済み
設定の流れ
- SSMを使うためのEC2用IAMロール(インスタンスプロファイル)の作成
- IAMロールをEC2にアタッチ
- アクセスするユーザ用のIAMポリシー作成・付与
- アクセス方法
設定手順
SSMを使うためのEC2用IAMロール(インスタンスプロファイル)の作成
AWS Systems ManagerがインスタンスにアクションするためのIAMロールを作成します。 必要なIAMポリシーは
AmazonSSMManagedInstanceCore
です。IAM
>ロール
>ロールを作成
を選択- 信頼されたエンティティを選択
信頼されたエンティティタイプ:AWSのサービス
ユースケース:EC2
- 許可を追加
許可ポリシー:AmazonSSMManagedInstanceCore
ポリシーのチェックボックスを選択(AmazonSSMManagedInstanceCoreで検索) - 名前、説明、タグ、作成確認
ロール名:分かりやすい名前を入力(例ではec2-ssm-role)
説明:必要があれば変更
タグ:必要があれば追加
ここまで設定したら、ロールを作成
を選択します。
作成したロールが一覧に表示されていることを確認
IAMロールをEC2にアタッチ
EC2
> 対象インスタンスにチェック >アクション
>セキュリティ
>IAMロールを変更
を選択
- ひとつ前に作成したIAMロール(例ではec2-ssm-role)を選択し、
IAMロールの更新
を選択
アクセスするユーザ用のIAMポリシー作成・付与
管理者ユーザなどの場合はすでに必要な権限があるかもしれませんが、アクセスするIAMユーザに必要な権限がない場合は追加する必要があります。
こちらに公式のポリシーサンプルがあります。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-restrict-access-quickstart.html
今回は公式ポリシーをベースに、以下のようなポリシーを作成し、IAMユーザに追加します。
変更点:- EC2コンソールから接続するために
ssm:DescribeInstanceInformation
を追加 - KMSキーによるセッションデータの暗号化はデフォルトで無効化状態のため、該当する部分を削除
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:StartSession" ], "Resource": [ "arn:aws:ec2:ap-northeast-1:<account-id>:instance/<instance-id>", "arn:aws:ssm:ap-northeast-1:<account-id>:document/SSM-SessionManagerRunShell" ], "Condition": { "BoolIfExists": { "ssm:SessionDocumentAccessCheck": "true" } } }, { "Effect": "Allow", "Action": [ "ssm:DescribeSessions", "ssm:GetConnectionStatus", "ssm:DescribeInstanceProperties", "ssm:DescribeInstanceInformation", "ec2:DescribeInstances" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ssm:TerminateSession", "ssm:ResumeSession" ], "Resource": [ "arn:aws:ssm:*:*:session/${aws:username}-*" ] } ] }
IAM
>ポリシー
>ポリシーを作成
を選択ポリシーの作成
ではJSON
のタブで上記のポリシーを上書き
※ポリシー内の<account-id>
,<instance-id>
は使用している環境に合わせて変更してください。
- タグ、名前、説明、作成確認
タグ:必要があれば追加
名前:分かりやすい名前を入力(例ではssm-user-policy)
説明:必要があれば変更
ここまで設定したら、ポリシーの作成
を選択します。
作成したポリシーが一覧に表示されていることを確認
- 作成したポリシーをユーザーグループ等にアタッチ
今回は接続テスト用のユーザを参加させているssm-users-groupというユーザーグループにアタッチしました。
- EC2コンソールから接続するために
アクセス方法
ここまで設定できましたら、次はアクセス確認をします。 方法は複数ありますが、アクセス対象が分かりやすい、EC2コンソールからの接続を紹介します。
EC2
>インスタンス
> アクセス対象のインスタンスを選択(チェック) >接続
を選択
セッションマネージャー
タブで接続
を選択
- コンソール画面が開けば成功
途中エラーになった場合や、コンソール画面で入力ができない等の不具合があれば、前提条件や設定で何か漏れている可能性があります。
参考に記載の前提条件やトラブルシューティングをご確認ください。
補足
- セッションデータはデフォルトでTLS 1.2を使用した暗号化が行われています。
- 今回の設定では、自動で
ssm-user
というOSユーザが作成され、アクセス時に使用されます。
OSユーザ権限の管理などを行っている場合は、そちらをご確認ください。
(アクセス時に使用するOSユーザを指定する方法もありますので、別の記事で紹介します。) - セッションの履歴は
Systems Manager
>セッションマネージャー
>セッション履歴
から確認できます。
おわりに
今回はEC2インスタンスへの、Session Managerを使用したコンソールアクセスの実装方法を少し細かく書いてみました。
プライベートなインスタンスに対しても、管理コストを抑えたセキュアなアクセスを実現できます。
ぜひ活用してみてください。
参考
- AWS Systems Manager Session Manager(公式ドキュメント) https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html
- Session Manager の前提条件 https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-prerequisites.html
- Session Manager のトラブルシューティング https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-troubleshooting.html
- AWS Systems Manager でのデータ保護 https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/data-protection.html