Итак, следуя рекомендациям по безопасности, вы настраиваете свой экземпляр RDS, Elasticache или EC2 в частной подсети. Следующий вопрос заключается в том, как подключиться к ресурсу с вашего локального компьютера для отладки или из конвейера CI/CD для миграции и развертывания.

В первой части этой статьи я опишу стандартный подход к подключению к скрытым от Интернета ресурсам в частных подсетях. Я не буду вдаваться в подробности ручной настройки, так как во второй части я представлю инструмент командной строки, который автоматизирует рутину за вас и максимально удешевит решение.

Хозяева бастиона

Одним из наиболее часто используемых подходов для подключения к базе данных или любому другому ресурсу в частной подсети AWS является настройка экземпляра bastion EC2 в той же сети, что и целевой ресурс, но в общедоступной подсети. Таким образом, вы делаете хост-бастион доступным из Интернета, а целевой ресурс доступен только с хоста-бастиона. Бастион становится единственной точкой входа в Интернет для ваших скрытых ресурсов. Он также контролирует доступ к вашим ресурсам, обрабатывая аутентификацию и авторизацию входящего соединения.

Туннелирование SSH и AWS Session Manager

Итак, как вы подключаетесь к своей базе данных через хост-бастион? Есть несколько способов сделать это: туннелирование SSH и переадресация портов с помощью AWS Session Manager. Оба этих подхода означают, что ваша скрытая цель доступна на вашем localhost путем перенаправления трафика с порта на вашей локальной машине на цель через хост-бастион. Использование туннелирования SSH подразумевает управление ключами SSH и раскрытие портов на вашем хосте-бастионе. Зачем вам возиться с SSH, если вы используете AWS? В AWS аутентификация и авторизация могут быть делегированы IAM.

AWS Session Manager (который является частью AWS Systems Manager) позволяет устанавливать безопасные сеансы переадресации портов, даже не открывая ваш хост-бастион Интернету. Вся связь осуществляется через черный ход диспетчера сеансов. Systems Manager является частью AWS CLI, поэтому единственное, что требуется для его использования, — это правильно настроенный набор инструментов AWS на вашем компьютере. Еще одним преимуществом использования Session Manager является возможность аудита доступа, что полезно в группах и организациях. Это достигается за счет сохранения истории всех подключений, выполненных через хост-бастион.

Недостатки ручного управления бастионным хостом

У этого подхода также есть некоторые недостатки. Во-первых, стоимость решения. Вы должны платить за хост-бастион, работающий 24/7, или управлять его состоянием вручную, останавливая его, когда он не нужен. Последний подход работает только до тех пор, пока вы не увидите счет от AWS и не поймете, что однажды забыли выключить инстанс. Другим недостатком является обновление программного обеспечения, которое вам придется делать регулярно и, скорее всего, вручную, чтобы обеспечить безопасность вашего хоста-бастиона.

Автоматизируйте управление бастионами с помощью Basti

Представляем Basti, инструмент CLI с открытым исходным кодом, который автоматически настраивает хост-бастион, останавливает его, когда он не используется, обрабатывает обновления программного обеспечения для обеспечения безопасности экземпляра-бастиона и предоставляет простой в использовании интерфейс CLI, который позволяет вам подключиться к вашей цели с помощью одной команды с вашего локального компьютера или конвейера CI/CD.

В этом примере мы будем использовать экземпляр PostgreSQL RDS в качестве цели подключения. Однако вы также можете подключиться к RDS MySQL, Aurora, Elasticache или любому частному экземпляру EC2, следуя тому же набору инструкций.

Предпосылки

  1. Убедитесь, что учетные данные AWS правильно настроены на вашем компьютере. Basti не использует интерфейс командной строки AWS, но поддерживает все его методы настройки, включая учетные данные, настроенные с помощью команды aws configure. В целом, вы должны ожидать, что Basti будет работать, если AWS CLI работает в вашем терминале.
  2. Установить Basti с помощью NPM. Другие способы установки появятся в ближайшее время.
npm install -g basti

Инициализируйте свой бастион

Теперь используйте команду basti init, чтобы настроить экземпляр бастиона EC2 и настроить цель подключения (в данном случае экземпляр RDS), чтобы принимать соединения с хоста-бастиона. Вам нужно запустить эту команду только один раз. Команда является интерактивной, поэтому вам будет предложено ввести все необходимые данные по пути.

Сначала выберите экземпляр RDS из списка возможных целей подключения, обнаруженных в вашей учетной записи.

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

Басти придумает за вас все остальное и закончит настройку инфраструктуры.

Подключиться к своей цели

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

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

Подключиться к пользовательской цели

С помощью Basti вы также можете подключиться к специальной службе, работающей на экземпляре EC2. Этот метод можно использовать для подключения к цели, для которой Basti еще не предоставляет первоклассную поддержку.

Чтобы инициализировать пользовательскую цель, выберите «Пользовательская» в качестве цели в команде basti init. Вам будет предложено указать VPC вашей цели и общедоступную подсеть для создания экземпляра бастиона. Когда экземпляр бастиона настроен, его можно использовать для доступа к любой цели в выбранном VPC. Вам просто нужно убедиться, что цель доступна из экземпляра бастиона, добавив входящее правило в группу безопасности цели.

Чтобы подключиться к пользовательской цели, выберите «Пользовательская» в качестве цели в команде basti connect. Вам будет предложено ввести целевой VPC, адрес и порт. Как обычно, вы выберете локальный порт, на котором будет отображаться ваша цель.

Basti в конвейере CI/CD

С Basti вы также можете подключиться к своей цели из конвейера автоматизации, который работает за пределами вашего VPC (например, в GitHub Actions, CircleCI или GitLab).

Все команды Basti поддерживают автоматический (неинтерактивный) режим, в котором вы можете передавать все входные данные в качестве аргументов командной строки.

# Initialization
basti init --rds-instance <your-instance-id> --bastion-subnet <your-subnet-id> 

# Connection
basti connect --rds-instance <your-instance-id> --local-port <your-port>

# Cleanup
basti cleanup -y

Поздравляем!

Теперь ваше соединение безопасно и экономично 🔒 🎉

Не забудьте поставить 👏 эту статью, если она оказалась вам полезной, и ⭐️ Басти, если она немного облегчила жизнь вашему разработчику!

Я подумываю о создании следующей статьи о разработке Basti и деталях его реализации. Пишите в комментариях, если вам интересна эта тема!