استخدام Azure Firewall لحماية أنظمة مجموعات Azure Kubernetes Service (AKS)

توضح لك هذه المقالة كيف يمكنك حماية أنظمة مجموعات Azure Kubernetes Service (AKS) باستخدام Azure Firewall لتأمين نسبة استخدام الشبكة الصادرة والواردة.

خلفية

مجموعات Kubernetes المُدارة مستضافة على خدمة Kubernetes من Azure (AKS). لمزيد من المعلومات، راجع Azure Kubernetes Service.

على الرغم من أن AKS عبارة عن حل مدار بالكامل، فإنه لا يقدم حلا مضمنا لتأمين حركة مرور الدخول والخروج بين نظام المجموعة والشبكات الخارجية. يوفر Azure Firewall حلاً لذلك.

يتم نشر أنظمة مجموعات AKS على شبكة اتصال ظاهرية. يمكن إدارة هذه الشبكة (التي تم إنشاؤها بواسطة AKS) أو مخصصة (تم تكوينها مسبقا من قبل المستخدم مسبقا). في كلتا الحالتين، تكون لنظام المجموعة تبعيات صادرة على الخدمات خارج شبكة الاتصال الظاهرية (ليست للخدمة تبعيات واردة). لأغراض الإدارة والتشغيل، تحتاج العقد في مجموعة AKS إلى الوصول إلى منافذ معينة وأسماء مجالات مؤهلة بالكامل (FQDNs) تصف هذه التبعيات الصادرة. هذا مطلوب للوظائف المختلفة بما في ذلك، على سبيل المثال لا الحصر، العقد التي تتصل بخادم واجهة برمجة تطبيقات Kubernetes. يقومون بتنزيل وتثبيت مكونات نظام مجموعة Kubernetes الأساسية وتحديثات أمان العقدة، أو سحب صور حاوية النظام الأساسي من Microsoft Container Registry (MCR)، وما إلى ذلك. يتم تعريف هذه التبعيات الصادرة بالكامل تقريبًا باستخدام FQDNs، والتي ليست لها عناوين ثابتة خلفها. يعني عدم وجود عناوين ثابتة أنه لا يمكن استخدام مجموعات أمان الشبكة لتأمين نسبة استخدام الشبكة الصادرة من نظام مجموعة AKS. لهذا السبب، بشكل افتراضي، تحتوي أنظمة مجموعات AKS على اتصال غير مقيد بالإنترنت الصادر (الخروج). يسمح هذا المستوى من الوصول إلى الشبكة للعقد والخدمات التي تقوم بتشغيلها بالوصول إلى الموارد الخارجية حسب الحاجة.

ومع ذلك، في بيئة الإنتاج، يجب حماية الاتصالات مع نظام مجموعة Kubernetes لمنع النقل غير المصرّح للبيانات جنبًا إلى جنب مع الثغرات الأمنية الأخرى. يجب مراقبة جميع نسب استخدام الشبكة الواردة والصادرة والتحكم فيها استنادًا إلى مجموعة من قواعد الأمان. إذا كنت ترغب في القيام بذلك، يجب عليك تقييد حركة الخروج، ولكن يجب أن يظل عدد محدود من المنافذ والعناوين متاحا للحفاظ على مهام صيانة نظام المجموعة السليمة وتلبية تلك التبعيات الصادرة المذكورة سابقا.

يستخدم أبسط حل جهاز جدار حماية يمكنه التحكم في نسبة استخدام الشبكة الصادرة استنادًا إلى أسماء النطاق. يُنشئ جدار الحماية عادةً حاجزًا بين شبكة موثوقة وشبكة غير موثوق بها، مثل الإنترنت. يمكن لجدار حماية Azure، على سبيل المثال، تقييد حركة مرور HTTP وHTTPS الصادرة استنادا إلى FQDN للوجهة، ما يمنحك تحكما دقيقا في نسبة استخدام الشبكة للخروج، ولكن في الوقت نفسه يسمح لك بتوفير الوصول إلى FQDNs التي تشمل التبعيات الصادرة لمجموعة AKS (شيء لا يمكن أن تفعله NSGs). وبالمثل، يمكنك التحكم في نسبة استخدام الشبكة الواردة وتحسين الأمان عن طريق تمكين التصفية المستندة إلى التحليل الذكي للمخاطر على Azure Firewall الذي تم توزيعه في شبكة فرعية مراقَبة مشتركة. يمكن أن توفر هذه التصفية تنبيهات وترفض نسبة استخدام الشبكة من وإلى عناوين IP والمجالات الضارة المعروفة.

