نشر تطبيق ويب من Amazon Web Services (AWS) على Azure

في هذا المقال، تقوم بنشر Yelb application على عنقود خدمة Azure Kubernetes ‏(AKS) الذي أنشأته في article السابق.

التحقق من البيئة

قبل نشر التطبيق، تأكد من أن عنقود AKS الخاص بك مهيأ بشكل صحيح باستخدام الأوامر التالية:

  1. قم بإدراج المساحات الاسمية في المجموعة باستخدام الأمر.kubectl get namespace

    kubectl get namespace
    

    إذا قمت بتثبيت وحدة تحكم الدخول NGINX باستخدام إضافة توجيه التطبيق، يجب أن ترى app-routing-system مساحة الأسماء في المخرج:

    NAME                 STATUS   AGE
    app-routing-system   Active   4h28m
    cert-manager         Active   109s
    dapr-system          Active   4h18m
    default              Active   4h29m
    gatekeeper-system    Active   4h28m
    kube-node-lease      Active   4h29m
    kube-public          Active   4h29m
    kube-system          Active   4h29m
    

    إذا قمت بتثبيت وحدة تحكم الدخول NGINX عبر Helm، يجب أن ترى ingress-basic مساحة الأسماء في المخرج:

    NAME                STATUS   AGE
    cert-manager        Active   7m42s
    dapr-system         Active   11m
    default             Active   21m
    gatekeeper-system   Active   20m
    ingress-basic       Active   7m19s
    kube-node-lease     Active   21m
    kube-public         Active   21m
    kube-system         Active   21m
    prometheus          Active   8m9s
    
  2. احصل على تفاصيل الخدمة في app-routing-systemingress-basic مساحة الأسماء باستخدام .kubectl get service command

    kubectl get service --namespace <namespace-name> -o wide
    

    إذا استخدمت إضافة توجيه التطبيقات، يجب أن ترى أن EXTERNAL-IPnginx عنوان IP الخاص للخدمة. هذا العنوان هو عنوان IP الخاص لتكوين IP في الواجهة الأمامية kubernetes-internal في موازن التحميل الخاص بعنقود AKS الخاص بك:

    NAME    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE     SELECTOR
    nginx   LoadBalancer   172.16.55.104   10.240.0.7    80:31447/TCP,443:31772/TCP,10254:30459/TCP   4h28m   app=nginx
    

    إذا استخدمت Helm، يجب أن ترى أن EXTERNAL-IP عنوان IP nginx-ingress-ingress-nginx-controller الخاص للخدمة. هذا العنوان هو عنوان IP الخاص لتكوين IP في الواجهة الأمامية kubernetes-internal في موازن التحميل الخاص في عنقود AKS الخاص بك.

    NAME                                               TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
    nginx-ingress-ingress-nginx-controller             LoadBalancer   172.16.42.152    10.240.0.7    80:32117/TCP,443:32513/TCP   7m31s
    nginx-ingress-ingress-nginx-controller-admission   ClusterIP      172.16.78.85     <none>        443/TCP                      7m31s
    nginx-ingress-ingress-nginx-controller-metrics     ClusterIP      172.16.109.138   <none>        10254/TCP                    7m31s
    

استعد لنشر تطبيق يلب

إذا أردت نشر العينة باستخدام إنهاء TLS عند Application Gateway واستدعاء Yelb عبر نهج HTTP ، يمكنك العثور على سكريبتات Bash وقوالب YAML لنشر تطبيق Yelb في المجلد http .

إذا كنت ترغب في نشر العينة باستخدام تنفيذ TLS من الطرف إلى الطرف باستخدام بنية Azure Application Gateway، يمكنك العثور على سكريبتات Bash وقوالب YAML لنشر تطبيق الويب في مجلد https.

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

