Как запустить защищенный сервер MongoDB с OpenVPN и Docker в Ubuntu 16.04

http://mongodb.org [MongoDB] - база данных NoSQL с открытым исходным кодом. В традиционной установке MongoDB отсутствуют некоторые функции безопасности, которые вам понадобятся, если вы беспокоитесь о безопасности данных.

Существует несколько способов защитить сервер, на котором работает база данных. Во-первых, вы можете настроить VPN и ограничить доступ только тем клиентам, которые подключены к VPN. Затем вы можете зашифровать транспортный уровень между клиентом и сервером с помощью сертификатов. Вы будете делать оба в этом уроке. Кроме того, вы будете использовать Docker для запуска вашего экземпляра MongoDB, чтобы вы могли обеспечить повторное использование конфигурации и сертификатов MongoDB на нескольких серверах.

Предпосылки

Чтобы пройти этот урок, вам необходимо:

  • Сервер OpenVPN, который вы можете настроить, следуя учебному руководству How Чтобы настроить сервер OpenVPN в Ubuntu 16.04. Обязательно установите флажок * Частная сеть * при создании сервера.

  • Машина с Ubuntu 16.04 с установленным Docker. Здесь вы создадите образ Docker MongoDB и где вы будете запускать MongoDB в контейнере. Чтобы создать его, нажмите * Create Droplet * в консоли управления DigitalOcean, выберите * One-click apps *, а затем выберите * Docker 1.x 16.04 *. Включите частную сеть на этом сервере.

  • Пользователь без полномочий root с правами sudo на обоих серверах. Https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04[Initial Руководство по установке для Ubuntu 16.04] объясняет, как его настроить.

  • MongoDB установлен на вашем локальном компьютере. Вы будете использовать это для проверки вашего соединения с сервером MongoDB.

Шаг 1 - Настройка VPN для пересылки на частные IP-адреса

Если вы следовали обязательной статье OpenVPN, вы, скорее всего, настроили свой сервер для пересылки запросов на общедоступный сетевой интерфейс, но не на частный. В этом руководстве мы собираемся настроить сервер MongoDB таким образом, чтобы к нему можно было получить доступ только через его частный интерфейс, к которому мы сможем получить доступ только через наше VPN-соединение. Нам нужно изменить правила пересылки IP на VPN-сервере, чтобы трафик от VPN-клиентов также направлялся в частную сеть.

Подключитесь к вашему серверу OpenVPN.

ssh @

Затем перейдите на панель мониторинга DigitalOcean, выберите свой VPN-дроплет и найдите его частный IP-адрес.

Получив частный IP-адрес, выполните эту команду на VPN-капле, чтобы определить сетевой интерфейс, который использует этот IP-адрес:

sudo nano /etc/ufw/before.rules
ip route | grep

Вы должны увидеть вывод, похожий на следующий:

Output10.132.0.0/16 dev   proto kernel  scope link  src

Обратите внимание на сетевой интерфейс в вашем выводе. В этом примере интерфейс + eth1 +, но ваш может отличаться.

После того как вы определили интерфейс частной сети, отредактируйте файл + / etc / ufw / before.rules:

sudo nano /etc/ufw/before.rules

Найдите раздел, который вы определили в предварительном учебнике, который выглядит следующим образом:

/etc/ufw/before.rules

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Добавьте новое правило для интерфейса частной сети:

/etc/ufw/before.rules

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE

COMMIT
# END OPENVPN RULES

Обязательно замените + eth1 + интерфейсом для вашей частной сети. Затем сохраните файл и выйдите из редактора.

Отключите и снова включите брандмауэр:

sudo ufw disable
sudo ufw enable

Затем выйдите из вашего VPN-сервера.

exit

Теперь установите VPN-соединение с локального компьютера на VPN-сервер. Поддерживайте эту связь на протяжении всего этого урока.

Теперь давайте подключимся к серверу MongoDB, используя его частный IP-адрес, и настроим брандмауэр.

Шаг 2 - Настройка межсетевого экрана сервера MongoDB

Мы собираемся подключиться к серверу MongoDB, используя его частный IP-адрес. Если у вас его нет, вернитесь на панель мониторинга DigitalOcean и найдите частный IP-адрес для Docker Droplet MongoDB. Вы будете использовать его здесь для подключения к серверу, а затем будете использовать его для прямого подключения к MongoDB, поскольку мы собираемся ограничить доступ к серверу базы данных для VPN-клиентов. Таким образом, вы избегаете публичного раскрытия базы данных, что является обязательной мерой безопасности.

Убедитесь, что вы подключены к VPN и SSH к серверу MongoDB, используя его частный IP:

ssh @

