Перейти к содержанию

Публикация приложения с использованием Kubernetes-манифестов

Требования

  • Локальный или облачный (EKS, GKE, AKE и т.д.) кластер любой версии Kubernetes

  • Приложение, опубликованное в Kubernetes с использованием манифестов

  • Доступность pod'а из сети Интернет или других потенциально опасных ресурсов

  • Ingress‑контроллер или внешний балансировщик нагрузки (например, AWS ELB, AWS ALB) передает публичный IP‑адрес подключающегося клиента в заголовке X-Forwarded-For

  • Аккаунт в Личном кабинете Валарм для EU‑облака или RU‑облака

  • Email и пароль пользователя с ролью Деплой, который добавлен в ваш аккаунт в Личном кабинете Валарм. Для добавления пользователя используйте инструкцию

Установка

  1. Создайте ConfigMap Валарм.

  2. Обновите описание объекта Deployment в Kubernetes.

  3. Обновите описание объекта Service в Kubernetes.

  4. Опубликуйте обновленное приложение в Kubernetes.

  5. Протестируйте sidecar‑контейнер Валарм.

Если Валарм WAF уже установлен

Если вы устанавливаете Валарм WAF вместо существующего Валарм WAF или дублируете установку, используйте версию существующего Валарм WAF или обновите версии всех установок до последней.

Версия установленного Валарм WAF указана в шаблоне Deployment → секция spec.template.spec.containersimage контейнера Валарм WAF.

  • Если указана версия 3.2.x, используйте текущую инструкцию.
  • Если указана версия 3.0.x, увеличьте версии образов во всех установках до 3.2.1-1 и следуйте текущей инструкции. Мы рекомендуем обновить модули, так как в последней версии добавлена настройка доступа к приложениям по IP‑адресам и упрощена логика работы режимов фильтрации трафика.
  • Если указана версия 2.18.x или ниже, увеличьте версии образов во всех установках до 3.2.1-1 и следуйте текущей инструкции. Поддержка установленных версий скоро будет прекращена или уже прекращена.

Более подробная информация о поддержке версий доступна в политике версионирования WAF‑ноды.

Шаг 1: Создание ConfigMap Валарм

  1. Создайте новый манифест Kubernetes или обновите существующий со следующими настройками NGINX для sidecar‑контейнера Валарм:
apiVersion: v1
kind: ConfigMap
metadata:
  name: wallarm-sidecar-nginx-conf
data:
  default: |
      server {
          listen 80 default_server;
          listen [::]:80 default_server ipv6only=on;
          server_name localhost;
          root /usr/share/nginx/html;
          index index.html index.htm;
          # Замените <WALLARM_MODE> ниже на режим фильтрации запросов: 
          # off для отключения фильтрации
          # monitoring для обработки всех запросов без блокировки
          # safe_blocking для блокировки только тех вредоносных запросов,
          # которые отправлены с IP-адресов из серого списка
          # block для обработки всех запросов и блокировки вредоносных
          wallarm_mode <WALLARM_MODE>;
          # wallarm_instance 1;
          set_real_ip_from 0.0.0.0/0;
          real_ip_header X-Forwarded-For;
          location / {
                  # Замените <APP_CONTAINER_PORT> ниже на порт,
                  # по которому контейнер получает входящие запросы; 
                  # значение должно совпадать с ports.containerPort в описании основного контейнера вашего приложения
                  proxy_pass http://localhost:<APP_CONTAINER_PORT>; 
                  include proxy_params;
          }
      }
  1. Обновите значения параметров, следуя комментариям к коду.

Шаг 2: Обновление объекта Deployment в Kubernetes

  1. Перейдите к манифестам Kubernetes и откройте шаблон с описанием объекта Deployment. Если в приложении несколько объектов Deployment, откройте тот, в котором описаны pod'ы, доступные из сети Интернет. Например:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers: 
      # Описание основного контейнера вашего приложения
      - name: myapp
        image: <Image>
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        # Порт, по которому контейнер приложения получает входящие запросы
        - containerPort: 8080
  1. Скопируйте в шаблон следующие элементы:
    • в секцию spec.template.spec.containersописание sidecar‑контейнера wallarm;
    • в секцию spec.template.spec.volumes описание ресурса wallarm-nginx-conf.
    Ниже приведен пример шаблона с добавленными элементами. Элементы для копирования обозначены комментарием элемент Валарм.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        # Элемент Валарм: описание sidecar‑контейнера Валарм
        - name: wallarm
          image: wallarm/node:3.2.1-1
          imagePullPolicy: Always
          env:
          # Конечная точка Валарм API:
          # "api.wallarm.com" для EU‑облака
          # "api.wallarm.ru" для RU‑облака
          - name: WALLARM_API_HOST 
            value: "api.wallarm.com"
          # Имя пользователя с ролью "Деплой"
          - name: DEPLOY_USER
            value: "username"
          # Пароль пользователя с ролью "Деплой"
          - name: DEPLOY_PASSWORD
            value: "password"
          - name: DEPLOY_FORCE
            value: "true"
          # Объем оперативной памяти в ГБ для записи данных по аналитике запросов;
          # рекомендуемое значение — 75% от общей памяти сервера
          - name: TARANTOOL_MEMORY_GB
            value: "2"
          ports:
          - name: http
            # порт, по которому sidecar‑контейнер Валарм получает запросы от объекта Service
            containerPort: 80
          volumeMounts: 
          - mountPath: /etc/nginx/sites-enabled 
            readOnly: true  
            name: wallarm-nginx-conf
        # Описание основного контейнера вашего приложения
        - name: myapp
          image: <Image>
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
          ports:
          # Порт, по которому контейнер приложения получает входящие запросы
          - containerPort: 8080
      volumes:
      # Элемент Валарм: описание ресурса wallarm-nginx-conf
      - name: wallarm-nginx-conf 
        configMap:
          name: wallarm-sidecar-nginx-conf
          items:
            - key: default
              path: default
  1. Обновите значения параметров, следуя комментариям к коду.

Шаг 3: Обновление объекта Service в Kubernetes

  1. Вернитесь к манифестам Kubernetes и откройте шаблон с описанием объекта Service, который соответствует объекту Deployment из шага 2. Например:
apiVersion: v1
kind: Service
metadata:
  name: myapp
  labels:
    run: myapp
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    run: myapp
  1. Обновите значение ports.targetPort в соответствии с ports.containerPort из описания sidecar‑контейнера Валарм. Например:
...
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    run: myapp

Шаг 4: Публикация обновленного приложения в Kubernetes

Опубликуйте приложение в Kubernetes, используя обновленные манифесты.

Объект NetworkPolicy в Kubernetes

Если вы также используете объект NetworkPolicy в Kubernetes, убедитесь, что он обрабатывает трафик, поступающий с порта sidecar‑контейнера Валарм.

Шаг 5: Тестирование sidecar‑контейнера Валарм

  1. Получите список pod'ов, используя команду:

    kubectl get pods
    

    Количество контейнеров в pod'е должно увеличиться, статус pod'а должен быть "Running".

    NAME                       READY   STATUS    RESTARTS   AGE
    mychart-856f957bbd-cr4kt   2/2     Running   0          3m48s
    
  2. Перейдите в Личный кабинет Валарм → секция Ноды по ссылке ниже и убедитесь, что в списке появился новый элемент. Созданная WAF‑нода используется для фильтрации запросов к вашему приложению.

  3. Выполните тестовую атаку на адрес вашего приложения, как описано в документации.

  4. Перейдите в Личный кабинет Валарм → секция События по ссылке ниже и проверьте, что атака появилась в списке.