راجع الفيديو التالي للحصول على نظرة عامة سريعة حول كيفية عمل هذا في الممارسة العملية على بيئة عينة:

يمكنك تنزيل ملف مضغوط من مركز التنزيل لـ Microsoft يحتوي على ملف البرنامج النصي bash وملف yaml لتكوين نموذج البيئة المستخدمة في الفيديو تلقائيًا. يقوم بتكوين Azure Firewall لحماية نسبة استخدام الشبكة للدخول والخروج. تستعرض الدلائل التالية كل خطوة من البرنامج النصي بمزيد من التفصيل حتى تتمكن من إعداد تكوين مخصص.

يوضح الرسم التخطيطي التالي نموذج البيئة من الفيديو الذي يقوم البرنامج النصي والدليل بتكوينه:

رسم تخطيطي يعرض مجموعة A K S مع Azure Firewall لتصفية الدخول والخروج.

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

تقييد نسبة استخدام شبكة الخروج باستخدام Azure Firewall

تعيين التكوين عبر متغيرات البيئة

تعريف مجموعة من متغيرات البيئة لاستخدامها في إنشاءات الموارد.

PREFIX="aks-egress"
RG="${PREFIX}-rg"
LOC="eastus"
PLUGIN=azure
AKSNAME="${PREFIX}"
VNET_NAME="${PREFIX}-vnet"
AKSSUBNET_NAME="aks-subnet"
# DO NOT CHANGE FWSUBNET_NAME - This is currently a requirement for Azure Firewall.
FWSUBNET_NAME="AzureFirewallSubnet"
FWNAME="${PREFIX}-fw"
FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
FWIPCONFIG_NAME="${PREFIX}-fwconfig"
FWROUTE_TABLE_NAME="${PREFIX}-fwrt"
FWROUTE_NAME="${PREFIX}-fwrn"
FWROUTE_NAME_INTERNET="${PREFIX}-fwinternet"

إنشاء شبكة اتصال ظاهرية مع شبكات فرعية متعددة

إنشاء شبكة ظاهرية مع شبكتين فرعيتين منفصلتين، واحدة للمجموعة، واحدة لجدار الحماية. اختياريًا، يمكنك أيضًا إنشاء شبكة لدخول الخدمة الداخلية.

طوبولوجيا شبكة الاتصال الفارغة

إنشاء مجموعة موارد للاحتفاظ بكافة الموارد.

# Create Resource Group

az group create --name $RG --location $LOC

إنشاء شبكة اتصال ظاهرية مع شبكتين فرعيتين لاستضافة نظام المجموعة AKS وAzure Firewall. لكل منها شبكتها الفرعية الخاصة. لنبدأ بشبكة AKS.

# Dedicated virtual network with AKS subnet

az network vnet create \
    --resource-group $RG \
    --name $VNET_NAME \
    --location $LOC \
    --address-prefixes 10.42.0.0/16 \
    --subnet-name $AKSSUBNET_NAME \
    --subnet-prefix 10.42.1.0/24

# Dedicated subnet for Azure Firewall (Firewall name cannot be changed)

az network vnet subnet create \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $FWSUBNET_NAME \
    --address-prefix 10.42.2.0/24

إنشاء Azure Firewall وإعداده باستخدام UDR

يجب تكوين قواعد Azure Firewall الواردة والصادرة. الغرض الرئيسي من جدار الحماية هو تمكين المؤسسات من تكوين قواعد المرور دخول والخروج من وإلى مجموعة AKS.

جدار الحماية وUDR

هام

إذا كان نظام المجموعة أو التطبيق الخاص بك ينشئ عددًا كبيرًا من الاتصالات الصادرة الموجهة إلى نفس المجموعة الفرعية أو مجموعة فرعية صغيرة من الوجهات، فقد تحتاج إلى مزيد من firewall frontend IPs لتجنب خلط المنافذ لكل IP أمامية. لمزيد من المعلومات حول كيفية إنشاء جدار حماية Azure باستخدام برامج IPs متعددة، انظر هنا

إنشاء مورد IP عام SKU قياسي يستخدم كعنوان الواجهة الأمامية لجدار حماية Azure.

az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"

تسجيل ملحق cli للمعاينة لإنشاء Azure Firewall.

# Install Azure Firewall preview CLI extension

az extension add --name azure-firewall

# Deploy Azure Firewall

az network firewall create -g $RG -n $FWNAME -l $LOC --enable-dns-proxy true

يمكن الآن تعيين عنوان IP الذي تم إنشاؤه مسبقًا إلى واجهة جدار الحماية.

إشعار

