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