如何验证 Kubernetes 服务帐户令牌 (JWT)

Posted

技术标签:

【中文标题】如何验证 Kubernetes 服务帐户令牌 (JWT)【英文标题】:How to verify Kubernetes service account token (JWT) 【发布时间】:2018-11-21 15:07:55 【问题描述】:

我创建了一个服务帐户并创建了一个与该服务帐户关联的 Pod。 在 Pod 中,我有服务帐户令牌:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Im15c2VydmljZS10b2tlbi1xY21jcSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJteXNlcnZpY2UiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJlZmVkM2MwZi02ZTEwLTExZTgtYWEwOC0wMDUwNTY4NTdjYWYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpteXNlcnZpY2UifQ.Q6evTXCaZ99eBRsOrNnu-UlCJsYu4EKNijxEYyMe8Kq6G9e5likG08DwqMyUOP9uVT7kbOR6VOqIuJ4w0xShG6H2zcXhsF7dViFdo9LaYrs2830XjkiMRAxqJmkcvNseeqwBL1aS5SiNz_xf8RgIZaU1Oik69KVRWncno3dZHEyr2PrwDt4akSorCAC9nyhWKV-oL7FWtQjRKzfr3utbvGMLU6YKVN6cDR4C-GrvVUM1eI0o_-6kovz4VKJKfiOb0c7ttAM_9h4kNOaRxtmTVPTBzBEy6qJUgva0IUlpya8AChRyGncXc6qIJaVOkgUvZm7SpI77Czxz0TrkGezVhA/

我使用jwt.io 网站解码了 JWT。

在它下面有一个地方可以验证我的令牌,但它要求提供公钥或证书:

在 Pod 内我有集群证书 (ca.crt):

我输入了它,但它说它无效。ca.crt 内容:

-----BEGIN CERTIFICATE-----
MIICyDCCAbCgAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
cm5ldGVzMB4XDTE4MDYxMTA4MzkwM1oXDTI4MDYwODA4MzkwM1owFTETMBEGA1UE
AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANLb
SLZuYZhsLD4eazkGglgcusKD02MMO7hYw02OD5M9G4biC/ZFlWjdayLY9OTKwISW
kdyNHrOvW5+UMf1Kha+aJgRfaf96YpDadADsdA/pXKlxA23TzjCmCLgZiO4h+PNO
nxRTftM/o8hoUNhY6t71m2Pn5gE2+bdFuzBLM4rGIaDlFagn1iYnAys6faz4Q3Xn
n8xpp2Fl+kxf2JpCffgdfHd3M7DAHlFqdyBPa8i9byCPknSt/j8dR62Etxl1xOxl
QwtLXmRKOe134g1yxPMrIbh54JkOMuU0dyVV9WriUj04jskH+zIrQnGOztSvES2N
iLqwIM52IC6EwKAcbXUCAwEAAaMjMCEwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB
/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAMfXDTlaoUFFloE/Ce8TwA32d6fD
tSUBX2xs5pMclacGAFtx505e+fpvkowR3qcJcjawov0bPdMyGNZyXyDWpCsvDVnH
850m+z91+mkqqom9vGmPk5MXoz7trzrKvkvl7CDaWyQlX8SV83c3ijyaeH8/crvC
Z3qeOkjekWnS/lKvQ9a+dFFou0ZsN3UGUpUtI12gwjvHYgTOwdpjX+CBp2TEnzd+
5NSkfv2QNom8cQmnEiSnI5JCxv3Vzi6z9uTGC7ok1EQAwwlYLBeyTpcz5PmCNvZ/
rw3eEneIyKxlSLafkNlEdhol2ZXZe+JS2zTzUVWlFbEtG/odGmn29BSN3nU=
-----END CERTIFICATE-----

在哪里可以找到与此服务帐户令牌相关联的公钥或证书? 在 worker 内部有一个位置 /var/lib/kubelet/pki,但密钥和证书与 kubelet 相关:kubelet-client.crt kubelet-client.key kubelet.crt kubelet.key

参考:CA Certificate and JWT tokens on kubernetes

【问题讨论】:

嘿。如果您还没有指定密钥(根据您的问题,我相信您没有)您的 API 服务器的 TLS 私钥将被使用。有关您的问题的信息,您可以在这里查看:kubernetes.io/docs/reference/access-authn-authz/authentication 我没有指定密钥。但是我尝试使用来自 API 服务器的 TLS 私钥 /etc/kubernetes/pki/sa.key 但它没有验证它。 【参考方案1】:

发出服务帐户令牌的不是 kubelet,而是 kube-controller-manager。您可以在主节点文件系统中找到密钥。具体可以在apiserver配置中参数--service-account-signing-key-file(私钥)和--service-account-key-file(公钥)的值中找到路径。

在此处查看这些值的文档:https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/

【讨论】:

为了验证,他们提到我需要使用公钥或证书。我找到了/etc/kubernetes/pki/sa.pub,但是这个还是不行。 刚刚编辑了答案。您可以在 --service-account-key-file 的值中找到公钥。 @IgnacioMillán 问题是如何从吊舱内部“仅验证”等 如何访问--service-account-key-file?换句话说,如果我想确保我收到的服务帐户令牌实际上是有效的,我需要检查签名。我可以单独使用公钥来做到这一点。

以上是关于如何验证 Kubernetes 服务帐户令牌 (JWT)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 REST API 从服务帐户凭据创建访问令牌?

在没有 gcloud 的情况下获取服务帐户身份验证令牌?

对 ML Web 服务的基于 Azure Kubernetes 令牌的身份验证

Kubernetes Nginx-Ingress oauth_proxy如何将信息/令牌传递给服务

Microsoft 帐户 JWT 身份验证令牌如何签名?

使用令牌通过服务帐户登录GKE