Nginx Reverse Proxyを使用してSSLでJenkinsを構成する方法

前書き

デフォルトでは、Jenkinsにはポート8080でリッスンする独自のビルトインWinstone Webサーバーが付属しています。これは使い始めるのに便利です。 ただし、Jenkinsの使用に真剣に取り組むようになったら、すぐにSSLで保護して、ウェブインターフェースを介して送信されるパスワードやその他の機密データを保護する必要があります。

このチュートリアルでは、Nginxをリバースプロキシとして設定して、クライアントリクエストをJenkinsに転送する方法を示します。 開始するには、以下の各前提条件を完了する必要があります。

前提条件

One Ubuntu 16.04 serverは、ルート以外のsudoユーザーとファイアウォールで構成され、次のガイドを使用してJenkinsとNginxがインストールおよび構成されたUbuntu 16.04 initial server setup guideに従います。

これらの要件を完了したら、開始する準備が整いました。

[[step-one -—- configuring-nginx]] ==ステップ1—Nginxの構成

前提条件のチュートリアルHow to Secure Nginx with Let’s Encrypt on Ubuntu 16.04では、/etc/nginx/sites-available/defaultファイルでSSLを使用するようにNginxを構成したので、そのファイルを開いてリバースプロキシ設定を追加します。

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

まず、SSL構成設定を使用してserverブロックに特定のアクセスログとエラーログを追加します。

/etc/nginx/sites-available/default

. . .
server {
        # SSL Configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        access_log            /var/log/nginx/jenkins.access.log;
        error_log            /var/log/nginx/jenkins.error.log;

次に、プロキシ設定を構成します。 すべてのリクエストをJenkinsに送信しているため、デフォルトのtry_files行をコメントアウトします。これは、記述されているとおり、リクエストがJenkinsに到達する前に404エラーを返します。

/etc/nginx/sites-available/default

 . . .
           location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;        }
. . .

次に、実際のプロキシ設定を追加します。 構成は、ホスト名、クライアント要求のプロトコル、クライアントIPアドレスなどの情報がログファイルで利用できるようにするNginx提供のproxy_paramsを含めることから始まります。 次に、proxy_passは、プロキシされたサーバー(この場合はポート8080のローカルホストでアクセスされるJenkinsサーバー)のプロトコルとアドレスを設定します。 次に、proxy_read_timeoutをNginxの60秒のデフォルトからプロジェクトの推奨される90秒の値に増やします。 最後に、proxy_redirectを追加して、responses are properly rewrittenに適切なホスト名が含まれるようにします。

以下のproxy_redirect行でSSLで保護されたドメイン名に置き換えてください。

/etc/nginx/sites-available/default

Location /
. . .
           location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;
                include /etc/nginx/proxy_params;
                proxy_pass          http://localhost:8080;
                proxy_read_timeout  90s;
                # Fix potential "It appears that your reverse proxy set up is broken" error.
                proxy_redirect      http://localhost:8080 https://your.ssl.domain.name;

これらの変更を行ったら、ファイルを保存して終了します。 Jenkinsを設定するまでNginxを再起動しませんが、今すぐ設定をテストします。

sudo nginx -t

すべてが正常な場合、コマンドは以下を返します。

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

そうでない場合は、テストに合格するまで報告されたエラーを修正します。

[。注意]##

Note:
proxy_passの構成を誤った場合(たとえば、末尾にスラッシュを追加するなど)、Jenkinsの構成ページに次のようなものが表示されます。

Jenkins error: Reverse proxy set up is broken

このエラーが表示された場合は、Nginx構成のproxy_passproxy_redirectの設定を再確認してください。

[[step-two -—- configuring-jenkins]] ==ステップ2—Jenkinsの構成

JenkinsがNginxと連携するには、Jenkinsサーバーがすべてのインターフェイス(0.0.0.0)ではなくlocalhostインターフェイスでのみリッスンするようにJenkins構成を更新する必要があります。 Jenkinsがすべてのインターフェースでリッスンしている場合、元の暗号化されていないポート(8080)でアクセスできる可能性があります。

これらの調整を行うために、/etc/default/jenkins構成ファイルを変更します。

sudo nano /etc/default/jenkins

JENKINS_ARGS行を見つけて、既存の引数に--httpListenAddress=127.0.0.1を追加します。

/etc/default/jenkins

. . .
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"

ファイルを保存して終了します。

新しい構成設定を使用するには、JenkinsとNginxを再起動します。

sudo systemctl restart jenkins

systemctlは出力を表示しないため、ステータスを確認します。

sudo systemctl status jenkins

Active行にactive (exited)ステータスが表示されます。

Output● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; bad; vendor preset: enabled)
   Active: active (exited) since Tue 2017-04-25 22:37:29 UTC; 5s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 11360 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
  Process: 11391 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)

Nginxに対してこれらの手順を繰り返します。

sudo systemctl restart nginx
sudo systemctl status nginx
Output● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2017-04-25 22:36:08 UTC; 2min 51s ago
  Process: 11339 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=
  Process: 11349 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 11345 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUC
 Main PID: 11353 (nginx)

両方のサーバーを再起動したので、HTTPまたはHTTPSを使用してドメインにアクセスできるはずです。 HTTPリクエストは自動的にHTTPSにリダイレクトされ、Jenkinsサイトは安全に提供されます。

[[step-three -—- testing-the-configuration]] ==ステップ3—構成のテスト

暗号化を有効にしたので、管理パスワードをリセットして構成をテストします。 まず、httpを介してサイトにアクセスし、Jenkinsに到達し、期待どおりにhttpsにリダイレクトされることを確認します。

Webブラウザーで、「http://your.ssl.domain.name」と入力し、ドメインをyour.ssl.domain.nameに置き換えます。 Enterキーを押すと、URLはhttpsで始まり、ロケーションバーは接続が安全であることを示しているはずです。

Verify Jenkins is being served over https

[ユーザー]フィールドにadminを入力し、Jenkinsがインストール時に作成して保存した自動生成パスワードを入力します。

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

管理者ユーザーのパスワードをリセットした場合は、代わりにそのパスワードを入力してください。 いずれにしても、ログインしたら、パスワードを変更して安全を確保します。

Navigate to the Jenkins admin password page

右上の[管理者]をクリックし、ドロップダウンメニューから[構成]を選択します。 新しいパスワードを入力して確認し、「保存」をクリックします。 Jenkins Webインターフェースを安全に使用できるようになりました。

結論

このチュートリアルでは、前提条件を満たした後、NginxをJenkinsの組み込みWebサーバーへのリバースプロキシとして構成し、Webインターフェイス経由で送信される資格情報やその他の情報を保護しました。 Jenkinsが安全になったので、コードの変更を自動的にテストするためのhow to set up a continuous integration pipelineを学習できます。 Jenkinsを初めて使用する場合に考慮すべきその他のリソースは、the Jenkins project’s “Getting Started: Create your first Pipelineチュートリアルまたはthe library of community-contributed pluginsです。

Related