Блог Amazon Web Services
Использование Amazon EC2 Instance Connect для доступа к вашим EC2-инстансам по SSH
Оригинал статьи: ссылка (Saloni Sonpal, Senior Product Manager – Amazon EC2, AWS)
В июне 2019 года был выпущен Amazon EC2 Instance Connect, новый способ контроля SSH-доступа к вашим EC2-инстансам с использованием AWS Identity and Access Management (IAM). В этом посте мы рассмотрим его подробнее.
Об Amazon EC2 Instance Connect
В то время как инструменты для внедрения «инфраструктуры как кода» (infrastructure as code, IaC), такие как Chef и Puppet, стали распространённым способом для конфигурации серверов, вам всё ещё может иногда потребоваться доступ к инстансам для более тонкой настройки, проверки системных логов или отладки проблем с приложениями. Самый популярный метод подключения к Linux-серверам – это Secure Shell (SSH). Он был создан в 1995 году и сегодня устанавливается по умолчанию практически в каждом дистрибутиве Linux.
Для индивидуальной авторизации пользователей при доступе по SSH часто используются пары SSH-ключей. В результате организациям приходится хранить, передавать и обслуживать эти ключи, а также управлять доступом к ним.
Кроме того, некоторые организации настраивают бастион-хосты (bastion hosts), которые помогают ограничить доступ по сети к другим серверам благодаря использованию единой точки входа. Они добавляют возможность логирования действий, а также предотвращают неправомерный доступ путём добавления дополнительного сетевого слоя, через который осуществляется SSH-доступ. То есть, другие инстансы доступны для подключения по SSH только из бастион-хоста, а не напрямую. С другой стороны, при использовании бастион-хостов возникают и проблемы, которые необходимо решить. Вам нужно обслуживать установленные SSH-ключи пользователей, осуществлять их ротацию, а также обеспечивать бесперебойную и, что более важно, безопасную работу бастион-хоста.
Amazon EC2 Instance Connect упрощает решение подобных проблем и предоставляет следующие преимущества, чтобы помочь вам улучшить общий уровень безопасности:
- Централизованный контроль доступа – вы получаете централизованный контроль доступа к вашим EC2-инстансам с возможностью настройки на уровне пользователей и инстансов. Благодаря использованию политик и объектов IAM больше нет необходимости управлять SSH-ключами или передавать их для распространения по серверам.
- Недолговечные ключи – SSH-ключи не хранятся на самом инстансе и являются эфемерными по своей природе. Инстанс получает к ним доступ только во время подключения от авторизованного пользователя, что упрощает предоставление и отзыв доступа в реальном времени. Это также позволяет вам избежать использования долговечных ключей. Вместо этого вы генерируете одноразовые SSH-ключи каждый раз, когда авторизованный пользователь инициирует подключение, тем самым избегая необходимости отслеживания и обслуживания ключей.
- Возможности аудита – подключения пользователей с использованием EC2 Instance Connect логируются в AWS CloudTrail, что предоставляет необходимую информацию для аудита запросов на подключение.
- Повсеместный доступ – с EC2 Instance Connect вы можете продолжать использовать ваш существующий SSH-клиент. Кроме того, вы можете подключаться к инстансам с использованием нового веб-клиента, который находится в консоли EC2. Это помогает избежать изменений в пользовательском опыте и необходимости менять ваши рабочие процессы и утилиты.
Как работает EC2 Instance Connect
Когда на инстансе включена функциональность EC2 Instance Connect, демон SSH (sshd) на нём настраивается с использованием особого скрипта AuthorizedKeysCommand. Этот скрипт изменяет AuthorizedKeysCommand так, чтобы во время процесса аутентификации по SSH публичные ключи читались из метаданных инстанса.
Публичные SSH-ключи доступны в метаданных инстанса только для одноразового использования в течение 60 секунд. Для того чтобы успешно подключиться к инстансу, вам необходимо сделать это в течение указанного времени. Так как ключи истекают автоматически, вам не нужно отслеживать их или управлять ими напрямую, как вы делали раньше.
Настройка EC2-инстанса для доступа по EC2 Instance Connect
Чтобы начать использовать EC2 Instance Connect, вам нужно в первую очередь настроить существующие инстансы. В настоящий момент EC2 Instance Connect поддерживает Amazon Linux 2 и Ubuntu. Для включения функциональности установите либо RPM, либо Debian-пакет соответственно. В новых инстансах на основе Amazon Linux 2 функциональность EC2 Instance Connect включена по умолчанию, поэтому вы можете подключиться к ним по SSH сразу без какой-либо дополнительной конфигурации.
Для использования функциональности в существующих инстансах сначала осуществите их настройку. В данном примере мы используем инстанс с Amazon Linux 2, запущенный в вашей учётной записи. Шаги, необходимые для настройки Ubuntu, вы можете найти в документации по ссылке Set Up EC2 Instance Connect.
- Подключитесь к инстансу по SSH. В данном примере он использует сравнительно новую версию Amazon Linux 2:
[ec2-user@ip-10-1-0-15 ~]$ uname -srv Linux 4.14.104-95.84.amzn2.x86_64 #1 SMP Fri Jun 21 12:40:53 UTC 2019
- Используйте команду yum для установки RPM-пакета ec2-instance-connect.
$ sudo yum install ec2-instance-connect Loaded plugins: extras_suggestions, langpacks, priorities, update-motd Resolving Dependencies --> Running transaction check ---> Package ec2-instance-connect.noarch 0:1.1-9.amzn2 will be installed --> Finished Dependency Resolution ........ Installed: ec2-instance-connect.noarch 0:1.1-9.amzn2 Complete!
Этот RPM-пакет произведет локальную установку нескольких скриптов и поменяет настройки AuthorizedKeysCommand и AuthorizedKeysCommandUser в файле /etc/ssh/sshd_config. Если вы используете какой-либо инструмент управления конфигурацией для изменения настроек sshd, то сначала установите пакет, а затем добавьте необходимые строки в конфигурацию, как указано в документации.
После установки ec2-instance-connect вы готовы к настройке пользователей и предоставлению им доступа к инстансам.
Настройка пользователей IAM
Вначале необходимо разрешить пользователю IAM отправлять свои SSH-ключи в EC2 Instance Connect. Для этого создайте политику IAM, чтобы вы затем могли назначать её другим пользователям в вашей учетной записи.
- В консоли IAM выберите пункт меню Policies и нажмите Create Policy.
- На странице Create Policy выберите вкладку JSON и вставьте следующий JSON-документ. Замените $REGION и $ACCOUNTID на соответствующие значения:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2-instance-connect:SendSSHPublicKey" ], "Resource": [ "arn:aws:ec2:$REGION:$ACCOUNTID:instance/*" ], "Condition": { "StringEquals": { "ec2:osuser": "ec2-user" } } } ] }
В качестве значения параметра ec2:osuser введите ec2-user при использовании Amazon Linux 2. Необходимо корректно указать этот параметр, чтобы метаданные были доступны для правильного SSH-пользователя. Более детальную информацию вы можете найти в документации по ссылке Actions, Resources, and Condition Keys for Amazon EC2 Instance Connect Service.
- Нажмите Review Policy.
- На странице Review Policy введите название политики, её описание и нажмите Create Policy.
- После создания политики вы можете назначить её необходимым объектам IAM. Например, создайте новую группу на странице Groups (я назвал мою группу «HostAdmins»).
- На странице Attach Policy во время создания группы выберите только что созданную политику и нажмите Next Step.
- Нажмите Create Group.
- На странице Groups выберите новую группу и нажмите Group Actions, Add Users to Group.
- Выберите одного или нескольких пользователей для добавления в группу и нажмите Add Users.
Теперь ваши пользователи могут использовать EC2 Instance Connect.
Подключение к инстансу с помощью EC2 Instance Connect
После конфигурации инстанса и назначения необходимой политики пользователям, они могут подключиться к инстансам с помощью обычного SSH-клиента, либо напрямую через AWS Management Console.
Чтобы избежать дополнительных шагов при подключении по SSH с использованием EC2 Instance Connect, существует специальная утилита для командной строки. Кроме того, можно воспользоваться веб-интерфейсом в консоли, который осуществляет за вас генерацию и установку SSH-ключа.
Для подключения с использованием SSH-клиента
- Создайте новый приватный и публичный ключи, mynew_key и mynew_key.pub соответственно:
$ ssh-keygen -t rsa -f mynew_key
- Для авторизации пользователя и отправки публичного ключа на EC2-инстанс, используйте AWS CLI и команду send-ssh-public-key. Убедитесь, что вы используете самую новую версию AWS CLI, чтобы эта команда была доступна.
$ aws ec2-instance-connect send-ssh-public-key --region us-east-1 --instance-id i-0989ec3292613a4f9 --availability-zone us-east-1f --instance-os-user ec2-user --ssh-public-key file://mynew_key.pub { "RequestId": "505f8675-710a-11e9-9263-4d440e7745c6", "Success": true }
- После аутентификации публичный ключ доступен для инстанса через его метаданные в течение 60 секунд. За это время подключитесь к инстансу с использованием соответствующего приватного ключа:
$ ssh -i mynew_key ec2-user@ec2-34-204-200-76.compute-1.amazonaws.com
Если по какой-либо причине вы не успеете подключиться за 60 секунд, то увидите следующее сообщение об ошибке:
$ ssh -i mynew_key ec2-user@ec2-34-204-200-76.compute-1.amazonaws.com
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
В таком случае для подключения по SSH снова запустите команду send-ssh-public-key.
Теперь рассмотрим подключение через консоль.
Для подключения из консоли Amazon EC2
- Откройте консоль Amazon EC2.
- В меню слева нажмите Instances, а затем выберите инстанс, к которому необходимо подключиться.
- Нажмите Connect.
- На странице Connect To Your Instance выберите EC2 Instance Connect (browser-based SSH connection), затем нажмите Connect.
Откроется следующее окно терминала. Теперь вы подключены к вашему инстансу по SSH.
Аудит с помощью CloudTrail
Для каждой попытки подключения вы можете увидеть детали соответствующего события. Они включают информацию об ID инстанса, имени пользователя на уровне ОС и публичного ключа. Все эти данные необходимы для подключения по SSH и соответствуют API-вызову SendSSHPublicKey в CloudTrail.
В консоли CloudTrail задайте поиск по событию SendSSHPublicKey.
Если EC2 Instance Connect недавно использовался, то вы увидите записи, соответствующие API-вызовам ваших пользователей для отправки их SSH-ключей на необходимые хосты. Чтобы узнать инстанс, к которому осуществлялось подключение, а также другую полезную для аудита информацию, откройте детали события.
В следующем примере вы можете увидеть JSON-описание события CloudTrail, которое показывает использование команды SendSSHPublicKey:
{
"eventVersion": "1.05",
"userIdentity": {
"type": "User",
"principalId": "1234567890",
"arn": "arn:aws:iam:: 1234567890:$USER",
"accountId": "1234567890",
"accessKeyId": "ABCDEFGHIJK3RFIONTQQ",
"userName": "$ACCOUNT_NAME",
"sessionContext": {
"attributes": {
"mfaAuthenticated": "true",
"creationDate": "2019-05-07T18:35:18Z"
}
}
},
"eventTime": "2019-06-21T13:58:32Z",
"eventSource": "ec2-instance-connect.amazonaws.com",
"eventName": "SendSSHPublicKey",
"awsRegion": "us-east-1",
"sourceIPAddress": "34.204.194.237",
"userAgent": "aws-cli/1.15.61 Python/2.7.16 Linux/4.14.77-70.59.amzn1.x86_64 botocore/1.10.60",
"requestParameters": {
"instanceId": "i-0989ec3292613a4f9",
"osUser": "ec2-user",
"SSHKey": {
"publicKey": "ssh-rsa <removed>\\n"
}
},
"responseElements": null,
"requestID": "df1a5fa5-710a-11e9-9a13-cba345085725",
"eventID": "070c0ca9-5878-4af9-8eca-6be4158359c4",
"eventType": "AwsApiCall",
"recipientAccountId": "1234567890"
}
Если вы настроили сохранение событий CloudTrail из вашей учетной записи в бакет Amazon S3, то вы можете программно скачать эту информацию и провести её аудит. Дополнительную информацию на эту тему вы можете найти в документации по ссылке Getting and Viewing Your CloudTrail Log Files.
Заключение
EC2 Instance Connect предлагает альтернативу стратегиям, включающим сложное управление SSH-ключами, а также предоставляет преимущества встроенного аудита с использованием CloudTrail. Благодаря интеграции с IAM и метаданными инстанса EC2, вы получаете безопасный способ распространения недолговечных SSH-ключей и контроля доступа с использованием политик IAM.
В разработке находятся дополнительные возможности для EC2 Instance Connect. Компания AWS планирует в будущем запустить авторизацию на основе тэгов, что позволит вам использовать тэги внутри условия политики IAM для контроля доступа. Кроме того, планируется по умолчанию включать EC2 Instance Connect в самых популярных дистрибутивах Linux, как это уже сделано в Amazon Linux 2.
EC2 Instance Connect уже доступен без дополнительной оплаты в регионах US East (Ohio и N. Virginia), US West (N. California и Oregon), Asia Pacific (Mumbai, Seoul, Singapore, Sydney и Tokyo), Canada (Central), EU (Frankfurt, Ireland, London, Paris и Stockholm) и South America (São Paulo).