قد يستغرق إعداد عنوان IP العام إلى Azure Firewall بضع دقائق. للاستفادة من FQDN على قواعد الشبكة، نحتاج إلى تمكين وكيل DNS، عند تمكين جدار الحماية سيستمع إلى المنفذ 53 وسيعيد توجيه طلبات DNS إلى خادم DNS المحدد مسبقا. سيسمح هذا جدار الحماية بترجمة هذا FQDN تلقائيًا.

# Configure Firewall IP Config

az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME

عند نجاح الأمر السابق، احفظ عنوان IP الأمامي لجدار الحماية للتكوين لاحقًا.

# Capture Firewall IP Address for Later Use

FWPUBLIC_IP=$(az network public-ip show -g $RG -n $FWPUBLICIP_NAME --query "ipAddress" -o tsv)
FWPRIVATE_IP=$(az network firewall show -g $RG -n $FWNAME --query "ipConfigurations[0].privateIPAddress" -o tsv)

إشعار

إذا كنت تستخدم الوصول الآمن إلى خادم AKS API باستخدام نطاقات عناوين IP المعتمدة، فستحتاج إلى إضافة IP العام لجدار الحماية إلى نطاق IP المعتمد.

إنشاء UDR مع قفزة إلى Azure Firewall

يوجه Azure حركة المرور تلقائيًا بين الشبكات الفرعية Azure والشبكات الظاهرية والشبكات المحلية. إذا كنت ترغب في تغيير أي من التوجيه الافتراضي الخاص بـ Azure، يمكنك القيام بذلك عن طريق إنشاء جدول توجيه.

إنشاء جدول توجيه فارغ ليتم إقرانه بشبكة فرعية معينة. سيحدد جدول التوجيه الوثبة التالية كجدار حماية Azure الذي تم إنشاؤه مسبقا. يمكن أن يكون لكل شبكة فرعية جدول توجيه واحد مقترن بها أو أن تكون بدون جداول توجيه.

# Create UDR and add a route for Azure Firewall

az network route-table create -g $RG -l $LOC --name $FWROUTE_TABLE_NAME
az network route-table route create -g $RG --name $FWROUTE_NAME --route-table-name $FWROUTE_TABLE_NAME --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address $FWPRIVATE_IP
az network route-table route create -g $RG --name $FWROUTE_NAME_INTERNET --route-table-name $FWROUTE_TABLE_NAME --address-prefix $FWPUBLIC_IP/32 --next-hop-type Internet

راجع وثائق جدول توجيه الشبكة الظاهرية حول كيفية تجاوز مسارات النظام الافتراضية ل Azure أو إضافة المزيد من المسارات إلى جدول توجيه الشبكة الفرعية.

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

إشعار

بالنسبة إلى التطبيقات خارج مساحات اسم الخدمة kube-system أو gatekeeper-system التي تحتاج إلى التحدث إلى خادم API، يلزم وجود قاعدة شبكة إضافية للسماح لاتصال TCP بالمنفذ 443 على عنوان IP لخادم API بالإضافة إلى طلب إضافة قاعدة التطبيق على fqdn-tag AzureKubernetesService.

يمكنك استخدام قواعد الشبكة الثلاث التالية لتكوين جدار الحماية الخاص بك. قد تحتاج إلى تكييف هذه القواعد بناء على التوزيع الخاص بك. تسمح القاعدة الأولى بالوصول إلى المنفذ 9000 عبر TCP. تسمح القاعدة الثانية بالوصول إلى المنفذ 1194 و123 عبر UDP. تسمح كلتا القاعديتين فقط بحركة المرور الموجهة إلى منطقة Azure CIDR التي نستخدمها، في هذه الحالة شرق الولايات المتحدة.

وأخيرا، نضيف قاعدة شبكة ثالثة تفتح المنفذ 123 إلى خادم وقت الإنترنت FQDN (على سبيل المثال:ntp.ubuntu.com) عبر UDP. تعد إضافة FQDN كقاعدة شبكة واحدة من الميزات المحددة لجدار حماية Azure، وتحتاج إلى تكييفه عند استخدام الخيارات الخاصة بك.

بعد تعيين قواعد الشبكة، سنضيف أيضا قاعدة تطبيق باستخدام AzureKubernetesService التي تغطي FQDNs المطلوبة التي يمكن الوصول إليها من خلال منفذ TCP 443 والمنفذ 80. بالإضافة إلى ذلك، قد تحتاج إلى تكوين المزيد من قواعد الشبكة والتطبيق استنادا إلى التوزيع الخاص بك. لمزيد من المعلومات، راجع قواعد الشبكة الصادرة وFQDN لمجموعات خدمة Azure Kubernetes (AKS).

