Обратная связь прокси OIDC в кубернетах
Я пытаюсь защитить Java-приложения на кубернетах.
Для простого приложения Springboot с разрешением All я выбираю openresty (nginx) с lua-resty-openidc в качестве обратного прокси.
Один пример, который в основном иллюстрирует то, что я пытаюсь сделать: https://medium.com/@lukas.eichler/securing-pods-with-sidecar-proxies-d84f8d34be3e
Он "работает" на localhost, но не на кубернетах.
Вот мой nginx.conf:
worker_processes 1;
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log debug;
events {
worker_connections 1024;
}
http {
lua_package_path '~/lua/?.lua;;';
resolver ${dns.ip};
lua_ssl_trusted_certificate /ssl/certs/chain.pem;
lua_ssl_verify_depth 5;
lua_shared_dict discovery 1m;
lua_shared_dict jwks 1m;
lua_shared_dict introspection 10m;
lua_shared_dict sessions 10m;
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
server_name localhost;
listen 80;
location /OAuth2Client {
access_by_lua_block {
local opts = {
discovery = "${openam-provider}/.well-known/openid-configuration",
redirect_uri = "http://localhost:8080/OAuth2Client/authorization-code/callback",
client_id = "myClientId",
client_secret = "myClientSecret",
scope = "openid profile email",
}
local res, err = require("resty.openidc").authenticate(opts)
if err then
ngx.status = 500
ngx.say(err)
ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
end
ngx.req.set_header("Authorization", "Bearer " .. res.access_token)
ngx.req.set_header("X-USER", res.id_token.sub)
}
proxy_pass http://localhost:8080/OAuth2Client;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
Итак, локально, поскольку мой nginx и мое приложение springboot работают на локальном хосте, перенаправления работают.
Теперь, когда я развертываю его на кубернетах с этим, браузер не сопоставляет localhost с внутренним ip контейнера.
apiVersion: apps/v1
kind: Deployment
metadata:
name: oauth2-client-deployment
spec:
selector:
matchLabels:
app: OAuth2Client
replicas: 2
template:
metadata:
labels:
app: OAuth2Client
spec:
#hostAliases:
#- ip: "127.0.0.1"
# hostnames:
# - "oauth2-client.local"
containers:
- name: oauth2-client-container
image: repo/oauth2-client-springboot:latest
env:
- name: SPRING_PROFILES_ACTIVE
value: dev
envFrom:
- secretRef:
name: openam-client-secret
- secretRef:
name: keystore-java-opts
volumeMounts:
- name: oauth2-client-keystore
mountPath: "/projected"
readOnly: true
ports:
- containerPort: 8080
- name: oauth2-sidecar
image: repo/oauth2-sidecar:latest
ports:
- containerPort: 80
volumes:
- name: oauth2-client-keystore
projected:
sources:
- secret:
name: keystore-secret
items:
- key: keystore.jks
path: keystore.jks
- secret:
name: truststore-secret
items:
- key: truststore.jks
path: truststore.jks
imagePullSecrets:
- name: regcred
---
apiVersion: v1
kind: Service
metadata:
name: oauth2-client-service-sidecar
spec:
selector:
app: OAuth2Client
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
Итак, как мне сопоставить этот локальный хост? Я не хочу, чтобы контейнер приложения был виден, поскольку на нем нет безопасности, поэтому я использовал nginx в качестве сопутствующего элемента, а служба нацелена только на него. Как сообщить nginx о необходимости redirect_uri и proxypass для ip контейнера приложения?
И дополнительный вопрос: поскольку nginx не принимает переменные env, как мне сделать его универсальным, чтобы приложения могли предоставлять свои собственные redirect_uri, которые следует использовать в nginx.conf?
Другой дополнительный вопрос: команда ngx.req.set_header("Авторизация", "Носитель" .. res.access_token), похоже, не работает, поскольку я не вижу заголовка авторизации в моем запросе в моем приложении...
1 ответ
Настройте свой сервис с помощью типа ClusterIP
чтобы быть доступным только изнутри, затем используйте fqdn в своих сервисах для доступа к сервису без зависимости от IP.
apiVersion: v1
kind: Service
metadata:
name: oauth2-client-service-sidecar
spec:
selector:
app: OAuth2Client
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Затем используйте oauth2-client-service-sidecar.<namespacen>.cluster.local
в вашей конфигурации nginx для доступа к службе:
proxy_pass http://oauth2-client-service-sidecar.<namespacen>.cluster.local/OAuth2Client;