Azure'a Amazon Web Services (AWS) web uygulaması dağıtma

Bu makalede, Yelb uygulamasını önceki makalede oluşturduğunuz Azure Kubernetes Service (AKS) kümesine dağıtacaksınız.

Ortamı denetleme

Uygulamayı dağıtmadan önce AŞAĞıDAKI komutları kullanarak AKS kümenizin düzgün yapılandırıldığından emin olun:

  1. komutunu kullanarak kümenizdeki ad alanlarını listeleyin kubectl get namespace .

    kubectl get namespace
    

    NGINX giriş denetleyicisini uygulama yönlendirme eklentisini kullanarak yüklediyseniz çıktıda ad alanını görmeniz app-routing-system gerekir:

    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 giriş denetleyicisini Helm aracılığıyla yüklediyseniz, ingress-basic namespace'i çıktıda görmeniz gerekir.

    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. Elde edin app-routing-system veya ingress-basic ad alanının belirli hizmet ayrıntılarını kubectl get service command kullanarak.

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

    Uygulama yönlendirme eklentisini kullandıysanız, hizmetin özel bir IP adresi olduğunu görmeniz EXTERNAL-IPnginx gerekir. Bu adres, AKS kümenizin özel yük dengeleyicisindeki bir ön uç IP yapılandırmasının kubernetes-internal özel IP adresidir:

    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 kullandıysanız, EXTERNAL-IP hizmetinin nginx-ingress-ingress-nginx-controller özel bir IP adresi olduğunu görmelisiniz. Bu adres, AKS kümenizin özel yük dengeleyicisindeki kubernetes-internal bir ön uç IP yapılandırmasının özel IP adresidir.

    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
    

Yelb uygulamasını dağıtmaya hazırlanma

Http yaklaşımı aracılığıyla Application Gateway ve Yelb çağrısında TLS sonlandırmasını kullanarak örneği dağıtmak istiyorsanız, Yelb uygulamasını http dağıtmak için Bash betiklerini ve YAML şablonlarını klasörde bulabilirsiniz.

Azure Application Gateway mimarisini kullanarak uçtan uca TLS kullanarak örneği dağıtmak istiyorsanız, web uygulamasını dağıtmak için Bash betiklerini ve YAML şablonlarını klasöründe bulabilirsiniz.

Bu makalenin kalan bölümlerinde, uçtan uca TLS yaklaşımını kullanarak örnek uygulamanın dağıtım sürecinde size yol göstereceğiz.

Değişkenleri özelleştirme

  1. Betikleri çalıştırmadan önce dosyadaki değişkenlerin 00-variables.sh değerlerini özelleştirmeniz gerekir. Bu dosya tüm betiklere dahil edilir ve aşağıdaki değişkenleri içerir:

    # 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. kullanıcı tarafından atanan yönetilen kimliğinclientId'ini almak için Azure Key Vault Sağlayıcısı for Secrets Store CSI Sürücüsü tarafından kullanılan az aks show komutunu aşağıdaki şekilde çalıştırabilirsiniz. keyVault.bicep modülü, yelb-ui hizmetini NGINX ingress denetleyicisi aracılığıyla kullanıma sunmak için kullanılan Kubernetes Ingress tarafından kullanılan sertifikayı alabilmesi amacıyla, eklentiye ait kullanıcı tarafından atanan yönetilen kimliğe Key Vault Administrator rolünü atar.

    az aks show \
      --name <aks-name> \
      --resource-group <aks-resource-group-name> \
      --query addonProfiles.azureKeyvaultSecretsProvider.identity.clientId \
      --output tsv \
      --only-show-errors
    
  3. Bu örnekle birlikte sağlanan Bicep modüllerini kullanarak Azure altyapısını dağıttıysanız, yelb uygulamasının dağıtımına geçebilirsiniz. Uygulamayı AKS kümenize dağıtmak istiyorsanız, ortamınızı yapılandırmak için aşağıdaki betikleri kullanabilirsiniz. 02-create-nginx-ingress-controller.sh ile etkinleştirilmiş ModSecurity açık kaynak web uygulaması güvenlik duvarı (WAF) bulunan NGINX giriş denetleyicisini yükleyebilirsiniz.

    #!/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
    