تخصيص المتغيرات

  1. قبل تشغيل أي سكريبت، تحتاج إلى تخصيص قيم المتغيرات في 00-variables.sh الملف. هذا الملف مدرج في جميع السكربتات ويحتوي على المتغيرات التالية:

    # Azure subscription and tenant
    RESOURCE_GROUP_NAME="<aks-resource-group>"
    SUBSCRIPTION_ID="$(az account show --query id --output tsv)"
    SUBSCRIPTION_NAME="$(az account show --query name --output tsv)"
    TENANT_ID="$(az account show --query tenantId --output tsv)"
    AKS_CLUSTER_NAME="<aks-name>"
    AGW_NAME="<application-gateway-name>"
    AGW_PUBLIC_IP_NAME="<application-gateway-public-ip-name>"
    DNS_ZONE_NAME="<your-azure-dns-zone-name-eg-contoso.com>"
    DNS_ZONE_RESOURCE_GROUP_NAME="<your-azure-dns-zone-resource-group-name>"
    DNS_ZONE_SUBSCRIPTION_ID="<your-azure-dns-zone-subscription-id>"
    
    # NGINX ingress controller installed via Helm
    NGINX_NAMESPACE="ingress-basic"
    NGINX_REPO_NAME="ingress-nginx"
    NGINX_REPO_URL="https://kubernetes.github.io/ingress-nginx"
    NGINX_CHART_NAME="ingress-nginx"
    NGINX_RELEASE_NAME="ingress-nginx"
    NGINX_REPLICA_COUNT=3
    
    # Specify the ingress class name for the ingress controller
    # - nginx: Unmanaged NGINX ingress controller installed via Helm
    # - webapprouting.kubernetes.azure.com: Managed NGINX ingress controller installed via AKS application routing add-on
    INGRESS_CLASS_NAME="webapprouting.kubernetes.azure.com"
    
    # Subdomain of the Yelb UI service
    SUBDOMAIN="<yelb-application-subdomain>"
    
    # URL of the Yelb UI service
    URL="https://$SUBDOMAIN.$DNS_ZONE_NAME"
    
    # Secret provider class
    KEY_VAULT_NAME="<key-vault-name>"
    KEY_VAULT_CERTIFICATE_NAME="<key-vault-resource-group-name>"
    KEY_VAULT_SECRET_PROVIDER_IDENTITY_CLIENT_ID="<key-vault-secret-provider-identity-client-id>"
    TLS_SECRET_NAME="yelb-tls-secret"
    NAMESPACE="yelb"
    
  2. يمكنك تشغيل الأمر التالي az aks show لاسترجاع من user-assign-user identity identity <المستخدم في برنامج CSI DriverAzure Key Vault>. keyVault.bicep دور مسؤول Key Vault في وحدة الوحدة إلى الهوية المدارة المعينة من قبل المستخدم للإضافة للسماح لها باسترجاع الشهادة التي استخدمها Kubernetes Ingress لكشف الخدمة yelb-ui عبر وحدة تحكم الدخول NGINX.

    az aks show \
      --name <aks-name> \
      --resource-group <aks-resource-group-name> \
      --query addonProfiles.azureKeyvaultSecretsProvider.identity.clientId \
      --output tsv \
      --only-show-errors
    
  3. إذا قمت بنشر بنية Azure التحتية باستخدام وحدات Bicep المرفقة مع هذه العينة، يمكنك الانتقال إلى deploy تطبيق Yelb. إذا كنت ترغب في نشر التطبيق في عنقود AKS الخاص بك، يمكنك استخدام السكريبتات التالية لتكوين بيئتك. يمكنك استخدام جهاز 02-create-nginx-ingress-controller.sh تثبيت وحدة تحكم الدخول NGINX مع تفعيل جدار الحماية لتطبيقات الويب مفتوحة المصدر (WAF) من ModSecurity .

    #!/bin/bash
    
    # Variables
    source ./00-variables.sh
    
    # Check if the NGINX ingress controller Helm chart is already installed
    result=$(helm list -n $NGINX_NAMESPACE | grep $NGINX_RELEASE_NAME | awk '{print $1}')
    
    if [[ -n $result ]]; then
      echo "[$NGINX_RELEASE_NAME] NGINX ingress controller release already exists in the [$NGINX_NAMESPACE] namespace"
    else
      # Check if the NGINX ingress controller repository is not already added
      result=$(helm repo list | grep $NGINX_REPO_NAME | awk '{print $1}')
    
      if [[ -n $result ]]; then
        echo "[$NGINX_REPO_NAME] Helm repo already exists"
      else
        # Add the NGINX ingress controller repository
        echo "Adding [$NGINX_REPO_NAME] Helm repo..."
        helm repo add $NGINX_REPO_NAME $NGINX_REPO_URL
      fi
    
      # Update your local Helm chart repository cache
      echo 'Updating Helm repos...'
      helm repo update
    
      # Deploy NGINX ingress controller
      echo "Deploying [$NGINX_RELEASE_NAME] NGINX ingress controller to the [$NGINX_NAMESPACE] namespace..."
      helm install $NGINX_RELEASE_NAME $NGINX_REPO_NAME/$nginxChartName \
        --create-namespace \
        --namespace $NGINX_NAMESPACE \
        --set controller.nodeSelector."kubernetes\.io/os"=linux \
        --set controller.replicaCount=$NGINX_REPLICA_COUNT \
        --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \
        --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
    fi
    
    # Get values
    helm get values $NGINX_RELEASE_NAME --namespace $NGINX_NAMESPACE
    

