Thứ sáu, 26/05/2017 | 00:00 GMT+7

Cách bảo mật CI bằng SSL bằng Nginx trên Ubuntu 16.04

Concourse CI là một hệ thống tích hợp liên tục hiện đại và có thể mở rộng được thiết kế để tự động hóa các đường ống thử nghiệm với cú pháp khai báo, có thể tổng hợp. Dựa trên thành công của các hệ thống CI trước đó, Concourse nhằm mục đích đơn giản hóa việc quản lý đường ống và loại bỏ các server "bông tuyết" để server thử nghiệm được quản lý tốt như mã mà nó xử lý.

Trong hướng dẫn trước , ta đã trình bày cách cài đặt và cấu hình version Concourse CI trên server Ubuntu 16.04. Cuối cùng, ta còn lại với một server tích hợp liên tục có thể được quản lý và giám sát từ cả dòng lệnh và giao diện web.

Trong hướng dẫn này, ta sẽ bảo mật các giao diện Concourse CI bằng cách cài đặt Reverse Proxy TLS / SSL với Nginx. Mặc dù Concourse có thể được cấu hình để sử dụng SSL nguyên bản, Reverse Proxy cung cấp tính linh hoạt hơn cho việc mở rộng quy mô trong tương lai và quyền truy cập vào bộ tính năng mạnh mẽ hơn.

Yêu cầu

Trước khi bắt đầu, bạn cần một server Ubuntu 16.04 với ít nhất 1G RAM . Hoàn thành các hướng dẫn sau để cài đặt user không phải root, cài đặt và cấu hình Concourse, cài đặt Nginx và cấu hình kết nối TLS / SSL trên server . Bạn cũng cần một tên domain được trỏ đến server Concourse của bạn để bảo mật đúng cách:

Sau khi làm theo các yêu cầu này, bạn sẽ có một server Concourse hoạt động trên cổng 8080. Ngoài ra, Nginx sẽ hoạt động trên các cổng 80 và 443. Lưu lượng đến cổng 80 sẽ được chuyển hướng đến cổng 443, sẽ mã hóa lưu lượng cho các yêu cầu tới server của bạn domain .

Khi đã sẵn sàng để bắt đầu, hãy tiếp tục bên dưới.

Cấu hình Nginx làm Proxy đảo ngược cho Hội nghị

Điều đầu tiên ta cần làm là sửa đổi file khối server SSL để định tuyến lưu lượng truy cập đến server Concourse CI.

Tìm đúng file để chỉnh sửa

Vì ta muốn domain được bảo mật SSL của bạn phục vụ giao diện Concourse, ta cần tìm file khối server nào hiện đang xử lý domain của ta . Vì ta chỉ quan tâm đến các khối server đang hoạt động, ta có thể sử dụng grep để tìm kiếm trong folder /etc/nginx/sites-enabled :

  • grep -R server_name /etc/nginx/sites-enabled

Bạn có thể sẽ thấy thông tin như thế này:

Output
/etc/nginx/sites-enabled/default: server_name example.com; /etc/nginx/sites-enabled/default: return 301 https://$server_name$request_uri; /etc/nginx/sites-enabled/default: server_name example.com; /etc/nginx/sites-enabled/default:# server_name example.com;

Trong kết quả ở trên, domain ( example.com trong trường hợp này) đang được xác định trong file /etc/nginx/sites-enabled/default . Bạn cần chỉnh sửa file (cột đầu tiên) được liên kết với domain của bạn.

Có thể bạn cũng có thể thấy thông tin như thế này:

Output
/etc/nginx/sites-enabled/default: server_name _; /etc/nginx/sites-enabled/default: return 301 https://$server_name$request_uri; /etc/nginx/sites-enabled/default: server_name _; /etc/nginx/sites-enabled/default:# server_name example.com;

Tên server server_name _; thường trong kết quả ở trên là một định nghĩa khối server phù hợp với bất kỳ yêu cầu nào chưa được so khớp. Nếu bạn không thể tìm thấy định nghĩa server_name phù hợp với domain của bạn , bạn nên sử dụng file có dạng như vậy để thay thế.

Xác định Khối server phòng chờ

Mở file xác định domain của bạn trong editor để bắt đầu:

  • sudo nano /etc/nginx/sites-enabled/default

Với các comment bị xóa cho ngắn gọn, file của bạn có thể sẽ trông giống như thế này nếu bạn làm theo đúng hướng dẫn trong phần yêu cầu :

