亚马逊AWS官方博客

使用 AWS Systems Manager 按用户组限制交互式会话命令

去限制使用AWS Systems Manager Session Manager交互式会话时可以在其Amazon Elastic Compute Cloud(Amazon EC2)实例上运行的命令类型。允许的命令因组而异,这意味着您需要根据用户组允许不同的命令集。例如,一组工程师可能需要只读访问某些日志文件或工具,而另一组工程师可能需要访问权限才能在操作系统中执行程序包更新。在本文中,我将演示两组用户如何通过AWS Systems Manager Session Manager来执行不同的命令集。

解决方案概述

会话管理器使您可以在实例上启动会话并发出交互式命令。会话管理器使用Runbook样式的SSM文档集来定义这些命令。您可以使用AWS提供的SSM文档或创建自己的文档。例如,您可以使用AWS提供的AWS-StartInteractiveCommand文档来允许用户在其实例上发出任何命令。该文档通过将命令作为参数然后执行实例上提供的命令来执行此操作。要控制可以执行哪些命令,请创建一个自定义SSM文档,并将其与allowedPattern文档参数耦合,以定义一个正则表达式,该正则表达式可根据预定义的正则表达式模式来验证命令参数。如果命令与允许的模式不匹配,则执行将无法启动。通过使用IAM策略,您可以控制谁可以执行每个文档

1建两个SSM文档

首先创建两个文档。第一个文档允许只读访问权限来调查实例上的日志。

1.     在AWS Systems Manager控制台中,选择Documents。

2.     选择Create Command or Session。

3.     使用以下内容创建文档。

a.     对于”Name”,输入SSM-StartReadOnlyInteractiveCommand。

b.     对于“Document Type”,选择“会话文档”。

c.     对于”Content”,复制并粘贴以下内容:

schemaVersion: '1.0'
description: Document to run single interactive command on an instance
sessionType: InteractiveCommands
parameters:
  command:
    type: String
    description: The command to run on the instance. Allows ls, cat, less, tail -f on .log files
    allowedPattern: ^(ls(\s[\s\w\/-]+)?)|((cat |less |tail -f )([\s\w\/-]+\.log))$
properties:
  windows:
    commands: '{{command}}'
    runAsElevated: false
  linux:
    commands: '{{command}}'
    runAsElevated: false

接下来,创建第二个文档,该文档允许用户交互式地更新您实例上的包。请按照步骤1-3创建文档,但是使用以下值:

a.     对于”Name”,请输入SSM-StartUpdatePackagesInteractiveCommand。

b.     对于“Document Type”,选择“Session Document”。

c.     对于”Content”,复制并粘贴以下内容:

schemaVersion: '1.0'
description: Document to run single interactive command on an instance
sessionType: InteractiveCommands
parameters:
  command:
    type: String
    description: The command to run on the instance
    allowedPattern: ^(sudo yum (update|upgrade))|(sudo yum install [\w\d-]+)|(sudo yum downgrade [\w\d-]+)$
properties:
  windows:
    commands: '{{command}}'
    runAsElevated: false
  linux:
    commands: '{{command}}'
    runAsElevated: false

现在,这两个文档提供了可以在您的实例上运行的特定命令。每个文档都有一个名为command的参数和一个allowPattern正则表达式,该正则表达式仅允许指定一组特定的命令。

2IAM策略并将其用到您的用

现在,创建一个IAM策略,该策略指定谁可以使用这些文档,并阻止那些用户执行任何其他文档,包括默认的会话文档。您将在IAM中创建两个策略,这些策略可用于将主体限制为仅执行指定的文档。

第一个策略允许用户仅对您帐户中的所有实例执行SSM-StartReadOnlyInteractiveCommand文档。

1.     在AWS Identity and Access Management控制台中,选择“Policies”。

2.     选择”Create Policy”。

3.     在JSON标签中,复制并粘贴以下策略。相应地更新ARN帐户ID,分区和区域。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Sid":"AllowStartReadOnlyInteractiveCommandAllInstances",
         "Effect":"Allow",
         "Action":"ssm:StartSession",
         "Resource":[
            "arn:aws:ssm:*:111122223333:document/SSM-StartReadOnlyInteractiveCommand",
            "arn:aws:ec2:*:111122223333:instance/*"
         ],
         "Condition":{
            "BoolIfExists":{
               "ssm:SessionDocumentAccessCheck":"true"
            }
         }
      }
   ]
}

4. 选择查”Review Policy”。

5. 输入名称,然后创建策略。

接下来,创建第二个策略,该策略允许用户仅对您帐户中的所有实例执行SSM-StartUpdatePackagesInteractiveCommand文档。请按照前面的步骤创建策略,但是将以下策略复制并粘贴到JSON选项卡中。再次,相应地更新ARN帐户ID,分区和区域。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Sid":"AllowStartUpdatePackagesInteractiveCommandAllInstances",
         "Effect":"Allow",
         "Action":"ssm:StartSession",
         "Resource":[
            "arn:aws:ssm:*:111122223333:document/SSM-StartUpdatePackagesInteractiveCommand",
            "arn:aws:ec2:*:111122223333:instance/*"
         ],
         "Condition":{
            "BoolIfExists":{
               "ssm:SessionDocumentAccessCheck":"true"
            }
         }
      }
   ]
}

3:从AWS CLI行命令从AWS CLI执行命令。

aws ssm start-session --target <instance-id-here> --document-name SSM-StartUpdatePackagesInteractiveCommand --parameters command="sudo yum upgrade"
aws ssm start-session --target <instance-id-here> --document-name SSM-StartReadOnlyInteractiveCommand --parameters command="ls -al app/logs"

本篇作者

徐欣蕾

Amazon Web Services公司专业服务团队顾问。