如何使用Ubuntu 16.04中的Nginx安全地使用SSL

Concourse CI是一种现代可扩展的连续集成系统,旨在通过可组合的声明式语法来自动化测试管道。建立早期CI系统的成功,Concourse旨在简化管道管理和...

介绍

Concourse CI是一种现代可扩展的连续集成系统,旨在通过可组合的声明式语法来自动化测试管道。 建立早期CI系统的成功,Concourse的目的是简化管道管理,消除“雪花”服务器,使测试服务器与其处理的代码一样受到监管。

之前的教程中 ,我们演示了如何在Ubuntu 16.04服务器上安装和配置Concourse CI实例。 最后,我们留下了一个可以从命令行和Web界面进行管理和监控的连续集成服务器。

在本指南中,我们将通过使用Nginx设置TLS / SSL反向代理来保护Concourse CI接口。 虽然Concourse可以配置为使用SSL本身,但是反向代理为将来的扩展和访问更强大的功能集提供了更大的灵活性。

先决条件

在开始之前,您将需要一个至少有1G RAM的Ubuntu 16.04服务器。 完成以下指南以设置非root用户,安装和配置Concourse,安装Nginx以及在服务器上配置TLS / SSL连接。 您还需要在Concert服务器上指向的域名才能正确保护它:

遵循这些先决条件后,您将在8080端口上运行一个Concourse服务器。另外,Nginx将在端口80和443上启动并运行。到端口80的流量将被重定向到端口443,这将加密流量,域名。

准备开始时,请继续下面。

配置Nginx作为广播的反向代理

我们需要做的第一件事是修改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;

在上面的输出中,在/etc/nginx/sites-enabled/default文件中定义域名(在这种情况下为example.com )。 您将要编辑与您的域名关联的文件(第一列)。

有可能你也可能看到这样的东西:

/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定义,则应该使用server_name相似的文件。

定义大厅服务器块

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

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

为了简洁起见,删除注释后,如果正确地遵循前提条款中的教程,您的文件可能会看起来类似于此:

在/ etc / nginx的/启用的站点 - /默认
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 Web进程如何接受连接。 连续集成服务器接受8080端口的连接。

接下来,通过查找具有字符串listen 443的块来查找负责提供SSL内容的服务器块。 再次检查该块中定义的server_name是否与您的域名匹配(或者设置为server_name _;如果在使用find搜索时find与您的域名匹配的结果)。

在这个服务器块的内部,我们需要调整location /块,以便Nginx将所有请求(其他地方未明确定义)传递给Concourse服务器。 为此,我们将包括来自外部文件的参数,设置一些附加参数,并在将请求传递给我们之前定义的upstream之前定义必需的代理头。

使用try_files示例中的行替换location /块中定义的try_files指令。 完成后,完成的文件应该类似于:

在/ etc / nginx的/启用的站点 - /默认
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服务器,我们应该限制Concert从哪里接受连接。 目前,Concourse将接受所有接口上8080端口的连接,因此用户可以通过直接与集成服务器连接来绕过SSL加密。

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

sudo nano /etc/concourse/web_environment

查找CONCOURSE_EXTERNAL_URL参数并将其更改为反映用户访问Concert Web界面的URL。 这包括由https://指定的协议,后跟我们的域名。

之后,将一个名为CONCOURSE_BIND_IP的新环境变量CONCOURSE_BIND_IP127.0.0.1 默认情况下,Concourse监听所有接口,但此设置告诉Concourse仅绑定到本地接口。 远程连接必须通过Nginx进行代理,这可以强制执行SSL:

在/ etc /广场/ web_environment
. . .
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

您应该能够访问最初的大厅CI页面:

大厅CI初始屏幕

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

大厅CI安全连接

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

如果您点击右上角的登录链接,您可以登录到Web界面。 首先,您将被要求选择您的团队。 主要团队是行政组织,默认情况下是唯一可用的选择:

大厅CI选择主要团队

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

输入您在web_environment文件中配置的web_environment之后,您将被登录并返回到默认占位符界面:

大厅CI选择主要团队

一旦您将流水线配置提交给服务器,这个屏幕将被一个可以监视管道活动的界面替换。

结论

在本指南中,我们将Nginx配置为Concourse CI服务器的安全反向代理。 Nginx接受来自客户端的安全连接,并将请求转发到Concourse服务器。 Concourse绑定到本地环回接口,以便远程客户端无法直接连接。

现在您可以安全地联系Concourse服务器,您可以使用fly工具和Web界面开始构建和管理流水线。 要了解如何使用fly将管道添加到您的Concourse服务器,请查看Concourse文档中的“hello world”示例