Gitea SSL med Apache som omdirigerande proxy

För att använda container registry i k8s behöver vi det över ssl

Sidinnehåll

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.

  1. Gitea har redan en container registry
  2. Apache som TLS-terminerande proxy kommer att lägga till HTTPS till vårt Gitea.
  3. Så började det… Rot CA, självsignerade certifikat…

Varje registry har sina egna hemligheter

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

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

Användbara länkar