SSH-туннелирование в AWS EC2 и подключение к DocumentDB с помощью Python
15 марта 2024 г.Зачем нужен SSH-туннель в AWS EC2?
Прежде чем я расскажу вам, зачем это нужно, я хотел бы рассказать, почему мне пришлось это сделать. Ответ прост: локально тестировать что-то в нашей базе кода ML.
Теперь, зачем это нужно:
Amazon DocumentDB — это управляемая служба баз данных, разработанная с учетом требований безопасности. Это просто означает, что база данных размещается конфиденциально в так называемом виртуальном частном облаке Amazon (Amazon VPC). Проще говоря, мне нравится думать об этом как о собственном частном Интернете Amazon. Таким образом, к DocumentDB может получить прямой доступ любой сервис AWS в том же VPC или любой другой с необходимыми разрешениями.
Туннелирование SSH необходимо, когда мы хотим получить доступ к ресурсам DocumentDB из-за пределов VPC кластера, здесь, на нашем локальном компьютере. Чтобы получить доступ к DocumentDB с вашего локального компьютера, вам обычно необходимо пройти через хост-бастион (экземпляр EC2) с использованием SSH. Этот дополнительный уровень безопасности гарантирует, что ваше соединение с базой данных не будет напрямую подключено к Интернету, что снижает риск несанкционированного доступа.
Что такое SSH-туннелирование?
Туннелирование SSH, также известное как «переадресация портов», — это метод, используемый для защиты и шифрования связи между двумя компьютерными системами через незащищенную сеть, например Интернет. Он предполагает создание безопасного канала (туннеля), по которому данные могут передаваться между локальной и удаленной машиной.
Проще говоря, это установка VPN. В нашем контексте:
- На локальном компьютере выполняется ваш скрипт Python.
- Удаленный компьютер — это экземпляр EC2 в вашей среде AWS.
Туннель SSH обеспечивает безопасную связь между вашим локальным компьютером и экземпляром EC2, обеспечивая безопасный путь для передачи данных. После установки туннеля вы можете использовать его для безопасного подключения к DocumentDB, как если бы он работал на вашем локальном компьютере.
Код
Прежде чем углубиться в код, вам понадобятся несколько важных констант. Я предлагаю хранить их как переменные среды в целях безопасности.
# SSH tunnel configuration
SSH_HOST=ec2-x-x-x-x.region.compute.amazonaws.com
SSH_USER=ec2-user
SSH_KEY_PATH=path to ec2-host-key-pair.pem file
LOCAL_BIND_PORT=3000 # any port of your choice
# MongoDB server configuration
MONGO_HOST=replica_db_name.*.*.docdb.amazonaws.com
MONGO_PORT=27017
MONGO_USERNAME=your_monogdb_username
MONGO_PASSWORD=your_monogdb_password
MONGO_DB_NAME=YOUR_DB_NAME
MONGO_COLLECTION_NAME=YOUR_DEFAULT_COLLECTION_NAME
# db parameters dict
DB_PARAMS = {
"host": '127.0.0.1',
"port": LOCAL_BIND_PORT,
"username": MONGO_USERNAME,
"password": MONGO_PASSWORD,
}
* SSH_HOST
: общедоступный IP-адрес вашего экземпляра EC2, работающего в том же VPC, что и ваша DocumentDB.
* SSH_KEY_PATH
: путь к файлу пары ключей.pem. Это используется для аутентификации вашего SSH-соединения с экземплярами EC2.
:::информация ПРИМЕЧАНИЕ. Перед запуском кода внесите свой IP-адрес в белый список в группах безопасности EC2.
:::
from pymongo import MongoClient
from sshtunnel import SSHTunnelForwarder
tunnel = SSHTunnelForwarder(
(SSH_HOST, 22),
ssh_username=SSH_USER,
ssh_pkey=SSH_KEY_PATH,
remote_bind_address=(MONGO_HOST, MONGO_PORT),
local_bind_address=('127.0.0.1', LOCAL_BIND_PORT)
)
# start the tunnel
tunnel.start()
# get mongo client
client = MongoClient(
directConnection=True,
**DB_PARAMS
)
# do something
db = client[MONGO_DB_NAME]
collection = db[MONGO_COLLECTION_NAME]
documents = list(collection.find(some_query))
print(documents)
# stop the tunnel and close the client
client.close()
tunnel.stop()
client=None
Как это работает?
Вот простая картинка, чтобы описать это:
На рисунке представлен упрощенный обзор туннелирования SSH. Между клиентом SSH и сервером SSH устанавливается безопасное соединение через ненадежную сеть. Это SSH-соединение зашифровано, защищает конфиденциальность и целостность, а также проверяет подлинность взаимодействующих сторон.
Соединение SSH используется приложением (нашим кодом Python) для подключения к серверу приложений (сервер Mongo/DocDB). При включенном туннелировании приложение обращается к порту (= 3000) на локальном хосте («127.0.0.1»), который прослушивает SSH-клиент. Затем SSH-клиент пересылает приложение по своему зашифрованному туннелю на сервер (экземпляр EC2). Затем сервер подключается к реальному серверу приложений (DocumentDB) — обычно на том же компьютере или в том же центре обработки данных, что и SSH-сервер. Таким образом, связь с приложением защищена без необходимости изменять приложение или рабочие процессы конечного пользователя.
n
Ссылки
- Что такое туннелирование SSH? - автор ssh.com
- Документация AWS: Ссылка 1, Ссылка 2, Ссылка 3
- Сообщение StackOverflow
:::информация Также опубликовано здесь. .
:::
Оригинал