步骤 5: (可选)限制对会话中命令的访问 - AWS Systems Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

步骤 5: (可选)限制对会话中命令的访问

您可以限制用户可以在会话 Management 会话中运行的命令,方法是创建自定义的Session键入 SSM 文档。在文档内容中,您可以定义用户启动会话时运行哪个命令以及用户可以向命令提供哪些参数。这些命令也称为交互式命令。这些区域有:Session文档schemaVersion必须是 1.0,并且sessionType的文档必须是InteractiveCommands。然后,您可以创建 AWS Identity and Access Management (IAM) 策略,以仅允许用户访问Session您定义的文档。有关使用 IAM 策略限制对会话中命令的访问的更多信息,请参阅交互式命令的 IAM 策略示例

用户在 start-session 命令的 --document-name 选项中指定允许的文档,并在 --parameters 选项中为命令提供任何必要的参数值。有关运行交互式命令的更多信息,请参阅启动会话(交互式命令)

以下过程介绍如何创建自定义Session类型 SSM 文档,用于定义允许用户运行的命令。

限制对会话中命令的访问(控制台)

限制用户可以在会话管理器会话中运行的命令(控制台)

  1. 以下网址打开 AWS Systems Manager 控制台:https://console.aws.amazon.com/systems-manager/

  2. 在导航窗格中,选择 Documents

  3. 选择 Create command or session (创建命令或会话)

  4. 适用于名称中,输入文档的描述性名称。

  5. 对于 Document type (文档类型),选择 Session document (会话文档)

  6. 输入文档内容,用来定义用户可以使用 JSON 或 YAML 在会话管理器会话中运行的命令,如以下示例所示。

    YAML
    --- schemaVersion: '1.0' description: Document to view a log file on a Linux instance sessionType: InteractiveCommands parameters: logpath: type: String description: The log file path to read. default: "/var/log/amazon/ssm/amazon-ssm-agent.log" allowedPattern: "^[a-zA-Z0-9-_/]+(.log)$" properties: linux: commands: "tail -f {{ logpath }}" runAsElevated: true
    JSON
    { "schemaVersion": "1.0", "description": "Document to view a log file on a Linux instance", "sessionType": "InteractiveCommands", "parameters": { "logpath": { "type": "String", "description": "The log file path to read.", "default": "/var/log/amazon/ssm/amazon-ssm-agent.log", "allowedPattern": "^[a-zA-Z0-9-_/]+(.log)$" } }, "properties": { "linux": { "commands": "tail -f {{ logpath }}", "runAsElevated": true } } }
  7. 选择创建文档

限制对会话中命令的访问(命令行)

开始前的准备工作

如果您尚未完成,请安装和配置 AWS Command Line Interface (AWS CLI) 或适用于 PowerShell 的 AWS 工具。想要了解有关信息,请参阅安装或升级 AWS 命令行工具