إضافة قواعد شبكة FW

az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apiudp' --protocols 'UDP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 1194 --action allow --priority 100
az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apitcp' --protocols 'TCP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 9000
az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'time' --protocols 'UDP' --source-addresses '*' --destination-fqdns 'ntp.ubuntu.com' --destination-ports 123

إضافة قواعد تطبيق FW

az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'fqdn' --source-addresses '*' --protocols 'http=80' 'https=443' --fqdn-tags "AzureKubernetesService" --action allow --priority 100

راجع وثائق Azure Firewall لمعرفة المزيد حول خدمة Azure Firewall.

إقران جدول المسار بـ AKS

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

# Associate route table with next hop to Firewall to the AKS subnet

az network vnet subnet update -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --route-table $FWROUTE_TABLE_NAME

نشر AKS عن طريق نوع UDR الصادر إلى الشبكة الحالية

الآن يمكن نشر نظام مجموعة AKS في الشبكة الظاهرية الموجودة. يمكنك أيضا استخدام نوع userDefinedRoutingالصادر ، تضمن هذه الميزة فرض أي حركة مرور صادرة من خلال جدار الحماية ولا توجد مسارات خروج أخرى (بشكل افتراضي يمكن استخدام نوع موازن التحميل الصادر).

aks-deploy

يتم تعريف الشبكة الفرعية المستهدف نشرها في مع متغير البيئة، $SUBNETID. لم نحدد$SUBNETID المتغير في الخطوات السابقة. لتعيين قيمة معرف الشبكة الفرعية، يمكنك استخدام الأمر التالي:

SUBNETID=$(az network vnet subnet show -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --query id -o tsv)

يمكنك تعريف النوع الصادر لاستخدام UDR الموجود بالفعل على الشبكة الفرعية. يمكن هذا التكوين AKS من تخطي الإعداد وتوفير IP لموازن التحميل.

هام

لمزيد من المعلومات حول UDR من النوع الصادر، بما في ذلك القيود، راجع UDR من نوع الخروج الصادر.

تلميح

يمكن إضافة ميزات إضافية إلى نشر نظام المجموعة مثل نظام المجموعة الخاصة أو تغيير نظام التشغيل SKU.

يمكن إضافة ميزة AKS لـ نطاقات IP المصرح بها لخادم API لتقييد وصول خادم API إلى نقطة النهاية العامة لجدار الحماية فقط. تتم الإشارة إلى ميزة نطاقات IP المعتمدة في الرسم التخطيطي كخيار. عند تمكين ميزة نطاق IP المصرح بها للحد من وصول خادم API، يجب أن تستخدم أدوات المطور الخاصة بك jumpbox من الشبكة الظاهرية لجدار الحماية أو يجب إضافة كافة نقاط نهاية المطور إلى نطاق IP المعتمد.

az aks create -g $RG -n $AKSNAME -l $LOC \
  --node-count 3 \
  --network-plugin azure \
  --outbound-type userDefinedRouting \
  --vnet-subnet-id $SUBNETID \
  --api-server-authorized-ip-ranges $FWPUBLIC_IP

إشعار

لإنشاء واستخدام VNet الخاصة بك وجدول التوجيه مع kubenet المكون الإضافي للشبكة، تحتاج إلى استخدام هوية مدارة معينة من قبل المستخدم. بالنسبة للهوية المدارة المعينة من قبل النظام، لا يمكننا الحصول على معرف الهوية قبل إنشاء نظام المجموعة، مما يؤدي إلى تأخير في سريان تعيين الدور.

لإنشاء الشبكة الظاهرية الخاصة بك واستخدامها وجدول التوجيه مع azure المكون الإضافي للشبكة، يتم دعم كل من الهويات المدارة المعينة من قبل النظام والمخصصة من قبل المستخدم.

تمكين وصول المطور إلى خادم API

إذا كنت تستخدم نطاقات IP المعتمدة لنظام المجموعة في الخطوة السابقة، يجب إضافة عناوين IP لأداة المطور الخاص بك إلى قائمة نظام مجموعة AKS المتضمنة نطاقات IP المعتمدة للوصول إلى خادم API من هناك. ثمة خيار آخر وهو تكوين jumpbox باستخدام الأدوات المطلوبة داخل شبكة فرعية منفصلة في شبكة جدار الحماية الظاهرية.

إضافة عنوان IP آخر إلى النطاقات المعتمدة باستخدام الأمر التالي

# Retrieve your IP address
CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)

# Add to AKS approved list
az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32

