Konfigurasi SSL Gitea dengan Apache sebagai reverse proxy

Untuk menggunakan registry kontainer di k8s, kita membutuhkannya melalui SSL

Konten Halaman

Kami ingin menjalankan registry kontainer yang bagus dan aman - untuk mendorong gambar docker ke sana dan klaster kubernetes kami akan menariknya dari registry ini. Maka muncul ide untuk menggunakan gitea melalui ssl.

  1. Gitea sudah memiliki registry kontainer
  2. Apache sebagai proxy pengakhiri TLS akan menambahkan HTTPS ke Gitea kami.
  3. Itu bagaimana dimulainya… CA rot, sertifikat self-signed…

Setiap registry memiliki rahasia sendiri

Ketika kita membutuhkan registry di k8s

Sayangnya registry di klaster kubernetes yang dibuat oleh kubespray tidak bekerja untuk saya.

  • untuk mendorong ke sana kita perlu membuat tunnel sementara melalui kube-proxy
  • setelah mendorong ke sana versi saat ini dari klaster baru saya tidak bisa menarik gambar dari registry internal ini

Setelah menghabiskan beberapa malam yang luar biasa mencoba memperbaikinya, Saya memutuskan hanya menggunakan registry kontainer internal Gitea, hanya perlu mengkonfigurasi akses HTTPS ke sana.

Akan membuatnya publik tetap, sehingga docker dan k8s tidak perlu melakukan login docker apa pun. Mungkin. Mari lihat bagaimana kita pergi.

Menguji apakah itu bekerja

Untuk menguji apakah registry kontainer cocok dengan kita kita ingin mampu

  • mendorong gambar ke sana dan
  • membuat deployment di k8s dari gambar tersebut
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

Sekarang xed alp1.yaml atau nano alp1.yaml tergantung pada mood Anda dan

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

Berikut adalah file ini tersedia untuk diunduh Kemudian membuat deployment ini

kubectl create -f alp1.yaml
kubectl get pods

kubectl describe po alp-registry-test-5f5cb94b97-njsp2
# atau apa pun pod yang dibuat atau tidak dibuat

Ya saya tahu tentang bagian ini

      imagePullSecrets:
      - name: registry-secret 

registry-secret adalah nama dari rahasia yang dibuat oleh kubespray.

Pembersihan

kubectl delete -f alp1.yaml

Bagaimana

Beberapa dokumentasi tersedia di situs Gitea: https-setup

Dan di halaman tersebut: https://docs.gitea.com/administration/reverse-proxies

Langkah 1 - Instalasi Apache dan membuat situs uji sederhana

Instalasi Apache

sudo apt install apache2

Periksa apa yang kita miliki di firewall

sudo ufw status

Jika firewall aktif, pikirkan port mana yang ingin Anda ekspos melalui https dan izinkan. Konfigurasi apache standar adalah

sudo ufw app list

Kita mungkin melihat sesuatu seperti

Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

dan untuk mengaktifkan hanya port 443 kita jalankan

sudo ufw allow 'Apache Secure'

baik. sekarang periksa status layanan

sudo systemctl status apache2

Selanjutnya - membuat server virtual sederhana untuk menguji 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

Masukkan

<html>
    <head>
        <title>Selamat datang di reg.homelab!</title>
    </head>
    <body>
        <h1>Berhasil!  Host virtual reg.homelab sedang bekerja!</h1>
    </body>
</html>

kemudian

sudo nano /etc/apache2/sites-available/reg.homelab.conf

dan masukkan

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

kemudian nonaktifkan situs default, aktifkan yang ini dan periksa bagaimana kita berjalan

sudo a2ensite reg.homelab.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest

lihat sesuatu seperti ini?

AH00558: apache2: Tidak dapat menentukan dengan andal nama domain penuh server, menggunakan 127.0.1.1. Tetapkan direktif 'ServerName' secara global untuk menekan pesan ini

kemudian

sudo nano /etc/apache2/apache2.conf

tambahkan di akhir:

ServerName reg.homelab

Dan ini masih bukan akhir! sekarang perlu menghapus upaya pengikatan port 80

sudo nano /etc/apache2/ports.conf

masukkan

Listen 3030
...
Listen 443

Dan sekarang