قم بنشر التطبيق

  1. شغل السكربت التالي 03-deploy-yelb.sh لنشر تطبيق Yelb وكائن Kubernetes Ingress لجعل yelb-ui الخدمة متاحة للإنترنت العام.

    #!/bin/bash
    
    # Variables
    source ./00-variables.sh
    
    # Check if namespace exists in the cluster
    result=$(kubectl get namespace -o jsonpath="{.items[?(@.metadata.name=='$NAMESPACE')].metadata.name}")
    
    if [[ -n $result ]]; then
      echo "$NAMESPACE namespace already exists in the cluster"
    else
      echo "$NAMESPACE namespace does not exist in the cluster"
      echo "creating $NAMESPACE namespace in the cluster..."
      kubectl create namespace $NAMESPACE
    fi
    
    # Create the Secret Provider Class object
    echo "Creating the secret provider class object..."
    cat <<EOF | kubectl apply -f -
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      namespace: $NAMESPACE
      name: yelb
    spec:
      provider: azure
      secretObjects:
        - secretName: $TLS_SECRET_NAME
          type: kubernetes.io/tls
          data: 
            - objectName: $KEY_VAULT_CERTIFICATE_NAME
              key: tls.key
            - objectName: $KEY_VAULT_CERTIFICATE_NAME
              key: tls.crt
      parameters:
        usePodIdentity: "false"
        useVMManagedIdentity: "true"
        userAssignedIdentityID: $KEY_VAULT_SECRET_PROVIDER_IDENTITY_CLIENT_ID
        keyvaultName: $KEY_VAULT_NAME
        objects: |
          array:
            - |
              objectName: $KEY_VAULT_CERTIFICATE_NAME
              objectType: secret
        tenantId: $TENANT_ID
    EOF
    
    # Apply the YAML configuration
    kubectl apply -f yelb.yml
    
    echo "waiting for secret $TLS_SECRET_NAME in namespace $namespace..."
    
    while true; do
      if kubectl get secret -n $NAMESPACE $TLS_SECRET_NAME >/dev/null 2>&1; then
        echo "secret $TLS_SECRET_NAME found!"
        break
      else
        printf "."
        sleep 3
      fi
    done
    
    # Create chat-ingress
    cat ingress.yml |
      yq "(.spec.ingressClassName)|="\""$INGRESS_CLASS_NAME"\" |
      yq "(.spec.tls[0].hosts[0])|="\""$SUBDOMAIN.$DNS_ZONE_NAME"\" |
      yq "(.spec.tls[0].secretName)|="\""$TLS_SECRET_NAME"\" |
      yq "(.spec.rules[0].host)|="\""$SUBDOMAIN.$DNS_ZONE_NAME"\" |
      kubectl apply -f -
    
    # Check the deployed resources within the yelb namespace:
    kubectl get all -n yelb
    
  2. قم بتحديث ملف yelb-ui YAML ليشمل تعريف csi volume وvolume mount لقراءة الشهادة كسر من Azure Key Vault.

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: yelb
  name: yelb-ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: yelb-ui
      tier: frontend
  template:
    metadata:
      labels:
        app: yelb-ui
        tier: frontend
    spec:
      containers:
        - name: yelb-ui
          image: mreferre/yelb-ui:0.7
          ports:
            - containerPort: 80
          volumeMounts:
            - name: secrets-store-inline
              mountPath: "/mnt/secrets-store"
              readOnly: true
      volumes:
        - name: secrets-store-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: yelb
  1. يمكنك الآن نشر التطبيق. يستخدم السكربت بيان yelb.yml YAML لنشر التطبيق ولإنشاء ingress.yml كائن الدخول. إذا استخدمت Azure منطقة DNS العامة لحل أسماء النطاقات، يمكنك استخدام سكريبت 04-configure-dns.sh. يربط هذا السكربت عنوان IP العام لوحدة تحكم الدخول NGINX بالنطاق المستخدم من قبل كائن الدخول، مما يكشف الخدمة yelb-ui . يقوم البرنامج النصي بالخطوات التالية:

    1. يسترجع العنوان العام لعنوان IP العام ل Azure المستخدم في تكوين عنوان IP الأمامي لبوابة التطبيق.
    2. يتحقق مما إذا كان A هناك سجل للنطاق الفرعي المستخدم من قبل yelb-ui الخدمة.
    3. إذا لم يكن السجل A موجودا، يقوم السكربت بإنشائه.
