Thứ sáu, 30/10/2015 | 00:00 GMT+7

Cách thiết lập an toàn Shipyard 2.0.10 với TLS trên CoreOS

Docker là một lựa chọn phổ biến cho phần mềm container hóa và CoreOS chuyên dụng cho các môi trường phân cụm, làm cho hai phần mềm này trở nên phù hợp tuyệt vời cho các ứng dụng được container hóa. Tuy nhiên, việc sắp xếp tất cả các containers của bạn có thể phức tạp, đặc biệt nếu chúng chỉ được quản lý thông qua giao diện dòng lệnh Docker hoặc nếu bạn có nhiều version CoreOS.

May mắn là có một công cụ quản lý Docker hữu ích được gọi là Shipyard . Nó cung cấp cho bạn khả năng khởi động lại, phá hủy và tạo containers thông qua GUI hữu ích. Nó cũng cho phép bạn quản lý phân bổ tài nguyên cho các containers cụ thể và quản lý các containers trên nhiều server Docker. Tuy nhiên, điều quan trọng là phải đảm bảo server Docker và hệ thống Shipyard của bạn được bảo mật, đặc biệt nếu chúng đang được sử dụng trong production .

Trong hướng dẫn này, ta sẽ cài đặt Shipyard 2.0.10 trên một server CoreOS duy nhất và bảo mật Docker bằng certificate TLS đảm bảo rằng chỉ những client được ủy quyền mới có thể kết nối với nó. TLS là viết tắt của Bảo mật tầng truyền tải . Nó được sử dụng để mã hóa dữ liệu khi nó được truyền từ client đến server và quay trở lại. Trong trường hợp của ta , ta sẽ sử dụng nó để mã hóa kết nối của ta với server Docker và kết nối của Docker với Shipyard.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần :

  • Một CoreOS Server với ít nhất 512 MB RAM, nhưng 1 GB trở lên được khuyến khích . Đảm bảo bạn chọn version CoreOS ổn định mới nhất, không phải version alpha hoặc beta.

    Tất cả các server CoreOS đều yêu cầu SSH key , vì vậy nếu bạn chưa có, bạn có thể thêm một khóa theo các bước 1 - 3 của Cách sử dụng SSH key với server DigitalOcean .

  • Tên domain đủ điều kiện (FQDN) hoặc domain phụ cho server lưu trữ Docker của bạn.

    Nếu bạn chưa sở hữu một domain , bạn có thể mua một domain từ bất kỳ công ty đăng ký domain nào khác nhau. Sau khi bạn có domain để sử dụng, Cách trỏ đến server tên DigitalOcean từ các công ty đăng ký domain chung có hướng dẫn về cách cài đặt domain đó trong DNS DigitalOcean.

    Bạn có thể trỏ domain đến Server của bạn bằng cách thêm bản ghi A như được mô tả trong Cách cài đặt tên server lưu trữ với DigitalOcean .

  • Cài đặt Docker để sử dụng certificate để xác thực là một chủ đề khá nâng cao, vì vậy hãy đọc qua hướng dẫn OpenSSL này để biết giải thích về cách hoạt động của certificate SSL.

Bước một - Tạo certificate server

Điều đầu tiên ta cần làm là tạo Cơ quan cấp certificate mà ta có thể sử dụng để ký certificate server và client . CoreOS đi kèm với OpenSSL, một tiện ích được dùng để tạo và ký certificate .

Để bắt đầu, ta sẽ tạo một private key RSA. Đầu tiên, hãy tạo và di chuyển đến một folder có tên là dockertls , để dễ dàng nhớ được vị trí của các file .

  • mkdir ~/dockertls && cd ~/dockertls

Tiếp theo, tạo một private key RSA. Lệnh này sẽ nhắc bạn tạo passphrase (password bảo vệ) cho khóa của bạn.

  • openssl genrsa -aes256 -out private-key.pem 4096

Hãy chia nhỏ lệnh trên. genrsa nghĩa là lệnh sẽ tạo một private key RSA riêng. -out private-key.pem chỉ định tên của file ta muốn tạo, là private-key.pem . Bit cuối cùng, 4096 , là độ dài của khóa tính bằng bit. Bạn nên giữ con số này ở một con số cao như 4096.

Tiếp theo, tạo một certificate mới và ký nó bằng private key mà ta vừa tạo. Bạn cần nhập passphrase (password bảo vệ) bạn đã chọn khi tạo khóa.

  • openssl req -new -x509 -sha512 -days 365 -key private-key.pem -out myca.pem

OpenSSL cũng sẽ yêu cầu một số thông tin bắt buộc, như FQDN của server của bạn và hạt mà tổ chức của bạn đặt trụ sở. Cố gắng trả lời những câu hỏi này càng chính xác càng tốt. Đây là bước cuối cùng trong việc tạo Tổ chức phát hành certificate tự ký của ta , hoặc CA.

Bây giờ ta đã có CA, ta có thể tạo một số certificate server để sử dụng với daemon Docker. Hai lệnh sau tạo ra một yêu cầu ký. Đảm bảo thay thế example.com bằng domain hoặc domain phụ bạn đang sử dụng cho Docker.

  • openssl genrsa -out docker-1-key.pem 4096
  • openssl req -subj "/CN=example.com" -sha512 -new -key docker-1-key.pem -out docker.csr

Cuối cùng, ký bằng private key của CA. Bạn cần nhập lại passphrase (password bảo vệ) khóa.

  • openssl x509 -req -days 365 -sha256 -in docker.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out final-server-cert.pem

Thao tác này sẽ tạo một file trong folder hiện tại có tên là final-server-cert.pem , là certificate server sẽ được sử dụng trên server Docker.

Bước hai - Tạo certificate ứng dụng client

Bây giờ ta đã có certificate server , ta cần tạo certificate client . Điều này sẽ được sử dụng khi nào ta cố gắng kết nối với server Docker. Nó sẽ xác minh ứng dụng client kết nối đã thực sự được xác minh và ký bởi CA cá nhân của ta . Do đó, chỉ những client được ủy quyền mới được phép kết nối và gửi lệnh tới Docker.

Đầu tiên, tạo một yêu cầu ký khác cho khách hàng.

  • openssl genrsa -out client-key.pem 4096
  • openssl req -subj '/CN=client' -new -key client-key.pem -out docker-client.csr

Có một bước bổ sung nhỏ cần được thực hiện đối với yêu cầu của khách hàng này. Ta cần tạo một file cấu hình chỉ định rằng certificate kết quả thực sự được dùng để xác thực client .

  • echo extendedKeyUsage = clientAuth > client.cnf

Lệnh trên tạo một file có tên client.cnf với nội dung là extendedKeyUsage = clientAuth mà không cần sử dụng editor .

Tiếp theo, ký khách hàng bằng khóa CA.

  • openssl x509 -req -days 365 -sha512 -in docker-client.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out client.pem -extfile client.cnf

Bây giờ ta có CA, certificate server và certificate client .

Bước 3 - Cấu hình Docker và CoreOS

Trong bước này, ta sẽ cấu hình daemon Docker để sử dụng các certificate của ta .

Ta cần sửa đổi các tùy chọn khởi động cho Docker. CoreOS sử dụng systemd để quản lý các dịch vụ. Nếu bạn muốn đọc trên systemd và tìm hiểu thêm về nó, bạn có thể đọc Cách sử dụng Systemctl để quản lý các đơn vị và dịch vụ Systemd .

Đầu tiên, hãy bắt đầu bằng cách chỉnh sửa file đơn vị Docker. Có một tùy chọn cho lệnh systemctl sẽ giúp ta bằng cách sao chép file đơn vị thực thay vì sửa đổi trực tiếp bản root . Bạn có thể coi nó giống như một overrides cho cấu hình Docker.

Mở file đơn vị Docker để chỉnh sửa bằng systemctl .

  • sudo systemctl edit --full docker

Thao tác này sẽ mở file để chỉnh sửa bằng vim , bạn có thể tìm hiểu cách sử dụng bằng cách đọc hướng dẫn vim của ta .

Tìm dòng bắt đầu bằng ExecStart=/usr/lib/coreos/dockerd . Nối các tùy chọn được đánh dấu bên dưới sau --host=fd:// trên dòng đó, để file trông giống như sau:

EnvironmentFile=-/run/flannel_docker_opts.env MountFlags=slave LimitNOFILE=1048576 LimitNPROC=1048576 ExecStart=/usr/lib/coreos/dockerd --daemon --host=fd:// --tlsverify --tlscacert=/home/core/dockertls/myca.pem --tlscert=/home/core/dockertls/final-server-cert.pem --tlskey=/home/core/dockertls/docker-1-key.pem -H=0.0.0.0:2376 $DOCKER_OPTS $DOCKER_OPT_BIP $DOCKER_OPT_MTU $DOCKER_OPT_IPMASQ 

Hãy xem xét các tùy chọn mà ta vừa thêm:

  • --tlsverify chỉ cần bật xác minh TLS để chỉ những khách hàng được ủy quyền mới có thể kết nối.
  • --tlscacert chỉ định vị trí của certificate CA của ta .
  • --tlscert chỉ định vị trí certificate server .
  • --tlskey chỉ định vị trí khóa server .
  • -H=0.0.0.0:2376 nghĩa là Docker sẽ lắng nghe các kết nối từ bất kỳ đâu, nhưng nó vẫn sẽ không cho phép bất kỳ kết nối nào không có certificate hoặc khóa ứng dụng client được ủy quyền.

Lưu file , sau đó reload daemon Docker để nó sử dụng cấu hình mới của ta .

  • sudo systemctl restart docker

Bạn có thể đảm bảo mọi thứ đang hoạt động bằng cách kiểm tra trạng thái của Docker.

  • systemctl status docker

Tìm dòng bắt đầu bằng Active:. Nếu nó cho biết bất kỳ điều gì khác ngoài hoạt động (đang chạy) , hãy kiểm tra kỹ các chỉnh sửa file đơn vị của bạn và đảm bảo tất cả các khóa và certificate bắt buộc đã được tạo.

Cuối cùng, ta có thể kiểm tra xác minh TLS của bạn .

  • docker --tlsverify --tlscacert=myca.pem --tlscert=client.pem --tlskey=client-key.pem -H=example.com:2376 info

Nếu tất cả đều ổn, bạn sẽ nhận lại một số thông tin hệ thống cơ bản về server Docker của bạn ; điều này nghĩa là bạn vừa bảo mật server Docker của bạn bằng TLS. Nếu bạn gặp lỗi, hãy kiểm tra log bằng trình systemctl status docker .

Như vậy, bạn có thể truy cập server Docker của bạn từ mọi nơi miễn là bạn kết nối bằng certificate và khóa ứng dụng client hợp lệ. Bạn có thể tạo và ký bao nhiêu certificate ứng dụng client mà bạn muốn để sử dụng trong một cụm.

Bước 4 - Lắp đặt xưởng đóng tàu

Cài đặt Shipyard là một quá trình khá dễ dàng. Tất cả các phần đều tự chứa trong containers Docker của riêng chúng, vì vậy Docker sẽ tự động kéo các hình ảnh cần thiết.

Đầu tiên, ta cần cài đặt một data volumes nơi database của Shipyard sẽ được lưu trữ.

  • docker create --name shipyard-rethinkdb-data shipyard/rethinkdb

Bây giờ ta có thể kéo xuống và tạo ra một containers mới cho RethinkDB . Đây là công cụ database mà Shipyard sử dụng để theo dõi dữ liệu thời gian thực từ Docker.

  • docker run -it -d --name shipyard-rethinkdb --restart=always --volumes-from shipyard-rethinkdb-data -p 127.0.0.1:49153:8080 -p 127.0.0.1:49154:28015 -p 127.0.0.1:29015:29015 shipyard/rethinkdb

Lệnh này cũng đảm bảo RethinkDB sẽ chỉ lắng nghe trên localhost . Đây là một cách tốt để bảo mật database này vì nó nghĩa là không ai có thể truy cập nó từ bên ngoài server .

Ta sẽ sử dụng Shipyard version 2.0.10 vì đây là version dễ cấu hình nhất với Docker TLS. Lệnh sau sẽ bắt đầu một containers mới chạy Shipyard và liên kết nó với containers RethinkDB, cho phép chúng giao tiếp với nhau.

  • docker run -it -p 8080:8080 -d --restart=always --name shipyard --link shipyard-rethinkdb:rethinkdb shipyard/shipyard:2.0.10

Khi bạn đã hoàn tất cài đặt Shipyard của bạn , hãy truy cập http:// example.com :8080 hoặc http:// your_server_ip :8080 để truy cập console Shipyard. Bạn có thể đăng nhập với tên user mặc định là admin và password đóng tàu .

Shipyard sẽ nhắc bạn thêm một động cơ mới vào cụm. Nhấp vào nút + THÊM màu xanh lục và bạn sẽ thấy một biểu mẫu như sau:

Xưởng đóng tàu Thêm

Điền thông tin như sau:

  • Tên có thể là bất cứ điều gì bạn muốn. Đây sẽ là tên của động cơ.
  • Nhãn cũng có thể là bạn muốn . Chỉ cần làm cho nó ngắn gọn để bạn có thể sắp xếp các containers của bạn .
  • CPU là server của bạn có bao nhiêu CPU.
  • Bộ nhớ là bao nhiêu RAM server của bạn có.
  • Địa chỉ phải là https:// your_server_ip :2376 để sử dụng TLS.

Có ba vùng văn bản lớn bên dưới các tùy chọn cơ bản. Đây là nơi bạn sẽ dán các certificate và khóa để Shipyard có thể kết nối an toàn với server Docker của bạn.

Trường đầu tiên, Chứng chỉ SSL , certificate request ứng dụng client . In nội dung của certificate .

  • cat ~/dockertls/client.pem

Sau đó sao chép kết quả và dán nó vào hộp Chứng chỉ SSL .

Tiếp theo, in nội dung của khóa client .

  • cat ~/dockertls/client-key.pem

Dán kết quả vào vùng văn bản SSL Key .

Cuối cùng, in nội dung hte của certificate CA.

  • cat ~/dockertls/myca.pem

Dán nội dung đó vào hộp Chứng chỉ CA.

Nhấp vào nút THÊM màu xanh lam nhạt ở cuối trang. Nếu mọi thứ được cấu hình chính xác, Shipyard sẽ hiển thị cho bạn màn hình sau:

Danh sách động cơ xưởng đóng tàu

Kết luận

Đến đây bạn có một server lưu trữ Docker an toàn đang chạy trên server CoreOS của bạn!

Shipyard có thể giúp quản lý các container và cụm vật chủ của bạn một cách an toàn và bảo mật. Bạn cũng có thể thêm khóa khách và certificate vào máy local của bạn để có thể quản lý từ xa cụm Docker của bạn từ bất kỳ đâu.

Đối với các bước bảo mật bổ sung, bạn có thể sử dụng Nginx để đảo ngược proxy server Shipyard của bạn . Điều này cho phép bạn sử dụng HTTPS để có kết nối an toàn hơn với Shipyard từ máy local của bạn. Bạn có thể tìm hiểu thêm về điều đó trong bài viết Docker Explained: Cách chứa và sử dụng Nginx làm Proxy . Bạn cũng có thể tạo ra nhiều server CoreOS hơn và dùng thử một cụm Docker. Bạn có thể quản lý hàng trăm động cơ bằng Shipyard.


Tags:

Các tin liên quan