SSH-туннелирование в AWS EC2 и подключение к DocumentDB с помощью Python

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

Source: AWS Docs.


Что такое 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

Как это работает?

Вот простая картинка, чтобы описать это:

Source: ssh.com

На рисунке представлен упрощенный обзор туннелирования SSH. Между клиентом SSH и сервером SSH устанавливается безопасное соединение через ненадежную сеть. Это SSH-соединение зашифровано, защищает конфиденциальность и целостность, а также проверяет подлинность взаимодействующих сторон.

Соединение SSH используется приложением (нашим кодом Python) для подключения к серверу приложений (сервер Mongo/DocDB). При включенном туннелировании приложение обращается к порту (= 3000) на локальном хосте («127.0.0.1»), который прослушивает SSH-клиент. Затем SSH-клиент пересылает приложение по своему зашифрованному туннелю на сервер (экземпляр EC2). Затем сервер подключается к реальному серверу приложений (DocumentDB) — обычно на том же компьютере или в том же центре обработки данных, что и SSH-сервер. Таким образом, связь с приложением защищена без необходимости изменять приложение или рабочие процессы конечного пользователя.

n Источник: Документы AWS.


Ссылки


:::информация Также опубликовано здесь. .

:::


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE