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 содержится дополнительная информация о создание пользователей и является отличным следующим шагом на пути к установке, готовой к работе.