Uygulamayı dağıt

  1. Yelb uygulamasını ve 03-deploy-yelb.sh nesnesini dağıtmak için aşağıdaki betiği çalıştırarak hizmetin genel İnternet tarafından erişilebilir olmasını sağlayınyelb-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 bildirimini csi volume tanımını içerecek şekilde güncelleştirin ve sertifikayı Azure Key Vault'tan gizli olarak okumak için volume mount.

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. Artık uygulamayı dağıtabilirsiniz. Betik, uygulamayı dağıtmak için yelb.yml YAML bildirimini ve giriş nesnesini oluşturmak için ingress.yml öğesini kullanır. Etki alanı adı çözümlemesi için Azure Genel DNS Bölgesi kullanıyorsanız, 04-configure-dns.sh betiğini kullanabilirsiniz. Bu betik, NGINX giriş denetleyicisinin genel IP adresini, yelb-ui hizmetini açık hale getiren giriş nesnesi tarafından kullanılan etki alanıyla ilişkilendirir. Komut dosyası aşağıdaki adımları gerçekleştirir:

    1. Application Gateway'in ön uç IP yapılandırması tarafından kullanılan Azure genel IP adresini alır.
    2. A hizmeti tarafından kullanılan alt etki alanı için bir yelb-ui kaydının mevcut olup olmadığını denetler.
    3. Eğer A kaydı yoksa, komut dosyası bunu oluşturur.
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

Uyarı

Yelb uygulamasını dağıtmadan ve ingress nesnesini oluşturmadan önce betik, Azure Key Vault'tan TLS sertifikasını almak ve SecretProviderClass nesnesi için Kubernetes gizli dizisini oluşturmak üzere bir ingress oluşturur. Key Vault için Secrets Store CSI Sürücüsü, yalnızca eklendiğinde ve birim tanımı SecretProviderClass içinde bulunduğunda TLS sertifikasını içeren Kubernetes gizli dizisini oluşturur. Bu duruma dikkat etmek önemlidir. TLS sertifikasının Azure Key Vault düzgün bir şekilde alındığından ve ingress nesnesi tarafından kullanılan Kubernetes gizli dizisinde depolandığından emin olmak için, yelb-ui dağıtımının YAML bildiriminde aşağıdaki değişiklikleri yapmamız gerekir:

  • Azure Key Vault'tan TLS sertifikasını almakla sorumlu csi volume nesnesine başvuran secrets-store.csi.k8s.io sürücüsünü kullanarak SecretProviderClass tanımını ekleyin.
  • Sertifikayı Azure Key Vault gizli dizi olarak okumak için volume mount ekleyin.

Daha fazla bilgi için TLS ile NGINX Ingress Controller'ı etkinleştirmek için Secrets Store CSI Driver ayarlama bölümüne bakın.

Uygulamayı test edin

05-call-yelb-ui.sh betiğini, yelb-ui hizmetini çağırmak, SQL enjeksiyonu ve XSS saldırılarını simüle etmek ve ModSecurity'nin yönetilen kural kümesinin kötü amaçlı istekleri nasıl engellediğini gözlemleyin.

#!/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 betiği, ilk çağrının başarılı olduğu aşağıdaki çıkışı üretmeli ve ModSecurity kuralları aşağıdaki iki çağrıyı engellemelidir:

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

Uygulamayı izleyin

