Ubuntu 16.04에서 SSL을 통해 Nginx를 사용하여 Concourse CI를 보호하는 방법

Ubuntu 16.04에서 SSL을 통해 Nginx를 사용하여 Concourse CI를 보호하는 방법

2022-06-01 last update

11 minutes reading Ubuntu CI/CD Ubuntu 16.04

소개


Concourse CI는 현대적이고 확장 가능한 연속 통합 시스템으로 조합 가능한 성명성 문법 자동화 테스트 파이프를 사용하기 위한 것이다.초기 CI 시스템의 성공을 바탕으로 Concourse는 파이프 관리를 간소화하고 눈꽃 서버를 없애 서버가 처리된 코드와 같이 잘 관리되는 것을 테스트하는 데 목적을 두었다.
previous tutorial 에서는 Ubuntu 16.04 서버에 Concourse CI 인스턴스를 설치하고 구성하는 방법을 보여 줍니다.마지막으로 우리는 명령줄과 웹 인터페이스에서 관리하고 감시할 수 있는 지속적인 통합 서버를 얻었다.
이 가이드에서는 Nginx 설정 TLS/SSL 리버스 에이전트를 사용하여 Concourse CI 인터페이스를 보호합니다.비록 Concourse를 이 컴퓨터에서 SSL을 사용하도록 설정할 수 있지만, 역방향 에이전트는 장래에 더욱 튼튼한 기능 집합을 확장하고 접근하는 데 더욱 유연성을 제공한다.

선결 조건