source ./00-variables.sh

# Get the address of the Application Gateway Public IP
echo "Retrieving the address of the [$AGW_PUBLIC_IP_NAME] public IP address of the [$AGW_NAME] Application Gateway..."
PUBLIC_IP_ADDRESS=$(az network public-ip show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $AGW_PUBLIC_IP_NAME \
    --query ipAddress \
    --output tsv \
    --only-show-errors)
if [[ -n $PUBLIC_IP_ADDRESS ]]; then
    echo "[$PUBLIC_IP_ADDRESS] public IP address successfully retrieved for the [$AGW_NAME] Application Gateway"
else
    echo "Failed to retrieve the public IP address of the [$AGW_NAME] Application Gateway"
    exit
fi
# Check if an A record for todolist subdomain exists in the DNS Zone
echo "Retrieving the A record for the [$SUBDOMAIN] subdomain from the [$DNS_ZONE_NAME] DNS zone..."
IPV4_ADDRESS=$(az network dns record-set a list \
    --zone-name $DNS_ZONE_NAME \
    --resource-group $DNS_ZONE_RESOURCE_GROUP_NAME \
    --subscription $DNS_ZONE_SUBSCRIPTION_ID \
    --query "[?name=='$SUBDOMAIN'].ARecords[].IPV4_ADDRESS" \
    --output tsv \
    --only-show-errors)
if [[ -n $IPV4_ADDRESS ]]; then
    echo "An A record already exists in [$DNS_ZONE_NAME] DNS zone for the [$SUBDOMAIN] subdomain with [$IPV4_ADDRESS] IP address"
    if [[ $IPV4_ADDRESS == $PUBLIC_IP_ADDRESS ]]; then
        echo "The [$IPV4_ADDRESS] ip address of the existing A record is equal to the ip address of the ingress"
        echo "No additional step is required"
        continue
    else
        echo "The [$IPV4_ADDRESS] ip address of the existing A record is different than the ip address of the ingress"
    fi
    # Retrieving name of the record set relative to the zone
    echo "Retrieving the name of the record set relative to the [$DNS_ZONE_NAME] zone..."
    RECORDSET_NAME=$(az network dns record-set a list \
        --zone-name $DNS_ZONE_NAME \
        --resource-group $DNS_ZONE_RESOURCE_GROUP_NAME \
        --subscription $DNS_ZONE_SUBSCRIPTION_ID \
        --query "[?name=='$SUBDOMAIN'].name" \
        --output tsv \
        --only-show-errors 2>/dev/null)
    if [[ -n $RECORDSET_NAME ]]; then
        echo "[$RECORDSET_NAME] record set name successfully retrieved"
    else
        echo "Failed to retrieve the name of the record set relative to the [$DNS_ZONE_NAME] zone"
        exit
    fi
    # Remove the A record
    echo "Removing the A record from the record set relative to the [$DNS_ZONE_NAME] zone..."
    az network dns record-set a remove-record \
        --ipv4-address $IPV4_ADDRESS \
        --record-set-name $RECORDSET_NAME \
        --zone-name $DNS_ZONE_NAME \
        --resource-group $DNS_ZONE_RESOURCE_GROUP_NAME \
        --subscription $DNS_ZONE_SUBSCRIPTION_ID \
        --only-show-errors 1>/dev/null
    if [[ $? == 0 ]]; then
        echo "[$IPV4_ADDRESS] ip address successfully removed from the [$RECORDSET_NAME] record set"
    else
        echo "Failed to remove the [$IPV4_ADDRESS] ip address from the [$RECORDSET_NAME] record set"
        exit
    fi
