إعداد SSL في Gitea باستخدام Apache كم proxy عكسي

للاستفادة من سجل الحاويات في k8s، نحتاج إلى استخدامه عبر ssl

Page content

نريد إنشاء سجل حاويات مريح وآمن - لنقوم بدفع صور دوكير إليه ولنقوم بسحبها من هذا السجل بواسطة كластر كيبرنيتيس الخاص بنا. لذلك جاءت فكرة استخدام جيتا عبر ssl.

  1. جيتا لديه بالفعل سجل حاويات
  2. أباتش كproxy مُنهي TLS سيضيف HTTPS إلى جيتا لدينا.
  3. وهكذا بدأت… CA المُستقل، الشهادات المُوقعة ذاتيًا…

كل سجل لديه أسراره الخاصة

عندما نحتاج إلى السجل في كيبرنيتيس

للأسف السجل المُنشأ في كластر كيبرنيتيس بواسطة كيبسبراي لا يعمل معي.

  • لدفع الصور إليه نحتاج إلى إنشاء نفق مؤقت عبر kube-proxy
  • بعد دفع الصور إليه لم تتمكن إصدار الحالي من كластر جديد من سحب الصور من هذا السجل الداخلي

بعد أن قضيت بعض الليالي الرائعة محاولة إصلاحه، قررت فقط استخدام سجل الحاويات الداخلي لجيتا، فقط يحتاج إلى تكوين الوصول عبر HTTPS إليه.

سأجعله عامًا بأي حال، لذا لا يحتاج دوكير وكيبرنيتيس إلى إجراء أي تسجيلات دوكير. ربما. دعنا نرى كيف نسير.

اختبار إذا كان يعمل

للمحاولة إذا كان سجل الحاويات مناسبًا لنا، نريد أن نتمكن

  • من دفع الصورة إليه و
  • من إنشاء نشر في كيبرنيتيس من هذه الصورة
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

الآن xed alp1.yaml أو nano alp1.yaml حسب المزاج الذي أنت فيه و

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

هنا هذا الملف متوفر للتنزيل ثم إنشاء هذا النشر

kubectl create -f alp1.yaml
kubectl get pods

kubectl describe po alp-registry-test-5f5cb94b97-njsp2
# أو أي بود تم إنشاؤه أو لم يتم إنشاؤه

نعم أعرف هذا الجزء

      imagePullSecrets:
      - name: registry-secret 

registry-secret هو اسم السر الذي أنشأه كيبسبراي.

التنظيف

kubectl delete -f alp1.yaml

كيف

هناك مجموعة من الوثائق متاحة على موقعة جيتا: https-setup

ومن هذه الصفحة: https://docs.gitea.com/administration/reverse-proxies

الخطوة 1 - تثبيت أباتش وإنشاء موقع اختبار بسيط

تثبيت أباتش

sudo apt install apache2

تحقق مما نملك في جدار الحماية

sudo ufw status

إذا كان جدار الحماية نشطًا فكر في أي منفذ ترغب في إظهاره عبر https وسمح به. التكوينات الافتراضية لأباتش هي

sudo ufw app list

ربما نرى شيئًا مثل

التطبيقات المتاحة:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

وإلى أن نفعل فقط منفذ 443 ننفذ

sudo ufw allow 'Apache Secure'

حسنًا. الآن تحقق من حالة الخدمة

sudo systemctl status apache2

الخطوة التالية - إنشاء خادم افتراضي بسيط لاختبار أباتش

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

ضع هناك

<html>
    <head>
        <title>مرحبا بكم في reg.homelab!</title>
    </head>
    <body>
        <h1>نجاح! يعمل خادم reg.homelab الافتراضي!</h1>
    </body>
</html>

ثم

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

وضع هناك

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

ثم تعطيل الموقع الافتراضي، وتفعيل هذا واحد وتحقق من ما نحن عليه

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

هل ترى شيئًا مثل هذا؟

AH00558: apache2: لم يتم تحديد اسم النطاق الكامل للخادم بشكل موثوق، باستخدام 127.0.1.1. ضع تعليمات 'ServerName' عالميًا لتثبيت هذه الرسالة

