Gitea SSL med Apache som omdirigerande proxy
För att använda container registry i k8s behöver vi det över ssl
Vi vill värd en trevlig och säker container registry - för att skicka docker-bilder dit och vårt kubernetes-kluster skulle hämta dem från denna registry. Därför kom idén att använda gitea över ssl.
- Gitea har redan en container registry
- Apache som TLS-terminerande proxy kommer att lägga till HTTPS till vårt Gitea.
- Så började det… Rot CA, självsignerade certifikat…

När vi behöver registret i k8s
Tyvärr fungerar inte registret i kubernetes-klustret som skapades av kubespray för mig.
- för att skicka in i det behöver vi skapa en tillfällig tunnel via kube-proxy
- efter att ha skickat in i det kan min nuvarande version av det nya klustret inte hämta bilder från denna interna registry
Efter att ha tillbringat några underbara två kvällar med att försöka fixa det, har jag bestämt mig för att bara använda Giteas interna container registry, jag behöver bara konfigurera HTTPS-åtkomst till den.
Jag kommer att göra den offentlig ändå, så att docker och k8s inte behöver göra några docker-inloggningar. Kanske. Låt oss se hur det går.
Testning om det fungerar
För att testa om container registret passar oss vill vi kunna
- skicka en bild dit och
- skapa en deployment i k8s från den bilden
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
Nu xed alp1.yaml eller nano alp1.yaml beroende på vilken stämning du är i och
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
Här är den här filen tillgänglig för nedladdning Sen skapar vi den här deploymenten
kubectl create -f alp1.yaml
kubectl get pods
kubectl describe po alp-registry-test-5f5cb94b97-njsp2
# eller vilket pod som helst som skapades eller inte skapades
Ja, jag vet om den här biten
imagePullSecrets:
- name: registry-secret
registry-secret är namnet på hemligheten som kubespray skapade.
Rensning
kubectl delete -f alp1.yaml
Hur
En massa dokumentation är tillgänglig på Gitea webbplats: https-inställning
Och på den sidan: https://docs.gitea.com/administration/reverse-proxies
Steg 1 - Installera Apache och skapa en enkel testwebbplats
Installera Apache
sudo apt install apache2
Kolla vad vi har i brandväggen
sudo ufw status
Om brandväggen är aktiv fundera på vilken port du vill exponera via https och tillåt den. Standard Apache-konfigurationer är
sudo ufw app list
Vi kan se något som
Tillgängliga applikationer:
Apache
Apache Full
Apache Secure
OpenSSH
och för att aktivera endast port 443 kör vi
sudo ufw allow 'Apache Secure'
ok. nu kolla tjänstens status
sudo systemctl status apache2
Nästa - skapa en enkel virtuell server för att testa 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
Lägg där
<html>
<head>
<title>Välkommen till reg.homelab!</title>
</head>
<body>
<h1>Framgång! Den virtuella hosten reg.homelab fungerar!</h1>
</body>
</html>
sen
sudo nano /etc/apache2/sites-available/reg.homelab.conf
och lägg där
<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>
sen inaktivera standardwebbplatsen, aktivera den här och kolla hur vi ligger till
sudo a2ensite reg.homelab.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
ser du något som detta?
AH00558: apache2: Kunde inte tillförlitligt bestämma serverns fullständiga domännamn, använder 127.0.1.1. Ange direktivet 'ServerName' globalt för att undertrycka detta meddelande
sen
sudo nano /etc/apache2/apache2.conf
lägg till i slutet:
ServerName reg.homelab
Och det här är fortfarande inte slutet! nu måste vi ta bort försöket att binda port 80
sudo nano /etc/apache2/ports.conf
lägg där
Listen 3030
...
Listen 443
Och nu
sudo systemctl restart apache2
sudo systemctl status apache2
journalctl -xeu apache2.service
curl localhost:3080
OK! Nu navigera till
Steg 2 - Omvandla den här webbplatsen till en osäker reverse proxy :) till Gitea
sudo nano /etc/apache2/sites-available/reg.homelab.conf
lägg där
<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>
Gör några konfigurationstester
sudo apache2ctl configtest
Lägg till några Apache-moduler och starta om Apache
sudo a2enmod proxy proxy_http ssl
sudo systemctl restart apache2
sudo systemctl status apache2
OK, nu navigera till eller curl
# Ja, det är fortfarande en http, men på port 443
curl http://localhost:443
http://<Server_IP_Address>:443/
Steg 3 Självsignerad rot-CA och webbplatscertifikat
SweetHome-RootCA.
CANAME=MostImportant-RootCA
# valfritt, skapa en katalog
mkdir $CANAME
cd $CANAME
# generera AES-krypterad privat nyckel
openssl genrsa -aes256 -out $CANAME.key 4096
# skapa certifikat, 1826 dagar = 5 år
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'
# skapa certifikat för tjänst
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'
# skapa en v3 ext fil för SAN-egenskaper
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
På maskiner som ansluter till gitea / registry
Registrera rotcertifikat på linux:
sudo cp MostImportant-RootCA.crt /usr/local/share/ca-certificates
sudo update-ca-certificates
Registrera rotcertifikat på windows:
- Dubbelklicka på filen MostImportant-RootCA.crt
- Importera till lokal användare
- Välj Truster Root CA.
- När det frågas om att importera oäkta certifikat - klicka ja
När git pull på windows säger
Kan inte lösa "kan inte få lokal utfärdare av certifikat...
kan du säga åt git att använda windows-nätverkslager genom
git config --global http.sslbackend schannel
Steg 4 - Säkra proxy med självsignerat certifikat
https://httpd.apache.org/docs/2.4/ssl/ssl_howto.html
Skapa ett självsignerat certifikat OM du inte gjorde det i steg 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
Eller ta det från föregående steg
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
Återigen, öppna virtuell host-konfiguration
sudo nano /etc/apache2/sites-available/reg.homelab.conf
Lägg till där i slutet av SSL-sektionen med certifikaten
<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>
Kontrollera konfiguration, starta om servern, kontrollera status och navigera till vårt Gitea över SSL
sudo apache2ctl configtest
sudo systemctl restart apache2
sudo systemctl status apache2
# gå till: http://<Server_IP_Address>:443/
# eller
curl -k -v https://localhost
webbläsaren kommer att varna för det självsignerade certifikatet
Din anslutning är inte privat
Angripare kan försöka stjäla din information från reg.homelab (till exempel lösenord, meddelanden eller kreditkort). Läs mer
NET::ERR_CERT_AUTHORITY_INVALID
Men vi kommer att ignorera det, för tillfället, tills vi använder Let’s Encrypt.
Nu k8s-test
Gör lite DNS…
På varje k8s-nod:
sudo nano /etc/hosts
och lägg till där
192.168.18.200 gitea.homelab
192.168.18.200 reg.homelab
Root CA
På varje k8s-nod:
sudo cp SweetHome-RootCA.crt /usr/local/share/ca-certificates
sudo update-ca-certificates
Och starta om nu
Skapa hemlighet med registry-uppgifter
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
eller
kubectl create secret docker-registry regcred --docker-server=your-registry-server --docker-username=your-name --docker-password=your-pword --docker-email=your-email
Ny docker-bild och k8s-deployment
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
Nu nano alp2.yaml, filen är [tillgänglig]tillgänglig
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
Här är den här filen tillgänglig för nedladdning: Sen skapar vi den här deploymenten
kubectl create -f alp2.yaml
kubectl get pods
kubectl describe po alp...
Rensning
kubectl delete -f alp2.yaml