Thứ sáu, 24/03/2017 | 00:00 GMT+7

Cách chạy server MongoDB an toàn với OpenVPN và Docker trên Ubuntu 16.04


MongoDB là một database NoSQL open-souce . Cài đặt MongoDB truyền thống thiếu một số tính năng bảo mật mà bạn muốn nếu lo ngại về bảo mật dữ liệu.

Có một số phương pháp để bảo mật server chạy database . Trước tiên, bạn có thể cài đặt VPN và hạn chế quyền truy cập chỉ đối với những ứng dụng client được kết nối với VPN. Sau đó, bạn có thể mã hóa lớp truyền tải giữa client và server bằng các certificate . Bạn sẽ làm cả hai trong hướng dẫn này. Ngoài ra, bạn sẽ sử dụng Docker để chạy version MongoDB của bạn , vì vậy bạn có thể đảm bảo khả năng sử dụng lại cấu hình MongoDB và certificate của bạn trên nhiều server .

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần:

  • Server OpenVPN mà bạn có thể cài đặt theo hướng dẫn Cách cài đặt server OpenVPN trên Ubuntu 16.04 . Đảm bảo bạn chọn hộp Mạng riêng khi tạo server .
  • Máy Ubuntu 16.04 đã cài đặt Docker. Đây là nơi bạn sẽ tạo hình ảnh MongoDB Docker và là nơi bạn sẽ chạy MongoDB trong một containers . Để tạo nó, hãy nhấp vào Tạo server trong console quản lý DigitalOcean, chọn Ứng dụng một lần nhấp , rồi chọn Docker 1.x trên 16.04 . Bật mạng riêng tư trên server này.
  • User không phải root có quyền sudo trên cả hai server . Hướng dẫn Cài đặt Ban đầu cho Ubuntu 16.04 giải thích cách cài đặt nó.
  • MongoDB được cài đặt trên máy local của bạn . Bạn sẽ sử dụng điều này để kiểm tra kết nối với server MongoDB của bạn .

Bước 1 - Cấu hình VPN để chuyển tiếp đến địa chỉ IP riêng

Nếu bạn đã làm theo bài viết OpenVPN yêu cầu , rất có thể bạn đã cấu hình server của bạn để chuyển tiếp các yêu cầu tới network interface công cộng, nhưng không phải giao diện riêng tư. Trong hướng dẫn này, ta sẽ cấu hình server MongoDB để nó chỉ có thể được truy cập trên giao diện riêng tư của nó, ta chỉ có thể truy cập thông qua kết nối VPN của bạn . Ta cần sửa đổi các luật chuyển tiếp IP trên server VPN để lưu lượng truy cập từ các client VPN cũng được chuyển đến mạng riêng.

Kết nối với server OpenVPN của bạn.

ssh sammy@vpn_server_public_ip

Sau đó, truy cập trang tổng quan DigitalOcean, chọn Server VPN của bạn và tìm địa chỉ IP riêng của nó.

Khi bạn có địa chỉ IP riêng, hãy thực hiện lệnh này trên VPN Server để xác định network interface sử dụng địa chỉ IP đó:

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

Bạn sẽ thấy kết quả tương tự như sau:

Output
10.132.0.0/16 dev eth1 proto kernel scope link src vpn_server_private_ip

Ghi lại network interface trong kết quả của bạn. Trong ví dụ này, giao diện là eth1 , nhưng giao diện của bạn có thể khác.

Khi bạn đã xác định được network interface riêng, hãy chỉnh sửa file /etc/ufw/before.rules :

  • sudo nano /etc/ufw/before.rules

Tìm phần bạn đã xác định trong hướng dẫn yêu cầu , trông giống như sau:

/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

Thêm luật mới cho network interface riêng:

/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
-A POSTROUTING -s 10.8.0.0/8 -o eth1 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Đảm bảo thay thế eth1 bằng giao diện cho mạng riêng của bạn. Sau đó, lưu file và thoát khỏi editor .

Tắt và bật lại firewall :

  • sudo ufw disable
  • sudo ufw enable

Sau đó đăng xuất khỏi server VPN của bạn.

  • exit