Önerilen çözümde dağıtım işlemi, Azure Log Analytics Workspace çalışma alanına tanılama günlüklerini ve ölçümlerini toplamak için Azure Application Gateway kaynağını otomatik olarak yapılandırıyor. Günlükleri etkinleştirerek Application Gateway içindeki Azure Web Uygulaması Güvenlik Duvarı (WAF) tarafından gerçekleştirilen değerlendirmeler, eşleşmeler ve bloklar hakkında değerli içgörüler elde edebilirsiniz. Daha fazla bilgi için bkz. Application Gateway için tanılama günlükleri. Güvenlik duvarı günlükleri içindeki verileri incelemek için Log Analytics de kullanabilirsiniz. Log Analytics çalışma alanınızda güvenlik duvarı günlükleri varsa verileri görüntüleyebilir, sorgu yazabilir, görselleştirmeler oluşturabilir ve bunları portal panonuza ekleyebilirsiniz. Günlük sorguları hakkında ayrıntılı bilgi için Azure İzleyici'da Günlük Sorgularına Genel Bakış bölümüne bakın.

Kusto sorguları ile verileri keşfetme

Önerilen çözümde dağıtım işlemi, Azure Application Gateway kaynağını otomatik olarak yapılandırarak Azure Log Analytics çalışma alanına tanılama günlüklerini ve ölçümlerini toplar. Günlükleri etkinleştirerek Application Gateway içindeki Azure Web Uygulaması Güvenlik Duvarı (WAF) tarafından gerçekleştirilen değerlendirmeler, eşleşmeler ve bloklar hakkında içgörüler elde edebilirsiniz. Daha fazla bilgi için bkz. Application Gateway için tanılama günlükleri.

Güvenlik duvarı günlükleri içindeki verileri incelemek için Log Analytics de kullanabilirsiniz. Log Analytics çalışma alanınızda güvenlik duvarı günlükleri varsa verileri görüntüleyebilir, sorgu yazabilir, görselleştirmeler oluşturabilir ve bunları portal panonuza ekleyebilirsiniz. Günlük sorguları hakkında daha fazla bilgi için bkz. Azure İzleyici günlük sorgularının genel görünümü.

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

Alternatif olarak, Kaynağa özgü tabloyla çalışırken ham güvenlik duvarı günlük verilerine aşağıdaki sorgu kullanılarak erişilebilir. Kaynağa özgü tablolar hakkında daha fazla bilgi edinmek için İzleme verileri başvuru belgelerine bakın.

AGWFirewallLogs
| limit 10

Verileri aldıktan sonra daha ayrıntılı bir şekilde inceleyebilir ve graflar veya görselleştirmeler oluşturabilirsiniz. Aşağıda, kullanılabilecek KQL sorgularının bazı ek örnekleri verilmiştir:

IP tarafından eşleşen/engellenen istekler

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

URI tarafından eşleşen/engellenen istekler

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

En çok eşleşen kurallar

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

İlk beş eşleşen kural grubu

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

Dağıtılan kaynakları gözden geçirme

Kaynak grubundaki dağıtılan kaynakları listelemek için Azure CLI veya Azure PowerShell kullanabilirsiniz.

[az resource list][az-resource-list] komutunu kullanarak kaynak grubundaki dağıtılan kaynakları listeleyin.

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

Bu öğreticide oluşturduğunuz kaynaklara artık ihtiyacınız kalmadığında kaynak grubunu silmek için Azure CLI veya Azure PowerShell kullanabilirsiniz.

komutunu kullanarak az group delete kaynak grubunu ve ilişkili kaynaklarını silin.

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

Sonraki adımlar

Azure DDoS Koruması ve Azure Güvenlik Duvarı kullanarak çözümün güvenlik ve tehdit korumasını artırabilirsiniz. Daha fazla bilgi için aşağıdaki makalelere bakın:

Azure Application Gateway yerine NGINX giriş denetleyicisini veya aks tarafından barındırılan başka bir giriş denetleyicisini kullanıyorsanız, AKS kümesine gelen ve aks kümesinden gelen trafiği incelemek ve kümeyi veri sızdırma ve diğer istenmeyen ağ trafiğine karşı korumak için Azure Güvenlik Duvarı kullanabilirsiniz. Daha fazla bilgi için aşağıdaki makalelere bakın:

Katkıda Bulunanlar

Microsoft bu makaleyi korur. Orijinal olarak aşağıdaki katkıda bulunanlar yazdı:

Asıl yazar:

Diğer katkıda bulunanlar: