如何在 Ubuntu 16.04 上使用 Nginx 通过 SSL 确保 Concourse CI 的安全

介绍

Concourse CI是一个现代化和可扩展的连续集成系统,旨在用可复制的声明语法来自动化测试管道,基于早期CI系统的成功,Concourse旨在简化管道管理,消除雪花服务器,以便测试服务器与其处理的代码一样受管制。

在以前的教程中(LINK0),我们展示了如何在Ubuntu 16.04服务器上安装和配置Concourse CI实例,最后我们留下了可以从命令行和Web接口管理和监控的连续集成服务器。

在本指南中,我们将通过与 Nginx 设置一个 TLS/SSL 反向代理来保护 Concourse CI 接口.虽然 Concourse 可以配置为本地使用 SSL,但反向代理为未来的扩展提供更多的灵活性,并获得更强大的功能集。

前提条件

在你开始之前,你需要一个 Ubuntu 16.04 服务器 **具有至少 1G 的 RAM **. 完成以下指南来设置一个非根用户,安装和配置 Concourse,安装 Nginx,并在服务器上配置 TLS/SSL 连接。

遵循这些前提后,您将有一个 Concourse 服务器在端口 8080 上运行。 此外, Nginx 将在端口 80 和 443 上运行。

当你准备好开始时,继续下方。

将 Nginx 配置为 Concourse 的反向代理

我们需要做的第一件事是修改SSL服务器封锁文件,将流量路由到Concourse CI服务器。

找到正确的文件来编辑

由于我们希望我们的 SSL 安全域名为 Concourse 接口提供服务,我们需要找出目前处理我们的域名的服务器块文件。

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

你可能会看到这样的东西:

1[secondary_label Output]
2/etc/nginx/sites-enabled/default:   server_name example.com;
3/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
4/etc/nginx/sites-enabled/default:   server_name example.com;
5/etc/nginx/sites-enabled/default:#  server_name example.com;

在上述输出中,域名(‘example.com’ 在本例中)正在被定义为 /etc/nginx/sites-enabled/default 文件中。

也许你也看到了这样的东西:

1[secondary_label Output]
2/etc/nginx/sites-enabled/default:   server_name _;
3/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
4/etc/nginx/sites-enabled/default:   server_name _;
5/etc/nginx/sites-enabled/default:#  server_name example.com;

server_name _;通常在上述输出中是一个服务器块定义,匹配任何未匹配的请求. 如果您无法找到一个匹配您的域名的server_name定义,您应该使用看起来像这样的文件。

定义竞争服务器块

在文本编辑器中打开定义您的域名的文件,以便开始:

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

随着评论被删除,您的文件可能会看起来类似于此,如果您正确遵循前提部分中的教程:

 1[label /etc/nginx/sites-enabled/default]
 2server {
 3    listen 80 default_server;
 4    listen [::]:80 default_server;
 5    server_name example.com;
 6    return 301 https://$server_name$request_uri;
 7}
 8
 9server {
10    listen 443 ssl http2 default_server;
11    listen [::]:443 ssl http2 default_server;
12    include snippets/ssl-example.com.conf;
13    include snippets/ssl-params.conf;
14
15    root /var/www/html;
16    index index.html index.htm index.nginx-debian.html;
17
18    server_name example.com;
19
20    location / {
21        try_files $uri $uri/ =404;
22    }
23
24    location ~ /.well-known {
25        allow all;
26    }
27}

可能会有轻微的变化,但这应该是文件的总体结构,我们可以通过进行两个重要的编辑来适应这个代理服务器的 Concourse。

首先,在文件的开始,在服务器块之前,我们将创建一个名为concourse上游块,该块定义了我们的Concourse Web 流程如何接受连接。

接下来,找出负责提供SSL内容的服务器块,以Listen 443字符串搜索该块. 再次检查该块中定义的server_name是否匹配您的域名(或设置为server_name _;如果您在搜索find时没有找到与您的域名匹配的任何结果)。

在这个服务器块中,我们需要调整位置/块,以便 Nginx 将所有请求(在其他地方没有明确定义)传递给 Concourse 服务器。

