• Русский
  • ModSecurity

    ModSecurity — это открытый Web Application Firewall (WAF), предназначенный для защиты веб-приложений от вредоносных атак. Он поддерживается сообществом с открытым исходным кодом и поддерживает различные языки программирования и веб-серверы. Платформа Load Balancer (ALB) поддерживает настройку ModSecurity, позволяя создавать индивидуальные конфигурации на уровне Ingress.

    Содержание

    Терминология

    ТерминОбъяснение
    owasp-core-rulesOWASP Core Rule Set — это набор правил с открытым исходным кодом, используемый для обнаружения и предотвращения распространённых атак на веб-приложения.

    Процедура эксплуатации

    Настройте ModSecurity, добавив аннотации в YAML-файл соответствующего ресурса или настроив CR.

    Метод первый: Добавление аннотаций

    Добавьте следующие аннотации в поле metadata.annotations соответствующего YAML-файла для настройки ModSecurity.

    • Аннотации, совместимые с Ingress-Nginx

      АннотацияТипПрименимый объектОбъяснение
      nginx.ingress.kubernetes.io/enable-modsecurityboolIngressВключить ModSecurity.
      nginx.ingress.kubernetes.io/enable-owasp-core-rulesboolIngressВключить OWASP Core Rule Set.
      nginx.ingress.kubernetes.io/modsecurity-transaction-idstringIngressИспользуется для идентификации уникальных ID транзакций для каждого запроса, что помогает при логировании и отладке.
      nginx.ingress.kubernetes.io/modsecurity-snippetstringIngress, ALB, FT, RuleПозволяет пользователям вставлять собственные конфигурации ModSecurity для удовлетворения специфических требований безопасности.
    • Специальные аннотации ALB

      АннотацияТипПрименимый объектОбъяснение
      alb.modsecurity.cpaas.io/use-recommendboolIngressВключить или отключить рекомендуемые правила ModSecurity; установите true для применения предопределённого набора правил безопасности.
      alb.modsecurity.cpaas.io/cmrefstringIngressСсылка на конкретные конфигурации, например, можно загрузить пользовательские настройки безопасности, указав путь ссылки на ConfigMap ($ns/$name#$section).

    Метод второй: Настройка CR

    1. Откройте файл конфигурации ALB, FT или Rule, который необходимо настроить.

    2. Добавьте следующие поля в spec.config по необходимости.

      { "modsecurity": {
            "enable": true, # Включить или отключить ModSecurity
            "transactionId": "$xx", # Использовать ID из Nginx
            "useCoreRules": true, # Добавить modsecurity_rules_file /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf
            "useRecommend": true, # Добавить modsecurity_rules_file /etc/nginx/modsecurity/modsecurity.conf
            "cmRef": "$ns/$name#$section", # Добавить конфигурацию из ConfigMap
          } }
    3. Сохраните и примените файл конфигурации.

    Связанные объяснения

    Переопределение

    Если ModSecurity не настроен в Rule, будет предпринята попытка найти конфигурацию в FT; если в FT конфигурация отсутствует, будет использована конфигурация из ALB.

    Пример конфигурации

    В следующем примере развёртывается ALB с именем waf-alb и демонстрационное backend-приложение с именем hello. Кроме того, развёртывается Ingress с именем ing-waf-enable, который определяет маршрут /waf-enable и настраивает правила ModSecurity. Любой запрос, содержащий параметр запроса test, значение которого включает строку test, будет заблокирован.

    cat <<EOF | kubectl apply -f -
    apiVersion: crd.alauda.io/v2
    kind: ALB2
    metadata:
      name: waf-alb
      namespace: cpaas-system
    spec:
      config:
        loadbalancerName: waf-alb
        projects:
          - ALL_ALL
        replicas: 1
      type: nginx
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/enable-modsecurity: "true"
        nginx.ingress.kubernetes.io/modsecurity-transaction-id: "$request_id"
        nginx.ingress.kubernetes.io/modsecurity-snippet: |
          SecRuleEngine On
          SecRule ARGS:test "@contains test" "id:1234,deny,log"
      name: ing-waf-enable
    spec:
      ingressClassName: waf-alb
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: hello
                    port:
                      number: 80
                path: /waf-enable
                pathType: ImplementationSpecific
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ing-waf-normal
    spec:
      ingressClassName: waf-alb
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: hello
                    port:
                      number: 80
                path: /waf-not-enable
                pathType: ImplementationSpecific
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello
    spec:
      replicas: 1
      selector:
        matchLabels:
          service.cpaas.io/name: hello
          service_name: hello
      template:
        metadata:
          labels:
            service.cpaas.io/name: hello
            service_name: hello
        spec:
          containers:
            - name: hello-world
              image: docker.io/hashicorp/http-echo
              imagePullPolicy: IfNotPresent
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: hello
    spec:
      internalTrafficPolicy: Cluster
      ipFamilies:
        - IPv4
      ipFamilyPolicy: SingleStack
      ports:
        - name: http
          port: 80
          protocol: TCP
          targetPort: 5678
      selector:
        service_name: hello
      sessionAffinity: None
      type: ClusterIP
    EOF