Захистіть свій кластер
Найкращий спосіб захистити кластер RethinkDB - запустити його в захищеній мережі, що не дозволяє доступу ззовні. Однак це не завжди можливо. Наприклад, розгортання в хмарі часто вимагає доступу з широкосмугових мереж.
Існує два основних методу, що забезпечують RethinkDB для захисту кластера: TLS шифрування для підключень і зв'язування портів, які сервер використовує для конкретних IP-адрес, для обмеження зовнішніх з'єднань.
Починаючи з версії 2.3, RethinkDB надає можливість захищати з'єднання між серверами, між серверами та клієнтами, а також веб-інтерфейс за допомогою TLS шифрування (наступник SSL). Захист RethinkDB таким чином схожий на захист веб-сайту на самостійно підписаний сертифікат SSL : створити приватний ключ і сертифікат, а потім повідомляти серверу про їх використання.
Найпростіший спосіб зробити це з інструментом командного рядка openssl. (У Linux і OS X це вже встановлено; для Windows можна знайти його скомпільовані двійкові файли зі списку на вікі OpenSSL.)
Спочатку створіть 2048-бітовий ключ і збережіть його в key.pem:
opensl genrsa -out key.pem 2048
Потім створіть сертифікат cert.pem з цього ключа:
openssl req -new -x509-ключ key.pem -out cert.pem -денні 3650
OpenSSL попросить ввести інформацію для сертифіката. Хоча деякі з цих питань можна залишити за замовчуванням, "Загальне ім'я" має відповідати доменному імені вашого сервера. Для цілей локального тестування можна використовувати localhost, але не у виробництві.
Назва країни (код з 2 літер) [AU]: назва штату або провінції США (прізвище, ім'я та прізвище) [Деякі держави]: Назва місцевості Каліфорнії (наприклад, місто) []: Назва організації гори (наприклад, компанія) Ltd]: ім'я організаційної одиниці RethinkDB (наприклад, розділ) []: загальне ім'я (наприклад, FQDN сервера або ВАШЕ ім'я) []: example.com Email Address []:
Сертифікати та ключі також можуть бути вказані Параметри командного рядка або як ключі в a файлу конфігурації . Щоб запустити RethinkDB і повідомити йому про захист інтерфейсу веб-адміністрування, можна запустити сервер з такими параметрами:
rethinkdb --http-tls-ключ key.pem --http-tls-cert cert.pem
Потрібні обидва варіанти. У конфігураційному файлі потрібно вказати ключ і сертифікат так:
http-tls-key = key.pem http-tls-cert = cert.pem
Щоб використовувати з'єднання TLS із драйверами клієнта, вкажіть:
rethinkdb --driver-tls-ключ key.pem --driver-tls-cert cert.pem
Якщо ви використовуєте цей параметр на сервері, клієнт також повинен використовувати захищене з'єднання. Передати інформацію про сертифікат у параметр ssl команді Connect ReQL; прочитати документацію API для підключення докладніше про конкретний синтаксис вашої мови.
Щоб використовувати з'єднання TLS між серверами кластера:
rethinkdb - кластер-tls-ключ key.pem --cluster-tls-cert cert.pem - cluster-tls-ca cert.pem
Зауважте, що в останньому випадку вам також потрібно надати сертифікат ЦС. Це сертифікат, який використовується для підписання інших сертифікатів. У цьому випадку ми використовуємо один і той же сертифікат для обох, але ми могли б підписати наш cert.pem з іншим сертифікатом CA і вказати обидва з них. Сервери можуть підключатися до кластера, лише якщо сертифікати, вказані значенням їх кластера-tls-cert, підписуються сертифікатом ЦС, визначеним кластером-tls-ca.
Під OS X, версії системи Python і Ruby посилаються на старі версії OpenSSL, які не підтримують значення за замовчуванням RethinkDB для TLS. Щоб використовувати ці драйвери під OS X, сервер повинен вказати:
- tls-min-протокол TLSv1
- шифри EECDH + AESGCM: EDH + AESGCM: AES256 + EECDH: AES256 + EDH: AES256-SHA
Вони можуть бути вказані як параметри запуску rethinkdb або у конфігураційному файлі.
Усі сервери RethinkDB мають обліковий запис адміністратора з повним доступом до кластера, і за умовчанням цей обліковий запис не має пароля. (Докладніше про цю тему читайте Дозволи та облікові записи користувачів .) Однією з перших речей, які потрібно зробити, щоб захистити кластер, є призначення пароля адміністратору. Це можна зробити, коли перший сервер запускається за допомогою пароля --initial-password параметр командного рядка або шляхом оновлення адміністративного запису новим паролем для користувача системна таблиця .
Коли нові сервери (включаючи проксі) приєднуються до існуючого кластера, вони синхронізуються з усіма відомостями облікового запису користувача, включаючи паролі, з цього кластера. Це включає обліковий запис адміністратора. Однак сервер без набору паролів адміністратора не може приєднатися до існуючого кластера, який має встановлений пароль. В іншому випадку, зловмисник зможе підключитися до цього сервера як адміністратор і виконати довільні запити в часі між запуском сервера та обліковими записами, які синхронізуються з рештою кластера.
Якщо ви налаштовуєте кластер у захищеному середовищі (наприклад, весь кластер знаходиться в локальній мережі за брандмауером), ви можете просто запустити сервери в кластері без пароля адміністратора, а потім оновити обліковий запис адміністратора в таблиця користувачів з новим паролем. Однак, якщо ви приєднуєте новий сервер до кластера, який вже захищений паролем, найкращим способом це - вказати автоматичну опцію --initial-password.
Цей параметр створює випадковий пароль для облікового запису адміністратора цього сервера. Після того, як сервер синхронізується з кластером, випадковий пароль буде перезаписаний паролем адміністратора, що запобігає експлуатації, описаній вище.
rethinkdb --initial-password auto - приєднати кластер
Прив'язка порту веб-інтерфейсу може перешкодити доступу до неї безпосередньо з віддаленого комп'ютера. Ви можете прив'язати його до певної IP-адреси за допомогою --bind-http параметр командного рядка ; найбезпечніший спосіб - прив'язати його до локальної машини (localhost), а потім з'єднати через проксі.
rethinkdb --bind-http localhost
(Можна також вказати bind-http = у файлу конфігурації .)
Тепер скористайтеся одним із наступних двох способів, щоб увімкнути безпечний доступ.
Через проксі SOCKS
Як тільки ви заблокуєте порт веб-інтерфейсу на наведеному вище етапі, найпростіший спосіб отримати доступ до нього - використовувати ssh для налаштування проксі SOCKS. Запустіть таку команду на локальному сервері (не той, що запускає RethinkDB):
ssh -D 3000 USERNAME @ HOST
Де,
- HOST - це ip будь-якого сервера на вашому кластері RethinkDB.
- 3000 можна змінити на будь-який порт, доступний на локальному сервері.
Потім відкрийте веб-переглядач:
- Якщо ви використовуєте Chrome , перейдіть у меню Налаштування> Додаткові налаштування> Мережа> Змінити налаштування проксі-сервера та встановіть для параметра " Мережний проксі " ручний режим із такими параметрами:
- Хост: localhost
- Порт: 3000
- Проігноровано хост: (видалити все)
- Якщо ви використовуєте Firefox , перейдіть до Edit> Preferences . Потім натисніть кнопку Додатково> Мережа> Налаштування та створіть ручну конфігурацію проксі з такими параметрами:
- Носки хост: localhost
- Порт: 3000
- Перевірте шкарпетки v5
- Немає проксі для: (видалити все)
Тепер ви можете відвідати localhost: 8080, щоб побачити веб-адміністратора RethinkDB.
Через зворотний проксі
Ви можете використовувати зворотний HTTP-проксі, щоб дозволити доступ до веб-інтерфейсу з інших серверів. Більшість веб-серверів (таких як Apache або Nginx) підтримують цю функцію. У наступному прикладі ми використовуємо Apache для налаштування зворотного проксі.
Вам знадобляться наступні модулі, встановлені для Apache:
Залежно від операційної системи, вам може знадобитися встановити бібліотеку, наприклад libapache2-mod-proxy-html.
Створити новий віртуальний хост:
<VirtualHost *: 80> ServerName domain.net ProxyRequests Вимкнути <Проксі *> Заборонити заборонити, дозволити Дозволити з усіх AuthType Basic AuthName "Потрібно ввести пароль" / http: // localhost: 8080 / ProxyPassReverse / rethinkdb_admin / http: // localhost: 8080 / </VirtualHost>
Створіть файл паролів у / etc / apache2 /:
Ім'я користувача htpasswd.exe -c password.file
Майже зроблено. Зараз потрібно лише створити файл group.file з таким вмістом:
Тепер ви можете отримати доступ до веб-інтерфейсу за допомогою URL-адреси: http: // HOST / rethinkdb_admin.
Клієнти можуть вказувати значення користувача та пароля в підключення команду. Для отримання додаткових відомостей про створення та керування обліковими записами та правами користувачів читайте Дозволи та облікові записи користувачів .
Зауважте, що паролі надсилатимуться у відкритому тексті, якщо ви не використовуєте шифрування 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', порт: <local_port>}, функція (помилка, з'єднання) {...})
Щоб захистити порт кластера, прив'яжіть його до певної IP-адреси за допомогою кластера --bind-cluster параметр командного рядка або відповідний файлу конфігурації . Прив'яжіть його до IP-адреси, доступної лише з локальної мережі.
rethinkdb --bind-cluster 192.168.0.100
Порт intracluster буде доступний з локальної мережі, де ви запускаєте вузли RethinkDB, але не будуть доступні з зовнішнього світу.