2018年7月1日日曜日

GitLab の Docker image で HTTPS とクライアント認証の設定をする

この前は、 HTTPS 通信までだったが、 HTTPS + クライアント認証をしたくなったので試す。

環境

イメージ取得

docker pull gitlab/gitlab-ce:11.0.1-ce.0
docker pull mikoto2000/openssl:latest

仕切り直しのためにボリュームを作り直す

docker container prune
docker volume rm gitlab_etc gitlab_opt gitlab_log
docker volume create gitlab_etc; docker volume create gitlab_log; docker volume create gitlab_opt

各種証明書作成

証明書作成用環境準備

作業用ディレクトリを作成し mikoto2000/openssl 環境を整える。

そして

  • CA
  • サーバー証明書
  • クライアント証明書

を作る。

# ディレクトリを作成して移動
mkdir PATH_TO_GITLAB_BASE/work
cd PATH_TO_GITLAB_BASE/work

設定ファイルを持ってくる

# docker-compose.yml
curl https://raw.githubusercontent.com/mikoto2000/docker-images/324bc3d5f81ad602dc9c35280f9cfe6f1dd0484a/openssl/docker-compose.yml -OutFile .\docker-compose.yml

# openssl.cnf
mkdir usr_lib_ssl
curl https://raw.githubusercontent.com/mikoto2000/docker-images/324bc3d5f81ad602dc9c35280f9cfe6f1dd0484a/openssl/usr_lib_ssl/openssl.cnf -OutFile .\usr_lib_ssl\openssl.cnf

# v3_ca.txt
curl https://raw.githubusercontent.com/mikoto2000/docker-images/324bc3d5f81ad602dc9c35280f9cfe6f1dd0484a/openssl/usr_lib_ssl/v3_ca.txt -OutFile .\usr_lib_ssl\v3_ca.txt

移行、「CA」「サーバー」「クライアント」の作業は、この openssl 環境で作業する。

openssl 環境の利用方法

docker-compose run --rm openssl /bin/bash

CA, サーバー, クライアントの分を全部一気に作ってしまう。

CA

CA 初期化

CA の仕事。

cd /ca

# 各種ディレクトリ作成
mkdir cert private crl newcerts
chmod 700 private

# シリアル初期化
echo "01" | tee -a serial

# crlnumber 初期化
echo "01" | tee -a crlnumber

# インデックス初期化
touch index.txt

CA 鍵と CA 証明書作成

CA の仕事。

KEY_FILE="/ca/private/cakey.pem"
CSR_FILE="/ca/ca.csr"

# CA 用秘密鍵作成
openssl genrsa -out ${KEY_FILE} 2048

# CA 証明書要求作成
COUNTRY="JP"
STATE="Tokyo"
LOCALITY="foo-ku"
ORGANIZATION="bar Inc."
ORGANIZATIONAL_UNIT="baz"
COMMON="localhost"
EMAIL="test@example.com"
SUBJECT="/C=${COUNTRY}/ST=${STATE}/L=${LOCALITY}/O=${ORGANIZATION}/OU=${ORGANIZATIONAL_UNIT}/CN=${COMMON}"
openssl req -new -key ${KEY_FILE} -out ${CSR_FILE} -subj "${SUBJECT}"

# CA 証明書要求確認
openssl req -noout -text -in /ca/ca.csr

# CA 証明書作成
openssl x509 -req -in /ca/ca.csr -signkey /ca/private/cakey.pem -out /ca/cacert.pem -extfile /usr/lib/ssl/v3_ca.txt

証明書のコピー

CA 証明書受け渡しのために /client ディレクトリにコピー

cp /ca/cacert.pem /client

サーバー

鍵と証明書要求の作成

サーバーの仕事。

COMMON="localhost"
KEY_FILE="/client/${COMMON}.key"
CSR_FILE="/client/${COMMON}.csr"

# クライアント秘密鍵作成
openssl genrsa -out ${KEY_FILE} 2048

# クライアント証明書要求作成
COUNTRY="JP"
STATE="Tokyo"
LOCALITY="foo-ku"
ORGANIZATION="bar Inc."
ORGANIZATIONAL_UNIT="baz"
EMAIL="test@example.com"
SUBJECT="/C=${COUNTRY}/ST=${STATE}/L=${LOCALITY}/O=${ORGANIZATION}/OU=${ORGANIZATIONAL_UNIT}/CN=${COMMON}"
openssl req -new -key ${KEY_FILE} -out ${CSR_FILE} -subj "${SUBJECT}"

# クライアント証明書要求確認
openssl req -noout -text -in ${CSR_FILE}

証明書作成

CA の仕事。

COMMON="localhost"
CRT_FILE="/client/${COMMON}.crt"
CSR_FILE="/client/${COMMON}.csr"

cd /client