fi
# Create the A record
echo "Creating an A record in [$DNS_ZONE_NAME] DNS zone for the [$SUBDOMAIN] subdomain with [$PUBLIC_IP_ADDRESS] IP address..."
az network dns record-set a add-record \
    --zone-name $DNS_ZONE_NAME \
    --resource-group $DNS_ZONE_RESOURCE_GROUP_NAME \
    --subscription $DNS_ZONE_SUBSCRIPTION_ID \
    --record-set-name $SUBDOMAIN \
    --ipv4-address $PUBLIC_IP_ADDRESS \
    --only-show-errors 1>/dev/null
if [[ $? == 0 ]]; then
    echo "A record for the [$SUBDOMAIN] subdomain with [$PUBLIC_IP_ADDRESS] IP address successfully created in [$DNS_ZONE_NAME] DNS zone"
else
    echo "Failed to create an A record for the $SUBDOMAIN subdomain with [$PUBLIC_IP_ADDRESS] IP address in [$DNS_ZONE_NAME] DNS zone"
fi

Note

قبل نشر تطبيق Yelb وإنشاء كائن ingress، يقوم السكربت بإنشاء SecretProviderClass لاسترجاع شهادة TLS من Azure Key Vault وتوليد سر Kubernetes لكائن ingress. من المهم ملاحظة أن برنامج تشغيل CSI الخاص بمخزن Secrets Store ل Key Vault ينشئ سر Kubernetes الذي يحتوي على شهادة TLS فقط عندما يتم تضمين SecretProviderClass وتعريف المجلدات في deployment. لضمان استرجاع شهادة TLS بشكل صحيح من Azure Key Vault وتخزينها في سر Kubernetes المستخدم في كائن ingress، نحتاج إلى إجراء التعديلات التالية على بيان YAML لنشر yelb-ui:

  • أضف تعريف csi volume باستخدام تعريف secrets-store.csi.k8s.io، الذي يشير إلى كائن SecretProviderClass المسؤول عن استرجاع شهادة TLS من Azure Key Vault.
  • أرفق volume mount لقراءة الشهادة كسر عن Azure Key Vault.

لمزيد من المعلومات، راجع إعداد برنامج تشغيل CSI لتخزين الأسرار لتمكين وحدة تحكم الدخول NGINX باستخدام TLS.

اختبار التطبيق

استخدم السكربت 05-call-yelb-ui.sh لاستدعاء الخدمة yelb-ui ، ومحاكاة حقن SQL، وهجمات XSS، ومراقبة كيف تقوم مجموعة القواعد المدارة في ModSecurity بحجب الطلبات الخبيثة.

#!/bin/bash
# Variables
source ./00-variables.sh
# Call REST API
echo "Calling Yelb UI service at $URL..."
curl -w 'HTTP Status: %{http_code}\n' -s -o /dev/null $URL
# Simulate SQL injection
echo "Simulating SQL injection when calling $URL..."
curl -w 'HTTP Status: %{http_code}\n' -s -o /dev/null $URL/?users=ExampleSQLInjection%27%20--
# Simulate XSS
echo "Simulating XSS when calling $URL..."
curl -w 'HTTP Status: %{http_code}\n' -s -o /dev/null $URL/?users=ExampleXSS%3Cscript%3Ealert%28%27XSS%27%29%3C%2Fscript%3E
# A custom rule blocks any request with the word blockme in the querystring.
echo "Simulating query string manipulation with the 'blockme' word in the query string..."
curl -w 'HTTP Status: %{http_code}\n' -s -o /dev/null $URL/?users?task=blockme

يجب أن ينتج سكريبت Bash الناتج التالي، حيث تنجح المكالمة الأولى، بينما تحظر قواعد ModSecurity الاستدعاءين التاليين:

Calling Yelb UI service at https://yelb.contoso.com...
HTTP Status: 200
Simulating SQL injection when calling https://yelb.contoso.com...
HTTP Status: 403
Simulating XSS when calling https://yelb.contoso.com...
HTTP Status: 403
Simulating query string manipulation with the 'blockme' word in the query string...
HTTP Status: 403

مراقبة التطبيق

