我在Azure中使用一个Kubernetes部署模型,它有一个OAuth2代理(https://github.com/oauth2-proxy/oauth2-proxy),它通过通过各种客户端启用SSO登录来保护集群资源。从最终用户的角度来看,这是可以的,因为他们可以轻松地使用他的SSO客户端登录。当OAuth2代理背后的服务公开的API需要由外部应用程序通过REST调用使用时,问题就出现了。
配置是默认的配置,它为OAuth2提供了一个专门的Kubernetes服务,并在inside文件中遵循了以下规则。
nginx.ingress.kubernetes.io/auth-signin: 'https://$host/oauth2/start?rd=$request_uri'
nginx.ingress.kubernetes.io/auth-url: 'https://$host/oauth2/auth'根据我检查的内容,目前这些服务只能通过来自外部应用程序(例如,Postman)的REST调用来使用,只有当我添加了一个cookie ,该cookie是在使用UI和SSO客户端提供程序成功登录后生成的。如果我不添加这个cookie参数,就不会出现像cookie _oauth_proxy这样的错误。
是否有任何选项可以添加到代理配置中,以便允许基于令牌的身份验证和授权/编程生成某些标识符,以便通过REST调用为技术用户(外部应用程序)访问OAuth2代理背后的资源?我可以根据现有的配置(客户机id、机密、应用程序范围等)生成访问令牌。
OAuth2代理部署YAML如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: oauth2-proxy
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: oauth2-proxy
template:
metadata:
labels:
app: oauth2-proxy
spec:
containers:
- env:
- name: OAUTH2_PROXY_PROVIDER
value: azure
- name: OAUTH2_PROXY_AZURE_TENANT
value: <REPLACE_WITH_DIRECTORY_ID>
- name: OAUTH2_PROXY_CLIENT_ID
value: <REPLACE_WITH_APPLICATION_ID>
- name: OAUTH2_PROXY_CLIENT_SECRET
value: <REPLACE_WITH_SECRET_KEY>
- name: OAUTH2_PROXY_COOKIE_SECRET
value: <REPLACE_WITH_VALUE_OF python -c 'import os,base64; print base64.b64encode(os.urandom(16))'>
- name: OAUTH2_PROXY_HTTP_ADDRESS
value: "0.0.0.0:4180"
- name: OAUTH2_PROXY_UPSTREAM
value: "<AZURE KUBERNETES CLUSTER HOST e.g. >"
image: bitnami/oauth2-proxy:latest
imagePullPolicy: IfNotPresent
name: oauth2-proxy
ports:
- containerPort: 4180
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: oauth2-proxy
name: oauth2-proxy
namespace: default
spec:
ports:
- name: http
port: 4180
protocol: TCP
targetPort: 4180
selector:
app: oauth2-proxy 编辑:
我终于能够通过AD OAuth2令牌端点使用生成的令牌来调用代理后面的API。为了实现这一点,我将码头映像从machinedata/oauth2_proxy更改为bitnami/oauth2-proxy.。除此之外,我还向容器添加了以下参数
args:
- '--provider=azure'
- '--azure-tenant=TENANT_ID'
- '--skip-jwt-bearer-tokens=true'
- >-
--oidc-issuer-url=https://sts.windows.net/TENANT_ID/
- >-
--extra-jwt-issuers=https://login.microsoftonline.com/TENANT_ID/v2.0=APP_ID
- '--request-logging=true'
- '--auth-logging=true'
- '--standard-logging=true'此外,我还必须对来自Azure的应用程序注册清单进行一些更改,以便通过OAuth2代理根据正确的版本验证令牌。
"accessTokenAcceptedVersion": 2我在这里也找到了一些有用的解释:https://github.com/oauth2-proxy/oauth2-proxy/issues/502。
现在,我可以使用Azure提供的令牌端点为我的API调用生成一个Bearer令牌。唯一仍然存在的问题是,当我试图访问应用程序UI时,出现了一个错误。
在pod日志中收到的错误/警告是:警告:这个会话需要多个cookie,因为它超过了4kb的cookie限制。请使用服务器端会话存储(例如。而不是红色。
在浏览器中接收到的错误是502坏网关
编辑2:
我能够绕过这个新的错误,在我的入口级为OAuth2代理增加缓冲区大小。更多细节可以在下面的URL中找到。https://oauth2-proxy.github.io/oauth2-proxy/docs/configuration/oauth_provider/#azure-auth-provider https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/
发布于 2020-12-22 13:00:59
最后,我使用以下配置使其工作:
deployment.yaml用于OAuth2代理:
kind: Deployment
apiVersion: apps/v1
metadata:
name: oauth2-proxy
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: oauth2-proxy
template:
metadata:
creationTimestamp: null
labels:
app: oauth2-proxy
spec:
containers:
- name: oauth2-proxy
image: 'bitnami/oauth2-proxy:latest'
args:
- '--provider=azure'
- '--azure-tenant=TENANT_ID'
- '--skip-jwt-bearer-tokens=true'
- >-
--oidc-issuer-url=https://sts.windows.net/TENANT_ID/
- >-
--extra-jwt-issuers=https://login.microsoftonline.com/TENANT_ID/v2.0=CLIENT_ID
- '--request-logging=true'
- '--auth-logging=true'
- '--standard-logging=true'
ports:
- containerPort: 4180
protocol: TCP
env:
- name: OAUTH2_PROXY_AZURE_TENANT
value: TENANT_ID
- name: OAUTH2_PROXY_CLIENT_ID
value: CLIENT_ID
- name: OAUTH2_PROXY_CLIENT_SECRET
value: CLIENT_SECRET
- name: OAUTH2_PROXY_COOKIE_SECRET
value: COOKIE_SECRET
- name: OAUTH2_PROXY_HTTP_ADDRESS
value: '0.0.0.0:4180'
- name: OAUTH2_PROXY_UPSTREAM
value: 'http://your-host'
- name: OAUTH2_PROXY_EMAIL_DOMAINS
value: '*'ingress.yaml for OAuth2 proxy:
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: oauth2-proxy
namespace: default
labels:
app: oauth2-proxy
annotations:
kubernetes.io/ingress.class: addon-http-application-routing
# in my case the generated cookie was too big so I had to add the below parameters
nginx.ingress.kubernetes.io/proxy-buffer-size: 8k
nginx.ingress.kubernetes.io/proxy-buffers-number: '4'
spec:
tls:
- hosts:
- YOUR_HOST
rules:
- host: YOUR_HOST
http:
paths:
- path: /oauth2
backend:
serviceName: oauth2-proxy
servicePort: 4180除了这些配置文件之外,我还必须在Azure应用程序注册清单中更改accessTokenAcceptedVersion的值。默认情况下,此值设置为null,这意味着它将用于V1令牌,而不是参数中指定的V2。
"accessTokenAcceptedVersion": 2在进行了这些更改之后,我可以通过Azure令牌端点使用生成的令牌,以便通过OAuth2代理并到达应用程序公开的API:
HTTP POST to https://login.microsoftonline.com/TENANT_ID/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded
Body:
- client_id: YOUR_CLIENT_ID
- grant_type: client_credentials
- client_secret: YOUR_CLIENT_SECRET
- scope: api://YOUR_CLIENT_ID/.default - this was generated by me, but it should work with MS Graph as well发布于 2021-09-02 17:46:09
我在Azure中使用了一个Kubernetes部署模型,它有一个OAuth2代理,它通过启用SSO登录来保护集群资源。我已经成功地运行了Oauth服务,我还部署了应用程序入口和oauth入口。但是当我访问应用程序URL时,我得到了500个内部错误。如果我访问Oauth入口url,我就得到了登录窗口。我可以提供有关oauth部署yaml以及应用程序入口和oauth入口yaml的详细信息。
https://stackoverflow.com/questions/64965691
复制相似问题