前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用Nginx在Ubuntu 16.04上使用SSL保护Concourse CI

如何使用Nginx在Ubuntu 16.04上使用SSL保护Concourse CI

原创
作者头像
小翼111
修改2018-10-22 11:39:59
9010
修改2018-10-22 11:39:59
举报

介绍

Concourse CI是一个现代且可扩展的持续集成系统,旨在通过可组合的声明性语法自动化测试管道。基于早期CI系统的成功,Concourse旨在简化管道管理并消除“雪花”服务器,以便测试服务器与其处理的代码一样受到监管。

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

准备

一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

  • 在Ubuntu 16.04上安装Concourse CI
  • 在Ubuntu 16.04上安装Nginx
  • 在Ubuntu 16.04上使用Let加密来保护Nginx

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

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

配置Nginx作为Concourse的反向代理

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

找到要编辑的正确文件

由于我们希望我们的SSL安全域名服务于Concourse接口,我们需要找到当前正在处理我们域名的服务器块文件。由于我们只对活动服务器块感兴趣,我们可以使用grep/etc/nginx/sites-enabled目录中搜索:

代码语言:javascript
复制
grep -R server_name /etc/nginx/sites-enabled

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

代码语言:javascript
复制
/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文件中定义的。您需要编辑与您的域名关联的文件(第一列)。

您可能也会看到类似这样的内容:

代码语言:javascript
复制
/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与您的域名匹配的定义,则应使用看起来像这样的文件。

定义Concourse服务器块

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

代码语言:javascript
复制
sudo nano /etc/nginx/sites-enabled/default

删除注释只是为了简洁,如果您正确地遵循先决条件部分中的教程,则您的文件可能看起来与此类似:

代码语言:javascript
复制
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 /以下示例中的行。完成后,完成的文件应类似于:

代码语言:javascript
复制
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通过键入以下内容来检查语法错误:

代码语言:javascript
复制
sudo nginx -t
代码语言:javascript
复制
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果您看到错误消息而不是上述成功消息,请返回并查看您编辑的文件是否存在错误,然后再继续操作。

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

代码语言:javascript
复制
sudo systemctl restart nginx

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

配置Concourse绑定到本地环回接口

既然Nginx已设置为将流量转发到Concourse服务器,我们应该限制Concourse接受连接的位置。目前,Concourse将接受所有接口上与端口8080的连接,因此用户可以通过直接连接集成服务器来绕过SSL加密。

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

代码语言:javascript
复制
sudo nano /etc/concourse/web_environment

查找CONCOURSE_EXTERNAL_URL参数并对其进行更改以反映用户访问Concourse Web界面时应使用的URL。这包括协议,由我们的指定域名https://,其后跟我们的域名。

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

代码语言:javascript
复制
. . .
CONCOURSE_EXTERNAL_URL=https://example.com
CONCOURSE_BIND_IP=127.0.0.1

完成后保存并关闭文件。

重新启动Concourse web流程以开始使用新设置:

代码语言:javascript
复制
sudo systemctl restart concourse-web

通过键入以下内容,检查Concourse web接口是否仅侦听本地环回接口:

代码语言:javascript
复制
sudo netstat -plunt | grep 8080
代码语言:javascript
复制
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      20932/concourse

上面的输出表明Concourse web进程只是在本地接口上侦听。

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

代码语言:javascript
复制
sudo ufw delete allow 8080
代码语言:javascript
复制
secondary_label Output]
Rule deleted
Rule deleted (v6)

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

测试Web界面

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

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 准备
      • 配置Nginx作为Concourse的反向代理
        • 找到要编辑的正确文件
        • 定义Concourse服务器块
        • 测试并激活新配置
      • 配置Concourse绑定到本地环回接口
        • 测试Web界面
          • 结论
          相关产品与服务
          持续集成
          CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档