[アップデート] Amazon Q Developer in chat applications がジャストインタイムノードアクセス機能の承認/却下をサポートしました
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
Amazon Q Developer in chat applications がジャストインタイムノードアクセス機能の承認/却下をサポートしました。
アップデート内容
まず初めにジャストインタイムノードアクセス機能とは、Session Manager を利用したノード(EC2 インスタンス)へのログイン権限を、一時的に付与する機能です。機能の付与は承認制で自動承認/手動承認がサポートされています。
ノードへのログインを承認ベースにすることで、アクセス権限の管理(細かいポリシー制御)や付与・剥奪の手間を大幅に削減できます。
ジャストインタイムノードアクセス機能自体の検証は以下のブログにまとまっているため、併せてご覧ください。(私も拝読させていただきました。)
今回のアップデートは承認/拒否のやりとりを、 Amazon Q Developer in chat applications で行えるようになりました。
Amazon Q Developer in chat applications を利用することで、従来、承認者はマネジメントコンソールを通じて承認を行う必要があったものが、 Slack や Teams 経由でリクエストできるようになったというものです。非常に便利ですね。運用負荷が下がりそうです。
やってみた
それでは、実際に Amazon Q Developer in chat applications 経由で AWS Systems Manager のジャストインタイムノードアクセスを利用します。
今回は Slack を利用します。Slack と Amazon Q Developer in chat applications の連携は済んでいるものとします。
また、ジャストインタイムノードアクセスの有効化
まで済んでいるものとします。
[アップデート] SSM Session Managerでのノード接続時の承認管理に役立つジャストインタイムノードアクセス機能が追加されました | DevelopersIO
Slack チャンネルの作成
まずは Slack チャンネルを作成します。誰でも承認できるとマズいので、プライベートチャンネルで作成します。
チャンネルが作成できたら /invite @Amazon Q
を忘れないようにしましょう。
IAM ロールの作成
承認者用の IAM ロールを作成します。ロール名は任意の名前で設定します。
Slack チャンネルから通知が来た時に、承認者はそのロールを使って承認/拒否を行うイメージです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "chatbot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
IAM ポリシーは以下のドキュメントの IAM policy for access request approvers
に沿って作成します。
region
, account id
部分は適宜置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAccessRequestDescriptions",
"Effect": "Allow",
"Action": [
"ssm:DescribeOpsItems",
"ssm:GetOpsSummary",
"ssm:ListOpsItemEvents"
],
"Resource": "*"
},
{
"Sid": "AllowGetSpecificAccessRequest",
"Effect": "Allow",
"Action": [
"ssm:GetOpsItem"
],
"Resource": "arn:aws:ssm:region:account id:opsitem/*"
},
{
"Sid": "AllowApprovalRejectionSignal",
"Effect": "Allow",
"Action": [
"ssm:SendAutomationSignal"
],
"Resource": "arn:aws:ssm:*:*:automation-execution/*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/SystemsManagerJustInTimeNodeAccessManaged": "true"
}
}
},
{
"Sid": "QuickSetupConfigurationManagers",
"Effect": "Allow",
"Action": [
"ssm-quicksetup:ListConfigurationManagers",
"ssm-quicksetup:ListConfigurations",
"ssm-quicksetup:GetConfigurationManager",
"ssm-quicksetup:ListQuickSetupTypes",
"ssm-quicksetup:GetConfiguration"
],
"Resource": "*"
},
{
"Sid": "QuickSetupDeployments",
"Effect": "Allow",
"Action": [
"cloudformation:ListStacks",
"cloudformation:DescribeStacks",
"organizations:DescribeOrganization",
"organizations:ListDelegatedAdministrators"
],
"Resource": "*"
},
{
"Sid": "AllowSsmJitnaPoliciesCrudOperations",
"Effect": "Allow",
"Action": [
"ssm:GetDocument",
"ssm:DescribeDocument"
],
"Resource": [
"arn:aws:ssm:region:account id:document/*"
],
"Condition": {
"StringEquals": {
"ssm:DocumentType": [
"ManualApprovalPolicy",
"AutoApprovalPolicy"
]
}
}
},
{
"Sid": "AllowSsmJitnaPoliciesListOperations",
"Effect": "Allow",
"Action": [
"ssm:ListDocuments",
"ssm:ListDocumentVersions"
],
"Resource": "*"
},
{
"Sid": "IDCPermissions",
"Effect": "Allow",
"Action": [
"sso:DescribeRegisteredRegions",
"sso:ListDirectoryAssociations",
"identitystore:GetUserId",
"identitystore:DescribeUser",
"identitystore:DescribeGroup",
"identitystore:ListGroupMembershipsForMember"
],
"Resource": "*"
}
]
}
手動承認ポリシーの作成
続いて手動承認ポリシーを作成します。ターゲットはすべてのノード
または、タグベースで特定のノードのみ
を指定できます。
今回はすべてのノード
を選択しました。アクセス期間(再承認が不要な期間)は任意の時間を指定します。
承認者を選択します。先ほど作成したロールを指定します。(私はロール名を just-in-time-node-access-manager
としました。)
最終的な作成イメージは以下のとおりです。
クライアント設定
Amazon Q Developer in chat applications と Slack の連携が済んでいると、設定から次のようにクライアントが表示されている状態になります。
クライアントをクリックし、新しいチャネルを設定
をクリックします。
チャネルの設定画面が表示されます。
通知タイプは承認者向けなので Notify approvers that access request requires their approval decision
を選択します。
IAM ロールは先ほど作成したロール名(承認者と同じロール)を選択します。
チャネル ID も先ほど作成したチャネル ID を指定します。設定名はわかりやすいよう、私はチャネル名を指定しました。
完了すると次のような設定になります。
承認リクエストを送信
実際に承認リクエストを送信してみます。
ReadOnlyAccess
権限と、以下の IAM ポリシーを持った権限から承認リクエストを送信します。
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "AllowJITNAOperations",
"Effect": "Allow",
"Action": [
"ssm:StartAccessRequest",
"ssm:GetAccessToken"
],
"Resource": "*"
},
{
"Sid": "AllowOpsItemCreationAndRetrieval",
"Effect": "Allow",
"Action": [
"ssm:CreateOpsItem",
"ssm:GetOpsItem"
],
"Resource": "arn:aws:ssm:*:*:opsitem/*"
},
{
"Sid": "AllowListAccessRequests",
"Effect": "Allow",
"Action": [
"ssm:DescribeOpsItems",
"ssm:GetOpsSummary",
"ssm:ListOpsItemEvents",
"ssm:DescribeSessions"
],
"Resource": "*"
},
{
"Sid": "RequestManualApprovals",
"Action": "ssm:StartAutomationExecution",
"Effect": "Allow",
"Resource": "arn:aws:ssm:*:*:document/*",
"Condition": {
"StringEquals": {
"ssm:DocumentType": "ManualApprovalPolicy"
}
}
},
{
"Sid": "StartManualApprovalsAutomationExecution",
"Effect": "Allow",
"Action": "ssm:StartAutomationExecution",
"Resource": "arn:aws:ssm:*:*:automation-execution/*"
},
{
"Sid": "AllowManualApprovalAutomationExecutionTagging",
"Effect": "Allow",
"Action": [
"ssm:AddTagsToResource"
],
"Resource": [
"arn:aws:ssm:*:*:automation-execution/*"
],
"Condition": {
"StringEquals": {
"aws:RequestTag/SystemsManagerJustInTimeNodeAccessManaged": "true"
},
"ForAllValues:StringEquals": {
"aws:TagKeys": [
"SystemsManagerJustInTimeNodeAccessManaged"
]
}
}
},
{
"Sid": "CancelAccessRequestManualApproval",
"Effect": "Allow",
"Action": "ssm:StopAutomationExecution",
"Resource": "arn:aws:ssm:*:*:automation-execution/*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/SystemsManagerJustInTimeNodeAccessManaged": "true"
}
}
},
{
"Sid": "DescribeEC2Instances",
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:DescribeTags",
"ec2:GetPasswordData"
],
"Resource": "*"
},
{
"Sid": "AllowListSSMManagedNodesAndTags",
"Effect": "Allow",
"Action": [
"ssm:DescribeInstanceInformation",
"ssm:ListTagsForResource"
],
"Resource": "*"
},
{
"Sid": "QuickSetupConfigurationManagers",
"Effect": "Allow",
"Action": [
"ssm-quicksetup:ListConfigurationManagers",
"ssm-quicksetup:GetConfigurationManager",
"ssm-quicksetup:ListConfigurations",
"ssm-quicksetup:ListQuickSetupTypes",
"ssm-quicksetup:GetConfiguration"
],
"Resource": "*"
},
{
"Sid": "AllowSessionManagerOperations",
"Effect": "Allow",
"Action": [
"ssm:DescribeSessions",
"ssm:GetConnectionStatus"
],
"Resource": "*"
},
{
"Sid": "AllowRDPOperations",
"Effect": "Allow",
"Action": [
"ssm-guiconnect:ListConnections",
"ssm:GetConnectionStatus"
],
"Resource": "*"
},
{
"Sid": "QuickSetupDeployments",
"Effect": "Allow",
"Action": [
"cloudformation:ListStacks",
"cloudformation:DescribeStacks",
"organizations:DescribeOrganization",
"organizations:ListDelegatedAdministrators"
],
"Resource": "*"
},
{
"Sid": "AllowSsmJitnaPoliciesReadOnly",
"Effect": "Allow",
"Action": [
"ssm:GetDocument",
"ssm:DescribeDocument"
],
"Resource": [
"arn:aws:ssm:*:account id:document/*"
],
"Condition": {
"StringEquals": {
"ssm:DocumentType": [
"ManualApprovalPolicy",
"AutoApprovalPolicy"
]
}
}
},
{
"Sid": "AllowSsmJitnaPoliciesListOperations",
"Effect": "Allow",
"Action": [
"ssm:ListDocuments",
"ssm:ListDocumentVersions"
],
"Resource": "*"
},
{
"Sid": "ExploreNodes",
"Effect": "Allow",
"Action": [
"ssm:ListNodesSummary",
"ssm:ListNodes",
"ssm:DescribeInstanceProperties"
],
"Resource": "*"
},
{
"Sid": "IdentityStorePermissions",
"Effect": "Allow",
"Action": [
"sso:DescribeRegisteredRegions",
"sso:ListDirectoryAssociations",
"identitystore:GetUserId",
"identitystore:DescribeUser",
"identitystore:DescribeGroup"
],
"Resource": "*"
}
]
}
IAM policy for just-in-time node access users
承認リクエストが飛んできました。Request Reason
が日本語でやりとりできて良いですね。
サーバー情報は Instance ID で判断しないといけないため、何かしらのマッピング情報をどこかに書いておく必要がありそうです。Name タグが記載されていると嬉しそうですね。
試しに Reject してみましょう。Comment も追記できるようです。
返信する形で、実行したコマンドの表示および、承認リクエストのステータスが更新されました。
リクエスタ側からも次のように理由/コメントが表示される形でアクセスリクエストが却下されていました。
承認が却下されたため、再度、リクエストを送信します。
別投稿の形で新しいコメントが投稿されていました。
急ぎのようなので、承認しました。
こちらも却下と同じくコメントに返信する形で、実行したコマンドの表示および、承認リクエストのステータスが更新されました。
リクエスタ側からもセッションが開始できるようになりました。
おまけ
承認/却下をした後、再度、承認/却下を押すとエラーになりました。ちゃんとチェックしてクリックしましょう。
承認後に Reject を押した後の挙動
却下後に Approve を押した後の挙動
Slack なので Request Reason にメンションできるか試してみましたが、残念ながら反応しませんでした。
メンションが反応せず、道半ばで途絶えたコメント
まとめ
以上、「Amazon Q Developer in chat applications がジャストインタイムノードアクセス機能の承認/却下をサポートしました。」でした。普段チャットでコミュニケーションしている企業の場合、非常に便利な機能なのではないでしょうか。
参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!