إنشاء واستخدام قواعد مخصصة لـ Web Application Firewall v2 على Application Gateway

يوفر جدار حماية تطبيق الويب (WAF) v2 على بوابة تطبيق Azure الحماية لتطبيقات الويب. يتم توفير هذه الحماية بواسطة مجموعة القواعد الأساسية لمشروع أمان تطبيق الويب المفتوح (OWASP) (CRS). في بعض الحالات، قد تحتاج إلى إنشاء القواعد المخصصة الخاصة بك لتلبية احتياجاتك المحددة. لمزيد من المعلومات حول قواعد WAF المخصصة، راجع نظرة عامة على قواعد جدار حماية تطبيق الويب المخصص.

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

يتم اشتقاق قصاصات JSON الموضحة في هذه المقالة من مورد ApplicationGatewayWebApplicationFirewallPolicies.

إشعار

في حالة أن بوابة التطبيق لديك لا تستخدم طبقة WAF، فسيظهر خيار ترقية بوابة التطبيق إلى طبقة WAF في الجزء الأيمن.

Enable WAF

مثال1

أنت تعرف أن هناك روبوتًا يسمى evilbot تريد منعه من تتبع الارتباطات على موقعك على الويب. في هذه الحالة، يمكنك حظر User-Agent evilbot في عناوين الطلب.

المنطق: p

$variable = New-AzApplicationGatewayFirewallMatchVariable `
   -VariableName RequestHeaders `
   -Selector User-Agent

$condition = New-AzApplicationGatewayFirewallCondition `
   -MatchVariable $variable `
   -Operator Contains `
   -MatchValue "evilbot" `
   -Transform Lowercase `
   -NegationCondition $False

$rule = New-AzApplicationGatewayFirewallCustomRule `
   -Name blockEvilBot `
   -Priority 2 `
   -RuleType MatchRule `
   -MatchCondition $condition `
   -Action Block `
   -State Enabled

وإليك JSON المطابق:

{
  "customRules": [
    {
      "name": "blockEvilBot",
      "priority": 2,
      "ruleType": "MatchRule",
      "action": "Block",
      "state": "Enabled",
      "matchConditions": [
        {
          "matchVariables": [
            {
              "variableName": "RequestHeaders",
              "selector": "User-Agent"
            }
          ],
          "operator": "Contains",
          "negationCondition": false,
          "matchValues": [
            "evilbot"
          ],
          "transforms": [
            "Lowercase"
          ]
        }
      ]
    }
  ]
}

لمشاهدة WAF تم نشره باستخدام هذه القاعدة المخصصة، راجع تكوين قاعدة مخصصة لجدار حماية تطبيق الويب باستخدام Azure PowerShell.

مثال 1أ

يمكنك إنجاز نفس الشيء باستخدام تعبير عادي:

$variable = New-AzApplicationGatewayFirewallMatchVariable `
   -VariableName RequestHeaders `
   -Selector User-Agent

$condition = New-AzApplicationGatewayFirewallCondition `
   -MatchVariable $variable `
   -Operator Regex `
   -MatchValue "evilbot" `
   -Transform Lowercase `
   -NegationCondition $False

$rule = New-AzApplicationGatewayFirewallCustomRule `
   -Name blockEvilBot `
   -Priority 2 `
   -RuleType MatchRule `
   -MatchCondition $condition `
   -Action Block `
   -State Enabled

وJSON المقابلة:

{
  "customRules": [
    {
      "name": "blockEvilBot",
      "priority": 2,
      "ruleType": "MatchRule",
      "action": "Block",
      "state": "Enabled",
      "matchConditions": [
        {
          "matchVariables": [
            {
              "variableName": "RequestHeaders",
              "selector": "User-Agent"
            }
          ],
          "operator": "Regex",
          "negationCondition": false,
          "matchValues": [
            "evilbot"
          ],
          "transforms": [
            "Lowercase"
          ]
        }
      ]
    }
  ]
}

المثال 2

تريد السماح بنسبة استخدام الشبكة فقط من الولايات المتحدة باستخدام عامل تشغيل GeoMatch ولا تزال القواعد المدارة سارية:

$variable = New-AzApplicationGatewayFirewallMatchVariable `
   -VariableName RemoteAddr `

$condition = New-AzApplicationGatewayFirewallCondition `
   -MatchVariable $variable `
   -Operator GeoMatch `
   -MatchValue "US" `
   -Transform Lowercase `
   -NegationCondition $True

$rule = New-AzApplicationGatewayFirewallCustomRule `
   -Name "allowUS" `
   -Priority 2 `
   -RuleType MatchRule `
   -MatchCondition $condition `
   -Action Block `
   -State Enabled

وJSON المقابلة:

{
  "customRules": [
    {
      "name": "allowUS",
      "priority": 2,
      "ruleType": "MatchRule",
      "action": "Block",
      "state": "Enabled",
      "matchConditions": [
        {
          "matchVariables": [
            {
              "variableName": "RemoteAddr"
            }
          ],
          "operator": "GeoMatch",
          "negationCondition": true,
          "matchValues": [
            "US"
          ],
          "transforms": [
            "Lowercase"
          ]
        }
      ]
    }
  ]
}

المثال 3

تريد حظر جميع الطلبات من عناوين IP في النطاق 198.168.5.0/24.

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

المنطق: p

$variable1 = New-AzApplicationGatewayFirewallMatchVariable `
   -VariableName RemoteAddr

