Spec-Zone.ru › RethinkDB javascript

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

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

Обратите внимание, что в последнем случае вам также необходимо предоставить сертификат центра сертификации. Это сертификат, используемый для подписи других сертификатов. В этом случае мы используем один и тот же сертификат для обоих, но мы могли бы подписать наш cert.pem с помощью другого сертификата центра сертификации и указать оба. Серверы могут подключаться к кластеру только в том случае, если сертификаты, указанные в их cluster-tls-cert значении, подписаны сертификатом центра сертификации, указанным в 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