كيفية استخدام Vault لإدارة الشهادات في APISIX

Junduo Dong

Junduo Dong

June 9, 2023

Technology

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

كبوابة API سحابية جديدة، يوفر Apache APISIX آلية اتصال TLS/mTLS بين العملاء النهائيين وAPISIX، وبين APISIX والخدمات العليا، وذلك لضمان أمان الشبكة بينها. يحفظ APISIX شهادة SSL ككائن شهادة SSL، ويحقق التحميل الديناميكي لشهادة SSL من خلال الامتداد SNI (Server Name Indication) الذي يدعم بروتوكول TLS.

للتخزين الآمن لشهادات SSL في APISIX، حقق APISIX التكامل مع HashiCorp Vault، وبالتالي تحقيق إدارة موحدة لشهادات SSL باستخدام ميزة التخزين الآمن للأسرار في Vault. تأخذ هذه المقالة مثالاً على تكوين اتصال HTTPS بين العميل النهائي وAPISIX لتقديم كيفية تكامل APISIX مع Vault لتنفيذ إدارة شهادات SSL.

تكامل APISIX مع Vault

ما هي شهادة SSL

SSL/TLS هو بروتوكول تشفير يحمي أمان الاتصال الشبكي عن طريق إنشاء اتصال شبكي مشفر بين الطرفين المتواصلين. يضمن بروتوكول SSL/TLS إرسال البيانات إلى العميل والخادم الصحيحين من خلال مصادقة المستخدمين والخوادم. بالإضافة إلى ذلك، يمكن لبروتوكول SSL/TLS تشفير بيانات الاتصال، مما يضمن عدم سرقة البيانات أو العبث بها أو تزويرها أثناء الإرسال.

شهادة SSL هي شهادة رقمية تعتمد هوية موقع ويب وتمكن اتصالاً مشفرًا باستخدام بروتوكول SSL/TLS. يتم عادةً إصدار شهادة SSL من قبل سلطة شهادات رقمية موثوقة (CA)، وتتضمن بشكل رئيسي المعلومات التالية:

  • اسم النطاق
  • سلطة الشهادة
  • التوقيع الرقمي الموقع من قبل سلطة الشهادة
  • النطاقات الفرعية المرتبطة
  • تاريخ إصدار الشهادات
  • تاريخ انتهاء الشهادات
  • المفتاح العام (بينما المفتاح الخاص هو مفتاح سري)

ما هو HashiCorp Vault

HashiCorp Vault (يشار إليه فيما بعد بـ Vault) هو أداة إدارة أسرار على مستوى المؤسسات يمكنها تخزين وإدارة البيانات الحساسة مثل الرموز وكلمات المرور والشهادات. يمكن تكامل Vault مع التقنيات في نظام IT بأكمله، وتوفير خدمات التشفير والأمان الآلي القائم على الهوية، والتحكم المركزي في الوصول إلى البيانات والأنظمة الحساسة، ومساعدة المنظمات على تقليل مخاطر تسريب البيانات والتعرض لها، وبالتالي تحسين أمان السحابة والتطبيقات.

HashiCorp Vault

كيفية تخزين شهادات SSL لـ APISIX في Vault

إعداد البيئة

نشر وتكوين خدمة Vault

في هذا القسم، سنستخدم Docker لنشر خدمة حاوية Vault. يمكنك تخطي هذا القسم إذا كان لديك بالفعل مثيل خدمة Vault متاح في بيئتك.

إنشاء ونشر حاوية Vault في وضع التطوير، باسم apisix-quickstart-vault. حدد رمز Vault كـ apisix-quickstart-vault-token وقم بتعيين المنفذ 8200 إلى المضيف:

docker run -d --cap-add=IPC_LOCK \
  -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' \
  -e 'VAULT_ADDR=http://0.0.0.0:8200' \
  -e 'VAULT_DEV_ROOT_TOKEN_ID=apisix-quickstart-vault-token' \
  -e 'VAULT_TOKEN=apisix-quickstart-vault-token' \
  --network=apisix-quickstart-net \
  --name apisix-quickstart-vault \
  -p 8200:8200 vault:1.13.0

اختر kv كمسار تخزين شهادات SSL لـ APISIX:

docker exec apisix-quickstart-vault vault secrets enable -path=kv -version=1 kv

تكوين APISIX

يحتاج APISIX إلى قراءة شهادات SSL من Vault، لذا يجب على Vault منح إذن القراءة لـ APISIX على المسار المحدد.

إنشاء سياسة Vault باسم apisix-policy.hcl، ومنح APISIX حق الوصول للقراءة إلى المسار kv/apisix/:

docker exec apisix-quickstart-vault /bin/sh -c "echo '
path \"kv/apisix/*\" {
    capabilities = [\"read\"]
}
' > /etc/apisix-policy.hcl"

تطبيق ملف السياسة الذي تم إنشاؤه apisix-policy.hcl على Vault:

docker exec apisix-quickstart-vault vault policy write apisix-policy /etc/apisix-policy.hcl

إنشاء كائن سر APISIX بالمعرف quickstart-secret-id لحفظ معلومات اتصال Vault ومسار تخزين الشهادات:

