Ведение журнала SSH и управление сеансами с помощью AWS SSM
Опубликовано: 2022-03-11Настройка пользовательских инструментов или сценариев для ведения журнала SSH в Linux может быть утомительной и подверженной ошибкам.
Инженеры могут использовать rooth , screen или другую утилиту для регистрации активности пользователей, но если права пользователя установлены неправильно, опытный пользователь может стереть журналы аудита, чтобы замести следы. Другим вариантом может быть настройка ведения журнала на уровне ядра, но необходимые для этого знания не так уж распространены.
К счастью, есть способ регистрировать активность пользователя без написания даже одной команды Linux! Нам понадобятся эти услуги:
- ЕС2
- IAM (управление идентификацией и доступом)
- KMS (служба управления ключами)
- Журналы CloudWatch (и/или S3)
- AWS Systems Manager (ранее известный как SSM)
Давайте посмотрим, как настроить каждый из них.
EC2 и IAM
Запуск экземпляра EC2 обычно довольно прост, но есть одна ключевая задача, которую необходимо выполнить во время запуска: нам нужно привязать роль IAM к нашему экземпляру, иначе мы не сможем достичь ожидаемых результатов, подробно описанных в конце этого руководства. статья.
Роль IAM, которую мы связываем с нашим инстансом EC2, должна иметь встроенную политику AmazonSSMManagedInstanceCore , а также эту политику (прикрепленную как встроенную или управляемую клиентом):
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:DescribeLogGroups", "logs:PutLogEvents" ], "Effect": "Allow", "Resource": "*" } ] }Помимо роли IAM, мы обычно используем следующую конфигурацию экземпляра EC2:
- Операционная система — Amazon Linux 2, поскольку по умолчанию она поставляется с установленным агентом AWS Systems Manager (агентом SSM). (Так же как и дистрибутивы Ubuntu, которые также являются опцией.)
- Тип экземпляра — t3.micro (но подойдет любой тип).
- Группа безопасности по умолчанию, которую AWS назначает VPC, будет работать, так как нам не нужен открытый порт SSH для этого упражнения.
Мы можем приступить к настройке KMS, не дожидаясь загрузки инстанса EC2.
КМС
Нам нужен ключ KMS, если мы хотим, чтобы все журналы сеансов, доставленные в CloudWatch, хранились в зашифрованном виде. Давайте перейдем к службе KMS и создадим ключ.
Мы рекомендуем назначить администратора, чтобы ключом могли управлять пользователи, отличные от пользователя root учетной записи AWS, но если другим не потребуется доступ, мы можем пропустить шаг 3.
Здесь мы выбрали пользователя IAM «admin» в качестве главного администратора, но мы можем выбрать любого пользователя или роль. Мы также можем отключить разрешение на удаление ключа для администратора.
Мы не будем назначать никаких пользователей этому ключу, потому что мы хотим, чтобы этот ключ использовался только службой журналов CloudWatch для операций шифрования и расшифровки журналов SSH.
На странице обзора нам потребуется изменить политику ключа, сгенерированную KMS, поскольку она не включает разрешения для журналов CloudWatch на использование ключа. Мы заменим его этой политикой:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:user/USERNAME" }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }, { "Sid": "Allow access to CloudWatch Log", "Effect": "Allow", "Principal": { "Service": "logs.REGION.amazonaws.com" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*", "Condition": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:REGION:ACCOUNT_ID:*" } } } ] }Обязательно замените все заполнители:
-
ACCOUNT_IDстановится идентификатором нашей учетной записи AWS. -
USERNAMEстановится именем пользователя администратора, выбранным на шаге 3. Если мы отказались от этого шага, здесь мы удаляем второй блок операторов (тот, что с"Sid": "Allow access for Key Administrators"). -
REGIONстановится кодом регионального идентификатора, в котором мы развертываем сервисы (например,us-west-1).
После этого KMS готов к работе.
Группа журналов CloudWatch
Затем нам нужна группа журналов CloudWatch (и/или корзина S3 — см. ниже), куда агент SSM может отправлять журналы сеансов SSH. Давайте создадим его.
Обратите внимание на поле ARN ключа KMS: AWS предоставляет нам необходимое здесь значение после создания ключа на шаге 5 раздела KMS.
(Если мы не связали правильную политику с нашим ключом KMS ранее, разрешив службе журналов CloudWatch использовать ключ, на этом этапе мы получим сообщение об ошибке, связанное с ключом KMS.)
Хранение журналов SSH в корзине S3
Для хранения журналов активности с помощью S3 вместо журналов CloudWatch или в дополнение к ним нам необходимо добавить эти разрешения в наш профиль экземпляра EC2 в виде отдельной политики (или вручную объединить их с другими разрешениями, которые нам могут понадобиться):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::BUCKET_NAME/*" }, { "Effect": "Allow", "Action": [ "s3:GetEncryptionConfiguration" ], "Resource": "*" }, { "Effect": "Allow", "Action": "kms:GenerateDataKey", "Resource": "*" } ] } В приведенном выше фрагменте обязательно замените заполнитель BUCKET_NAME .
Теперь, когда мы настроили место для хранения журналов — журналы CloudWatch, корзину S3 или и то, и другое — мы готовы подключиться к сеансам SSH.
Диспетчер сеансов AWS Systems Manager
Это последний ключевой шаг, на котором мы настраиваем безопасный доступ к нашей машине Linux для мониторинга и ведения журнала сеансов SSH. Мы начнем с панели управления Session Manager.

На панели инструментов нажмите белую кнопку «Настроить настройки» в правом верхнем углу «Начать сеанс», чтобы включить ведение журнала сеанса.
На странице настроек мы найдем несколько разделов, которые мы могли бы изучить, но наше внимание будет сосредоточено на потоковой передаче журналов сеансов SSH в CloudWatch или S3, чтобы мы могли быстро увидеть, что происходит на нашем компьютере с Linux.
Сразу после раздела «Ведение журнала CloudWatch» есть раздел «Ведение журнала S3», где мы можем выбрать корзину.
После того, как ведение журнала SSH настроено, мы можем подключиться по SSH к нашей машине с Linux и выполнить некоторые команды, чтобы увидеть, фиксируется ли активность или нет.
Итак, начинаем сеанс. На той же странице мы найдем вкладку «Сеансы», где мы можем начать сеанс. Нажав кнопку «Начать сеанс», мы получим список машин EC2, на которых мы можем инициировать сеанс:
Если мы не видим наш инстанс EC2 Linux в списке, мы должны проверить, находится ли он в рабочем состоянии и есть ли связанные с ним разрешения IAM, которые мы описали ранее.
Обработка ошибки агента SSM «Не поддерживает журналы потоковой передачи»
Если мы получим сообщение об ошибке, в котором говорится, что версия агента SSM, установленная на нашем компьютере EC2, не поддерживает потоковую передачу журналов CloudWatch, не беспокойтесь. Есть безболезненный способ исправить это.
Чтобы обновить агент SSM, нам нужно перейти к команде «Выполнить» на левой панели сервиса AWS Systems Manager .
Оказавшись там, мы можем нажать оранжевую кнопку «Выполнить команду», что приведет к новой странице, где мы можем заполнить некоторые параметры.
Мы начнем с выбора AWS-UpdateSSMAgent из списка.
Как только это будет выбрано, мы будем прокручивать вниз, пока не увидим раздел «Цели». Там нам нужно выбрать экземпляр EC2, на котором мы хотим обновить агент SSM, а затем нажать кнопку «Выполнить» в конце. Это отправит нас на страницу, где мы сможем следить за ходом обновления.
Обновление агента не должно занимать более пяти минут. Как только это будет сделано, мы сможем создать сеанс обратно в диспетчере сеансов.
На этом этапе у нас должен быть запущен сеанс SSH.
Выполнив несколько команд, давайте перейдем к группе журналов CloudWatch Logs (или нашей корзине S3, не показана) и подтвердим, что активность записывается.
Теперь у нас есть установка с включенным шифрованием в состоянии покоя, которая записывает каждую команду, запущенную на нашем компьютере с Linux.
На самом деле каждая команда может быть больше, чем мы хотим: любые секреты, предоставленные или сгенерированные во время сеанса, будут записаны в CloudWatch или S3, и их сможет увидеть любой, у кого есть необходимые разрешения. Чтобы предотвратить это, мы можем использовать stty -echo; read passwd; stty echo; stty -echo; read passwd; stty echo; для каждого секрета, который мы должны предоставить во время сеанса.
Отличное решение для ведения журналов SSM/SSH AWS с небольшими оговорками
Диспетчер сеансов — это полезный инструмент для получения удаленного доступа к нашим виртуальным машинам в AWS без необходимости открывать порт 22. Фактически, мы не можем генерировать журналы SSH таким образом, если мы используем переадресацию портов или прямое соединение SSH, поскольку диспетчер сеансов примечания к документации.
Тем не менее, сочетание Session Manager с ведением журнала сеансов является надежным решением для контроля и мониторинга активности внутри виртуальных машин. Кроме того, с нас не взимается плата за использование службы Session Manager. Мы платим только за инстанс EC2 и журналы CloudWatch или корзину S3 для хранения журналов.
Для читателей, предпочитающих видеоуроки, я более подробно описал очень похожую процедуру на YouTube.
Дальнейшее чтение в блоге Toptal Engineering:
- Практический пример: почему я использую облачную инфраструктуру AWS для своих продуктов