시작하기 전에 최소 1G의 RAM이 있는 Ubuntu 16.04 서버가 필요합니다.서버에 비root 사용자를 설정하고, Concourse를 설치하고, Nginx를 설치하고, TLS/SSL 연결을 설정하려면 다음 안내서를 완성하십시오.Concourse 서버의 도메인 이름을 지정하여 보안을 유지해야 합니다.
  • Initial Server Setup with Ubuntu 16.04
  • How To Install Concourse CI on Ubuntu 16.04
  • How To Install Nginx on Ubuntu 16.04
  • How To Secure Nginx with Let’s Encrypt on Ubuntu 16.04
  • 이러한 전제 조건을 준수하면 포트 8080에서 실행되는 Concourse 서버가 있습니다.또한 Nginx는 포트 80과 443에서 시작되고 실행됩니다.포트 80에 대한 트래픽은 서버 도메인 이름으로 요청된 트래픽을 암호화하는 포트 443으로 리디렉션됩니다.
    시작할 준비가 되었을 때, 아래의 조작을 계속하십시오.

    Nginx를 Concourse의 리버스 에이전트로 구성


    우리가 해야 할 첫 번째 일은 Concourse CI 서버로 트래픽을 라우팅하기 위해 SSL 서버 블록 파일을 수정하는 것입니다.

    편집할 올바른 파일 찾기


    우리는 우리의 SSL 보안 도메인 이름이 Concourse 인터페이스에 서비스되기를 희망하기 때문에, 우리는 현재 우리의 도메인 이름을 처리하고 있는 서버 블록 파일을 찾아야 한다.우리는 active 서버 블록에만 관심이 있기 때문에 grep 디렉터리에서 검색할 수 있습니다.
    1. grep -R server_name /etc/nginx/sites-enabled
    다음을 볼 수 있습니다.
    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;
    위의 출력에서 도메인 이름(이 예는 /etc/nginx/sites-enabledexample.com 파일에서 정의됩니다.도메인 이름과 연관된 파일 (첫 번째 열) 을 편집해야 합니다.
    다음과 같은 상황을 볼 수 있습니다.
    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;
    위의 출력 /etc/nginx/sites-enabled/default 은 일반적으로 일치하지 않는 요청과 일치하는 서버 블록 정의입니다.도메인 이름과 일치하는 server_name _; 정의를 찾을 수 없으면 유사한 파일을 사용해야 합니다.

    로비 서버 블록 정의


    텍스트 편집기에서 도메인을 정의하는 파일을 열어 다음을 시작합니다.
    1. sudo nano /etc/nginx/sites-enabled/default
    간결하게 보기 위해 주석을 삭제한 후 필수 부분의 강좌를 정확하게 따르면 파일이 이와 비슷할 수 있습니다.
    /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_name 블록을 만들기 전에, 우리는concourse라는 server 블록을 만들 것입니다. 이 블록은 우리의concourse 웹 프로세스가 연결을 어떻게 받아들이는지 정의합니다.지속적인 통합 서버는 포트 8080의 연결을 수용합니다.
    다음은 문자열upstream이 포함된 블록을 찾아 SSL 컨텐츠를 제공하는 서버 블록을 찾습니다.이 블록에 정의된 listen 443 이 도메인 이름과 일치하는지 다시 확인하십시오 server_name 를 사용하여 검색할 때 도메인 이름과 일치하는 결과를 찾지 못하면 server_name _; 로 설정합니다.
    이 서버 블록 내부에서, Nginx가 모든 요청 (다른 곳은 명확하게 정의되지 않음) 을 Concourse 서버에 전달할 수 있도록 블록을 조정해야 합니다.이를 위해, 외부 파일의 매개 변수를 포함하고, 추가 매개 변수를 설정하고, 요청을 앞에서 정의한 find 에 전달하기 전에 필요한 프록시 헤더를 정의합니다.
    블록에 정의된 location / 명령을 다음 예제의 행으로 대체합니다.완료된 파일은 다음과 같습니다.
    /etc/nginx/sites enabled/default
    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에서 구문 오류를 확인합니다.
    1. sudo nginx -t
    Output
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
    위의 성공 메시지가 아닌 오류 메시지를 보았다면 편집한 파일의 오류를 되돌려 보고 계속하십시오.
    새 구성을 구현하려면 Nginx를 다시 시작하십시오.
    1. sudo systemctl restart nginx
    Nginx는 도메인 이름 요청을 Concourse 서버로 전송하도록 구성됩니다.

    Concourse 를 구성하여 로컬 루프백 인터페이스에 바인딩


    Nginx가 Concourse 서버로 데이터를 전송하도록 설정된 이상 Concourse가 어디에서 연결을 받을지 제한해야 합니다.현재 Concourse는 모든 인터페이스에서 포트 8080에 연결할 수 있기 때문에 사용자는 직접 연결 통합 서버를 통해 SSL을 우회하여 암호화할 수 있다.
    Concourse 웹 설정을 변경하여 이 동작을 수정할 수 있습니다.텍스트 편집기에서 upstream 에서 만든 try_files 프로세스의 프로필을 엽니다.
    1. sudo nano /etc/concourse/web_environment
    location / 매개변수를 찾아 Concourse 웹 인터페이스에 액세스할 때 사용할 URL로 변경합니다.여기에는 web 에서 지정한 프로토콜과 도메인 이름이 포함됩니다.
    그런 다음 /etc/concourse/web_environment 라는 새 환경 변수를 CONCOURSE_EXTERNAL_URL 로 설정합니다.기본적으로 Concourse는 모든 인터페이스를 정탐하지만, 이 설정은 Concourse가 로컬 인터페이스에만 연결되어 있음을 알려줍니다.원격 연결은 Nginx 에이전트를 통해 수행되어야 하며 Nginx는 SSL을 강제할 수 있습니다.
    /etc/로비/web\U 환경
    . . .
    CONCOURSE_EXTERNAL_URL=https://example.com
    CONCOURSE_BIND_IP=127.0.0.1
    
    완료되면 파일을 저장하고 닫습니다.
    Concoursehttps:// 프로세스를 다시 시작하여 새 설정을 사용합니다.
    1. sudo systemctl restart concourse-web
    다음 내용을 입력하여 ConcourseCONCOURSE_BIND_IP 인터페이스가 로컬 루프백 인터페이스만 탐지하는지 확인합니다.
    1. sudo netstat -plunt | grep 8080
    Output
    tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 20932/concourse
    위의 출력은 Concourse127.0.0.1 프로세스가 로컬 인터페이스에서만 정탐되고 있음을 나타낸다.
    이제 방화벽 설정을 수정하여 포트 8080의 예외를 제거할 수 있습니다. 모든 외부 요청이 Nginx 라우팅을 통과하기 때문입니다.
    1. sudo ufw delete allow 8080
    secondary_label Output]
    Rule deleted
    Rule deleted (v6)
    
    현재, 우리는 안전하게 웹 인터페이스에 로그인할 수 있다.

    웹 인터페이스 테스트


    선택한 웹 브라우저에서 서버의 도메인 이름에 액세스하려면 다음과 같이 하십시오.
    https://example.com
    
    초기 Concourse CI 페이지에 액세스할 수 있어야 합니다.

    브라우저의 주소 표시줄을 보면 보안 연결을 통해 통합 서버에 연결하고 있다는 메시지가 표시됩니다.

    Nginx는 브라우저와의 연결을 확인하고 요청을 Concourse에 전달합니다.이제 우리는 안전하게 연결할 수 있고 웹 인터페이스에 로그인하면 안전합니다.
    오른쪽 상단의 로그인 링크를 누르면 웹 인터페이스에 로그인할 수 있습니다.우선, 당신의 팀을 선택하도록 요구할 것입니다.기본적으로 관리 그룹의 마스터 팀이 사용할 수 있는 유일한 선택입니다.

    다음 페이지에서 자격 증명을 입력해야 합니다.web 파일에 구성된 자격 증명을 입력하면 로그인하여 기본 자리 표시자 인터페이스로 돌아갑니다.
    web를 사용하여 파이핑 구성을 서버에 커밋하면 이 화면은 파이핑 활동을 모니터링할 수 있는 인터페이스로 대체됩니다.

    결론


    이 가이드에서는 Nginx를 Concourse CI 서버의 보안 역방향 에이전트로 구성합니다.Nginx는 클라이언트로부터 보안 연결을 수락하고 요청을 Concourse 서버로 전달합니다.Concourse는 로컬 루프백 인터페이스에 연결되어 있어 원격 클라이언트가 직접 연결할 수 없습니다.
    현재, 당신은 안전하게 Concourse 서버에 연락할 수 있으며, web 도구와 웹 인터페이스를 사용하여 파이프를 구축하고 관리할 수 있습니다.다음 학습 안내서how to develop and implement continuous integration pipelines에 따라 프로젝트에 대한 자동 테스트 과정을 설정할 수 있습니다.더 보려고 할 수도 있습니다“hello world” example in the Concourse documentation.