curl -i "http://127.0.0.1:9180/apisix/admin/secrets/vault/quickstart-secret-id" -X PUT -d '
{
    "uri": "http://apisix-quickstart-vault:8200",
    "prefix": "kv/apisix",
    "token" : "apisix-quickstart-vault-token"
}'

تخزين شهادات SSL في Vault

إنشاء شهادة CA موقعة ذاتيًا ca.crt والمفتاح ca.key:

openssl genrsa -out ca.key 2048 && \
  openssl req -new -sha256 -key ca.key -out ca.csr -subj "/CN=ROOTCA" && \
  openssl x509 -req -days 36500 -sha256 -extensions v3_ca -signkey ca.key -in ca.csr -out ca.crt

تم إصدار شهادة SSL server.crt والمفتاح server.key بواسطة CA، واسمها الشائع (CN) هو test.com:

openssl genrsa -out server.key 2048 && \
  openssl req -new -sha256 -key server.key -out server.csr -subj "/CN=test.com" && \
  openssl x509 -req -days 36500 -sha256 -extensions v3_req \
  -CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial \
  -in server.csr -out server.crt

نسخ شهادة SSL والمفتاح الصادر إلى حاوية Vault:

docker cp server.key apisix-quickstart-vault:/root/
docker cp server.crt apisix-quickstart-vault:/root/

استخدام الأمر vault kv put لتخزين شهادة SSL والمفتاح كسر، المفتاح هو ssl، ومسار التخزين هو kv/apisix:

docker exec apisix-quickstart-vault vault kv put kv/apisix/ssl test.com.crt=@/root/server.crt test.com.key=@/root/server.key

من خلال الأمر أعلاه، قمنا بتخزين سر باسم ssl في Vault، والذي يحتوي على زوجين من المفاتيح والقيم: الشهادة والمفتاح الخاص.

كيفية استخدام شهادة SSL لـ APISIX المخزنة في Vault

يدعم APISIX تشفير الشبكة TLS/mTLS بين العملاء النهائيين وAPISIX، وبين APISIX والخدمات العليا، حيث يمكن استخدام شهادات SSL المخزنة في Vault. سنأخذ مثالاً على تكوين اتصال HTTPS بين العميل وAPISIX لتوضيح كيفية استخدام شهادة SSL المخزنة في Vault في APISIX.

تكوين اتصال HTTPS بين العميل وAPISIX

إنشاء كائن شهادة SSL لحفظ شهادة SSL:

curl -i "http://127.0.0.1:9180/apisix/admin/ssls" -X PUT -d '
{
  "id": "quickstart-tls-client-ssl",
  "sni": "test.com",
  "cert": "$secret://vault/quickstart-secret-id/ssl/test.com.crt",
  "key": "$secret://vault/quickstart-secret-id/ssl/test.com.key"
}'

الـ sni لهذا الكائن هو test.com، وهو متوافق مع CN الذي أصدر الشهادة. الـ cert و key يتوافقان مع الشهادة والمفتاح الخاص الصادرين، ويتم الحصول عليهما تلقائيًا من Vault من خلال معرف الموارد السرية الذي تم إنشاؤه، وقواعد معرف الموارد هي:

$secret://$manager/$id/$secret_name/$key
  • manager: خدمة إدارة المفاتيح Vault
  • id: معرف مورد السر APISIX
  • secret_name: اسم السر في Vault
  • key: مفتاح زوج المفاتيح والقيم في السر المسمى secret_name

التحقق من اتصال HTTPS بين العميل وAPISIX

إنشاء مسار لتوجيه جميع الطلبات المرسلة إلى /ip إلى الخدمة العليا httpbin.org:

curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
  "id": "quickstart-client-ip",
  "uri": "/ip",
  "upstream": {
    "nodes": {
      "httpbin.org:80":1
    },
    "type": "roundrobin"
  }
}'

استخدام cURL لإرسال طلب إلى https://test.com:9443/ip، test.com يحل إلى 127.0.0.1:

curl -ikv --resolve "test.com:9443:127.0.0.1" "https://test.com:9443/ip"

إذا كان التكوين ناجحًا، فإن عملية مصافحة TLS بين العميل وAPISIX التي يتم إرجاعها بواسطة cURL ستكون مماثلة للنتائج التالية:

* Added test.com:9443:127.0.0.1 to DNS cache
* Hostname test.com was found in DNS cache
*   Trying 127.0.0.1:9443...
* Connected to test.com (127.0.0.1) port 9443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=test.com
*  start date: Apr 21 07:47:54 2023 GMT
*  expire date: Mar 28 07:47:54 2123 GMT
*  issuer: CN=ROOTCA
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x556274d632e0)
> GET /ip HTTP/2
> Host: test.com:9443
> user-agent: curl/7.74.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200
HTTP/2 200
...

الخلاصة

قدمنا كيفية تكامل APISIX مع Vault لتنفيذ إدارة شهادات SSL، وعرضنا خطوات التكوين والتكامل بالتفصيل بأخذ مثال على اتصال HTTPS بين العملاء النهائيين وAPISIX.

لمفاهيم واستخدامات شهادات SSL في APISIX، يرجى الرجوع إلى المقالات التالية:

Tags: