JWT#

В примере ниже развертывается веб-приложение, настраивается балансировка нагрузки с помощью VirtualServer и применяется политика JWT.

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

  1. Установите ANIC.

  2. Сохраните публичный IP-адрес ANIC в переменной оболочки:

    $ IC_IP=XXX.YYY.ZZZ.III
    
  3. Сохраните HTTP-порт ANIC в переменной оболочки:

    $ IC_HTTP_PORT=<номер порта>
    

Настройка JWT#

  1. Создайте Deployment и Service для приложения:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: webapp
    spec:
      replicas: 1
      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
    

    Примените настройки:

    $ kubectl apply -f webapp.yaml
    
  2. Создайте секрет с именем jwk-secret, который будет использоваться для проверки JWT:

    apiVersion: v1
    kind: Secret
    metadata:
      name: jwk-secret
    type: angie.software/jwk
    data:
      jwk: eyJrZXlzIjoKICAgIFt7CiAgICAgICAgImsiOiJabUZ1ZEdGemRHbGphbmQwIiwKICAgICAgICAia3R5Ijoib2N0IiwKICAgICAgICAia2lkIjoiMDAwMSIKICAgIH1dCn0K
    

    Примените настройки:

    $ kubectl apply -f jwk-secret.yaml
    
  3. Создайте политику jwt-policy, которая будет ссылаться на Secret из предыдущего шага и разрешать запросы к веб-приложению только при наличии корректного JWT:

    apiVersion: k8s.angie.software/v1
    kind: Policy
    metadata:
      name: jwt-policy
    spec:
      jwt:
        realm: MyProductAPI
        secret: jwk-secret
        token: $http_token
    

    Примените настройки:

    $ kubectl apply -f jwt.yaml
    
  4. Настройте балансировку нагрузки. Создайте ресурс VirtualServer для веб-приложения:

    apiVersion: k8s.angie.software/v1
    kind: VirtualServer
    metadata:
      name: webapp
    spec:
      host: webapp.example.com
      policies:
      - name: jwt-policy
      upstreams:
      - name: webapp
        service: webapp-svc
        port: 80
      routes:
      - path: /
        action:
          pass: webapp
    

    Примените настройки:

    $ kubectl apply -f virtual-server.yaml
    

    Обратите внимание, что VirtualServer ссылается на политику jwt-policy, созданную на предыдущем шаге.

  5. Протестируйте конфигурацию.

    Если попытаться получить доступ к приложению без JWT, ANIC отклонит запрос:

    $ curl --resolve webapp.example.com:$IC_HTTP_PORT:$IC_IP http://webapp.example.com:$IC_HTTP_PORT/
    

    Ответ:

    <html>
    <head><title>401 Authorization Required</title></head>
    <body>
    <center><h1>401 Authorization Required</h1></center>
    <hr><center>Angie/1.8.1</center>
    </body>
    </html>
    

    Если передать корректный JWT, запрос будет выполнен успешно:

    $ curl --resolve webapp.example.com:$IC_HTTP_PORT:$IC_IP http://webapp.example.com:$IC_HTTP_PORT/ -H "token: `cat token.jwt`"
    

    Ответ:

    Server address: 172.17.0.3:8080
    Server name: webapp-7c6d448df9-lcrx6
    Date: 10/Sep/2020:18:20:03 +0000
    URI: /
    Request ID: db2c07ce640755ccbe9f666d16f85620