Gitea SSL met Apache als reverse proxy

Om de container registry in k8s te gebruiken, hebben we het nodig via SSL

Inhoud

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.

  1. Gitea heeft al een containerregister
  2. Apache als TLS-terminerende proxy zal HTTPS toevoegen aan onze Gitea.
  3. Zo is het begonnen… Rot CA, zelfondertekende certificaten…

Elk register heeft zijn eigen geheimen

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 :3080

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