sudo systemctl restart apache2
sudo systemctl status apache2
journalctl -xeu apache2.service
curl localhost:3080

BAIK! Sekarang kunjungi :3080

Langkah 2 - Mengubah situs ini menjadi reverse proxy tidak aman :) ke Gitea

sudo nano /etc/apache2/sites-available/reg.homelab.conf

memasukkan

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

Lakukan beberapa pengujian konfigurasi

sudo apache2ctl configtest

Tambahkan beberapa modul apache dan restart Apache

sudo a2enmod proxy proxy_http ssl
sudo systemctl restart apache2
sudo systemctl status apache2

BAIK, sekarang kunjungi atau curl

# Ya, masih http, tetapi pada port 443
curl http://localhost:443
http://<Server_IP_Address>:443/

Langkah 3 Sertifikat dan situs self-signed root CA

SweetHome-RootCA.

CANAME=MostImportant-RootCA

# opsional, buat direktori
mkdir $CANAME
cd $CANAME

# menghasilkan kunci pribadi yang dienkripsi aes
openssl genrsa -aes256 -out $CANAME.key 4096

# membuat sertifikat, 1826 hari = 5 tahun
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'

# membuat sertifikat untuk layanan
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'

# membuat file v3 ext untuk properti SAN
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
Pada mesin yang terhubung ke gitea / registry

Daftarkan sertifikat root pada linux:

sudo cp MostImportant-RootCA.crt /usr/local/share/ca-certificates
sudo update-ca-certificates

Daftarkan sertifikat root pada windows:

  • Klik dua kali file MostImportant-RootCA.crt
  • Impor ke pengguna lokal
  • Pilih Truster Root CA.
  • Ketika diminta tentang mengimpor sertifikat yang tidak terpercaya - klik ya

Ketika git pull di windows mengatakan tentang

Tidak dapat menyelesaikan "tidak dapat mendapatkan sertifikat penerbit lokal...

Anda dapat memberi tahu git untuk menggunakan lapisan jaringan windows dengan

git config --global http.sslbackend schannel

Langkah 4 - Mengamankan proxy dengan sertifikat self-signed

https://httpd.apache.org/docs/2.4/ssl/ssl_howto.html

Buat sertifikat self-signed JIKA Anda belum melakukannya di langkah 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

Atau hanya ambil dari langkah sebelumnya

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

Kembali, buka konfigurasi host virtual

sudo nano /etc/apache2/sites-available/reg.homelab.conf

Tambahkan ke bagian bawah bagian SSL dengan sertifikat

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

Periksa konfigurasi, restart server, periksa status dan kunjungi Gitea kami melalui SSL

sudo apache2ctl configtest
sudo systemctl restart apache2
sudo systemctl status apache2

# pergi ke: http://<Server_IP_Address>:443/
# atau
curl -k -v https://localhost

browser akan memperingatkan tentang sertifikat self-signed

Koneksi Anda tidak pribadi
Pencuri mungkin sedang mencoba mencuri informasi Anda dari reg.homelab (misalnya, kata sandi, pesan atau kartu kredit). Pelajari lebih lanjut
NET::ERR_CERT_AUTHORITY_INVALID

Tetapi kita akan mengabaikannya, untuk sekarang, sampai kita menggunakan Let’s Encrypt.

Sekarang uji k8s

Lakukan beberapa DNSing…

Pada setiap node k8s:

sudo nano /etc/hosts

dan tambahkan

192.168.18.200 gitea.homelab
192.168.18.200 reg.homelab

Root CA

Pada setiap node k8s:

sudo cp SweetHome-RootCA.crt /usr/local/share/ca-certificates
sudo update-ca-certificates

Dan restart sekarang

Membuat rahasia dengan kredensial registry

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

atau

kubectl create secret docker-registry regcred --docker-server=your-registry-server --docker-username=your-name --docker-password=your-pword --docker-email=your-email

Gambar docker baru dan deployment 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

Sekarang nano alp2.yaml, file ini [tersedia]tersedia

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

Berikut adalah file ini tersedia untuk diunduh: Membuat deployment ini

kubectl create -f alp2.yaml
kubectl get pods
kubectl describe po alp...

Pembersihan

kubectl delete -f alp2.yaml

Tautan yang berguna