استخدم الأمر az aks get-credentials لتكوين kubectl للاتصال بمجوعة Kubernetes المنشأة حديثًا.

az aks get-credentials -g $RG -n $AKSNAME

تقييد نسبة استخدام شبكة الخروج باستخدام Azure Firewall

يمكنك الآن بدء عرض الخدمات ونشر التطبيقات إلى نظام المجموعة هذا. في هذا المثال، نكشف عن خدمة عامة، ولكن يمكنك أيضا اختيار عرض خدمة داخلية عبر موازن التحميل الداخلي.

الخدمة العامة DNAT

  1. راجع بيان التشغيل السريع ل AKS Store Demo لمشاهدة جميع الموارد التي سيتم إنشاؤها.

  2. نشر الخدمة باستخدام kubectl apply الأمر .

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-quickstart.yaml
    

إضافة قاعدة DNAT إلى Azure Firewall

هام

عند استخدام Azure Firewall لتقييد حركة مرور الخروج وإنشاء مسار المعرف من قبل المستخدم (UDR) لفرض كافة حركة المرور الخاصة بالخروج، تأكد من إنشاء قاعدة DNAT المناسبة في جدار حماية للسماح بحركة مرور الدخول بشكل صحيح. استخدام Azure Firewall مع UDR يقطع إعداد الدخول بسبب التوجيه غير المتماثل. (تحدث المشكلة إذا كان لدى الشبكة الفرعية AKS توجيه افتراضي ينتقل إلى عنوان IP الخاص بجدار الحماية، ولكنك تستخدم موازن تحميل عامًا - خدمة الدخول أو Kubernetes من النوع: LoadBalancer). في هذه الحالة، يتم تلقي حركة مرور موازن التحميل الواردة عبر عنوان IP العام الخاص به، ولكن مسار الإرجاع يمر عبر عنوان IP الخاص بجدار الحماية. لأن جدار الحماية هو stateful، فإنه يسقط الحزمة العائدة لأن جدار الحماية غير مدرك لجلسة العمل المقررة. لمعرفة كيفية دمج Azure Firewall مع موازن تحميل الدخول أو الخدمة، راجع دمج Azure Firewall مع Azure Standard Load Balancer.

لتكوين الاتصال الوارد، يجب كتابة قاعدة DNAT إلى Azure Firewall. لاختبار الاتصال بنظام المجموعة الخاص بك، يتم تعريف قاعدة لعنوان IP العام الخاص بجدار الحماية بغرض توجيه IP الداخلية التي تعرضها الخدمة الداخلية.

يمكن تخصيص عنوان الوجهة لأنه المنفذ على جدار الحماية الذي سيتم الوصول إليه. يجب أن يكون العنوان المترجم عنوان IP لموازن التحميل الداخلي. يجب أن يكون المنفذ المترجم هو المنفذ المكشوف لخدمة Kubernetes.

تحتاج إلى تحديد عنوان IP الداخلي المعين لموازن التحميل الذي أنشأته خدمة Kubernetes. استرداد العنوان عن طريق تشغيل:

kubectl get services

يتم سرد عنوان IP المطلوب في عمود EXTERNAL-IP، على غرار ما يلي.

NAME               TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                AGE
kubernetes         ClusterIP      10.41.0.1       <none>            443/TCP                10h
store-front        LoadBalancer   10.41.185.82    203.0.113.254     80:32718/TCP           9m
order-service      ClusterIP      10.0.104.144    <none>            3000/TCP               11s
product-service    ClusterIP      10.0.237.60     <none>            3002/TCP               10s
rabbitmq           ClusterIP      10.0.161.128    <none>            5672/TCP,15672/TCP     11s

احصل على IP الخدمة عن طريق تشغيل:

SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')

إضافة قاعدة NAT عن طريق تشغيل:

az network firewall nat-rule create --collection-name exampleset --destination-addresses $FWPUBLIC_IP --destination-ports 80 --firewall-name $FWNAME --name inboundrule --protocols Any --resource-group $RG --source-addresses '*' --translated-port 80 --action Dnat --priority 100 --translated-address $SERVICE_IP

التحقق من صحة الاتصال

انتقل إلى عنوان IP الأمامي لجدار حماية Azure في مستعرض للتحقق من صحة الاتصال.

يجب أن تشاهد تطبيق مخزن AKS. في هذا المثال، كان IP العام لجدار الحماية 203.0.113.32.

لقطة شاشة تعرض Azure Store Front App الذي تم فتحه في مستعرض محلي.

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

تنظيف الموارد

لتنظيف موارد Azure، احذف مجموعة موارد AKS.

az group delete -g $RG

الخطوات التالية