ثم

sudo nano /etc/apache2/apache2.conf

أضف في النهاية:

ServerName reg.homelab

وهذا لا يزال ليس النهاية! الآن نحتاج إلى إزالة محاولة ربط منفذ 80

sudo nano /etc/apache2/ports.conf

ضع هناك

Listen 3030
...
Listen 443

والآن

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

حسنًا! الآن توجه إلى :3080

الخطوة 2 - تحويل هذا الموقع إلى proxy عكسي غير آمن :) إلى جيتا

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

وضع هناك

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

قم ببعض اختبارات التكوين

sudo apache2ctl configtest

أضف بعض وحدات أباتش واعادة تشغيل أباتش

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

حسنًا، الآن توجه إلى أو curl

# نعم، لا يزال هو http، ولكن على منفذ 443
curl http://localhost:443
http://<Server_IP_Address>:443/

الخطوة 3 - CA الجذر الموقعة ذاتيًا والشهادة الموقعية

SweetHome-RootCA.

CANAME=MostImportant-RootCA

# خياري، إنشاء دليل
mkdir $CANAME
cd $CANAME

# إنشاء مفتاح خاص مشفر بـ aes
openssl genrsa -aes256 -out $CANAME.key 4096

# إنشاء شهادة، 1826 يومًا = 5 سنوات
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'

# إنشاء شهادة للخدمة
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'

# إنشاء ملف v3 ext لخصائص 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
على الأجهزة المتصلة بجيتا / السجل

سجّل شهادة الجذر على لينكس:

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

سجّل شهادة الجذر على ويندوز:

  • انقر مرتين على ملف MostImportant-RootCA.crt
  • استيراد إلى المستخدم المحلي
  • اختر الجذر الموثوق به.
  • عندما تُسأل عن استيراد الشهادة غير الموثوقة - انقر نعم

عندما يقول git pull على ويندوز عن

لا يمكن حل "لا يمكن الحصول على مُصدر محلي..."

يمكنك إخبار git باستخدام طبقة الشبكة في ويندوز من خلال

git config --global http.sslbackend schannel

الخطوة 4 - تأمين Proxy باستخدام شهادة موقعة ذاتيًا

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

أنشئ شهادة موقعة ذاتيًا إذا لم تكن قد أنشأتها في الخطوة 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

أو فقط خذها من الخطوة السابقة

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

مرة أخرى، افتح تكوين خادم افتراضي

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

أضف في الأسفل قسم SSL مع الشهادات

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

تحقق من التكوين، أعد تشغيل الخادم، تحقق من الحالة واتجه إلى جيتا عبر SSL

sudo apache2ctl configtest
sudo systemctl restart apache2
sudo systemctl status apache2

# اذهب إلى: http://<Server_IP_Address>:443/
# أو
curl -k -v https://localhost

سيحذر المتصفح من الشهادة الموقعة ذاتيًا

الاتصال غير آمن
قد يكون المهاجمون يحاولون سرقة معلوماتك من reg.homelab (على سبيل المثال، كلمات المرور، الرسائل أو البطاقات الائتمانية). تعلّم المزيد
NET::ERR_CERT_AUTHORITY_INVALID

لكن سنتجاهلها مؤقتًا، حتى نستخدم Let’s Encrypt.

اختبار كيبرنيتيس الآن

قم ببعض DNS…

على كل عقدة كيبرنيتيس:

sudo nano /etc/hosts

وأضف هناك

192.168.18.200 gitea.homelab
192.168.18.200 reg.homelab

CA الجذر

على كل عقدة كيبرنيتيس:

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

واعادة التشغيل الآن

إنشاء سر مع بيانات تسجيل الدخول إلى السجل

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

أو

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

صورة دوكير جديدة ونشر كيبرنيتيس

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

الآن nano alp2.yaml، الملف متاح [هنا]avaliable

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

هنا هذا الملف متاح للتنزيل: ثم إنشاء هذا النشر

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

التنظيف

kubectl delete -f alp2.yaml

روابط مفيدة