Базовая HTTP-аутентификация#

ANIC поддерживает аутентификацию HTTP-запросов. Для настройки базовой HTTP-аутентификации используются следующие две аннотации:

  • angie.software/basic-auth-secret: "secret" — обязательная аннотация, указывает на секрет, содержащий список пользователей в формате htpasswd. Значения хранятся в поле htpasswd. Тип секрета: angie.software/htpasswd.

  • angie.software/basic-auth-realm: "realm" — необязательная аннотация, определяет область (realm), отображаемую в окне входа.

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

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

    $ IC_IP=<ваш_IP-адрес>
    
  3. Сохраните HTTP-порт ANIC в переменную оболочки:

    $ IC_HTTP_PORT=<номер_порта>
    
  4. Создайте Deployment и Service приложения Cafe для компонентов coffee и tea:

    Пример
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: coffee
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: coffee
      template:
        metadata:
          labels:
            app: coffee
        spec:
          containers:
          - name: coffee
            image: angiesoftware/angie-hello:plain-text
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: coffee-svc
    spec:
      ports:
      - port: 80
        targetPort: 8080
        protocol: TCP
        name: http
      selector:
        app: coffee
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tea
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: tea
      template:
        metadata:
          labels:
            app: tea
        spec:
          containers:
          - name: tea
            image: angiesoftware/angie-hello:plain-text
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: tea-svc
      labels:
    spec:
      ports:
      - port: 80
        targetPort: 8080
        protocol: TCP
        name: http
      selector:
        app: tea
    

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

    $ kubectl apply -f cafe.yaml
    
  5. Создайте секрет типа angie.software/htpasswd с именем cafe-passwd, который будет использоваться для базовой аутентификации. Секрет должен содержать список пар user:password в формате Base64:

    kind: Secret
    metadata:
      name: cafe-passwd
    apiVersion: v1
    type: angie.software/htpasswd
    stringData:
      htpasswd: |
        foo:$2y$10$e4CiBWaLq9JW93jV8r9CW.RE6fbsT3szmIsUhwqYuPfVlggXiBY76
      # bar
    

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

    $ kubectl apply -f cafe-passwd.yaml
    
  6. Создайте ресурс Ingress для приложения:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: cafe-ingress
      annotations:
        angie.software/basic-auth-secret: "cafe-passwd"
        angie.software/basic-auth-realm: "Cafe App"
    spec:
      ingressClassName: angie
      tls:
      - hosts:
        - cafe.example.com
        secretName: cafe-secret
      rules:
      - host: cafe.example.com
        http:
          paths:
          - path: /tea
            pathType: Prefix
            backend:
              service:
                name: tea-svc
                port:
                  number: 80
          - path: /coffee
            pathType: Prefix
            backend:
              service:
                name: coffee-svc
                port:
                  number: 80
    

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

    $ kubectl apply -f cafe-ingress.yaml
    

    Примечание

    Ресурс Ingress должен содержать аннотацию angie.software/basic-auth-secret, ссылающуюся на секрет cafe-passwd, созданный ранее.

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

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

    $ curl --resolve cafe.example.com:$IC_HTTP_PORT:$IC_IP http://cafe.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>
    

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

    $ curl --resolve cafe.example.com:$IC_HTTPS_PORT:$IC_IP https://cafe.example.com:$IC_HTTPS_PORT/coffee --insecure -u foo:bar
    Server address: 10.244.0.6:8080
    Server name: coffee-7b9b4bbd99-bdbxm
    Date: 20/Jun/2022:11:43:34 +0000
    URI: /coffee
    Request ID: f91f15d1af17556e552557df2f5a0dd2
    

Пример с отдельными параметрами htpasswd для разных путей#

В примере ниже реализована базовая аутентификация для объединенных (mergeable) ресурсов Ingress с отдельными списками user:password для каждого пути.

Master Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-master
  annotations:
    angie.software/mergeable-ingress-type: "master"
spec:
  ingressClassName: angie
  tls:
  - hosts:
    - cafe.example.com
    secretName: cafe-secret
  rules:
  - host: cafe.example.com

Minion для /tea:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-tea-minion
  annotations:
    angie.software/mergeable-ingress-type: "minion"
    angie.software/basic-auth-secret: "tea-passwd"
    angie.software/basic-auth-realm: "Tea"
spec:
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80

Minion для /coffee:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-coffee-minion
  annotations:
    angie.software/mergeable-ingress-type: "minion"
    angie.software/basic-auth-secret: "coffee-passwd"
    angie.software/basic-auth-realm: "Coffee"
spec:
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /coffee
        pathType: Prefix
        backend:
          service:
            name: coffee-svc
            port:
              number: 80