MS Azure OAuth2 代理 - 基于令牌的身份验证不是 oauth_proxy cookie
MS Azure OAuth2 proxy - Token based authentication not oauth_proxy cookie
我在 Azure 中使用 Kubernetes 部署模型,它有一个 OAuth2 代理(https://github.com/oauth2-proxy/oauth2-proxy),它通过各种客户端启用 SSO 登录来保护集群资源。从最终用户的角度来看,这是可以的,他们可以轻松地使用他的 SSO 客户端登录。当 OAuth2 代理背后的服务公开的 API 需要外部应用程序通过 REST 调用使用时,就会出现问题。
配置是默认配置,在 Ingress 文件中有一个用于 OAuth2 的专用 Kubernetes 服务和以下规则。
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 参数(_oauth2_proxy) 在使用 UI 和 SSO 客户端提供商成功登录后生成。如果我不添加此 cookie 参数,则会出现错误,例如 cookie _oauth_proxy 不存在 .
有没有我可以添加到代理配置的选项,以允许基于令牌的身份验证和 authorization/programmatic 生成一些标识符,以便技术用户(外部)访问 OAuth2 代理背后的资源应用程序)通过 REST 调用?我可以根据现有配置(客户端 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。为了实现这一点,我将 docker 图像从 machinedata/oauth2_proxy 更改为 bitnami/oauth2-proxy。
除此之外,我将以下参数添加到 container:
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 AD 的 应用程序注册清单 进行一些更改,以便 OAuth2 代理根据正确的版本验证令牌。
"accessTokenAcceptedVersion": 2
我在这里也找到了一些有用的解释:https://github.com/oauth2-proxy/oauth2-proxy/issues/502 .
现在我可以使用 Azure 提供的令牌端点为我的 API 调用生成 Bearer 令牌。唯一仍然存在的问题是我在尝试访问应用程序时遇到的错误 UI。
pod 日志中收到的 error/warning 是:
警告:此会话需要多个 cookie,因为它超过了 4kb 的 cookie 限制。请改用服务器端会话存储(例如 Redis)。
浏览器收到的错误是 502 Bad Gateway
编辑#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/
我终于使用以下配置使其工作:
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 对于 OAuth2 代理:
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 令牌而不是 extra-jwt-issuers 参数中指定的 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
我在 Azure 中使用 Kubernetes 部署模型,它有一个 OAuth2 代理,它通过启用 SSO 登录来保护集群资源。
我成功地获得了 Oauth 服务 运行,我还部署了应用程序入口和 oauth 入口。但是当我访问应用程序 URL 时,出现 500 内部错误。如果我访问 Oauth 入口 url,我得到了登录名 window。我可以提供有关 oauth 部署 yaml 和应用程序入口和 oauth 入口 yaml 的详细信息。
我在 Azure 中使用 Kubernetes 部署模型,它有一个 OAuth2 代理(https://github.com/oauth2-proxy/oauth2-proxy),它通过各种客户端启用 SSO 登录来保护集群资源。从最终用户的角度来看,这是可以的,他们可以轻松地使用他的 SSO 客户端登录。当 OAuth2 代理背后的服务公开的 API 需要外部应用程序通过 REST 调用使用时,就会出现问题。
配置是默认配置,在 Ingress 文件中有一个用于 OAuth2 的专用 Kubernetes 服务和以下规则。
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 参数(_oauth2_proxy) 在使用 UI 和 SSO 客户端提供商成功登录后生成。如果我不添加此 cookie 参数,则会出现错误,例如 cookie _oauth_proxy 不存在 .
有没有我可以添加到代理配置的选项,以允许基于令牌的身份验证和 authorization/programmatic 生成一些标识符,以便技术用户(外部)访问 OAuth2 代理背后的资源应用程序)通过 REST 调用?我可以根据现有配置(客户端 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。为了实现这一点,我将 docker 图像从 machinedata/oauth2_proxy 更改为 bitnami/oauth2-proxy。 除此之外,我将以下参数添加到 container:
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 AD 的 应用程序注册清单 进行一些更改,以便 OAuth2 代理根据正确的版本验证令牌。
"accessTokenAcceptedVersion": 2
我在这里也找到了一些有用的解释:https://github.com/oauth2-proxy/oauth2-proxy/issues/502 .
现在我可以使用 Azure 提供的令牌端点为我的 API 调用生成 Bearer 令牌。唯一仍然存在的问题是我在尝试访问应用程序时遇到的错误 UI。
pod 日志中收到的 error/warning 是: 警告:此会话需要多个 cookie,因为它超过了 4kb 的 cookie 限制。请改用服务器端会话存储(例如 Redis)。
浏览器收到的错误是 502 Bad Gateway
编辑#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/
我终于使用以下配置使其工作:
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 对于 OAuth2 代理:
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 令牌而不是 extra-jwt-issuers 参数中指定的 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
我在 Azure 中使用 Kubernetes 部署模型,它有一个 OAuth2 代理,它通过启用 SSO 登录来保护集群资源。 我成功地获得了 Oauth 服务 运行,我还部署了应用程序入口和 oauth 入口。但是当我访问应用程序 URL 时,出现 500 内部错误。如果我访问 Oauth 入口 url,我得到了登录名 window。我可以提供有关 oauth 部署 yaml 和应用程序入口和 oauth 入口 yaml 的详细信息。