限制用户可以在会话管理器会话中运行的命令(命令行)

  1. 为文档内容创建 JSON 或 YAML 文件,用来定义用户可在会话管理器会话中运行的命令,如以下示例所示。

    YAML
    --- schemaVersion: '1.0' description: Document to view a log file on a Linux instance sessionType: InteractiveCommands parameters: logpath: type: String description: The log file path to read. default: "/var/log/amazon/ssm/amazon-ssm-agent.log" allowedPattern: "^[a-zA-Z0-9-_/]+(.log)$" properties: linux: commands: "tail -f {{ logpath }}" runAsElevated: true
    JSON
    { "schemaVersion": "1.0", "description": "Document to view a log file on a Linux instance", "sessionType": "InteractiveCommands", "parameters": { "logpath": { "type": "String", "description": "The log file path to read.", "default": "/var/log/amazon/ssm/amazon-ssm-agent.log", "allowedPattern": "^[a-zA-Z0-9-_/]+(.log)$" } }, "properties": { "linux": { "commands": "tail -f {{ logpath }}", "runAsElevated": true } } }
  2. 运行以下命令,使用您的内容创建 SSM 文档,该内容定义了用户可以在会话管理器会话中运行的命令。

    Linux & macOS
    aws ssm create-document \ --content file://path/to/file/documentContent.json \ --name "exampleAllowedSessionDocument" \ --document-type "Session"
    Windows
    aws ssm create-document ^ --content file://C:\path\to\file\documentContent.json ^ --name "exampleAllowedSessionDocument" ^ --document-type "Session"
    PowerShell
    $json = Get-Content -Path "C:\path\to\file\documentContent.json" | Out-String New-SSMDocument ` -Content $json ` -Name "exampleAllowedSessionDocument" ` -DocumentType "Session"

交互式命令参数和 AWS CLI

在使用 AWS CLI 时,您可以通过多种方式提供交互式命令参数。根据您用于通过 AWS CLI 连接到实例的客户端计算机的操作系统 (OS),您为包含特殊字符或转义字符的命令提供的语法可能会有所不同。以下示例展示了在使用 AWS CLI 时可以提供命令参数的一些不同方法,以及如何处理特殊字符或转义字符。

存储在参数存储中的参数可以在 AWS CLI 中为您的命令参数引用,如以下示例所示。

Linux & macOS
aws ssm start-session \ --target instance-id \ --document-name MyInteractiveCommandDocument \ --parameters '{"command":["{{ssm:mycommand}}"]}'
Windows
aws ssm start-session ^ --target instance-id ^ --document-name MyInteractiveCommandDocument ^ --parameters '{"command":["{{ssm:mycommand}}"]}'

以下示例演示如何将简写语法与 AWS CLI 一起使用来传递参数。

Linux & macOS
aws ssm start-session \ --target instance-id \ --document-name MyInteractiveCommandDocument \ --parameters command="ifconfig"
Windows
aws ssm start-session ^ --target instance-id ^ --document-name MyInteractiveCommandDocument ^ --parameters command="ipconfig"

您还可以在 JSON 中提供参数,如以下示例所示。

Linux & macOS
aws ssm start-session \ --target instance-id \ --document-name MyInteractiveCommandDocument \ --parameters '{"command":["ifconfig"]}'
Windows
aws ssm start-session ^ --target instance-id ^ --document-name MyInteractiveCommandDocument ^ --parameters '{"command":["ipconfig"]}'

参数还可以存储在 JSON 文件中并提供给 AWS CLI,如以下示例所示。有关从文件中使用 AWS CLI 参数的更多信息,请参阅从文件加载 AWS CLI 参数中的AWS 命令行界面用户指南

{ "command": [ "my command" ] }
Linux & macOS
aws ssm start-session \ --target instance-id \ --document-name MyInteractiveCommandDocument \ --parameters file://complete/path/to/file/parameters.json
Windows
aws ssm start-session ^ --target instance-id ^ --document-name MyInteractiveCommandDocument ^ --parameters file://complete/path/to/file/parameters.json

如下例所示,您在 JSON 输入文件中还可以生成 AWS CLI 框架。有关从 JSON 输入文件生成 AWS CLI 骨架的更多信息,请参阅从 JSON 或 YAML 输入文件生成 AWS CLI 骨架和输入参数中的AWS 命令行界面用户指南

{ "Target": "instance-id", "DocumentName": "MyInteractiveCommandDocument", "Parameters": { "command": [ "my command" ] } }
Linux & macOS
aws ssm start-session \ --cli-input-json file://complete/path/to/file/parameters.json
Windows
aws ssm start-session ^ --cli-input-json file://complete/path/to/file/parameters.json

要转义引号内的字符,必须向转义字符添加其他反斜杠,如以下示例所示。

Linux & macOS
aws ssm start-session \ --target instance-id \ --document-name MyInteractiveCommandDocument \ --parameters '{"command":["printf \"abc\\\\tdef\""]}'
Windows
aws ssm start-session ^ --target instance-id ^ --document-name MyInteractiveCommandDocument ^ --parameters '{"command":["printf \"abc\\\\tdef\""]}'

有关在 AWS CLI 中将引号与命令参数结合使用的信息,请参阅在 AWS CLI 中将引号和字符串结合使用中的AWS 命令行界面用户指南

交互式命令的 IAM 策略示例

您可以创建 IAM 策略以仅允许用户访问Session您定义的文档。这将用户可以在会话管理器会话中运行的命令限制为仅在自定义Session键入 SSM 文档。

允许用户在单个实例上运行交互式命令
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"ssm:StartSession", "Resource":[ "arn:aws:ec2:region:987654321098:instance/i-02573cafcfEXAMPLE", "arn:aws:ssm:region:987654321098:document/exampleAllowedSessionDocument" ], "Condition":{ "BoolIfExists":{ "ssm:SessionDocumentAccessCheck":"true" } } } ] }
允许用户在所有实例上运行交互式命令
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"ssm:StartSession", "Resource":[ "arn:aws:ec2:us-west-2:987654321098:instance/*", "arn:aws:ssm:us-west-2:987654321098:document/exampleAllowedSessionDocument" ], "Condition":{ "BoolIfExists":{ "ssm:SessionDocumentAccessCheck":"true" } } } ] }
允许用户在所有实例上运行多个交互式命令
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"ssm:StartSession", "Resource":[ "arn:aws:ec2:us-west-2:987654321098:instance/*", "arn:aws:ssm:us-west-2:987654321098:document/exampleAllowedSessionDocument", "arn:aws:ssm:us-west-2:987654321098:document/exampleAllowedSessionDocument2" ], "Condition":{ "BoolIfExists":{ "ssm:SessionDocumentAccessCheck":"true" } } } ] }