Настройка OIDC#

OIDC (OpenID Connect) обеспечивает удобную аутентификацию пользователей через внешнего провайдера, используя безопасные токены для управления доступом в системе.

Политика OIDC настраивает ANIC как клиент (relying party) для аутентификации через OpenID Connect.

Например, следующая конфигурация использует clientID myclient и clientSecret oidc-secret для аутентификации через провайдера OpenID Connect https://idp.example.com:

oidc:
 clientID: myclient
 clientSecret: oidc-secret
 authEndpoint: https://idp.example.com/openid-connect/auth
 jwksURI: https://idp.example.com/openid-connect/certs
 tokenEndpoint: https://idp.example.com/openid-connect/token
 scope: openid+profile+email
 accessTokenEnable: true

Подробное описание параметров можно посмотреть здесь.

Настройка аутентификации через OpenID Connect#

Чтобы настроить аутентификацию через OpenID Connect, выполните следующие шаги:

  1. Задайте аргумент командной строки enable-oidc=true.

    В конфиге будут подключены три модуля:

    • load_module modules/ngx_http_js_module.so;

    • load_module modules/ngx_http_auth_jwt_module.so;

    • load_module modules/ngx_http_keyval_module.so;

  2. Добавьте секрет с ключом клиента. Ключ должен быть закодирован в Base64:

    client-secret.yaml#
    apiVersion: v1
    kind: Secret
    metadata:
      name: oidc-secret
    type: angie.software/oidc
    data:
      client-secret: <client_secret>
    
  3. Примените секрет:

    kubectl apply -f oidc/client-secret.yaml
    
  4. Добавьте политику:

    oidc.yaml#
    apiVersion: k8s.angie.software/v1
    kind: Policy
    metadata:
      name: oidc-policy
    spec:
       oidc:
         clientID: myclient
         clientSecret: oidc-secret
         authEndpoint: https://idp.example.com/openid-connect/auth
         jwksURI: https://idp.example.com/openid-connect/certs
         tokenEndpoint: https://idp.example.com/openid-connect/token
         scope: openid+profile+email
         accessTokenEnable: true
    
  5. Примените политику:

    kubectl apply -f oidc/oidc.yaml
    
  6. После того как секрет и описание политики будут добавлены, примените политику для сервера или маршрута, сославшись на нее:

    policies:
      - name: oidc-policy
    

    На данном этапе включение политики вызовет ошибку, т.к. не были заданы обязательные переменные, обеспечивающие валидацию токенов в процессе аутентификации OIDC:

    • $jwt_claim_iat

    • $jwt_claim_iss

    • $jwt_claim_sub

    • $jwt_claim_aud

  7. В спецификации VirtualServer задайте обязательные переменные в параметре maps:

    maps:
      - variable: $jwt_claim_iat
        source: $oidc_client
        parameters:
          - value: 'myclient'
            result: '80'
      - variable: $jwt_claim_iss
        source: $oidc_client
        parameters:
          - value: 'myclient'
            result: 'PROVIDER_URL'
      - variable: $jwt_claim_sub
        source: $oidc_client
        parameters:
          - value: 'myclient'
            result: 'myclient'
      - variable: $jwt_claim_aud
        source: $oidc_client
        parameters:
          - value: 'myclient'
            result: 'myclient'
    

    В конфигурацию VirtualServer будут добавлены следующие директивы:

    map $oidc_client $jwt_claim_iat {
        myclient 80;
    }
    
    map $oidc_client $jwt_claim_iss {
        myclient PROVIDER_URL;
    }
    
    map $oidc_client $jwt_claim_sub {
        myclient myclient;
    }
    
    map $oidc_client $jwt_claim_aud {
        myclient myclient;
    }
    

Полный пример конфигурации#

apiVersion: k8s.angie.software/v1
kind: VirtualServer
metadata:
  name: test-echo
spec:
  host: test.example.com
  upstreams:
    - name: app-server-payload
      service: echoserver
      port: 8077
  routes:
    - path: /
      action:
        proxy:
          upstream: app-server-payload
      policies:
        - name: oidc-policy
  maps:
    - variable: $jwt_claim_iat
      source: $oidc_client
      parameters:
        - value: 'myclient'
          result: '80'
    - variable: $jwt_claim_iss
      source: $oidc_client
      parameters:
        - value: 'myclient'
          result: 'PROVIDER_URL'
    - variable: $jwt_claim_sub
      source: $oidc_client
      parameters:
        - value: 'myclient'
          result: 'myclient'
    - variable: $jwt_claim_aud
      source: $oidc_client
      parameters:
        - value: 'myclient'
          result: 'myclient'

Пример включения переменных map в зависимости от входного значения#

Значения:

  • default

  • volatile

  • include

  • hostnames

maps:
  - variable: $result_var
    source: $host
    parameters:
      - value: 'default'
        result: 'default_value'
      - value: 'volatile'
        result: ''
      - value: 'include'
        result: '/dev/stdout'
      - value: 'example.com'
        result: '1'
      - value: '*.example.com'
        result: '1'

См. также директиву map в документации Angie.