<a id="access-control"></a>

# Контроль доступа

Ниже приведен пример развертывания веб-приложения, настройки балансировки нагрузки с помощью VirtualServer и применения политики управления доступом для запрета и разрешения трафика из определенной подсети.

## Предварительные действия

1. Установите ANIC.
2. Сохраните публичный IP-адрес ANIC в переменной оболочки:
   ```console
   $ IC_IP=<ваш_IP-адрес>
   ```
3. Сохраните HTTP-порт ANIC в переменной оболочки:
   ```console
   $ IC_HTTP_PORT=<номер порта>
   ```

## Настройка контроля доступа

1. Создайте Deployment и Service для приложения:
   ```yaml
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: webapp
   spec:
     selector:
       matchLabels:
         app: webapp
     template:
       metadata:
         labels:
           app: webapp
       spec:
         containers:
         - name: webapp
           image: angiesoftware/angie-hello:plain-text
           ports:
           - containerPort: 8080
   ---
   apiVersion: v1
   kind: Service
   metadata:
     name: webapp-svc
   spec:
     ports:
     - port: 80
       targetPort: 8080
       protocol: TCP
       name: http
     selector:
       app: webapp
   ```

   Примените настройки:
   ```console
   $ kubectl apply -f webapp.yaml
   ```
2. Создайте политику `webapp-policy`, которая запрещает запросы от клиентов с IP-адресами из подсети `10.0.0.0/8`.
   Убедитесь, что поле `deny` в файле `access-control-policy-deny.yaml` настроено
   в соответствии с вашей средой:
   ```yaml
   apiVersion: k8s.angie.software/v1
   kind: Policy
   metadata:
     name: webapp-policy
   spec:
     accessControl:
       deny:
       - 10.0.0.0/8
   ```

   Примените настройки:
   ```console
   $ kubectl apply -f access-control-policy-deny.yaml
   ```
3. Создайте ресурс VirtualServer для веб-приложения:
   ```yaml
   apiVersion: k8s.angie.software/v1
   kind: VirtualServer
   metadata:
     name: webapp
   spec:
     host: webapp.example.com
     policies:
     - name: webapp-policy
     upstreams:
     - name: webapp
       service: webapp-svc
       port: 80
     routes:
     - path: /
       action:
         pass: webapp
   ```

   Примените настройки:
   ```console
   $ kubectl apply -f virtual-server.yaml
   ```

   Обратите внимание, что VirtualServer должен ссылаться на политику `webapp-policy`, созданную на шаге 2.
4. Протестируйте конфигурацию.

   Попробуйте обратиться к приложению:
   ```console
   $ curl --resolve webapp.example.com:$IC_HTTP_PORT:$IC_IP http://webapp.example.com:$IC_HTTP_PORT
   ```

   Ожидаемый результат:
   ```html
   <html>
   <head><title>403 Forbidden</title></head>
   <body>
   <center><h1>403 Forbidden</h1></center>
   <hr><center>Angie/1.8.1</center>
   </body>
   </html>
   ```

   Ответ `403 Forbidden` означает успешное срабатывание политики блокировки запросов.
5. Обновите политику, чтобы разрешить запросы от клиентов из подсети `10.0.0.0/8`.
   Убедитесь, что поле `allow` в файле `access-control-policy-allow.yaml` настроено в соответствии с вашей средой:
   ```console
   apiVersion: k8s.angie.software/v1
   kind: Policy
   metadata:
     name: webapp-policy
   spec:
     accessControl:
       allow:
       - 10.0.0.0/8
   ```

   Обновите политику:
   ```console
   $ kubectl apply -f access-control-policy-allow.yaml
   ```
6. Повторно протестируйте конфигурацию.

   Попробуйте обратиться к приложению:
   ```console
   $ curl --resolve webapp.example.com:$IC_HTTP_PORT:$IC_IP http://webapp.example.com:$IC_HTTP_PORT
   ```

   Ожидаемый результат:
   ```console
   Server address: 10.64.0.13:8080
   Server name: webapp-5cbbc7bd78-wf85w
   ```

   Ответ `200 OK` означает успешное разрешение запроса после обновления политики.
