Apache をリバースプロキシとして使用した Gitea の SSL 設定
k8sでコンテナレジストリを使用するには、SSL経由でアクセスする必要があります。
私たちは、セキュアで使いやすいコンテナレジストリをホストしたいと考えています。Dockerイメージをそこにプッシュし、Kubernetesクラスターがこのレジストリからイメージをプルできるようにしたいのです。
そのため、SSLを介してGiteaを使用するというアイデアが浮かびました。
- Gitea にはすでにコンテナレジストリがあります
- ApacheをTLS終端プロキシとして使用することで、GiteaにHTTPSを追加します
- それが始まりました… 自己署名証明書を使用したロート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! 今、
ステップ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