Bây giờ cài đặt kết nối VPN từ máy tính local của bạn đến server VPN. Duy trì kết nối này trong suốt hướng dẫn này.

Bây giờ, hãy kết nối với server MongoDB bằng địa chỉ IP riêng của nó và cấu hình firewall của nó.

Bước 2 - Cài đặt firewall của server MongoDB

Ta sẽ kết nối với server MongoDB bằng địa chỉ IP riêng của nó. Nếu bạn không có, hãy quay lại trang tổng quan DigitalOcean và tìm địa chỉ IP riêng cho MongoDB Docker Server. Bạn sẽ sử dụng nó ở đây để kết nối với server và sau đó bạn sẽ sử dụng nó để kết nối trực tiếp với MongoDB, vì ta sắp hạn chế quyền truy cập vào server database đối với các client VPN. Bằng cách này, bạn tránh để lộ database một cách công khai, đây là một biện pháp bảo mật bắt buộc phải có.

Đảm bảo bạn được kết nối với VPN của bạn và SSH với server MongoDB bằng IP riêng của nó:

ssh sammy@mongodb_server_private_ip

Khi bạn đã đăng nhập, hãy xóa tất cả các luật firewall hiện có để ngăn truy cập từ thế giới bên ngoài:

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

Sau đó, thêm hai luật mới chỉ cho phép truy cập SSH và MongoDB từ các máy tính được kết nối với VPN của bạn. Để làm điều đó, hãy sử dụng địa chỉ IP riêng của server VPN của bạn cho IP root :

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

Đảm bảo đây là hai luật duy nhất được cấu hình :

  • sudo ufw status

Bạn sẽ thấy kết quả sau:

Output
To Action From -- ------ ---- 22/tcp ALLOW vpn_server_private_ip 28018/tcp ALLOW vpn_server_private_ip

Bật firewall và đăng xuất khỏi server :

  • sudo ufw enable
  • exit

Sau đó đăng nhập lại vào server MongoDB đảm bảo rằng bạn vẫn có quyền truy cập vào server sau khi bật bộ lọc IP.

ssh sammy@mongodb_server_private_ip

Nếu bạn không thể cài đặt kết nối SSH, hãy đảm bảo bạn đã kết nối với VPN và bạn đã cài đặt server VPN để chuyển tiếp lưu lượng truy cập trên mạng riêng. Nếu điều đó không hiệu quả, hãy đăng nhập bằng DigitalOcean Console và kiểm tra các luật firewall . Đảm bảo bạn đã chỉ định IP riêng của server VPN của bạn trong luật chứ không phải IP riêng của server MongoDB của bạn.

Để tìm hiểu thêm về UFW, hãy khám phá hướng dẫn DigitalOcean UFW này .

Đến đây bạn đã cấu hình các biện pháp bảo mật cơ bản, hãy tiến hành cấu hình MongoDB.

Bước 3 - Tạo file cấu hình MongoDB

Trong bước này, ta sẽ tạo cấu hình MongoDB tùy chỉnh, cấu hình MongoDB để sử dụng certificate SSL.

Hãy tạo một cấu trúc folder để chứa cấu hình của ta và các file liên quan. Ta sẽ tạo một folder có tên mongoconf , sau đó tạo một folder config bên trong folder đó cho các file cấu hình của ta . Trong folder config , ta sẽ tạo một folder có tên là ssl , nơi ta sẽ lưu trữ các certificate .

Tạo cấu trúc bằng lệnh sau:

  • mkdir -p ~/mongoconf/config/ssl

Sau đó chuyển sang folder ~/mongoconf/config :

  • cd ~/mongoconf/config

Mở một file mới có tên mongod.conf bằng editor của bạn:

  • nano mongod.conf

Đầu tiên, đặt database để liên kết với mọi network interface trên cổng 28018 . Liên kết với 0.0.0.0 không phải là vấn đề bảo mật trong trường hợp này vì firewall sẽ không cho phép các kết nối từ thế giới bên ngoài. Nhưng ta cần cho phép kết nối từ các client bên trong VPN. Thêm phần sau vào file :

