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, выполните следующие шаги: Задайте аргумент командной строки В конфиге будут подключены три модуля: Добавьте секрет с ключом клиента. Ключ должен быть закодирован в Base64: Примените секрет: Добавьте политику: Примените политику: После того как секрет и описание политики будут добавлены,
примените политику для сервера или маршрута, сославшись на нее: На данном этапе включение политики вызовет ошибку, т.к. не были заданы обязательные переменные, обеспечивающие валидацию токенов в процессе аутентификации OIDC: В спецификации VirtualServer задайте обязательные
переменные в параметре maps: В конфигурацию VirtualServer будут добавлены следующие директивы: Значения: См. также директиву map в документации Angie.Настройка аутентификации через 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;
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
$jwt_claim_iat
$jwt_claim_iss
$jwt_claim_sub
$jwt_claim_aud
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 $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'