Apache をリバースプロキシとして使用した Gitea の SSL 設定

k8sでコンテナレジストリを使用するには、SSL経由でアクセスする必要があります。

目次

私たちは、セキュアで使いやすいコンテナレジストリをホストしたいと考えています。Dockerイメージをそこにプッシュし、Kubernetesクラスターがこのレジストリからイメージをプルできるようにしたいのです。
そのため、SSLを介してGiteaを使用するというアイデアが浮かびました。

  1. Gitea にはすでにコンテナレジストリがあります
  2. ApacheをTLS終端プロキシとして使用することで、GiteaにHTTPSを追加します
  3. それが始まりました… 自己署名証明書を使用したロートCA、自己署名証明書…

すべてのレジストリには秘密があります

Kubernetesでレジストリが必要なとき

残念ながら、kubesprayによって作成されたKubernetesクラスター内のレジストリは私には動作しません。

  • そこにプッシュするには、kube-proxyを介して一時的なトンネルを作成する必要があります
  • その後、私の現在のバージョンの新しいクラスターは、この内部レジストリからイメージをプルできません

2つの素晴らしい夜をかけてこれを修正しようとしていたのですが、最終的にGiteaの内部コンテナレジストリを使用することに決めました。HTTPS経由でアクセスできるように設定するだけです。

とにかく、それを公開するので、DockerやK8sはDockerログインをしなくても大丈夫です。
おそらく。では、どうなるか見てみましょう。

それが動作しているかテストする

コンテナレジストリが私たちに適しているかを確認するには、以下のことができるようにしたいです

  • そこにイメージをプッシュする
  • そのイメージからK8sにデプロイメントを作成する
sudo docker pull alpine:3.12.0
sudo docker images
sudo docker tag a24bb4013296 localhost:5000/rg/alpine:version.3.12.0
sudo docker push localhost:5000/rg/alpine:version.3.12.0

xed alp1.yaml または nano alp1.yaml を使用して、気分に応じてファイルを開き、以下を入力します

apiVersion: apps/v1
kind: Deployment
metadata:
  name: alp-registry-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: alp-registry-test
  template:
    metadata:
      labels:
        app: alp-registry-test
    spec:
      containers:
        - name: alpine-test
          image: localhost:5000/rg/lpine:version.3.12.0
      imagePullSecrets:
      - name: registry-secret

このファイルはここからダウンロード可能です。
その後、このデプロイメントを作成します

kubectl create -f alp1.yaml
kubectl get pods

kubectl describe po alp-registry-test-5f5cb94b97-njsp2
# または、作成されたポッドまたは作成されなかったポッドを確認してください

はい、この部分については知っています

      imagePullSecrets:
      - name: registry-secret 

registry-secret は kubespray が作成したシークレットの名前です。

クリーンアップ

kubectl delete -f alp1.yaml

手順

Giteaサイト: https-setup にいくつかのドキュメントがあります
そしてそのページ: https://docs.gitea.com/administration/reverse-proxies

ステップ1 - Apacheをインストールし、簡単なテストサイトを作成する

Apacheをインストール

sudo apt install apache2

ファイアウォールに何があるか確認

sudo ufw status

ファイアウォールが有効な場合、HTTPS経由で公開したいポートを選び、それを許可してください。
標準のApache設定は

sudo ufw app list

このようなものを見ることができるかもしれません

Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

そして、ポート443のみを有効にするために実行します

sudo ufw allow 'Apache Secure'

OK。今サービスの状態を確認します

sudo systemctl status apache2

次に、Apacheのための簡単な仮想サーバーを作成します

sudo mkdir /var/www/reg.homelab
sudo chown -R $USER:$USER /var/www/reg.homelab
sudo chmod -R 755 /var/www/reg.homelab
sudo nano /var/www/reg.homelab/index.html

そこに以下を入力します

<html>
    <head>
        <title>Welcome to reg.homelab!</title>
    </head>
    <body>
        <h1>Success!  The reg.homelab virtual host is working!</h1>
    </body>
</html>

その後

sudo nano /etc/apache2/sites-available/reg.homelab.conf

そこに以下を入力します

<VirtualHost *:3080>
    ServerAdmin webmaster@localhost
    ServerName reg.homelab
    ServerAlias www.reg.homelab
    DocumentRoot /var/www/reg.homelab
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

その後、デフォルトサイトを無効化し、このサイトを有効化し、どうなっているか確認します

sudo a2ensite reg.homelab.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest

このようなものを見ますか?

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message

その後

sudo nano /etc/apache2/apache2.conf

最後に以下を追加します

ServerName reg.homelab

これはまだ終わりではありません!今、ポート80のバインディングの試みを削除する必要があります

sudo nano /etc/apache2/ports.conf

そこに以下を入力します

Listen 3030
...
Listen 443

そして

sudo systemctl restart apache2
sudo systemctl status apache2
journalctl -xeu apache2.service
curl localhost:3080

OK! 今、:3080 にアクセスしてください。

ステップ2 - このサイトをGiteaへの不安全なリバースプロキシに変換します

sudo nano /etc/apache2/sites-available/reg.homelab.conf

そこに以下を入力します

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName reg.homelab
    ServerAlias www.reg.homelab
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ProxyPreserveHost On
    ProxyRequests off
    AllowEncodedSlashes NoDecode
    ProxyPass / http://localhost:3000/ nocanon
</VirtualHost>

いくつかの設定テストを行います

sudo apache2ctl configtest

いくつかのApacheモジュールを追加し、Apacheを再起動します

sudo a2enmod proxy proxy_http ssl
sudo systemctl restart apache2
sudo systemctl status apache2

OK、今、アクセスまたはcurlします