После того, как вы вошли в систему, удалите все существующие правила брандмауэра, чтобы предотвратить доступ из внешнего мира:

sudo ufw delete limit ssh
sudo ufw delete allow 2375/tcp
sudo ufw delete allow 2376/tcp

Затем добавьте два новых правила, которые разрешают доступ по SSH и MongoDB только с компьютеров, подключенных к вашей VPN. Для этого используйте частный IP-адрес вашего VPN-сервера для исходного IP-адреса:

sudo ufw allow from  to any port 22 proto tcp
sudo ufw allow from  to any port 28018 proto tcp

Убедитесь, что настроены только два правила:

sudo ufw status

Вы должны увидеть следующий вывод:

OutputTo                         Action      From
--                         ------      ----
22/tcp                     ALLOW
28018/tcp                  ALLOW

Включите брандмауэр и выйдите из сервера:

sudo ufw enable
exit

Затем снова войдите на сервер MongoDB, чтобы убедиться, что у вас все еще есть доступ к серверу после включения фильтра IP.

ssh @

Если вы не можете установить соединение SSH, убедитесь, что вы подключены к VPN и настроили сервер VPN для пересылки трафика в частной сети. Если это не сработает, войдите в систему с помощью DigitalOcean Console и проверьте правила брандмауэра. Убедитесь, что вы указали в правилах частный IP-адрес вашего VPN-сервера, а не частный IP-адрес вашего сервера MongoDB.

Чтобы узнать больше о UFW, ознакомьтесь с https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-14-04 в этом учебнике DigitalOcean UFW] ,

Теперь, когда вы настроили основные меры безопасности, перейдите к настройке MongoDB.

Шаг 3 - Создание файла конфигурации MongoDB

На этом шаге мы создадим пользовательскую конфигурацию MongoDB, которая настраивает MongoDB для использования SSL-сертификатов.

Давайте создадим структуру каталогов для хранения нашей конфигурации и связанных файлов. Мы создадим каталог с именем + mongoconf +, а затем создадим внутри него каталог + config + для наших файлов конфигурации. В каталоге + config мы создадим каталог с именем` + ssls`, в котором мы будем хранить сертификаты.

Создайте структуру с помощью следующей команды:

mkdir -p ~/mongoconf/config/ssl

Затем перейдите в папку + ~ / mongod conf / config:

cd ~/mongoconf/config

Откройте новый файл с именем + mongod.conf + в текстовом редакторе:

nano mongod.conf

Сначала настройте привязку базы данных к каждому сетевому интерфейсу на порту + 28018 +. Привязка к + 0.0.0.0 + в этом случае не является проблемой безопасности, так как брандмауэр в любом случае не разрешает соединения из внешнего мира. Но нам нужно разрешить подключение от клиентов внутри VPN. Добавьте следующее в файл:

mongodb.conf

net:
 bindIp: 0.0.0.0
 port: 28018

Также в разделе + net + укажите пути к сертификатам SSL и укажите кодовую фразу сертификата. Мы вскоре создадим файл сертификата и пароль.

mongodb.conf

net:
. . .
 ssl:
   CAFile: /etc/mongo/ssl/client.pem
   PEMKeyFile: /etc/mongo/ssl/server.pem
   PEMKeyPassword: test
   mode: requireSSL

Наконец, установите каталог хранилища по умолчанию и включите ведение журнала.

mongodb.conf

. . .
storage:
 dbPath: /mongo/db
 journal:
   enabled: true

Чтобы узнать обо всех доступных параметрах конфигурации, read документации MongoDB.

Пока сохраните файл и выйдите из редактора. Пришло время генерировать сертификаты SSL, которые мы будем использовать.

Шаг 4 - Генерация SSL-сертификатов

Для безопасной передачи данных вам необходимо сгенерировать два SSL-сертификата для MongoDB - один для сервера и один для клиента, который будет обращаться к базе данных.

Сначала перейдите в каталог + ~ / mongoconf / config / ssl + и сгенерируйте пару сертификат-ключ сервера. Заполните подсказки с информацией по вашему выбору. Обратите внимание на поля + Common Name и` + PEM Pass Phrase`.

cd ~/mongoconf/config/ssl
openssl req -new -x509 -days 365 -out server.crt -keyout server.key

Вы увидите следующий вывод и вас попросят предоставить некоторые подробности по пути:

Server certificate-key generation. . .
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
. . .
Common Name (e.g. server FQDN or YOUR name) []:
. . .

Когда вас спросят о парольной фразе PEM, убедитесь, что вы используете то же значение, которое вы использовали в файле конфигурации MongoDB на предыдущем шаге.

MongoDB не принимает отдельные файлы ключей и сертификатов, поэтому объедините их в один файл + .pem +:

