إعداد SSL في Gitea باستخدام Apache كم proxy عكسي
للاستفادة من سجل الحاويات في k8s، نحتاج إلى استخدامه عبر ssl
نريد إنشاء سجل حاويات مريح وآمن - لنقوم بدفع صور دوكير إليه ولنقوم بسحبها من هذا السجل بواسطة كластر كيبرنيتيس الخاص بنا. لذلك جاءت فكرة استخدام جيتا عبر ssl.
- جيتا لديه بالفعل سجل حاويات
- أباتش كproxy مُنهي TLS سيضيف HTTPS إلى جيتا لدينا.
- وهكذا بدأت… 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
حسنًا! الآن توجه إلى
الخطوة 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