mongodb.conf
net: 
  bindIp: 0.0.0.0 
  port: 28018

Cũng trong phần net , hãy đặt đường dẫn đến certificate SSL và chỉ định passphrase (password bảo vệ) certificate . Ta sẽ sớm tạo các file và passphrase (password bảo vệ) chứng nhận thực tế.

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

Cuối cùng, đặt folder lưu trữ mặc định và bật tính năng ghi log .

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

Để tìm hiểu về tất cả các tùy chọn cấu hình có sẵn, hãy đọc tài liệu của MongoDB .

Bây giờ, hãy lưu file và thoát khỏi editor . Đã đến lúc tạo certificate SSL mà ta sẽ sử dụng.

Bước 4 - Tạo certificate SSL

Để bảo mật việc vận chuyển dữ liệu, bạn cần tạo hai certificate SSL cho MongoDB - một cho server và một cho client sẽ truy cập database .

Lưu ý: Ta tạo certificate tự ký trong hướng dẫn này. Trong môi trường production , bạn sẽ sử dụng tổ chức phát hành certificate tin cậy để tạo chúng.

Để làm điều đó, bạn cần cài đặt một trình phân giải DNS riêng . Sau đó, sử dụng thử thách Let's Encrypt DNS để xác thực các domain mạng nội bộ mới được tạo và cấp certificate cho chúng.

Đầu tiên, thay đổi thành folder ~/mongoconf/config/ssl và tạo cặp khóa certificate server . Điền vào dấu nhắc với thông tin bạn chọn. Chú ý đến các trường Common NamePEM Passphrase .

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

Bạn sẽ thấy kết quả sau và sẽ được yêu cầu cung cấp một số chi tiết trong quá trình thực hiện:

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

Khi bạn được yêu cầu nhập cụm từ password PEM, hãy đảm bảo bạn sử dụng cùng một giá trị mà bạn đã sử dụng trong file cấu hình MongoDB của bạn ở bước trước.

MongoDB không chấp nhận các file khóa và certificate riêng biệt, vì vậy hãy kết hợp chúng thành một file .pem duy nhất:

  • cat server.crt server.key >> server.pem

Tiếp theo, tạo cặp khóa certificate cho client :

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

Bạn sẽ làm theo quy trình tương tự như trước đây, nhưng lần này, sử dụng IP riêng của server VPN. Cụm từ vượt qua PEM có thể là bất cứ điều gì bạn muốn cho bước này.

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

Nối các file bạn vừa tạo thành một file .pem :

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

Tiếp theo, sao chép cả hai file certificate vào máy local của bạn để bạn có thể kết nối với server MongoDB từ xa. Bạn có thể thực hiện việc này bằng lệnh scp trên máy local của bạn :

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

Ngoài ra, bạn có thể làm theo hướng dẫn Cách sử dụng SFTP để truyền file an toàn bằng server từ xa để chuyển client.pemserver.pem sang máy local của bạn.

Bây giờ, hãy tạo Docker image và chạy database trong một containers để cấu hình này có thể linh hoạt hơn.

Bước 5 - Tạo Docker image MongoDB và chạy containers

Bạn đã tạo cấu hình MongoDB an toàn và các certificate đã tạo. Bây giờ hãy làm cho nó di động với Docker. Ta sẽ tạo một hình ảnh tùy chỉnh cho MongoDB, nhưng ta sẽ chuyển vào file cấu hình và certificate của ta khi ta chạy containers .

Để xây dựng một hình ảnh, bạn cần một Dockerfile.

Lưu ý : Để chạy docker mà không có sudo , hãy thêm sammy vào group docker :

  • sudo usermod -aG docker sammy

Sau đó đăng xuất khỏi server và đăng nhập lại để quyền group mới có hiệu lực.

Chuyển sang folder root của dự án và mở Dockerfile trống trong editor :

  • cd ~/mongoconf
  • nano Dockerfile

Thêm phần sau vào file mới:

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"]

Tệp này yêu cầu Docker tạo một hình ảnh dựa trên Ubuntu 16.04 Xenial, download file binary MongoDB mới nhất và tạo một vài folder nơi ta sẽ lưu trữ file cấu hình và database . Nó cung cấp cổng 28018 của containers cho server và chạy Mongo mỗi khi user khởi động lại containers .