cat server.crt server.key >>

Затем сгенерируйте пару сертификат-ключ для клиента:

openssl req -new -x509 -days 365 -out client.crt -keyout

Вы будете следовать тому же процессу, что и раньше, но на этот раз используйте частный IP-адрес VPN-сервера. Парольная фраза PEM может быть любой, что вы хотели бы для этого шага.

Client certificate-key generation. . .
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
. . .
Common Name (e.g. server FQDN or YOUR name) []:
. . .

Объедините только что созданные вами файлы в один файл + .pem +:

cat client.crt client.key >> client.pem

Затем скопируйте оба файла сертификата на локальный компьютер, чтобы вы могли удаленно подключиться к серверу MongoDB. Вы можете сделать это с помощью команды + scp + на вашем локальном компьютере:

scp @:/home//mongoconf/config/ssl/\{client.pem,server.pem\} .

Кроме того, вы можете следовать учебному руководству Wow To Use SFTP to Безопасная передача файлов с удаленного сервера для передачи файлов + client.pem + и + server.pem + на локальный компьютер.

Теперь давайте создадим образ Docker и запустим ядро ​​базы данных в контейнере, чтобы эта конфигурация была более переносимой.

Шаг 5 - Создание образа Docker MongoDB и запуск контейнера

Вы создали безопасную конфигурацию MongoDB и сгенерировали сертификаты. Теперь давайте сделаем это портативным с Docker. Мы создадим собственный образ для MongoDB, но мы передадим наш файл конфигурации и сертификаты при запуске контейнера.

Чтобы создать образ, вам нужен Dockerfile.

Перейдите в корневой каталог проекта и откройте пустой Dockerfile в вашем редакторе:

cd ~/mongoconf
nano Dockerfile

Добавьте следующее в новый файл:

Dockerfile

FROM ubuntu:xenial

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
RUN echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.4.list
RUN apt-get update && apt-get install -y mongodb-org
RUN mkdir -p /mongo/db /etc/mongo

EXPOSE 28018
ENTRYPOINT ["mongod", "--config", "/etc/mongo/mongod.conf"]

Этот файл говорит Docker создать образ на основе Ubuntu 16.04 Xenial, загрузить последние двоичные файлы MongoDB и создать несколько каталогов, в которых мы будем хранить файлы конфигурации и базу данных. Он делает порт + 28018 + контейнера доступным для хоста и запускает Mongo каждый раз, когда пользователь перезапускает контейнер.

Сохраните файл и выйдите из редактора. Затем создайте изображение:

docker build -t mongo .

Как только изображение будет построено, запустите контейнер на основе изображения. Мы смонтируем каталог + config + как том внутри контейнера, чтобы наша пользовательская конфигурация и ключи были видны экземпляру MongoDB внутри контейнера:

docker run \
--detach \
--publish 28018:28018 \
--volume $PWD/config:/etc/mongo \
--name mongodb \
mongo

Теперь, когда у вас есть работающий экземпляр MongoDB, получите доступ к нему с локального компьютера.

Шаг 6 - Доступ к MongoDB

В новом терминале на вашем локальном компьютере подключитесь к базе данных, используя частный IP-адрес сервера MongoDB. Вы предоставите файлы client.pem и server.pem, которые вы скачали на локальный компьютер, а также пароль, который вы использовали при создании сертификата клиента. Выполните эту команду:

mongo \
--ssl \
--sslCAFile  \
--sslPEMKeyFile  \
--sslPEMKeyPassword  \
--host  \
--port 28018

Если все хорошо, вы должны увидеть приглашение MongoDB.

Если появляется ошибка, дважды проверьте, что вы подключаетесь к частному IP-адресу сервера MongoDB, а не к IP-адресу VPN-сервера. Также убедитесь, что местоположение ключа и пароль верны, и что ваше соединение с VPN все еще работает.

Заключение

Теперь у вас есть настроенная MongoDB, запущенная в контейнере Docker. Его безопасность обеспечивается SSL-аутентификацией клиента и сервера и транспортным шифрованием. Вы добавили дополнительную безопасность, настроив брандмауэр для ограничения подключений к базе данных для клиентов, подключенных к VPN-серверу.

Хотя эта настройка является оптимальной для тестирования, помните, что в производственной среде следует использовать доверенный центр сертификации и подписанные сертификаты. Кроме того, вы должны проанализировать свои потребности в области безопасности и действовать соответственно. Например, вы можете настроить пользователей, пароли и роли в базе данных. В учебнике Как установить и защитить MongoDB в Ubuntu 16.04 содержится дополнительная информация о создание пользователей и является отличным следующим шагом на пути к установке, готовой к работе.

Related