# はい、これはまだhttpですが、443ポートで
curl http://localhost:443
http://<Server_IP_Address>:443/

ステップ3 - 自己署名のルートCAとサイト証明書

SweetHome-RootCA.

CANAME=MostImportant-RootCA

# 任意、ディレクトリを作成
mkdir $CANAME
cd $CANAME

# AES暗号化されたプライベートキーを生成
openssl genrsa -aes256 -out $CANAME.key 4096

# 証明書を生成、1826日 = 5年
openssl req -x509 -new -nodes -key $CANAME.key -sha256 -days 1826 -out $CANAME.crt -subj '/CN=My Root CA/C=AT/ST=Vienna/L=Vienna/O=MyOrganisation'

# サービスの証明書を生成
MYCERT=reg.homelab
openssl req -new -nodes -out $MYCERT.csr -newkey rsa:4096 -keyout $MYCERT.key -subj '/CN=My Firewall/C=AT/ST=Vienna/L=Vienna/O=MyOrganisation'

# SANプロパティのためのv3 extファイルを作成
cat > $MYCERT.v3.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = reg.homelablab
DNS.2 = gitea.homelablab
IP.1 = 192.168.0.10
IP.2 = 192.168.0.11
EOF

openssl x509 -req -in $MYCERT.csr -CA $CANAME.crt -CAkey $CANAME.key -CAcreateserial -out $MYCERT.crt -days 730 -sha256 -extfile $MYCERT.v3.ext
Gitea / レジストリに接続するマシン上

Linuxでルート証明書を登録:

sudo cp MostImportant-RootCA.crt /usr/local/share/ca-certificates
sudo update-ca-certificates

Windowsでルート証明書を登録:

  • MostImportant-RootCA.crt ファイルをダブルクリック
  • ローカルユーザーにインポート
  • 信頼できるルートCAを選択
  • 不信頼証明書のインポートについて尋ねられた場合は、はいをクリック

Windowsでgit pullが

Unable to resolve "unable to get local issuer certificate...

と表示される場合、

git config --global http.sslbackend schannel

と実行して、Windowsのネットワーク層を使用させることができます。

ステップ4 - 自己署名証明書でプロキシをセキュア化

https://httpd.apache.org/docs/2.4/ssl/ssl_howto.html

ステップ3で証明書を作成しなかった場合、自己署名証明書を作成します

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -subj "/CN=reg.homelab" \
  -addext "subjectAltName = DNS:reg.homelab" \
  -keyout /etc/ssl/private/apache-selfsigned-reg.homelab.key \
  -out /etc/ssl/certs/apache-selfsigned-reg.homelab.crt

または、ステップ3からコピーします

sudo cp reg.homelab.crt /etc/ssl/certs/apache-selfsigned-reg.homelab.crt
sudo cp reg.homelab.key /etc/ssl/private/apache-selfsigned-reg.homelab.key

再度、仮想ホスト設定を開きます

sudo nano /etc/apache2/sites-available/reg.homelab.conf

証明書のセクションを下部に追加します

<VirtualHost *:443>
   ServerAdmin webmaster@localhost
   ServerName reg.homelab
   ServerAlias www.reg.homelab
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
   ProxyPreserveHost On
   ProxyRequests off
   AllowEncodedSlashes NoDecode
   ProxyPass / http://localhost:3000/ nocanon
    
   SSLEngine on
   SSLCertificateFile /etc/ssl/certs/apache-selfsigned-reg.homelab.crt
   SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned-reg.homelab.key
</VirtualHost>

設定を確認し、サーバーを再起動し、状態を確認し、SSL経由でGiteaにアクセスします

sudo apache2ctl configtest
sudo systemctl restart apache2
sudo systemctl status apache2

# goto: http://<Server_IP_Address>:443/
# または
curl -k -v https://localhost

ブラウザは自己署名証明書について警告します

Your connection is not private
Attackers might be trying to steal your information from reg.homelab (for example, passwords, messages or credit cards). Learn more
NET::ERR_CERT_AUTHORITY_INVALID

しかし、今はLet’s Encryptを使用するまで無視します。

今K8sテスト

いくつかDNSを設定します…

各K8sノードで:

sudo nano /etc/hosts

そこに以下を追加します

192.168.18.200 gitea.homelab
192.168.18.200 reg.homelab

ルートCA

各K8sノードで:

sudo cp SweetHome-RootCA.crt /usr/local/share/ca-certificates
sudo update-ca-certificates

そして今、再起動します。

レジストリの資格情報を使用してシークレットを作成

https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

sudo docker login reg.homelab
kubectl create secret generic regcred --from-file=.dockerconfigjson=/home/rg/.docker/config.json --type=kubernetes.io/dockerconfigjson

または

kubectl create secret docker-registry regcred --docker-server=your-registry-server --docker-username=your-name --docker-password=your-pword --docker-email=your-email

新しいDockerイメージとK8sデプロイメント

sudo docker pull alpine:3.12.0
sudo docker images
sudo docker tag a24bb4013296 reg.homelab/rg/alpine:version.3.12.0
sudo docker push reg.homelab/rg/alpine:version.3.12.0

nano alp2.yaml、ファイルはここからダウンロード可能

apiVersion: apps/v1
kind: Deployment
metadata:
  name: alp-registry-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: alp-registry-test
  template:
    metadata:
      labels:
        app: alp-registry-test
    spec:
      containers:
        - name: alpine-test
          image: reg.homelab/rg/alpine:version.3.12.0
      imagePullSecrets:
      - name: regcred

このファイルはここからダウンロード可能です。
その後、このデプロイメントを作成します

kubectl create -f alp2.yaml
kubectl get pods
kubectl describe po alp...

クリーンアップ

kubectl delete -f alp2.yaml

有用なリンク