Spec-Zone.ru › RethinkDB python

Защитите свой кластер

Securing your cluster Illustration

  • Использование TLS
  • Аккаунт администратора
  • Привязка порта веб-интерфейса
  • Защита порта драйвера
  • Привязка внутрикластерного порта

Лучший способ защитить кластер RethinkDB — запустить его в защищённой сети, которая не допускает внешнего доступа. Однако, это не всегда возможно. Например, облачные развертывания часто требуют доступа из глобальных сетей.

RethinkDB предоставляет два основных метода для защиты кластера: шифрование TLS для соединений и привязка используемых сервером портов к определённым IP-адресам для ограничения внешних подключений.

Использование TLS

Начиная с версии 2.3, RethinkDB предлагает возможность защитить соединения между серверами, между серверами и клиентами, а также веб-интерфейс с помощью шифрования TLS (преемник SSL). Защита RethinkDB таким образом аналогична защите веб-сайта с помощью самозаверяющего SSL-сертификата: создайте закрытый ключ и сертификат, а затем сообщите серверу использовать их.

Генерация ключа и соответствующего сертификата

Самый простой способ сделать это — использовать инструмент командной строки openssl. (В Linux и OS X он уже установлен; для Windows вы можете найти предварительно скомпилированные бинарные файлы в списке на вики-сайте OpenSSL.)

Сначала сгенерируйте 2048-битный ключ и сохраните его в key.pem.

openssl genrsa -out key.pem 2048

Затем сгенерируйте сертификат, cert.pem, из этого ключа:

openssl req -new -x509 -key key.pem -out cert.pem -days 3650

OpenSSL попросит вас ввести информацию для сертификата. Некоторые из этих вопросов можно оставить по умолчанию, но «Общее имя» должно совпадать с доменным именем вашего сервера. В целях локального тестирования можно использовать localhost, но не в рабочей среде.

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:California
Locality Name (eg, city) []:Mountain View
Organization Name (eg, company) [Internet Widgits Pty Ltd]:RethinkDB
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:

Настройка RethinkDB для использования вашего сертификата

Сертификаты и ключи можно указать с помощью опций командной строки или как ключи в файле конфигурации. Чтобы запустить RethinkDB и настроить защиту веб-административного интерфейса, вы можете запустить сервер со следующими параметрами:

rethinkdb --http-tls-key key.pem --http-tls-cert cert.pem

Оба параметра необходимы. В файле конфигурации вы бы указали ключ и сертификат следующим образом:

http-tls-key=key.pem
http-tls-cert=cert.pem

Чтобы использовать TLS-соединения с драйверами клиентов, укажите:

rethinkdb --driver-tls-key key.pem --driver-tls-cert cert.pem

Если вы используете эту опцию на сервере, клиент также должен использовать защищённое соединение. Передайте информацию о сертификате в опцию ssl к команде connect ReQL; обратитесь к документации API для connect для получения подробностей о синтаксисе вашего языка.

Чтобы использовать TLS-соединения между серверами в кластере:

rethinkdb --cluster-tls-key key.pem --cluster-tls-cert cert.pem --cluster-tls-ca cert.pem

Обратите внимание, что в последнем случае вам также необходимо предоставить сертификат удостоверяющего центра (CA). Это сертификат, используемый для подписи других сертификатов. В этом случае мы используем один и тот же сертификат для обоих, но мы могли бы подписать наш cert.pem с помощью другого сертификата CA и указать оба из них. Серверы могут подключаться к кластеру только в том случае, если сертификаты, указанные в их значении cluster-tls-cert, подписаны сертификатом CA, указанным в cluster-tls-ca.

В OS X системные версии Python и Ruby ссылаются на старые версии OpenSSL, которые не поддерживают настройки TLS по умолчанию RethinkDB. Чтобы использовать эти драйверы в OS X, сервер должен указать:

  • tls-min-protocol TLSv1
  • tls-ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:AES256-SHA

Эти параметры могут быть указаны как опции запуска для rethinkdb или в файле конфигурации.

Аккаунт администратора

Все серверы RethinkDB имеют аккаунт admin с полным доступом к кластеру, и по умолчанию у этого аккаунта нет пароля. (Подробную информацию об этом вопросе см. в разделе Разрешения и учетные записи пользователей.) Одним из первых шагов по защите кластера должно быть назначение пароля аккаунту admin. Это можно сделать при запуске первого сервера, используя опцию командной строки --initial-password, или обновив запись admin с новым паролем в таблице системы пользователей .

Когда новые серверы (включая прокси) присоединяются к существующему кластеру, они синхронизируются со всей информацией об учетных записях пользователей, включая пароли, из этого кластера. Это включает аккаунт admin. Однако, сервер без установленного административного пароля не может присоединиться к существующему кластеру, у которого есть пароль. В противном случае теоретически возможно, что злоумышленник сможет подключиться к этому серверу как администратор и выполнить произвольные запросы в период между запуском этого сервера и синхронизацией учетных записей с остальной частью кластера.

Если вы настраиваете кластер в безопасной среде (например, весь кластер находится в локальной сети за брандмауэром), вы можете просто запустить серверы в кластере без административного пароля, а затем обновить запись admin в таблице users с новым паролем. Однако, если вы подключаете новый сервер к кластеру, который уже защищен паролем, лучший способ сделать это — указать опцию --initial-password auto.

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