$condition1 = New-AzApplicationGatewayFirewallCondition `
   -MatchVariable $variable1 `
   -Operator IPMatch `
   -MatchValue "192.168.5.0/24" `
   -NegationCondition $False

$rule = New-AzApplicationGatewayFirewallCustomRule `
   -Name myrule1 `
   -Priority 10 `
   -RuleType MatchRule `
   -MatchCondition $condition1 `
   -Action Block `
   -State Enabled

فيما يلي JSON المطابق:

{
  "customRules": [
    {
      "name": "myrule1",
      "priority": 10,
      "ruleType": "MatchRule",
      "action": "Block",
      "state": "Enabled",
      "matchConditions": [
        {
          "matchVariables": [
            {
              "variableName": "RemoteAddr"
            }
          ],
          "operator": "IPMatch",
          "negationCondition": false,
          "matchValues": [
            "192.168.5.0/24"
          ],
          "transforms": []
        }
      ]
    }
  ]
}

قاعدة CRS المقابلة: SecRule REMOTE_ADDR "@ipMatch 192.168.5.0/24" "id:7001,deny"

المثال الرابع

على سبيل المثال، تريد حظر User-Agent evilbot، ونسبة استخدام الشبكة في النطاق 192.168.5.0/24. لإنجاز هذا الإجراء، يمكنك إنشاء شرطي مطابقة منفصلين، ووضعهما في نفس القاعدة. يضمن هذا التكوين أنه إذا تم مطابقة كل من evilbot في عنوان عامل المستخدم وعناوين IP من النطاق 192.168.5.0/24، فسيتم حظر الطلب.

المنطق: p وq

$variable1 = New-AzApplicationGatewayFirewallMatchVariable `
   -VariableName RemoteAddr

 $variable2 = New-AzApplicationGatewayFirewallMatchVariable `
   -VariableName RequestHeaders `
   -Selector User-Agent

$condition1 = New-AzApplicationGatewayFirewallCondition `
   -MatchVariable $variable1 `
   -Operator IPMatch `
   -MatchValue "192.168.5.0/24" `
   -NegationCondition $False

$condition2 = New-AzApplicationGatewayFirewallCondition `
   -MatchVariable $variable2 `
   -Operator Contains `
   -MatchValue "evilbot" `
   -Transform Lowercase `
   -NegationCondition $False

 $rule = New-AzApplicationGatewayFirewallCustomRule `
   -Name myrule `
   -Priority 10 `
   -RuleType MatchRule `
   -MatchCondition $condition1, $condition2 `
   -Action Block `
   -State Enabled

فيما يلي JSON المطابق:

{
  "customRules": [
    {
      "name": "myrule",
      "priority": 10,
      "ruleType": "MatchRule",
      "action": "Block",
      "state": "Enabled",
      "matchConditions": [
        {
          "matchVariables": [
            {
              "variableName": "RemoteAddr"
            }
          ],
          "operator": "IPMatch",
          "negationCondition": false,
          "matchValues": [
            "192.168.5.0/24"
          ],
          "transforms": []
        },
        {
          "matchVariables": [
            {
              "variableName": "RequestHeaders",
              "selector": "User-Agent"
            }
          ],
          "operator": "Contains",
          "negationCondition": false,
          "matchValues": [
            "evilbot"
          ],
          "transforms": [
            "Lowercase"
          ]
        }
      ]
    }
  ]
}

مثال 5

على سبيل المثال، تريد الحظر إذا كان الطلب خارج نطاق عناوين IP 192.168.5.0/24، أو أن سلسلة عامل المستخدم ليست chrome (بمعنى أن المستخدم لا يستخدم مستعرض Chrome). نظرًا لأن هذا المنطق يستخدم or، فإن الشرطين موجودان في قواعد منفصلة كما هو ملاحظ في المثال التالي. يحتاج كل من myrule1وmyrule2 إلى التطابق لمنع نسبة استخدام الشبكة.

المنطق: ليس (p وq) = ليس p أو ليس q.

$variable1 = New-AzApplicationGatewayFirewallMatchVariable `
   -VariableName RemoteAddr

$variable2 = New-AzApplicationGatewayFirewallMatchVariable `
   -VariableName RequestHeaders `
   -Selector User-Agent

$condition1 = New-AzApplicationGatewayFirewallCondition `
   -MatchVariable $variable1 `
   -Operator IPMatch `
   -MatchValue "192.168.5.0/24" `
   -NegationCondition $True

$condition2 = New-AzApplicationGatewayFirewallCondition `
   -MatchVariable $variable2 `
   -Operator Contains `
   -MatchValue "chrome" `
   -Transform Lowercase `
   -NegationCondition $True

