Блог 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.

  1. Подключитесь к инстансу по 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
    
  2. Используйте команду 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, чтобы вы затем могли назначать её другим пользователям в вашей учетной записи.

  1. В консоли IAM выберите пункт меню Policies и нажмите Create Policy.
  2. На странице 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.

  1. Нажмите Review Policy.
  2. На странице Review Policy введите название политики, её описание и нажмите Create Policy.
  3. После создания политики вы можете назначить её необходимым объектам IAM. Например, создайте новую группу на странице Groups (я назвал мою группу «HostAdmins»).
  4. На странице Attach Policy во время создания группы выберите только что созданную политику и нажмите Next Step.
  5. Нажмите Create Group.
  6. На странице Groups выберите новую группу и нажмите Group Actions, Add Users to Group.
  7. Выберите одного или нескольких пользователей для добавления в группу и нажмите Add Users.

Теперь ваши пользователи могут использовать EC2 Instance Connect.

Подключение к инстансу с помощью EC2 Instance Connect

После конфигурации инстанса и назначения необходимой политики пользователям, они могут подключиться к инстансам с помощью обычного SSH-клиента, либо напрямую через AWS Management Console.

Чтобы избежать дополнительных шагов при подключении по SSH с использованием EC2 Instance Connect, существует специальная утилита для командной строки. Кроме того, можно воспользоваться веб-интерфейсом в консоли, который осуществляет за вас генерацию и установку SSH-ключа.

Для подключения с использованием SSH-клиента

  1. Создайте новый приватный и публичный ключи, mynew_key и mynew_key.pub соответственно:
    $ ssh-keygen -t rsa -f mynew_key
    
  2. Для авторизации пользователя и отправки публичного ключа на 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
    }
    
  3. После аутентификации публичный ключ доступен для инстанса через его метаданные в течение 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

  1. Откройте консоль Amazon EC2.
  2. В меню слева нажмите Instances, а затем выберите инстанс, к которому необходимо подключиться.
  3. Нажмите Connect.
  4. На странице 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).