インフラチームがお届けするブログリレーです!既に公開されている記事もありますので、こちらから他のメンバーの投稿もぜひチェックしてみてください!
はじめに
2025年4月29日に、AWS Systems Managerにおけるジャストインタイムのノードアクセスのリリースが発表されました(AWS Systems Manager でジャストインタイムのノードアクセスをリリース)
本稿では、この機能について、役立ちそうな場面や使い方を、まとめて見ていきます
私も初見の機能なので、脳内整理を皆さんとしていく気持ちでやっていきます
目次
- AWS Systems Managerのジャストインタイムのノードアクセスってなに?
- 通常のSession Managerと何が違うのか
- どんな場面で役立つのか
- 実際に使ってみる
- 必要な権限・設定
- 実際の操作
- まとめ
SSMのジャストインタイムのノードアクセスってなに?
そもそも、「AWS Systems Manageのジャストインタイムのノードアクセス」とはどのような機能なのでしょうか
公式ドキュメントを読んでみると、以下のようなことが記載されています
ジャストインタイムノードアクセスを使用すると、ユーザーはノードへの一時的な時間制限付きアクセスをリクエストでき、管理者はアクセスが本当に必要な場合にのみアクセスを承認できます。これにより、IAM ポリシーで管理されているノードへの長期的なアクセスを提供する必要がなくなります。さらに、Systems Manager は Windows Server ノードへの RDP セッションのセッション記録機能も提供しており、コンプライアンス要件の遵守、根本原因分析の実行などに役立ちます。
つまり、インスタンスへのSession Manager(以下SSM)を介した接続を、一時的かつ承認を伴って許可できるよ、という機能です
通常のSession Managerと何が違うのか
では、通常のSSM接続との違いはなんでしょうか
それぞれの特徴を表でまとめてみましょう
通常のSSM接続とジャストインタイムノードアクセスの違い
特徴 | 通常のSSM接続 | ジャストインタイムノードアクセス |
---|---|---|
アクセス期間 | 常時アクセス可能 | 一時的なアクセスのみ(必要な時だけ有効) |
IAM権限 | 固定的な権限設定 | 動的な権限付与と自動失効 |
セキュリティ | 常に接続可能なため攻撃面が広い | 必要時のみ接続可能で攻撃面が限定的 |
運用モデル | 常時接続可能な管理モデル | ゼロトラストに近い最小権限モデル |
監査と追跡 | 基本的な監査機能 | より詳細な監査と接続記録 |
使用シナリオ | 日常的な管理・メンテナンス | 緊急対応・特定作業・一時的アクセス |
設定の複雑さ | 比較的シンプル | より複雑な設定と権限管理が必要 |
アクセス要求 | 事前承認不要 | アクセス前に承認プロセスが必要な場合あり |
権限の有効期限 | 明示的に取り消すまで有効 | 設定した時間後に自動失効 |
コンプライアンス | 基本的なコンプライアンス対応 | より厳格なコンプライアンス要件に対応可能 |
この表を見ると分かる通り、ジャストインタイムノードアクセスは通常のSSM接続に比べて
- 権限が時間的に制限されていること
- アクセスリクエストの履歴が残ること(1年間)
で、よりセキュアかつコンプライアンスを意識した接続が可能になっていることが分かります
どんな場面で役立つのか
表から分かるように、ジャストインタイムノードアクセスは、以下のような場合に役立ちます
- 作業などで一時的に外部の人にSSMでインスタンスに接続して欲しい時
- コンプライアンス要件が厳しい案件でSSMを使用したい時
- RDSには手動承認でアクセスさせたいがインスタンスには自動承認でアクセスさせたいなど、きめ細やかにアクセスコントロールを行いたい時 etc…
お客様の本番環境や、外部の作業者が入る環境などではジャストインタイムノードアクセスが活用できそうです
実際に使ってみる
では、ここからは実際にジャストインタイムノードアクセスを利用してみましょう
必要な権限・設定
ジャストインタイムノードアクセスを利用するためには、以下の設定が必要です
なお、ここでの記載は
- SSM Agentがインストールされていること
- SSM接続に必要なSGの設定がされていること
- インスタンスに
AmazonSSMManagedInstanceCore
ポリシーを含む権限が付与されていること
を前提としています
1.ジャストインタイムノードアクセス(以下JITNA)を有効にする
まずはコンソールでジャストインタイムノードアクセスを有効にする必要があります
JITNAを有効化及び管理するためには、管理者のロールに以下の権限が付与されていることを確認してください
JITNAを有効にするIAMポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "QuickSetupConfigurationManagers", "Effect": "Allow", "Action": [ "ssm-quicksetup:CreateConfigurationManager", "ssm-quicksetup:DeleteConfigurationManager", "ssm-quicksetup:GetConfiguration", "ssm-quicksetup:GetConfigurationManager", "ssm-quicksetup:GetServiceSettings", "ssm-quicksetup:ListConfigurationManagers", "ssm-quicksetup:ListConfigurations", "ssm-quicksetup:ListQuickSetupTypes", "ssm-quicksetup:ListTagsForResource", "ssm-quicksetup:TagResource", "ssm-quicksetup:UntagResource", "ssm-quicksetup:UpdateConfigurationDefinition", "ssm-quicksetup:UpdateConfigurationManager", "ssm-quicksetup:UpdateServiceSettings" ], "Resource": "*" }, { "Sid": "QuickSetupDeployments", "Effect": "Allow", "Action": [ "cloudformation:DescribeStackSetOperation", "cloudformation:ListStacks", "cloudformation:DescribeStacks", "cloudformation:DescribeStackResources", "cloudformation:ListStackSetOperations", "cloudformation:ListStackInstances", "cloudformation:DescribeStackSet", "cloudformation:ListStackSets", "cloudformation:DescribeStackInstance", "cloudformation:DescribeOrganizationsAccess", "cloudformation:ActivateOrganizationsAccess", "cloudformation:GetTemplate", "cloudformation:ListStackSetOperationResults", "cloudformation:DescribeStackEvents", "cloudformation:UntagResource", "ssm:DescribeAutomationExecutions", "ssm:GetAutomationExecution", "ssm:ListAssociations", "ssm:DescribeAssociation", "ssm:GetDocument", "ssm:ListDocuments", "ssm:DescribeDocument", "ssm:GetOpsSummary", "organizations:DeregisterDelegatedAdministrator", "organizations:DescribeAccount", "organizations:DescribeOrganization", "organizations:ListDelegatedAdministrators", "organizations:ListRoots", "organizations:ListParents", "organizations:ListOrganizationalUnitsForParent", "organizations:DescribeOrganizationalUnit", "organizations:ListAWSServiceAccessForOrganization", "iam:ListRoles", "iam:ListRolePolicies", "iam:GetRole", "iam:CreatePolicy", "cloudformation:TagResource" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "cloudformation:RollbackStack", "cloudformation:CreateStack", "cloudformation:UpdateStack", "cloudformation:DeleteStack" ], "Resource": [ "arn:aws:cloudformation:*:*:stack/StackSet-AWS-QuickSetup-JITNA*", "arn:aws:cloudformation:*:*:stack/AWS-QuickSetup-*", "arn:aws:cloudformation:*:*:type/resource/*", "arn:aws:cloudformation:*:*:stack/StackSet-SSMQuickSetup" ] }, { "Sid": "StackSetOperations", "Effect": "Allow", "Action": [ "cloudformation:CreateStackSet", "cloudformation:UpdateStackSet", "cloudformation:DeleteStackSet", "cloudformation:DeleteStackInstances", "cloudformation:CreateStackInstances", "cloudformation:StopStackSetOperation" ], "Resource": [ "arn:aws:cloudformation:*:*:stackset/AWS-QuickSetup-JITNA*", "arn:aws:cloudformation:*:*:type/resource/*", "arn:aws:cloudformation:*:*:stackset-target/AWS-QuickSetup-JITNA*:*" ] }, { "Sid": "IamRolesMgmt", "Effect": "Allow", "Action": [ "iam:CreateRole", "iam:DeleteRole", "iam:GetRole", "iam:AttachRolePolicy", "iam:PutRolePolicy", "iam:DetachRolePolicy", "iam:GetRolePolicy", "iam:ListRolePolicies" ], "Resource": [ "arn:aws:iam::*:role/AWS-QuickSetup-JITNA*", "arn:aws:iam::*:role/service-role/AWS-QuickSetup-JITNA*" ] }, { "Sid": "IamPassRole", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::*:role/AWS-QuickSetup-JITNA*", "arn:aws:iam::*:role/service-role/AWS-QuickSetup-JITNA*" ], "Condition": { "StringEquals": { "iam:PassedToService": [ "ssm.amazonaws.com", "ssm-quicksetup.amazonaws.com", "cloudformation.amazonaws.com" ] } } }, { "Sid": "SSMAutomationExecution", "Effect": "Allow", "Action": "ssm:StartAutomationExecution", "Resource": "arn:aws:ssm:region:account id:automation-definition/AWS-EnableExplorer:*" }, { "Sid": "SSMAssociationPermissions", "Effect": "Allow", "Action": [ "ssm:DeleteAssociation", "ssm:CreateAssociation", "ssm:StartAssociationsOnce" ], "Resource": "arn:aws:ssm:region:account id:association/*" }, { "Sid": "SSMResourceDataSync", "Effect": "Allow", "Action": [ "ssm:CreateResourceDataSync", "ssm:UpdateResourceDataSync" ], "Resource": "arn:aws:ssm:region:account-id:resource-data-sync/AWS-QuickSetup-*" }, { "Sid": "ListResourceDataSync", "Effect": "Allow", "Action": [ "ssm:ListResourceDataSync" ], "Resource": "*" }, { "Sid": "CreateServiceLinkedRoles", "Effect": "Allow", "Action": [ "iam:CreateServiceLinkedRole" ], "Condition": { "StringEquals": { "iam:AWSServiceName": [ "accountdiscovery.ssm.amazonaws.com", "ssm.amazonaws.com", "ssm-quicksetup.amazonaws.com", "stacksets.cloudformation.amazonaws.com" ] } }, "Resource": "*" }, { "Sid": "CreateStackSetsServiceLinkedRole", "Effect": "Allow", "Action": [ "iam:CreateServiceLinkedRole" ], "Resource": "arn:aws:iam::*:role/aws-service-role/stacksets.cloudformation.amazonaws.com/AWSServiceRoleForCloudFormationStackSetsOrgAdmin" }, { "Sid": "AllowSsmJitnaPoliciesCrudOperations", "Effect": "Allow", "Action": [ "ssm:CreateDocument", "ssm:UpdateDocument", "ssm:UpdateDocumentDefaultVersion", "ssm:GetDocument", "ssm:DescribeDocument", "ssm:DeleteDocument" ], "Resource": [ "arn:aws:ssm:region:account id:document/SSM-JustInTimeAccessDenyAccessOrgPolicy" ], "Condition": { "StringEquals": { "ssm:DocumentType": [ "AutoApprovalPolicy" ] } } }, { "Sid": "AllowAccessRequestOpsItemOperations", "Effect": "Allow", "Action": [ "ssm:GetOpsItem", "ssm:DescribeOpsItems", "ssm:GetOpsSummary", "ssm:DeleteOpsItem", "ssm:ListOpsItemEvents" ], "Resource": "*" }, { "Sid": "IdentityCenterPermissions", "Effect": "Allow", "Action": [ "sso:DescribeRegisteredRegions", "sso:ListDirectoryAssociations", "identitystore:GetUserId", "identitystore:DescribeUser", "identitystore:DescribeGroup", "identitystore:ListGroupMembershipsForMember" ], "Resource": "*" } ] }
JITNAを構成するためのIAMポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSsmJitnaPoliciesCrudOperations", "Effect": "Allow", "Action": [ "ssm:CreateDocument", "ssm:UpdateDocument", "ssm:UpdateDocumentDefaultVersion", "ssm:GetDocument", "ssm:DescribeDocument", "ssm:DeleteDocument" ], "Resource": [ "arn:aws:ssm:region:account id:document/*" ], "Condition": { "StringEquals": { "ssm:DocumentType": [ "ManualApprovalPolicy", "AutoApprovalPolicy" ] } } }, { "Sid": "AllowSsmJitnaPoliciesListOperations", "Effect": "Allow", "Action": [ "ssm:ListDocuments", "ssm:ListDocumentVersions" ], "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account id:role/SSM-JustInTimeAccessTokenRole", "Condition": { "StringEquals": { "iam:PassedToService": [ "justintimeaccess.ssm.amazonaws.com" ] } } }, { "Sid": "AllowAccessRequestOpsItemOperations", "Effect": "Allow", "Action": [ "ssm:GetOpsItem", "ssm:DescribeOpsItems", "ssm:GetOpsSummary", "ssm:DeleteOpsItem", "ssm:ListOpsItemEvents" ], "Resource": "*" }, { "Sid": "AllowSessionManagerPreferencesOperation", "Effect": "Allow", "Action": [ "ssm:CreateDocument", "ssm:GetDocument", "ssm:DescribeDocument", "ssm:UpdateDocument", "ssm:DeleteDocument" ], "Resource": "arn:aws:ssm:region:account id:document/SSM-SessionManagerRunShell", "Condition": { "StringEquals": { "ssm:DocumentType": "Session" } } }, { "Sid": "AllowSessionManagerOperations", "Effect": "Allow", "Action": [ "ssm:DescribeSessions", "ssm:GetConnectionStatus", "ssm:TerminateSession" ], "Resource": "*" }, { "Sid": "AllowRDPConnectionRecordingOperations", "Effect": "Allow", "Action": [ "ssm-guiconnect:UpdateConnectionRecordingPreferences", "ssm-guiconnect:GetConnectionRecordingPreferences", "ssm-guiconnect:DeleteConnectionRecordingPreferences" ], "Resource": "*" }, { "Sid": "AllowRDPConnectionRecordingKmsOperation", "Effect": "Allow", "Action": [ "kms:CreateGrant" ], "Resource": "arn:aws:kms:region:account id:key/*", "Condition": { "StringEquals": { "aws:ResourceTag/SystemsManagerJustInTimeNodeAccessManaged": "true" }, "StringLike": { "kms:ViaService": "ssm-guiconnect.*.amazonaws.com" }, "Bool": { "aws:ViaAWSService": "true" } } }, { "Sid": "AllowFleetManagerOperations", "Effect": "Allow", "Action": [ "ssm-guiconnect:GetConnection", "ssm-guiconnect:ListConnections" ], "Resource": "*" }, { "Sid": "SNSTopicManagement", "Effect": "Allow", "Action": [ "sns:CreateTopic", "sns:SetTopicAttributes" ], "Resource": [ "arn:aws:sns:region:account id:SSM-JITNA*" ] }, { "Sid": "SNSListTopics", "Effect": "Allow", "Action": [ "sns:ListTopics" ], "Resource": "*" }, { "Sid": "EventBridgeRuleManagement", "Effect": "Allow", "Action": [ "events:PutRule", "events:PutTargets" ], "Resource": [ "arn:aws:events:region:account id:rule/SSM-JITNA*" ] }, { "Sid": "ChatbotSlackManagement", "Effect": "Allow", "Action": [ "chatbot:CreateSlackChannelConfiguration", "chatbot:UpdateSlackChannelConfiguration", "chatbot:DescribeSlackChannelConfigurations", "chatbot:DescribeSlackWorkspaces", "chatbot:DeleteSlackChannelConfiguration", "chatbot:RedeemSlackOauthCode", "chatbot:DeleteSlackWorkspaceAuthorization", "chatbot:GetSlackOauthParameters" ], "Resource": "*" }, { "Sid": "ChatbotTeamsManagement", "Effect": "Allow", "Action": [ "chatbot:ListMicrosoftTeamsChannelConfigurations", "chatbot:CreateMicrosoftTeamsChannelConfiguration", "chatbot:UpdateMicrosoftTeamsChannelConfiguration", "chatbot:ListMicrosoftTeamsConfiguredTeams", "chatbot:DeleteMicrosoftTeamsChannelConfiguration", "chatbot:RedeemMicrosoftTeamsOauthCode", "chatbot:DeleteMicrosoftTeamsConfiguredTeam", "chatbot:GetMicrosoftTeamsOauthParameters", "chatbot:TagResource" ], "Resource": "*" }, { "Sid": "SSMEmailSettings", "Effect": "Allow", "Action": [ "ssm:UpdateServiceSetting", "ssm:GetServiceSetting" ], "Resource": [ "arn:aws:ssm:region:account id:servicesetting/ssm/access-request/email-role-mapping", "arn:aws:ssm:region:account id:servicesetting/ssm/access-request/enabled-email-notifications" ] }, { "Sid": "AllowViewingJitnaCloudWatchMetrics", "Effect": "Allow", "Action": [ "cloudwatch:GetMetricData", "cloudwatch:GetMetricStatistics", "cloudwatch:ListMetrics" ], "Resource": "*", "Condition": { "StringEquals": { "cloudwatch:namespace": "AWS/SSM/JustInTimeAccess" } } }, { "Sid": "QuickSetupConfigurationManagers", "Effect": "Allow", "Action": [ "ssm-quicksetup:ListConfigurationManagers", "ssm-quicksetup:ListConfigurations", "ssm-quicksetup:ListQuickSetupTypes", "ssm-quicksetup:GetConfiguration", "ssm-quicksetup:GetConfigurationManager" ], "Resource": "*" }, { "Sid": "QuickSetupDeployments", "Effect": "Allow", "Action": [ "cloudformation:ListStacks", "cloudformation:DescribeStacks", "organizations:DescribeOrganization", "organizations:ListDelegatedAdministrators" ], "Resource": "*" }, { "Sid": "ManualPolicy", "Effect": "Allow", "Action": [ "sso:DescribeRegisteredRegions", "ssm:GetServiceSetting", "iam:ListRoles" ], "Resource": "*" }, { "Sid": "SessionPreference", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": "*" }, { "Sid": "AllowIamListForKMS", "Effect": "Allow", "Action": [ "iam:ListUsers" ], "Resource": "arn:aws:iam::account id:user/*" }, { "Sid": "KMSPermission", "Effect": "Allow", "Action": [ "kms:TagResource", "kms:ListAliases", "kms:CreateAlias" ], "Resource": "*" }, { "Sid": "KMSCreateKey", "Effect": "Allow", "Action": [ "kms:CreateKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestTag/SystemsManagerJustInTimeNodeAccessManaged": "true" }, "ForAllValues:StringEquals": { "aws:TagKeys": [ "SystemsManagerJustInTimeNodeAccessManaged" ] } } }, { "Sid": "AllowIamRoleForChatbotAction", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::account id:role/role name", "Condition": { "StringEquals": { "iam:PassedToService": [ "chatbot.amazonaws.com" ] } } }, { "Sid": "AllowIamServiceRoleForChat", "Effect": "Allow", "Action": [ "iam:CreateServiceLinkedRole" ], "Resource": "arn:aws:iam::account id:role/aws-service-role/management.chatbot.amazonaws.com/AWSServiceRoleForAWSChatbot" }, { "Sid": "CloudWatchLogs", "Effect": "Allow", "Action": [ "logs:DescribeLogGroups" ], "Resource": "arn:aws:logs:*:account id:log-group::log-stream:" }, { "Sid": "IdentityStorePermissions", "Effect": "Allow", "Action": [ "sso:ListDirectoryAssociations", "identitystore:GetUserId", "sso-directory:SearchUsers", "sso-directory:SearchGroups", "identitystore:DescribeGroup", "identitystore:DescribeUser" ], "Resource": "*" } ] }
SystemsManagerのダッシュボードから、「ジャストインタイムノードアクセス」を選択し、「新しいエクスペリエンスを有効にする」をクリックします
「ノードのインサイトを確認」ダッシュボードがセットアップされます
しばらくすると、右上に「ジャストインタイムノートアクセスを有効にする」ボタンが出てくるのでクリックします
「了承します」ボタンを押下します
「手動承認ポリシーの作成」の画面が出てきたらセットアップ完了です
2.IAMユーザーの設定
JITNAを利用するには、
- 承認者用のIAMロールとポリシー
- アクセスユーザー用のIAMロールとポリシー
が必要です
それぞれのポリシーは以下のとおりです
アクセスリクエスト承認者向けのIAMポリシー
# アクセスリクエスト承認者向けのIAMポリシー { "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": "*" } ] }
ジャストインタイムノードアクセスユーザー向けの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": "*" } ] }
それぞれのロールを作成もしくはポリシーの追加をしておきましょう
3.ノードの承認ポリシーを設定する
次はノードの承認ポリシーを設定します
設定できる項目は
- 承認ポリシーの詳細
- 名前
- (オプション)説明
- アクセス期間(1 時間〜14 日 (336 時間) の間で指定可能)
- ターゲット
- すべてのノードか特定のノードのみかを選択
- アクセスリクエストの承認
- そのレベルに必要な承認数
- 承認者(承認者のIAMロールを選択)
です
アクセスリクエストの承認については、承認レベル・承認数をそれぞれ5つまで設定することが可能です
これは例えるなら稟議を回すのと同じで、「課長レベルの承認をx人分、部長クラスの承認をy人分もらう」みたいなイメージです
今回は以下のような設定をしてみました
3.接続してみる
では、実際にアクセス用のロールを使って、インスタンスに接続をしてみましょう
アクセスリクエスト側の操作
いつも通りSSMの接続を押下すると、
このような感じでリクエストを作成するフォームが出てくるので、欄内に記入して、「リクエスト作成」ボタンを押下します
作成後のコンソールはこんな感じです(承認されていないので、承認ステータスは「保留中の承認」です)
承認者側の操作
今度は承認者側のロールでログインし、Systems ManagerのJITNAのコンソールから「私へのリクエスト」タブを確認します
すると、承認ステータスが「保留中の承認」となっているリクエストがあるため、選択して「承認」ボタンを押下します
今度は承認フォームが出てくるので、「承認」ボタンを押下します
接続確認
再度アクセスリクエスト側のロールでコンソールを確認すると、承認ステータスが「承認済み」になっていることが分かります
この状態になると「セッションを開始」ボタンが押下できるので押下すると…
SSMの接続を開始できました!
以上でSSMのJITNAのセットアップ〜接続までの作業は完了です
まとめ
JITNAは最小権限の原則やコンプライアンス遵守、柔軟な権限付与の点で通常のSSM接続より便利な点が多いです
ただ、最初のセットアップやロールの設定など、通常の設定とは異なる部分や、本稿では書ききれなかったつまづきやすい点も存在するため、設定の際は公式ドキュメント及び子ページを参考にしながら進めてみてください
参考:Systems Manager を使用したジャストインタイムのノード アクセス