Блог Amazon Web Services

Ограничение разрешённых команд в интерактивных сессиях AWS Systems Manager по группам пользователей

Зарегистрируйтесь, чтобы получать приглашения на мероприятия AWS на русском языке.

Оригинал статьи: ссылка (Adam Spicer, Senior Migration Delivery Consultant)

Часто наши клиенты хотят ограничить команды, которые можно запускать на инстансах Amazon Elastic Compute Cloud (Amazon EC2) при подключении к ним с использованием интерактивных сессий AWS Systems Manager Session Manager. При этом разрешённые команды должны отличаться для разных групп пользователей. Например, группа инженеров технической поддержки должна иметь возможность чтения лог-файлов или доступа к каким-либо специальным инструментам, в то время как инфраструктурной команде должна быть доступна функциональность обновления установленных в системе пакетов. В этой статье мы продемонстрируем, как можно настроить эти две группы пользователей так, чтобы разрешить им выполнение разных наборов команд в AWS Systems Manager Session Manager.

Обзор решения

Session Manager позволяет создавать сессии для доступа к вашим инстансам и выполнять в них интерактивные команды. Он использует SSM-документы в формате runbook для определения списка таких команд. Вы можете выбрать один из SSM-документов, созданных AWS, а также создать свои собственные документы. Например, чтобы разрешить пользователям выполнять любые команды на инстансах, вы можете взять документ AWS-StartInteractiveCommand, созданный AWS. Этот SSM-документ получает команду в качестве параметра, а затем запускает её на инстансе. Для управления разрешёнными командами вам нужно создать свой SSM-документ и задать в нём параметр allowedPattern, в котором должно содержаться регулярное выражение, на соответствие которому будут проверяться выполняемые команды. Если команда не подходит под регулярное выражение, она не будет запущена. Затем с помощью IAM вы можете определить, кто сможет запускать какие документы.

Шаг 1: Создайте два SSM-документа

Начните с создания двух документов. Первый документ будет разрешать только доступ для чтения, который можно будет использовать для исследование логов на ваших инстансах.

  1. В консоли AWS Systems Manager выберите пункт меню Documents.
  2. Нажмите кнопку Create command or session.
  3. Используйте следующие настройки при создании документа.
    1. В поле Name введите SSM-StartReadOnlyInteractiveCommand.
    2. В поле Document Type выберите Session document.
    3. В поле 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, приведённые выше, но используйте следующие значения:

  • В поле Name введите SSM-StartUpdatePackagesInteractiveCommand.
  • В поле Document Type выберите Session document.
  • В поле 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 и регулярное выражение allowedPattern, которые разрешают только определённый набор команд.

Шаг 2: Создайте политики IAM и примените их к пользователям

Теперь создайте политику IAM, которая определяет, кто может использовать эти документы, а также запрещает этим пользователям использовать любые другие документы, включая стандартный документ для неограниченной сессии. Вам нужно будет создать две политики IAM, которые ограничат используемые команды.

Первая политика позволяет пользователям запускать только документ SSM-StartReadOnlyInteractiveCommand на всех инстансах в аккаунте AWS.

  1. В консоли AWS Identity and Access Management выберите Policies.
  2. Нажмите кнопку Create policy.
  3. Скопируйте текст политики ниже и вставьте его на вкладке JSON. Поменяйте ID аккаунта и, при необходимости, укажите конкретный регион в ARN.
    {
       "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 на всех инстансах в аккаунте. Выполните те же шаги, но на этот раз скопируйте политику из текста ниже. Аналогично, поменяйте ID аккаунта и, при необходимости, укажите конкретный регион в ARN.

{
   "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"
            }
         }
      }
   ]
}

Если потребуется, вы можете ещё сильнее ограничить политики, указав ограниченный список инстансов. Поле ssm:SessionDocumentAccessCheck добавлено, чтобы убедиться, что у пользователя есть явно заданный доступ к документу сессии.

Шаг 3: Выполните команды в AWS CLI

После назначения политик доступа вашим пользователям они смогут создавать интерактивные сессии в AWS Systems Manager Session Manager. Запуск команд через интерфейс командной строки AWS (AWS CLI) будет производиться на определённом инстансе, а также потребует название документа. Сама запускаемая команда передаётся в качестве параметра документа.

Следующие две команды показывают, как оба новых документа можно использовать в AWS CLI. Для их запуска убедитесь, что вы установили плагин Session Manager для 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"

Заключение

В этой статье мы показали, как вы можете создавать документы AWS Systems Manager, разрешающие выполнение только определённых интерактивных команд на ваших инстансах. Вы можете воспользоваться таким же подходом для назначения разных уровней доступа техническим командам в рамках ваших практик DevOps, чтобы следовать принципу наименьших привилегий.