rethinkdb --initial-password auto --join cluster

Привязка порта веб-интерфейса

Привязка порта веб-интерфейса может предотвратить прямой доступ к нему из удалённой машины. Вы можете привязать его к определённому IP-адресу, используя опцию командной строки --bind-http; наиболее безопасным методом является привязка к локальной машине (localhost) и последующее подключение через прокси.

rethinkdb --bind-http localhost

(Вы также можете указать bind-http= в файле конфигурации.)

Важно! Отсутствие использования прокси может привести к уязвимостям. Убедитесь, что вы настроили прокси перед использованием RethinkDB в рабочей среде. Используйте один из следующих двух методов для обеспечения безопасного доступа.

Через прокси SOCKS

После того, как вы заблокировали порт веб-интерфейса на предыдущем шаге, самый простой способ получить к нему доступ — использовать ssh для настройки прокси SOCKS. Выполните следующую команду на вашем локальном сервере (не на том, где работает RethinkDB):

ssh -D 3000 USERNAME@HOST

Где,

  • HOST — IP-адрес любого сервера в вашем кластере RethinkDB.
  • 3000 можно изменить на любой доступный порт на вашем локальном сервере.

Затем откройте ваш браузер:

  • Если вы используете Chrome, перейдите в Настройки > Дополнительные настройки > Сеть > Изменить настройки прокси и установите опцию Сеть прокси в режим ручного управления со следующими параметрами:
    • Хост: localhost
    • Порт: 3000
    • Игнорируемый хост: (удалите всё)
  • Если вы используете Firefox, перейдите в Правка > Настройки. Затем нажмите на Дополнительно > Сеть > Настройки и создайте конфигурацию ручного прокси с этими параметрами:
    • Хост SOCKS: localhost
    • Порт: 3000
    • Включить SOCKS v5
    • Исключения прокси: (удалите всё)

Теперь вы можете посетить localhost:8080, чтобы увидеть веб-администрацию RethinkDB.

Через обратный прокси

Вы можете использовать обратный HTTP-прокси для доступа к веб-интерфейсу с других серверов. Большинство веб-серверов (таких как Apache или Nginx) поддерживают эту функцию. В следующем примере мы будем использовать Apache для настройки обратного прокси.

Для Apache вам понадобятся следующие модули:

  • proxy
  • proxy_http

В зависимости от вашей ОС, вам может потребоваться установить библиотеку, такую как libapache2-mod-proxy-html.

Создайте новый виртуальный хост:

<VirtualHost *:80>
    ServerName domain.net

    ProxyRequests Off

    <Proxy *>
        Order deny,allow
        Allow from all
        AuthType Basic
        AuthName "Password Required"
        AuthUserFile password.file
        AuthGroupFile group.file
        Require group dbadmin
    </Proxy>

    ProxyErrorOverride On
    ProxyPass   /rethinkdb_admin/   http://localhost:8080/
    ProxyPassReverse   /rethinkdb_admin/   http://localhost:8080/

</VirtualHost>

Создайте файл паролей в /etc/apache2/:

htpasswd.exe -c password.file username

Почти всё готово. Теперь нам нужно создать файл group.file с данным содержимым:

dbadmin: username

Теперь вы можете получить доступ к веб-интерфейсу по следующему URL: http://HOST/rethinkdb_admin.

Защита порта драйвера

Использование системы аутентификации RethinkDB

Клиенты могут указать значения user и password в команде connect. Для получения более подробной информации о создании и управлении учетными записями пользователей и разрешениями, прочитайте раздел Разрешения и учетные записи пользователей.

Обратите внимание, что пароли будут отправляться в открытом виде, если вы не используете шифрование TLS. Вместо (или дополнительно к) TLS, вы можете привязать порт драйвера и использовать SSH-туннелирование, как описано ниже.

Примечание: Система аутентификации влияет на драйверы клиентов, а не на веб-интерфейс. Следуйте инструкциям выше для защиты веб-интерфейса.

Использование SSH-туннелирования

Сначала защитите порт драйвера, чтобы к нему не было доступа извне. Используйте --bind-driver опцию командной строки или соответствующую опцию файла конфигурации, чтобы привязать его к localhost.

rethinkdb --bind-driver localhost

Теперь создайте SSH-туннель на сервере, которому нужен доступ к удалённому порту драйвера RethinkDB:

ssh -L <local_port>:localhost:<driver_port> <ip_of_rethinkdb_server>

Где,

  • local_port — порт, который вы будете указывать в драйвере — это может быть любой свободный порт на вашем сервере.
  • driver_port — порт драйвера RethinkDB (по умолчанию 28015).
  • ip_of_rethinkdb_server — IP-адрес сервера, на котором запущен сервер RethinkDB.

Теперь вы можете подключиться к вашей инстанции RethinkDB, подключившись к хосту localhost и порту local_port:

r.connect({host: 'localhost', port: <local_port>},
    function(error, connection) { ... })

Привязка внутрикластерного порта

Для защиты порта кластера привяжите его к определённому IP-адресу, используя --bind-cluster опцию командной строки или соответствующую опцию файла конфигурации. Привяжите его к IP-адресу, доступному только из вашей локальной сети.

rethinkdb --bind-cluster 192.168.0.100

Внутрикластерный порт будет доступен внутри локальной сети, где вы запустили узлы RethinkDB, но не будет доступен извне.

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/docs/security/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API