تمرين - تقييد الوصول إلى بيئة Azure Container Apps

مكتمل

في هذه الوحدة، يمكنك التأكد من أن قاعدة بيانات PostgreSQL يمكن الوصول إليها فقط بواسطة تطبيق Quarkus، وليس من قبل عملاء خارجيين آخرين. يمكنك حاليا الوصول إلى قاعدة البيانات من أي عميل باستخدام Azure CLI وتشغيل Quarkus محليا. هذا التكوين غير آمن. تحتاج إلى إضافة قاعدة جدار حماية للسماح لعناوين IP فقط داخل بيئة Azure Container Apps بالوصول إلى خادم قاعدة البيانات.

الوصول إلى خادم PostgreSQL باستخدام CLI

أولا، تأكد من أنه يمكنك الوصول إلى خادم PostgreSQL باستخدام Azure CLI. للقيام بذلك، قم بتشغيل هذا الأمر:

az postgres flexible-server execute \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --database-name "$AZ_POSTGRES_DB_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password "$AZ_POSTGRES_PASSWORD" \
    --querytext "select * from Todo" \
    --output table

يجب أن تكون قادرا على رؤية محتوى قاعدة البيانات. إذا كان بإمكانك ذلك، يمكن الوصول إلى قاعدة البيانات خارج البيئة.

إزالة قاعدة جدار الحماية المتساهل

توفر قاعدة بيانات Azure ل PostgreSQL الأمان بشكل افتراضي. لا يسمح جدار الحماية الخاص به عادة بالاتصالات الواردة. ولكن عند إنشاء خادم PostgreSQL، حددت المعلمة --public-access "All" لتمكين الوصول الخارجي، الذي قام بتكوين جدار الحماية ليكون مفتوحا للجمهور.

يمكنك سرد قواعد جدار الحماية الموجودة عن طريق تشغيل هذا الأمر:

az postgres flexible-server firewall-rule list \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --output table

يجب أن تشاهد الإخراج التالي:

EndIpAddress     Name                         ResourceGroup           StartIpAddress
---------------  ---------------------------  ----------------------  ----------------
255.255.255.255  AllowAll_2025-2-26_16-57-40  rgazure-deploy-quarkus  0.0.0.0

لاحظ أن نطاق عناوين IP المسموح بها 0.0.0.0 من خلال 255.255.255.255. تسمح قاعدة جدار الحماية مثل هذه لأي عميل بالوصول إلى قاعدة البيانات. للتأكد من أن تطبيق Quarkus فقط يمكنه الوصول إلى قاعدة البيانات، تحتاج إلى تحديث قواعد جدار الحماية لخادم PostgreSQL. في هذه الحالة، إنها مجرد مسألة إزالة القاعدة العامة. لإزالته، قم بتشغيل الأمر التالي:

az postgres flexible-server firewall-rule delete \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --rule-name <name of the AllowAll firewall rule> \
    --yes

حاول الآن الاستعلام عن قاعدة البيانات عن طريق تشغيل عبارة SQL من CLI:

az postgres flexible-server execute \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --database-name "$AZ_POSTGRES_DB_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password "$AZ_POSTGRES_PASSWORD" \
    --querytext "select * from Todo" \
    --output table

لقد انتهت مهلة المكالمة في النهاية. يجب أن تشاهد هذه الرسالة:

Unable to connect to flexible server: connection to server failed: Operation timed out

لأنك قمت بإزالة جميع قواعد جدار الحماية، حتى الآن لا يمكن لتطبيق Quarkus الوصول إلى قاعدة البيانات. إذا حاولت استرداد المهام من قاعدة البيانات، يفشل الطلب. قم بتشغيل طلب cURL التالي:

curl https://$AZ_APP_URL/api/todos

إضافة قاعدة جدار حماية جديدة

تحتاج إلى تكوين جدار الحماية للسماح بالوصول إلى تطبيق Quarkus فقط. تحتاج إلى إضافة قاعدة جدار حماية جديدة. لإضافة القاعدة، قم بتشغيل هذا الأمر:

az postgres flexible-server firewall-rule create \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --rule-name "Allow_Azure-internal-IP-addresses" \
    --start-ip-address "0.0.0.0" \
    --end-ip-address "0.0.0.0"

يسمح تعيين start-ip-addressend-ip-address إلى 0.0.0.0 بالوصول من جميع عناوين IP الداخلية ل Azure ولكنه لا يسمح بالوصول من عناوين IP الخارجية. تساعد هذه الممارسة على تأمين قاعدة البيانات من الوصول الخارجي.

إذا حاولت الوصول إلى قاعدة البيانات من CLI عن طريق تشغيل الأمر التالي، يجب أن تفشل المحاولة:

az postgres flexible-server execute \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --database-name "$AZ_POSTGRES_DB_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password "$AZ_POSTGRES_PASSWORD" \
    --querytext "select * from Todo" \
    --output table

ولكن إذا حاولت استخدام الأمر التالي لاسترداد المهام من قاعدة البيانات عبر تطبيق Quarkus الذي يعمل على Container Apps، تنجح المحاولة:

curl https://$AZ_APP_URL/api/todos

يقوم هذا الأمر بإرجاع قائمة بجميع عناصر to-do من قاعدة البيانات. يمكن الوصول إلى خادم PostgreSQL من تطبيق Quarkus الذي يعمل على خدمة Azure، ولكن لا يمكن الوصول إليه من خارج Azure.