Защитите свой кластер
Лучший способ защитить кластер 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 TLSv1tls-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
- Пропускаемые хосты: (удалите все)
- Хост SOCKS:
Теперь вы можете посетить 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/