Concourse CI是一个现代且可扩展的持续集成系统,旨在通过可组合的声明性语法自动化测试管道。基于早期CI系统的成功,Concourse旨在简化管道管理并消除“雪花”服务器,以便测试服务器与其处理的代码一样受到监管。
在本指南中,我们将通过使用Nginx设置TLS / SSL反向代理来保护Concourse CI接口。虽然Concourse可以配置为本机使用SSL,但反向代理为将来扩展和访问更强大的功能集提供了更大的灵活性。
一台已经设置好可以使用sudo
命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
遵循这些先决条件后,您将在端口8080上运行Concourse服务器。此外,Nginx将在端口80和443上启动并运行。到端口80的流量将重定向到端口443,这将加密对服务器的请求的流量。域名。
准备好开始时,继续下面。
我们需要做的第一件事是修改SSL服务器块文件以将流量路由到Concourse CI服务器。
由于我们希望我们的SSL安全域名服务于Concourse接口,我们需要找到当前正在处理我们域名的服务器块文件。由于我们只对活动服务器块感兴趣,我们可以使用grep
在/etc/nginx/sites-enabled
目录中搜索:
grep -R server_name /etc/nginx/sites-enabled
你可能会看到这样的东西:
/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;
在上面的输出中,域名(example.com
在本例中)是在/etc/nginx/sites-enabled/default
文件中定义的。您需要编辑与您的域名关联的文件(第一列)。
您可能也会看到类似这样的内容:
/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;
上面输出中的server_name _;
通常是服务器块定义,它匹配任何不匹配的请求。如果找不到server_name
与您的域名匹配的定义,则应使用看起来像这样的文件。
在文本编辑器中打开定义域的文件以开始:
sudo nano /etc/nginx/sites-enabled/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;
}
}
可能会有轻微的变化,但这应该是文件的一般结构。我们可以通过两次重要的编辑来调整它以代理我们的Concourse服务器。
首先,在文件的最开始,在server
块之前,我们将创建一个upstream
名为concourse的块,用于定义Concourse Web进程如何接受连接。持续集成服务器接受端口8080上的连接。
接下来,通过查找带有字符串的块来查找负责提供SSL内容的服务器块listen 443
。再次检查该块中定义的server_name
内容是否与您的域名匹配(或者如果您在用find
搜索时未找到与您的域名匹配的任何结果,则设置为server_name _;
)。
在此服务器块内部,我们需要调整location /
块,以便Nginx将所有请求(未在其他地方明确定义)传递给Concourse服务器。为此,我们将包含来自外部文件的参数,设置一些其他参数,并在将请求传递给upstream
我们之前定义的请求之前定义必要的代理头。
将块中定义的try_files
指令替换为location /
以下示例中的行。完成后,完成的文件应类似于:
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;
}
}
完成编辑后,保存并关闭文件。
在使用新配置之前,让Nginx通过键入以下内容来检查语法错误:
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
如果您看到错误消息而不是上述成功消息,请返回并查看您编辑的文件是否存在错误,然后再继续操作。
要实现新配置,请重新启动Nginx:
sudo systemctl restart nginx
Nginx现在配置为将您的域名请求转发到Concourse服务器。
既然Nginx已设置为将流量转发到Concourse服务器,我们应该限制Concourse接受连接的位置。目前,Concourse将接受所有接口上与端口8080的连接,因此用户可以通过直接连接集成服务器来绕过SSL加密。
我们可以通过更改Concourse Web配置来修改此行为。打开web
我们/etc/concourse/web_environment
在文本编辑器中创建的流程配置文件:
sudo nano /etc/concourse/web_environment
查找CONCOURSE_EXTERNAL_URL
参数并对其进行更改以反映用户访问Concourse Web界面时应使用的URL。这包括协议,由我们的指定域名https://
,其后跟我们的域名。
然后,设置一个名为CONCOURSE_BIND_IP
to 的新环境变量127.0.0.1
。默认情况下,Concourse侦听所有接口,但此设置告诉Concourse仅绑定到本地接口。必须通过Nginx代理远程连接,Nginx可以强制执行SSL:
. . .
CONCOURSE_EXTERNAL_URL=https://example.com
CONCOURSE_BIND_IP=127.0.0.1
完成后保存并关闭文件。
重新启动Concourse web
流程以开始使用新设置:
sudo systemctl restart concourse-web
通过键入以下内容,检查Concourse web
接口是否仅侦听本地环回接口:
sudo netstat -plunt | grep 8080
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 20932/concourse
上面的输出表明Concourse web
进程只是在本地接口上侦听。
我们现在可以修改我们的防火墙设置以删除端口8080的异常,因为所有外部请求都将通过Nginx路由:
sudo ufw delete allow 8080
secondary_label Output]
Rule deleted
Rule deleted (v6)
现在,我们可以安全地登录Web界面。
在您选择的Web浏览器中,访问您服务器的域名:
https://example.com
您应该能够访问初始Concourse CI页面:
如果您查看浏览器的地址栏,则会显示您通过安全连接连接到集成服务器:
Nginx保护与浏览器的连接并将请求传递给Concourse。现在我们可以安全地连接,登录Web界面是安全的。
如果单击右上角的登录链接,则可以登录Web界面。首先,您将被要求选择您的团队。在主要的团队,这是管理组,默认情况下是唯一可用的选择:
在下一页上,系统会要求您输入凭据。
输入您在web_environment
文件中配置的凭据后,您将登录并返回到默认的占位符界面:
使用fly
将管道配置提交到服务器后,此屏幕将替换为可监视管道活动的界面。
在本指南中,我们将Nginx配置为Concourse CI服务器的安全反向代理。Nginx接受来自客户端的安全连接,并将请求转发给Concourse服务器。Concourse绑定到本地环回接口,以便远程客户端无法直接连接。
现在您可以安全地联系Concourse服务器,您可以使用fly
工具和Web界面开始构建和管理管道。
更多Ubuntu教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Secure Concourse CI with SSL Using Nginx on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。