Gitea SSL met Apache als reverse proxy
Om de container registry in k8s te gebruiken, hebben we het nodig via SSL
We willen een aantrekkelijke en beveiligde containerregister hosten - om daar docker-afbeeldingen naar te pushen en onze kubernetes-cluster die vanuit dit register te pullen.
Daarom kwam het idee om Gitea over SSL te gebruiken.
- Gitea heeft al een containerregister
- Apache als TLS-terminerende proxy zal HTTPS toevoegen aan onze Gitea.
- Zo is het begonnen… Rot CA, zelfondertekende certificaten…
Wanneer we het register in k8s nodig hebben
Helaas werkt het register in de kubernetes-cluster gemaakt door kubespray niet voor mij.
- om erin te pushen moeten we een tijdelijke tunnel maken via kube-proxy
- na het pushen kan mijn huidige versie van het nieuwe cluster geen afbeeldingen vanuit dit interne register pullen
Na twee geweldige avonden door te brengen aan het proberen dit te fixen, heb ik besloten gewoon Gitea’s interne containerregister te gebruiken, ik moet alleen HTTPS-toegang tot het register configureren.
Ik maak het op ieder geval openbaar, dus docker en k8s hoeven geen docker-inloggingen te doen. Misschien. Laten we zien hoe het gaat.
Testen of het werkt
Om te testen of het containerregister ons geschikt is, willen we kunnen
- een afbeelding daarheen pushen en
- een deployment in k8s maken vanuit die afbeelding
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
of nano alp1.yaml
afhankelijk van je humeur en
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
Hier is dit bestand beschikbaar voor download Dan deze deployment maken
kubectl create -f alp1.yaml
kubectl get pods
kubectl describe po alp-registry-test-5f5cb94b97-njsp2
# of welke pod er ook maar gemaakt is of niet
Ja, ik weet over dit stukje
imagePullSecrets:
- name: registry-secret
registry-secret is de naam van het geheim dat kubespray heeft gemaakt.
Opschonen
kubectl delete -f alp1.yaml
Hoe
Er is een hoop documentatie beschikbaar op Gitea site: https-setup
En op die pagina: https://docs.gitea.com/administration/reverse-proxies
Stap 1 - Installeer Apache en maak een eenvoudige testsite
Installeer Apache
sudo apt install apache2
Controleer wat we in de firewall hebben
sudo ufw status
Als de firewall actief is, denk dan welk poort je via HTTPS wilt openen en stel dat in. Standaard Apache-configuratie is
sudo ufw app list
We kunnen iets zien zoals
Beschikbare toepassingen:
Apache
Apache Full
Apache Secure
OpenSSH
en om alleen poort 443 te activeren voeren we uit
sudo ufw allow 'Apache Secure'
goed. Nu controleer de service status
sudo systemctl status apache2
Volgende stap - maak een eenvoudige virtuele server om Apache te testen
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
Zet daar
<html>
<head>
<title>Welkom op reg.homelab!</title>
</head>
<body>
<h1>Succes! De virtuele host reg.homelab werkt!</h1>
</body>
</html>
dan
sudo nano /etc/apache2/sites-available/reg.homelab.conf
en zet daar
<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>
dan de standaard site uitschakelen, deze inschakelen en controleren hoe we eraan toe zijn
sudo a2ensite reg.homelab.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
zie je iets als dit?
AH00558: apache2: Kon de volledig gekwalificeerde domeinnaam van de server niet betrouwbaar bepalen, gebruik wordt gemaakt van 127.0.1.1. Stel de 'ServerName'-richtlijn wereldwijd in om dit bericht te onderdrukken
dan
sudo nano /etc/apache2/apache2.conf
voeg aan het einde toe:
ServerName reg.homelab
En dit is nog niet het einde! Nu moeten we de poging tot binding op poort 80 verwijderen
sudo nano /etc/apache2/ports.conf
zet daar
Listen 3030
...
Listen 443
En nu
sudo systemctl restart apache2
sudo systemctl status apache2
journalctl -xeu apache2.service
curl localhost:3080
OK! Nu navigeer naar
Stap 2 - Converteer deze site naar onveilig reverse proxy :) naar Gitea
sudo nano /etc/apache2/sites-available/reg.homelab.conf
zet daar
<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>
Do some config test
sudo apache2ctl configtest
Voeg enkele Apache modules toe en herstart Apache
sudo a2enmod proxy proxy_http ssl
sudo systemctl restart apache2
sudo systemctl status apache2
OK, nu navigeer naar of curl
# Ja, het is nog steeds http, maar op de 443 poort
curl http://localhost:443
http://<Server_IP_Address>:443/
Stap 3 Zelfondertekende root CA en site certificaat
SweetHome-RootCA.
CANAME=MostImportant-RootCA
# optioneel, maak een map
mkdir $CANAME
cd $CANAME
# genereer een AES-gecodeerd privé sleutel
openssl genrsa -aes256 -out $CANAME.key 4096
# creëer certificaat, 1826 dagen = 5 jaar
openssl req -x509 -new -nodes -key $CANAME.key -sha256 -days 1826 -out $CANAME.crt -subj '/CN=My Root CA/C=AT/ST=Wenen/L=Wenen/O=MyOrganisation'
# creëer certificaat voor dienst
MYCERT=reg.homelab
openssl req -new -nodes -out $MYCERT.csr -newkey rsa:4096 -keyout $MYCERT.key -subj '/CN=My Firewall/C=AT/ST=Wenen/L=Wenen/O=MyOrganisation'
# creëer een v3 ext bestand voor SAN eigenschappen
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
Op machines die verbinding maken met gitea / register
Register root certificaat op linux:
sudo cp MostImportant-RootCA.crt /usr/local/share/ca-certificates
sudo update-ca-certificates
Register root certificaat op windows:
- Dubbelklik op het bestand MostImportant-RootCA.crt
- Importeer naar lokale gebruiker
- Selecteer Vertrouwde Root CA.
- Wanneer je wordt gevraagd over het importeren van een onvertrouwd certificaat - klik ja
Wanneer git pull op windows zegt over
Kan niet oplossen "unable to get local issuer certificate...
kan je git vertellen om de windows netwerklayer te gebruiken door
git config --global http.sslbackend schannel
Stap 4 - Beveilig de proxy met een zelfondertekend certificaat
https://httpd.apache.org/docs/2.4/ssl/ssl_howto.html
Creëer een zelfondertekend certificaat als je dat niet hebt gedaan in stap 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
Of neem het gewoon over van de vorige stap
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
Weermaals, open de virtuele host configuratie
sudo nano /etc/apache2/sites-available/reg.homelab.conf
Voeg daar onderaan de SSL sectie met certificaten toe
<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>
Controleer configuratie, herstart server, controleer status en navigeer naar onze Gitea over SSL
sudo apache2ctl configtest
sudo systemctl restart apache2
sudo systemctl status apache2
# ga naar: http://<Server_IP_Address>:443/
# of
curl -k -v https://localhost
de browser zal waarschuwen over het zelfondertekende certificaat
Uw verbinding is niet privé
Aanvallers kunnen proberen uw informatie te stelen van reg.homelab (bijvoorbeeld wachtwoorden, berichten of creditcards). Meer informatie
NET::ERR_CERT_AUTHORITY_INVALID
Maar we negeren het nu, totdat we Let’s Encrypt gebruiken.
Nu k8s test
Doe wat DNS-ing…
Op elk k8s knooppunt:
sudo nano /etc/hosts
en voeg daar toe
192.168.18.200 gitea.homelab
192.168.18.200 reg.homelab
Root CA
Op elk k8s knooppunt:
sudo cp SweetHome-RootCA.crt /usr/local/share/ca-certificates
sudo update-ca-certificates
En herstart nu
Creëer geheim met register referenties
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
of
kubectl create secret docker-registry regcred --docker-server=your-registry-server --docker-username=your-name --docker-password=your-pword --docker-email=your-email
Nieuwe docker afbeelding en 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
, het bestand is [beschikbaar]beschikbaar
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
Hier is dit bestand beschikbaar voor download: Dan deze deployment maken
kubectl create -f alp2.yaml
kubectl get pods
kubectl describe po alp...
Opschonen
kubectl delete -f alp2.yaml