Настройка 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, выполните следующие шаги:
-
Задайте аргумент командной строки
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;
-
Добавьте секрет с ключом клиента. Ключ должен быть закодирован в Base64:
apiVersion: v1 kind: Secret metadata: name: oidc-secret type: angie.software/oidc data: client-secret: <client_secret>
-
Примените секрет:
kubectl apply -f oidc/client-secret.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
-
Примените политику:
kubectl apply -f oidc/oidc.yaml
-
После того как секрет и описание политики будут добавлены, примените политику для сервера или маршрута, сославшись на нее:
policies: - name: oidc-policy
На данном этапе включение политики вызовет ошибку, т.к. не были заданы обязательные переменные, обеспечивающие валидацию токенов в процессе аутентификации OIDC:
$jwt_claim_iat
$jwt_claim_iss
$jwt_claim_sub
$jwt_claim_aud
-
В спецификации 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.