Lưu ý: Để đơn giản, hình ảnh của ta dựa trên Ubuntu. Tuy nhiên, các containers được xây dựng trên các bản phân phối nhẹ như Alpine Linux sử dụng ít dung lượng ổ đĩa hơn.

Lưu file và thoát khỏi editor . Sau đó, xây dựng hình ảnh:

  • docker build -t mongo .

Sau khi hình ảnh được tạo, hãy chạy một containers dựa trên hình ảnh. Ta sẽ gắn folder config dưới dạng một ổ đĩa bên trong containers để cấu hình tùy chỉnh và các khóa của ta hiển thị với cá thể MongoDB bên trong containers :

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

Đến đây bạn có một version MongoDB đang chạy, hãy truy cập nó từ máy tính local của bạn.

Bước 6 - Truy cập MongoDB

Trong một terminal mới trên máy local của bạn, hãy kết nối với database bằng địa chỉ IP riêng của server MongoDB. Bạn sẽ cung cấp các file client.pem và server.pem mà bạn đã download máy local của bạn , cũng như passphrase (password bảo vệ) bạn đã sử dụng khi tạo certificate ứng dụng client . Thực hiện lệnh này:

  • mongo \
  • --ssl \
  • --sslCAFile path_to_server_pem \
  • --sslPEMKeyFile path_to_client_pem \
  • --sslPEMKeyPassword pem_key_passphrase \
  • --host mongodb_server_private_ip \
  • --port 28018

Nếu mọi thứ đều ổn, bạn sẽ thấy dấu nhắc MongoDB.

Nếu lỗi xuất hiện, hãy kiểm tra kỹ xem bạn đang kết nối với IP riêng của server MongoDB chứ không phải địa chỉ IP của server VPN. Đồng thời xác minh vị trí khóa và passphrase (password bảo vệ) là chính xác và kết nối của bạn với VPN vẫn đang chạy.

Kết luận

Đến đây bạn có MongoDB được cấu hình tùy chỉnh đang chạy trong containers Docker. Bảo mật của nó được cấp bằng xác thực client - server SSL và mã hóa truyền tải. Bạn đã thêm bảo mật bổ sung bằng cách cấu hình firewall để hạn chế kết nối database với các client được kết nối với server VPN.

Mặc dù cài đặt này là tối ưu để thử nghiệm, hãy nhớ rằng trong môi trường production , bạn nên sử dụng tổ chức phát hành certificate tin cậy và các certificate đã ký. Ngoài ra, bạn phải phân tích nhu cầu bảo mật của bạn và hành động phù hợp. Ví dụ: bạn có thể cần cài đặt user , password và role trong database . Hướng dẫn Cách cài đặt và bảo mật MongoDB trên Ubuntu 16.04 có thêm thông tin về cách tạo user và là bước tuyệt vời tiếp theo hướng tới cài đặt sẵn sàng production .


Tags:

Các tin trước

Kết xuất phía server cơ bản với Vue.js và Express 2017-03-14
Cách thiết lập server VPN IKEv2 với StrongSwan trên Ubuntu 16.04 2017-02-17
Cách bảo vệ server của bạn chống lại lỗ hổng Linux COW bẩn 2016-10-31
Cách bảo vệ server của bạn chống lại lỗ hổng HTTPoxy 2016-07-18
Cách cấu hình BIND làm server DNS Mạng riêng trên Ubuntu 16.04 2016-05-09
cách cấu hình bind làm server lưu trữ hoặc chuyển tiếp DNS trên Ubuntu 16.04 2016-05-02
Cách cài đặt và cấu hình Postfix làm server SMTP chỉ gửi trên Ubuntu 16.04 2016-04-29
Cách lưu trữ server chia sẻ tệp bằng Pydio trên Ubuntu 14.04 2016-04-29
Thiết lập server ban đầu với Ubuntu 16.04 2016-04-21
Cách di chuyển một ứng dụng phân tích cú pháp sang server phân tích cú pháp trên Ubuntu 14.04 2016-02-20