استخدام APISIX Ingress Controller مع AWS ACM
Xin Rong
December 30, 2022
لماذا نحتاج إلى AWS ACM؟
المشكلات الناتجة عن الإدارة اليدوية
تحتوي الشهادة على معلومات مثل الحامل والمصدر وتاريخ انتهاء الصلاحية، ولا يمكن استخدام الشهادة المنتهية الصلاحية ويجب تجديدها قبل انتهاء صلاحيتها. لذلك، يجب تسجيل معلومات الشهادة، على سبيل المثال، تسجيلها يدويًا في جدول بيانات، لضمان إمكانية إلغاء الشهادات وتجديدها في الوقت المناسب.
ومع ذلك، مع زيادة عدد الشهادات، لا يمكن للإدارة اليدوية إدارة الشهادات بشكل صحيح وفعال. لا يمكن لجدول البيانات إرسال إشعار تلقائي، ولن يقوم بتجديد الشهادة تلقائيًا عند انتهاء صلاحيتها، مما يجلب مخاطر غير ضرورية.
لتجنب مخاطر انقطاع الشهادة والحفاظ على التحديثات التلقائية وفقًا للمعلومات واللوائح الجديدة، ظهرت إدارة الشهادات التلقائية، مما يقلل من مخاطر انتهاء صلاحية الشهادات ويخفف العبء عن المطورين.
إدارة الشهادات تلقائيًا مع ACM
يمكن لـ AWS Certificate Manager (ACM) توفير وإدارة ونشر وتجديد شهادات SSL/TLS بسهولة. يمكنك إصدار الشهادات مباشرة من خلال ACM لحماية مواقعك وتطبيقاتك على AWS أو استيراد شهادات طرف ثالث إلى نظام إدارة ACM.
مع ACM، لم تعد بحاجة إلى المرور بالعمليات اليدوية المكثفة المرتبطة باستخدام وإدارة شهادات SSL/TLS كما كان من قبل. يمكنك أيضًا تصدير شهادات ACM الموقعة من قبل AWS Private CA لاستخدامها في أي مكان داخل PKI الداخلي الخاص بك. بالإضافة إلى ذلك، يتم دمجها مع AWS Elastic Load Balancing (ELB).
ما هي المشكلات التي يحلها ACM Private CA؟
تُستخدم الشهادات الموقعة ذاتيًا لنشر التطبيقات الداخلية دون أي CA خاص داخل المنظمة. عندما تحاول هذه التطبيقات الوصول إلى بعضها البعض، قد ترفض الوصول إلى بعضها البعض لأن شهاداتها غير موثوقة. الوثوق بشكل أعمى بمصادر غير معروفة للتطبيقات يمكن أن يجلب مخاطر أمنية. في هذه الحالة، نحتاج إلى خدمة CA خاصة مستضافة لإنشاء وإدارة تسلسل هرمي لـ CA لضمان أن جميع التطبيقات داخل المنظمة موثوقة.
ACM Private CA هي خدمة مستضافة عالية التوفر تقوم بإنشاء والحفاظ على PKI داخلي لمنظمتك، مما يلغي تكلفة الصيانة المستمرة. يتم تخزين المفاتيح الخاصة في وحدات أمان الأجهزة (HSM) المستضافة على AWS والتي تم التحقق منها بواسطة FIPS 140-2، مما يوفر حلًا أكثر أمانًا لمنظمات إصدار الشهادات مقارنة بـ CA الافتراضي في Kubernetes.
كيفية استخدام ACM مع Kubernetes؟
هناك تكوينان مختلفان لإنهاء شهادات TLS في Kubernetes:
- إنهاء شهادات TLS في Ingress: عندما تكون هناك حاجة للتشفير بين التطبيقات، نحتاج إلى إنهاء TLS في متحكم Ingress. يمكن لكل تطبيق إدارة شهادته من خلال Ingress دون أي تدخل من بعضها البعض. هذه الطريقة أسهل في التكوين والإدارة وتضمن أن الاتصال بين التطبيقات موثوق به.
- إنهاء شهادات TLS في NLB: إنهاء شهادات TLS على مستوى NLB هو الحالة الأكثر شيوعًا لاستخدام الشهادات الموثوقة بشكل عام. هذه الطريقة سهلة التكوين وربط شهادة ACM الموثوقة بشكل عام بـ NLB. الوصول إلى التطبيقات داخل الكتلة لا يزال يستخدم HTTP دون أي عمليات تشفير وفك تشفير إضافية.
في الأمثلة التالية، يمكنك تكوين APISIX Ingress مباشرة على Amazon EKS. باستخدام هاتين الطريقتين، سنوضح كيفية عمل APISIX Ingress مع ACM (و ACM Private CA).
المتطلبات الأساسية
قبل أن نبدأ، يجب أن نفي بالمتطلبات التالية:
- AWS حساب AWS وواجهة سطر أوامر AWS (AWS CLI)
- يجب أن يكون لديك إذن لاستخدام دور IAM لـ Amazon EKS والأدوار المتعلقة بالخدمة AWS CloudFormation, Amazon Virtual Private Cloud (Amazon VPC) والموارد ذات الصلة. يرجى التحقق من هذه المقالة في دليل المستخدم IAM "العمليات والموارد ومفاتيح الشرط لـ Amazon Elastic Container Service for Kubernetes" واستخدام الأدوار المتعلقة بالخدمة. بالإضافة إلى ذلك، يحتاج هذا المبدأ الأمني IAM إلى إرفاق سياسة IAM المدارة AWSCertificateManagerPrivateCAFullAccess.
- تثبيت وتكوين kubectl و eksctl.
مجموعة Amazon EKS
Amazon EKS هي خدمة مستضافة تسمح لك بتشغيل Kubernetes على AWS ونشر وإدارة مجموعات Kubernetes الخاصة بك بسهولة. ستستخدم هذه المقالة أداة سطر الأوامر eksctl لإدارة المجموعات.
- استخدام التكوين الافتراضي لـ eksctl لإنشاء المجموعات (يرجى تجاهل هذا الجزء إذا كان لديك بالفعل مجموعة EKS)
eksctl create cluster
تثبيت APISIX Ingress
- تثبيت APISIX Ingress في مجموعة EKS، وتعيينها كنوع LoadBalancer.
helm repo add apisix https://charts.apiseven.com
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install apisix apisix/apisix \
--set gateway.type=LoadBalancer \
--set gateway.tls.enabled=true \
--set ingress-controller.enabled=true \
--namespace ingress-apisix \
--create-namespace
ملاحظة:
يرجى التأكد من أن مجموعتك يمكنها إضافة وحدات تخزين دائمة؛ يرجى الاطلاع على Amazon EKS Storage لمزيد من التفاصيل. إذا كنت ترغب فقط في تجربة هذا البرنامج التعليمي، قم بتكوين --set etcd.persistence.enabled=false
أثناء التثبيت للإعلان عن عدم استخدام وحدات التخزين الدائمة.
- تنفيذ الأوامر التالية للتحقق من الحالة، والتأكد من أن جميع الحاويات في حالة
Running
.
$ kubectl get pods -n ingress-apisix
NAME READY STATUS RESTARTS AGE
apisix-78bfc58588-qspmm 1/1 Running 0 103s
apisix-etcd-0 1/1 Running 0 103s
apisix-etcd-1 1/1 Running 0 103s
apisix-etcd-2 1/1 Running 0 103s
apisix-ingress-controller-6ff56cd4b4-rktr9 1/1 Running 0 103s
- التحقق من حالة NLB؛ يرجى الانتباه إلى PORT(S) و EXTERNAL-IP.
$ kubectl get svc apisix-gateway -n ingress-apisix
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
apisix-gateway LoadBalancer 10.100.178.65 a6cffe9f6fc5c47b9929cb758610fc5a-2074689558.ap-northeast-1.elb.amazonaws.com 80:30851/TCP,443:32735/TCP 103s
إنهاء شهادات TLS في NLB
إعداد شهادة ACM
- افتح ACM console، وقم بطلب شهادة ACM عامة لنطاقك المخصص أو استيراد شهادة مخصصة.
تكوين شهادة LoadBalancer
- افتح EC2 console، واختر load balancers -> listener -> edit
- قم بتعيين بروتوكول NLB إلى HTTPS، والمنفذ إلى 443، وبروتوكول المثيل إلى HTTP والمنفذ إلى 30851
- إرفاق شهادة TLS من ACM إلى NLB.
ربط النطاق المخصص باسم موزع التحميل
يمكنك استخدام وحدة تحكم موفر DNS الخاص بك لتوجيه سجل DNS الخاص بتطبيقك إلى عنوان URL الخاص بـ NLB عبر CNAME. على سبيل المثال، Route53 و تكوين سجلات CNAME التي تشير إلى NLB الخاص بك.
httpbin.example-test.org CNAME a6cffe9f6fc5c47b9929cb758610fc5a-2074689558.ap-northeast-1.elb.amazonaws.com
الوصول إلى نطاق التطبيق
curl https://httpbin.example-test.org
إنهاء شهادة TLS في Ingress
قبل أن نبدأ هذا المثال، تأكد من استعادة تكوين AWS NLB، كما هو موضح في الصورة التالية.
تثبيت cert-manager
Cert-manager هو إضافة لـ Kubernetes يمكنها إدارة وإصدار شهادات TLS تلقائيًا من مصادر مختلفة. يمكنك استخدام طريقة شائعة لتثبيت cert-manager.
إنشاء ACM Private CA
- افتح وحدة تحكم ACM PCA، واختر "إنشاء CA خاص"، وقم بالتثبيت.
- بعد إنشاء CA بنجاح، وتكون الحالة نشطة. سيتم استخدام ARN الخاص بـ PCA بشكل متكرر في الأقسام اللاحقة.
تعيين أذونات عقدة EKS لـ ACM Private CA
بشكل افتراضي، لا يوجد إذن إصدار. لإصدار شهادة من ACM Private CA، يجب إضافة سياسة IAM إلى EKS NodeInstanceRole، بما في ذلك دور الخدمة iamserviceaccount.
- إنشاء ملف
pca-iam-policy.json
، ويجب استبدال${PCA_ARN}
بـ PCA_ARN الخاص بك.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "awspcaissuer",
"Action": [
"acm-pca:DescribeCertificateAuthority",
"acm-pca:GetCertificate",
"acm-pca:IssueCertificate"
],
"Effect": "Allow",
"Resource": "${PCA_ARN}"
}
]
}
- إنشاء IAM و iamserviceaccount بناءً على pca-iam-policy.json، ويجب استبدال
${account_id}
بمعرف AWS الخاص بك.
aws iam create-policy \
--policy-name AWSPCAIssuerIAMPolicy \
--policy-document file://pca-iam-policy.json
# إنشاء مساحة اسم
kubectl create namespace aws-pca-issuer
eksctl create iamserviceaccount \
--cluster=${cluster_name} \
--namespace=aws-pca-issuer \
--name=aws-pca-issuer \
--attach-policy-arn=arn:aws:iam::${account_id}:policy/AWSPCAIssuerIAMPolicy \
--override-existing-serviceaccounts \
--approve
تثبيت aws-privateca-issuer
AWS PrivateCA Issuer يعمل كإضافة لـ cert-manager (مصادر خارجية لتوقيع طلبات الشهادات.
- استخدام Helm للتثبيت
helm repo add awspca https://cert-manager.github.io/aws-privateca-issuer
helm repo update
helm install aws-pca-issuer awspca/aws-privateca-issuer \
-n aws-pca-issuer \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-pca-issuer
- التحقق من الحالة
$ kubectl get pods -n aws-pca-issuer
NAME READY STATUS RESTARTS AGE
aws-pca-issuer-aws-privateca-issuer-5cdd4b4687-z52n7 1/1 Running 0 20s
إنشاء المصدر وطلب الشهادة
- استبدل
${PCA_ARN}
في ملفissuer-cert.yaml
بتكوينك وقم بتنفيذ الأمر التالي:
kubectl apply -f issuer-cert.yaml
# issuer-cert.yaml
apiVersion: awspca.cert-manager.io/v1beta1
kind: AWSPCAClusterIssuer
metadata:
name: demo-test-root-ca
spec:
arn: ${PCA_ARN}
---
kind: Certificate
apiVersion: cert-manager.io/v1
metadata:
name: nlb-lab-tls-cert
spec:
commonName: httpbin.example-test.org # يجب استبداله باسم النطاق المخصص الخاص بك
dnsNames:
- httpbin.example-test.org # يجب استبداله باسم النطاق المخصص الخاص بك
duration: 2160h0m0s
issuerRef:
group: awspca.cert-manager.io
kind: AWSPCAClusterIssuer
name: demo-test-root-ca
renewBefore: 360h0m0s
secretName: nlb-tls-app-secret
usages:
- server auth
- client auth
privateKey:
algorithm: "RSA"
size: 2048
- تنفيذ الأمر التالي للتحقق من إصدار الشهادة وإنشاء السر.
$ kubectl get cert
NAME READY SECRET AGE
nlb-lab-tls-cert True nlb-tls-app-secret 10s
$ kubectl get secret
NAME TYPE DATA AGE
nlb-tls-app-secret kubernetes.io/tls 3 8s
نشر وحماية تطبيق httpbin
تأكد من تثبيت APISIX Ingress بنجاح. يرجى التحقق من هذا القسم
- نشر تطبيق httpbin
kubectl run httpbin --image kennethreitz/httpbin --port 80
kubectl expose pod httpbin --port 80
- إنشاء Ingress لنشر وحماية تطبيق httpbin
kubectl apply -f ingress-httpbin.yaml
```yaml
# ingress-httpbin.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: httpbin-demo-apisix
spec:
ingressClassName: apisix
tls:
- hosts:
- httpbin.example-test.org
secretName: nlb-tls-app-secret
rules:
- host: httpbin.example-test.org
http:
paths:
- backend:
service:
name: httpbin
port:
number: 80
path: /
pathType: Prefix
- الوصول إلى نطاق التطبيق
تأكد من ربط اسم النطاق المخصص واسم موزع التحميل. يرجى التحقق من هذا القسم
$ curl https://httpbin.example-test.org/headers --cacert acm-pca/cacert.pem
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.example-test.org",
"User-Agent": "curl/7.74.0",
"X-Forwarded-Host": "httpbin.example-test.org"
}
}
الخلاصة
توضح هذه المقالة استخدام APISIX Ingress مع مكونات AWS ACM و ACM Private CA من خلال أمثلة عملية وتقدم تكوينين لإنهاء شهادات TLS في Kubernetes: إنهاء شهادات TLS في NLB و Ingress. تكوين ACM + NLB أكثر ملاءمة للشهادات الموثوقة بشكل عام. إذا كانت هناك حاجة للتشفير بين التطبيقات، يمكن لـ ACM Private CA توفير خدمة إدارة مستضافة أكثر أمانًا.
نأمل أن تساعد هذه المقالات العملية القراء على تكوين وإدارة حركة TLS في مجموعات AWS EKS الخاصة بهم بشكل أكثر فعالية. لمزيد من المعلومات حول بوابة API، يرجى زيارة المدونات أو الاتصال بنا.