openssl ca -out ${CRT_FILE} -infiles ${CSR_FILE}

クライアント

鍵と証明書要求の作成

クライアントの仕事。

COMMON="client.example.com"
KEY_FILE="/client/${COMMON}.key"
CSR_FILE="/client/${COMMON}.csr"

# クライアント秘密鍵作成
openssl genrsa -out ${KEY_FILE} 2048

# クライアント証明書要求作成
COUNTRY="JP"
STATE="Tokyo"
LOCALITY="foo-ku"
ORGANIZATION="bar Inc."
ORGANIZATIONAL_UNIT="baz"
EMAIL="test@example.com"
SUBJECT="/C=${COUNTRY}/ST=${STATE}/L=${LOCALITY}/O=${ORGANIZATION}/OU=${ORGANIZATIONAL_UNIT}/CN=${COMMON}"
openssl req -new -key ${KEY_FILE} -out ${CSR_FILE} -subj "${SUBJECT}"

# クライアント証明書要求確認
openssl req -noout -text -in ${CSR_FILE}

証明書作成

CA の仕事。

COMMON="client.example.com"
CRT_FILE="/client/${COMMON}.crt"
CSR_FILE="/client/${COMMON}.csr"

cd /client

openssl ca -out ${CRT_FILE} -infiles ${CSR_FILE}

p12 形式に変換

クライアントの仕事。

COMMON="client.example.com"
CACERT_FILE=/ca/cacert.pem
KEY_FILE=/client/${COMMON}.key
CRT_FILE=/client/${COMMON}.crt
P12_FILE=/client/${COMMON}.p12
openssl pkcs12 -export -out ${P12_FILE} -inkey ${KEY_FILE} -in ${CRT_FILE} -certfile ${CACERT_FILE}

GitLab の設定

GitLab のドキュメント Enable 2-way SSL Client Authentication の通りに設定する

docker-compose.yml の作成

cd PATH_TO_GITLAB_BASE
vim docker-compose.yml

docker-compose.yml

version: '3'
services:
    gitlab:
        image: gitlab/gitlab-ce:11.0.1-ce.0
        restart: always
        hostname: 'localhost'
        volumes:
            - gitlab_etc:/etc/gitlab
            - gitlab_log:/var/log/gitlab
            - gitlab_opt:/var/opt/gitlab
        environment:
            GITLAB_OMNIBUS_CONFIG: |
                external_url 'https://localhost:443/'
                nginx['redirect_http_to_https'] = true
                nginx['redirect_http_to_https_port'] = 80
                nginx['ssl_verify_client'] = "on"
                nginx['ssl_client_certificate'] = '/etc/gitlab/trusted-certs/cacert.pem'
                nginx['ssl_crl'] = '/etc/gitlab/CA.crl'
                gitlab_rails['gitlab_shell_ssh_port'] = 8022
        ports:
            - "80:80"
            - "443:443"
            - "8022:22"

volumes:
    gitlab_etc:
        external: true
    gitlab_log:
        external: true
    gitlab_opt:
        external: true

HTTPS の設定にプラスして下記を追加。

  • nginx['ssl_verify_client']: クライアント認証設定("on" or "off")
  • nginx['ssl_client_certificate']: クライアント認証に使う CA 証明書のパス
  • nginx['ssl_crl']: 失効リストのパス

鍵・証明書の配置

GitLab の初回起動に先立って、別コンテナで鍵と証明書を gitlab_etc の所定の位置に格納しておく。

docker run --rm -it -v "PATH_TO_GITLAB_BASE/work/client:/client" -v "gitlab_etc:/etc/gitlab" debian:stretch-slim /bin/bash
mkdir -p /etc/gitlab/trusted-certs
cp /client/CA.crl /etc/gitlab/
cp /client/cacert.pem /etc/gitlab/trusted-certs/
mkdir -p /etc/gitlab/ssl
chmod 700 /etc/gitlab/ssl
cp /client/localhost.crt /client/localhost.key /etc/gitlab/ssl

firefox に証明書を追加

クライアント証明書

  1. メニュー -> オプション -> プライバシーとセキュリティ -> 証明書証明書を表示 ボタンを押下
  2. あなたの証明書インポート ボタンを押下
  3. クライアント証明書(client.example.com.p12) を選択

CA 証明書

  1. メニュー -> オプション -> プライバシーとセキュリティ -> 証明書証明書を表示 ボタンを押下
  2. 認証局証明書インポート ボタンを押下
  3. CA 証明書(cacert.pem) を選択

動作確認

GitLab 起動

docker-compose up -d

ブラウザでアクセス

  1. localhost にアクセス
  2. 個人証明書の要求ダイアログが出てくるので、 firefox に登録した証明書を選択

ok なはず。

参考文献

0 件のコメント:

コメントを投稿