$rule1 = New-AzApplicationGatewayFirewallCustomRule `
   -Name myrule1 `
   -Priority 10 `
   -RuleType MatchRule `
   -MatchCondition $condition1 `
   -Action Block `
   -State Enabled

$rule2 = New-AzApplicationGatewayFirewallCustomRule `
   -Name myrule2 `
   -Priority 20 `
   -RuleType MatchRule `
   -MatchCondition $condition2 `
   -Action Block `
   -State Enabled

وJSON المقابلة:

{
  "customRules": [
    {
      "name": "myrule1",
      "priority": 10,
      "ruleType": "MatchRule",
      "action": "Block",
      "state": "Enabled",
      "matchConditions": [
        {
          "matchVariables": [
            {
              "variableName": "RemoteAddr"
            }
          ],
          "operator": "IPMatch",
          "negationCondition": true,
          "matchValues": [
            "192.168.5.0/24"
          ],
          "transforms": []
        }
      ]
    },
    {
      "name": "myrule2",
      "priority": 20,
      "ruleType": "MatchRule",
      "action": "Block",
      "state": "Enabled",
      "matchConditions": [
        {
          "matchVariables": [
            {
              "variableName": "RequestHeaders",
              "selector": "User-Agent"
            }
          ],
          "operator": "Contains",
          "negationCondition": true,
          "matchValues": [
            "chrome"
          ],
          "transforms": [
            "Lowercase"
          ]
        }
      ]
    }
  ]
}

مثال 6

تريد السماح فقط بالطلبات من وكلاء مستخدمين معروفين محددين.

نظرًا لأن المنطق المستخدم هنا هو أو، وجميع القيم موجودة في رأس عامل المستخدم، يمكن أن تكون جميع MatchValues في قائمة مفصولة بفاصلة.

المنطق: p أو q أو r

$variable = New-AzApplicationGatewayFirewallMatchVariable `
   -VariableName RequestHeaders `
   -Selector User-Agent
$condition = New-AzApplicationGatewayFirewallCondition `
   -MatchVariable $variable `
   -Operator Equal `
   -MatchValue @('user1', 'user2') `
   -NegationCondition $True

$rule = New-AzApplicationGatewayFirewallCustomRule `
   -Name BlockUnknownUserAgents `
   -Priority 2 `
   -RuleType MatchRule `
   -MatchCondition $condition `
   -Action Block `
   -State Enabled

JSON المطابق:

{
  "customRules": [
    {
      "name": "BlockUnknownUserAgents",
      "priority": 2,
      "ruleType": "MatchRule",
      "action": "Block",
      "state": "Enabled",
      "matchConditions": [
        {
          "matchVariables": [
            {
              "variableName": "RequestHeaders",
              "selector": "User-Agent"
            }
          ],
          "operator": "Equal",
          "negationCondition": true,
          "matchValues": [
            "user1",
            "user2"
          ],
          "transforms": []
        }
      ]
    }
  ]
}

مثال 7

ليس من غير المألوف أن ترى Azure Front Door منشورا أمام بوابة التطبيق. للتأكد من أن نسبة استخدام الشبكة التي تتلقاها بوابة التطبيق تأتي من توزيع Front Door، فإن أفضل الممارسات هي التحقق مما إذا كان العنوان X-Azure-FDID يحتوي على القيمة الفريدة المتوقعة. لمزيد من المعلومات حول تأمين الوصول إلى التطبيق الخاص بك باستخدام Azure Front Door، راجع كيفية تأمين الوصول إلى الواجهة الخلفية الخاصة بي إلى Azure Front Door فقط

المنطق: ليس p

$expectedFDID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$variable = New-AzApplicationGatewayFirewallMatchVariable `
   -VariableName RequestHeaders `
   -Selector X-Azure-FDID

$condition = New-AzApplicationGatewayFirewallCondition `
   -MatchVariable $variable `
   -Operator Equal `
   -MatchValue $expectedFDID `
   -Transform Lowercase `
   -NegationCondition $True

$rule = New-AzApplicationGatewayFirewallCustomRule `
   -Name blockNonAFDTraffic `
   -Priority 2 `
   -RuleType MatchRule `
   -MatchCondition $condition `
   -Action Block `
   -State Enabled

وإليك JSON المطابق:

{
  "customRules": [
    {
      "name": "blockNonAFDTraffic",
      "priority": 2,
      "ruleType": "MatchRule",
      "action": "Block",
      "state": "Enabled",
      "matchConditions": [
        {
          "matchVariables": [
            {
              "variableName": "RequestHeaders",
              "selector": "X-Azure-FDID"
            }
          ],
          "operator": "Equal",
          "negationCondition": true,
          "matchValues": [
            "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
          ],
          "transforms": [
            "Lowercase"
          ]
        }
      ]
    }
  ]
}

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

بعد إنشاء القواعد المخصصة، يمكنك معرفة كيفية عرض سجلات WAF. لمزيد من المعلومات، راجع عمليات التشخيص في Application Gateway.