/ etc / nginx / sites-enable / default
server {     listen 80 default_server;     listen [::]:80 default_server;     server_name example.com;     return 301 https://$server_name$request_uri; }  server {     listen 443 ssl http2 default_server;     listen [::]:443 ssl http2 default_server;     include snippets/ssl-example.com.conf;     include snippets/ssl-params.conf;      root /var/www/html;     index index.html index.htm index.nginx-debian.html;      server_name example.com;      location / {         try_files $uri $uri/ =404;     }      location ~ /.well-known {         allow all;     } } 

Có thể có một số biến thể nhỏ, nhưng đây phải là cấu trúc chung của file . Ta có thể điều chỉnh điều này thành proxy cho server Concourse của bạn bằng cách thực hiện hai chỉnh sửa quan trọng.

Đầu tiên, ở phần đầu của file , trước các khối server , ta sẽ tạo một khối upstream được gọi là phòng chờ xác định cách quy trình web Phòng chờ của ta chấp nhận các kết nối. Server tích hợp liên tục chấp nhận các kết nối trên cổng 8080.

Tiếp theo, tìm khối server chịu trách nhiệm cung cấp nội dung SSL bằng cách tìm khối có chuỗi listen 443 . Kiểm tra lại rằng server_name quy định tại khối phù hợp với domain của bạn (hoặc là cài đặt để server_name _; nếu bạn không tìm thấy bất kỳ kết quả phù hợp với domain của bạn khi bạn đã tìm kiếm find ).

Bên trong khối server này, ta cần điều chỉnh location / khối để Nginx sẽ chuyển tất cả các yêu cầu (không được xác định rõ ràng ở nơi khác) đến server Concourse. Để thực hiện việc này, ta sẽ bao gồm các tham số từ một file bên ngoài, đặt một vài tham số bổ sung và xác định các tiêu đề proxy cần thiết trước khi chuyển yêu cầu đến phần upstream mà ta đã xác định trước đó.

Thay thế chỉ thị try_files được xác định trong location / khối bằng các dòng trong ví dụ sau. Khi bạn hoàn tất, file hoàn thành sẽ trông giống như sau:

/ etc / nginx / sites-enable / default
upstream concourse {         server 127.0.0.1:8080; }  server {     listen 80 default_server;     listen [::]:80 default_server;     server_name example.com;     return 301 https://$server_name$request_uri; }  server {     listen 443 ssl http2 default_server;     listen [::]:443 ssl http2 default_server;     include snippets/ssl-example.com.conf;     include snippets/ssl-params.conf;      root /var/www/html;     index index.html index.htm index.nginx-debian.html;      server_name example.com;      location / {         include proxy_params;         proxy_http_version 1.1;         proxy_read_timeout 90;          proxy_set_header Upgrade $http_upgrade;         proxy_set_header Connection "upgrade";          proxy_pass http://concourse;     }      location ~ /.well-known {         allow all;     } } 

Khi bạn hoàn tất chỉnh sửa, hãy lưu file .

Kiểm tra và kích hoạt cấu hình mới

Trước khi sử dụng cấu hình mới, hãy để Nginx kiểm tra lỗi cú pháp bằng lệnh :

  • sudo nginx -t
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

Nếu bạn thấy thông báo lỗi thay vì thông báo thành công ở trên, hãy quay lại và xem lại file bạn đã chỉnh sửa để tìm lỗi trước khi tiếp tục.

Để triển khai cấu hình mới, hãy khởi động lại Nginx:

  • sudo systemctl restart nginx

Nginx hiện đã được cấu hình để chuyển tiếp các yêu cầu domain của bạn tới server Concourse.

Cấu hình truy vấn để liên kết với giao diện vòng lặp local

Bây giờ Nginx được cài đặt để chuyển tiếp lưu lượng truy cập đến server Concourse, ta nên giới hạn nơi Concourse chấp nhận kết nối từ đó. Hiện tại, Concourse sẽ chấp nhận kết nối đến cổng 8080 trên tất cả các giao diện, vì vậy user có thể bỏ qua mã hóa SSL bằng cách kết nối trực tiếp với server tích hợp.

Ta có thể sửa đổi hành vi này bằng cách thay đổi cấu hình web Concourse. Mở file cấu hình của quy trình web mà ta đã tạo tại /etc/concourse/web_environment trong editor của bạn:

  • sudo nano /etc/concourse/web_environment

Tìm tham số CONCOURSE_EXTERNAL_URL và thay đổi nó để phản ánh URL mà user nên sử dụng để truy cập giao diện web Concourse. Điều này bao gồm giao thức, được chỉ định bởi https:// , theo sau là domain của ta .

Sau đó, đặt một biến môi trường mới có tên CONCOURSE_BIND_IP thành 127.0.0.1 . Theo mặc định, Concourse lắng nghe tất cả các giao diện, nhưng cài đặt này yêu cầu Concourse chỉ liên kết với giao diện local . Các kết nối từ xa phải được ủy quyền thông qua Nginx, có thể thực thi SSL:

/ etc / concourse / web_enosystem
. . . CONCOURSE_EXTERNAL_URL=https://example.com CONCOURSE_BIND_IP=127.0.0.1 

Lưu file khi bạn hoàn tất.

Khởi động lại quy trình web Concourse để bắt đầu sử dụng cài đặt mới:

  • sudo systemctl restart concourse-web

Kiểm tra xem giao diện web Concourse chỉ lắng nghe giao diện lặp lại local bằng lệnh :

  • sudo netstat -plunt | grep 8080
Output
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 20932/concourse

Kết quả trên cho biết quy trình web Concourse chỉ đang lắng nghe trên giao diện local .

Như vậy, ta có thể sửa đổi cài đặt firewall của bạn để xóa ngoại lệ cho cổng 8080 vì tất cả các yêu cầu bên ngoài sẽ được chuyển qua Nginx:

  • sudo ufw delete allow 8080
secondary_label Output] Rule deleted Rule deleted (v6) 

Bây giờ, ta có thể đăng nhập vào giao diện web một cách an toàn.

Kiểm tra giao diện web

Trong trình duyệt web bạn chọn, hãy truy cập domain của server của bạn:

https://example.com 

Bạn có thể truy cập trang Concourse CI ban đầu:

Màn hình ban đầu của Concourse CI

Nếu bạn nhìn vào thanh địa chỉ của trình duyệt, sẽ có một số dấu hiệu cho thấy bạn đang kết nối với server tích hợp qua kết nối an toàn:

Kết nối bảo mật Concourse CI

Nginx đảm bảo kết nối với trình duyệt của bạn và chuyển yêu cầu tới Concourse. Bây giờ ta có thể kết nối an toàn, thật an toàn khi đăng nhập vào giao diện web.

Nếu bạn nhấp vào liên kết đăng nhập ở góc trên bên phải, bạn có thể đăng nhập vào giao diện web. Đầu tiên, bạn cần chọn group của bạn . Group chính , là group quản trị, là lựa chọn khả dụng duy nhất theo mặc định:

Concourse CI chọn  group  chính

Trên trang tiếp theo, bạn cần nhập thông tin đăng nhập của bạn .

Sau khi nhập thông tin đăng nhập bạn đã cấu hình trong file web_environment , bạn sẽ được đăng nhập và đưa trở lại giao diện trình giữ chỗ mặc định:

Concourse CI chọn  group  chính

Sau khi bạn gửi cấu hình đường ống của bạn đến server một cách fly , màn hình này sẽ được thay thế bằng một giao diện nơi bạn có thể theo dõi hoạt động đường ống của bạn .

Kết luận

Trong hướng dẫn này, ta đã cấu hình Nginx làm Reverse Proxy an toàn cho server Concourse CI. Nginx chấp nhận các kết nối an toàn từ các client và chuyển tiếp các yêu cầu đến server Concourse. Concourse liên kết với giao diện loopback local để các client từ xa không thể kết nối trực tiếp.

Đến đây bạn có thể liên hệ với server Concourse một cách an toàn, bạn có thể bắt đầu xây dựng và quản lý các đường ống bằng cách sử dụng công cụ fly và giao diện web. Bạn có thể làm theo hướng dẫn tiếp theo của ta để tìm hiểu cách phát triển và triển khai các đường ống tích hợp liên tục để cài đặt quy trình kiểm tra tự động cho dự án của bạn. Bạn cũng có thể cần xem ví dụ “hello world” trong tài liệu Concourse .


Tags:

Các tin liên quan

Cách cấu hình Buildbot với SSL bằng Nginx Reverse Proxy
2017-05-17
Cách cấu hình Jenkins với SSL bằng cách sử dụng Nginx Reverse Proxy
2017-05-02
Cách tạo chứng chỉ SSL tự ký cho Nginx trên CentOS 7
2017-01-09
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Debian 8
2016-12-22
Cách tạo chứng chỉ SSL tự ký cho Nginx trên Debian 8
2016-12-20
Cách bảo mật Nginx bằng Let's Encrypt trên Debian 8
2016-12-19
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên Debian 8
2016-12-19
Cách tạo chuyển hướng tạm thời và vĩnh viễn với Nginx
2016-12-19
Cách thêm module gzip vào Nginx trên Ubuntu 16.04
2016-12-02
Cơ sở hạ tầng SaltStack: Tạo Salt State cho web server Nginx
2016-11-07