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:
- Cài đặt server ban đầu với Ubuntu 16.04
- Cách cài đặt Concourse CI trên Ubuntu 16.04
- Cách cài đặt Nginx trên Ubuntu 16.04
- Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 16.04
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 :
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:
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
Outputnginx: 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:
. . . 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
Outputtcp 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:
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:
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:
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:
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 .
Các tin liên quan
Cách cấu hình Buildbot với SSL bằng Nginx Reverse Proxy2017-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