如何使用oidc和Azure应用程序配置kubernetes以仅允许使用指定的安全组进行身份验证

时间:2019-09-24 16:59:45

标签: azure kubernetes openid-connect

我正在尝试在我们的(常规而非AKS)kubernetes群集和Azure AD之间设置SSO。 由于我不知道如何将令牌转发到kube-dashboard,因此我目前正在尝试在计算机上安装kubectl二进制文件。 当不涉及任何组,但是我们希望按安全组进行过滤(AAD上的帐户已从我们的本地Active Directory同步)时,它就可以工作,而无需涉及kube RBAC。

设置受https://medium.com/@olemarkus/using-azure-ad-to-authenticate-to-kubernetes-eb143d3cce10https://docs.microsoft.com/fr-fr/azure/aks/azure-ad-integration的启发:

  • 用于kube api服务器的Web应用程序配置为使用应用程序ID公开其API(添加范围等...): abc123
  • 用于客户端kubectl的本地应用程序,配置了来自Web应用程序的api权限,并具有以下应用程序ID: xyz456
  • kube api服务器yaml清单,我添加:

- --oidc-client-id=spn:abc123

- --oidc-issuer-url=https://sts.windows.net/OurAADTenantID

  • config kubectl二进制文件:
kubectl config set-cluster test-legacy-2 --server=https://192.168.x.y:4443 --certificate-authority=/somelocation/ca.pem
kubectl config set-credentials USER@mydomain.com --auth-provider=azure --auth-provider-arg=environment=AzurePublicCloud --auth-provider-arg=client-id=xyz456 --auth-provider-arg=tenant-id=OurAADTenantID --auth-provider-arg=apiserver-id=abc123

还要在Azure客户端应用清单中指定:

"allowPublicClient":true,

"oauth2AllowIdTokenImplicitFlow":true

否则出现错误“ 无法获取令牌:获取新的新令牌:等待设备代码身份验证完成:autorest / adal / devicetoken:检索OAuth令牌时出错:未知错误” 。 在https://github.com/MicrosoftDocs/azure-docs/issues/10326

上找到

尝试根据https://kubernetes.io/docs/reference/access-authn-authz/authentication/#openid-connect-tokens在JWT中找到某个安全组进行过滤时,问题开始了

即使JWT Azure向我发送的确包含格式正确的组(字符串的json数组),我仍收到格式错误

配置:

  • 在azure Web应用程序清单中,我的JWT中包含这些组:

"groupMembershipClaims": "SecurityGroup",

  • kube api服务器yaml清单:

- --oidc-groups-claim=groups

- --oidc-required-claim=groups=bbc2eedf-79cd-4505-9fb4-39856ed3790e

,其中的字符串是我的目标安全组的GUID。

我在kubectl的输出中收到error: You must be logged in to the server (Unauthorized),而kube api服务器日志向我提供了authentication.go:62] Unable to authenticate the request due to an error: [invalid bearer token, [invalid bearer token, oidc: parse claim groups: json: cannot unmarshal array into Go value of type string]]

但是我不明白为什么当我解码我拥有的JWT时为什么不快乐

"groups": [
    "00530f35-0013-4237-8947-6e3f6a7895ca",
    "bbc2eedf-79cd-4505-9fb4-39856ed3790e",
    "17dff614-fd68-4a38-906c-69561daec8b7"
  ],

据我所知,这是一个格式良好的json字符串数组...

为什么api服务器抱怨JWT?

1 个答案:

答案 0 :(得分:0)

Ok so, Required claims must be a string, not an array of strings

但是我找到了解决方法。

  • 请勿使用oidc-groups-claim和oidc-required-claim
  • 在Azure中,转到API服务器应用程序的属性。
  • 在“需要用户分配”中选择“是”
  • 在“用户和组”中,添加要过滤的特定安全组
  • 要进行测试:从安全组中删除自己
  • 等待令牌过期(在我的情况下是1小时)
  • 您无法再登录