用下面的示例中的行替代在位置/块中定义的try_files指令。

 1[label /etc/nginx/sites-enabled/default]
 2upstream concourse {
 3        server 127.0.0.1:8080;
 4}
 5
 6server {
 7    listen 80 default_server;
 8    listen [::]:80 default_server;
 9    server_name example.com;
10    return 301 https://$server_name$request_uri;
11}
12
13server {
14    listen 443 ssl http2 default_server;
15    listen [::]:443 ssl http2 default_server;
16    include snippets/ssl-example.com.conf;
17    include snippets/ssl-params.conf;
18
19    root /var/www/html;
20    index index.html index.htm index.nginx-debian.html;
21
22    server_name example.com;
23
24    location / {
25        include proxy_params;
26        proxy_http_version 1.1;
27        proxy_read_timeout 90;
28
29        proxy_set_header Upgrade $http_upgrade;
30        proxy_set_header Connection "upgrade";
31
32        proxy_pass http://concourse;
33    }
34
35    location ~ /.well-known {
36        allow all;
37    }
38}

完成编辑后,保存并关闭文件。

测试并激活新配置

在使用新配置之前,请让 Nginx 通过键入检查语法错误:

1sudo nginx -t
1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful

如果您看到错误消息,而不是上面的成功消息,请返回并检查您编辑的文件,以查找错误,然后继续。

要实现新的配置,请重新启动 Nginx:

1sudo systemctl restart nginx

Nginx现在已配置为将域名请求转发到Concourse服务器。

将 Concourse 配置为连接到本地回路接口

现在,Concourse将在所有接口上接受端口 8080的连接,因此用户可以通过直接连接到集成服务器来绕过SSL加密。

我们可以通过更改 Concourse Web 配置来修改这种行为. 在您的文本编辑器中打开我们在 /etc/concourse/web_environment 创建的 web 过程的配置文件:

1sudo nano /etc/concourse/web_environment

查找CONCOURSE_EXTERNAL_URL参数,并将其更改以反映用户应该使用的URL访问CONCOURSE Web接口。这包括协议,指定为https://,然后是我们的域名。

之后,设置一个名为CONCOURSE_BIND_IP的新环境变量为127.0.0.1。 默认情况下,Concourse 会倾听所有界面,但此设置告诉Concourse 只将其绑定到本地界面。

1[label /etc/concourse/web_environment]
2. . .
3CONCOURSE_EXTERNAL_URL=https://example.com
4CONCOURSE_BIND_IP=127.0.0.1

保存并关闭文件,当你完成。

重新启动Web程序,开始使用新设置:

1sudo systemctl restart concourse-web

检查ConcourseWeb界面是否只听到本地环绕界面,键入:

1sudo netstat -plunt | grep 8080
1[secondary_label Output]
2tcp 0 0 127.0.0.1:8080 0.0.0.0:*               LISTEN 20932/concourse

上面的输出表明,ConcourseWeb过程只在本地界面上进行听取。

我们现在可以更改我们的防火墙设置,以删除我们对端口8080的例外,因为所有外部请求都将通过Nginx路由:

1sudo ufw delete allow 8080
1secondary_label Output]
2Rule deleted
3Rule deleted (v6)

现在,我们可以安全地登录Web界面。

测试 Web 界面

在您选择的网页浏览器中,访问您的服务器的域名:

1https://example.com

您应该能够访问首页 Concourse CI:

Concourse CI initial screen

如果您查看浏览器的地址栏,会有一些迹象表明您正在通过安全连接连接到集成服务器:

Concourse CI secured connection

Nginx 确保了与您的浏览器的连接,并将请求传递给 Concourse. 现在我们可以安全地连接,您可以安全地登录 Web 界面。

如果您点击右上角的 login 链接,您可以登录 Web 接口. 首先,您将被要求选择您的团队。

Concourse CI select main team

在下一页,您将被要求输入您的凭证。

输入您在web_environment文件中配置的凭证后,您将登录并返回默认的位置接口:

Concourse CI select main team

一旦你将你的管道配置提交到服务器中,这个屏幕将被一个接口取代,你可以监控你的管道活动。

结论

在本指南中,我们将 Nginx 配置为 Concourse CI 服务器的安全反向代理。 Nginx 接受客户端的安全连接,并向 Concourse 服务器提交请求。

现在您可以安全地联系 Concourse 服务器,您可以使用工具和 Web 界面开始构建和管理管道。 您可以遵循我们的下一个指南来学习 如何开发和实施连续集成管道为您的项目设置自动测试流程。

Published At
Categories with 技术
comments powered by Disqus