في الحل المقترح، تقوم عملية النشر تلقائيا بتكوين مورد Azure Application Gateway لجمع سجلات التشخيص والمقاييس إلى مساحة عمل Azure Log Analytics Workspace. من خلال تفعيل السجلات، يمكنك الحصول على رؤى قيمة حول التقييمات والتطابقات والكتل التي تجريها Azure Web Application Firewall (WAF) داخل بوابة التطبيقات. لمزيد من المعلومات، راجع سجلات التشخيص لبوابة التطبيق. يمكنك أيضا استخدام Log Analytics لفحص البيانات داخل سجلات جدار الحماية. عندما تكون سجلات جدار الحماية في مساحة عمل Log Analytics الخاصة بك، يمكنك عرض البيانات، وكتابة الاستعلامات، وإنشاء التصورات، وإضافتها إلى لوحة تحكم البوابة الخاصة بك. للحصول على معلومات مفصلة حول استعلامات السجلات، انظر نظرة عامة على استعلامات السجل في Azure Monitor.

استكشف البيانات باستخدام استعلامات Kusto

في الحل المقترح، تقوم عملية النشر تلقائيا بتكوين مورد Azure Application Gateway لجمع سجلات ومقاييس التشخيص إلى مساحة عمل Azure Log Analytics. من خلال تفعيل السجلات، يمكنك الحصول على رؤى حول التقييمات والتطابقات والكتل التي أجرتها Azure Web Application Firewall (WAF) داخل بوابة التطبيقات. لمزيد من المعلومات، راجع سجلات التشخيص لبوابة التطبيق.

يمكنك أيضا استخدام Log Analytics لفحص البيانات داخل سجلات جدار الحماية. عندما تكون سجلات جدار الحماية في مساحة عمل Log Analytics الخاصة بك، يمكنك عرض البيانات، وكتابة الاستعلامات، وإنشاء التصورات، وإضافتها إلى لوحة تحكم البوابة الخاصة بك. لمزيد من المعلومات حول استعلامات السجل، انظر نظرة عامة على استعلامات السجل في Azure Monitor.

AzureDiagnostics 
| where ResourceProvider == "MICROSOFT.NETWORK" and Category == "ApplicationGatewayFirewallLog"
| limit 10

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

AGWFirewallLogs
| limit 10

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

الطلبات المتطابقة/المحظورة بواسطة IP

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.NETWORK" and Category == "ApplicationGatewayFirewallLog"
| summarize count() by clientIp_s, bin(TimeGenerated, 1m)
| render timechart

الطلبات المطابقة/المحظورة بواسطة URI

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.NETWORK" and Category == "ApplicationGatewayFirewallLog"
| summarize count() by requestUri_s, bin(TimeGenerated, 1m)
| render timechart

أعلى القواعد المتطابقة

| where ResourceProvider == "MICROSOFT.NETWORK" and Category == "ApplicationGatewayFirewallLog"
| summarize count() by ruleId_s, bin(TimeGenerated, 1m)
| where count_ > 10
| render timechart

أفضل خمس مجموعات قواعد متطابقة

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.NETWORK" and Category == "ApplicationGatewayFirewallLog"
| summarize Count=count() by details_file_s, action_s
| top 5 by Count desc
| render piechart

مراجعة الموارد الموزعة

يمكنك استخدام Azure CLI أو Azure PowerShell لإدراج الموارد المنتشرة في مجموعة الموارد.

  • واجهة سطر الأوامر Azure (Azure CLI)
  • Azure PowerShell

قم بإدراج الموارد المنشورة في مجموعة الموارد باستخدام أمر [az resource list][az-resource-list].

az resource list --resource-group <resource-group-name>

يمكنك استخدام Azure CLI أو Azure PowerShell لحذف مجموعة الموارد عندما لا تحتاج إلى الموارد التي أنشأتها في هذا الدرس.

  • واجهة سطر الأوامر Azure (Azure CLI)
  • Azure PowerShell

احذف مجموعة الموارد ومواردها المرتبطة باستخدام az group delete الأمر.

az group delete --name <resource-group-name>

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

يمكنك زيادة الأمان وحماية التهديدات للحل باستخدام Azure DDoS Protection و Azure Firewall. لمزيد من المعلومات، راجع المقالات التالية:

إذا كنت تستخدم وحدة تحكم الدخول NGINX أو أي وحدة تحكم دخول أخرى مستضافة من AKS بدلا من Azure Application Gateway، يمكنك استخدام Azure Firewall لفحص حركة المرور من وإلى عنقود AKS وحماية العنقود من تسرب البيانات وحركة المرور غير المرغوب فيها في الشبكة. لمزيد من المعلومات، راجع المقالات التالية:

Contributors

تحافظ Microsoft على هذا المقال. قام المساهمون التاليون بكتابته في الأصل:

الكاتب الرئيسي:

مساهمون آخرون: