我们使用Google Cloud中的Cloud Endpoints在部署到Google Kubernetes Engine的应用程序中进行服务到服务的身份验证。
在我们所有应用程序的前面都有一个可扩展服务代理,其中一个Swagger(OpenApi)2.0 YAML描述符指定了哪些端点可以被其他服务访问。
每个服务都有其自己的服务帐户,可以很容易地创建必要的安全性定义:
securityDefinitions:
service-foo:
authorizationUrl: ""
flow: "implicit"
type: "oauth2"
x-google-issuer: "service-foo@my-gcloud-project.iam.gserviceaccount.com"
x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/service-foo-my-gcloud-project.iam.gserviceaccount.com"
这对于GKE中的服务到服务通信非常有效。
但是在开发过程中,有时我们希望从我们的开发机器向这些服务发送请求。通过此设置,我们需要访问原始服务帐户密钥以生成JWT令牌,这很不方便,而且引发了安全隐患。
如果我们可以创建一个安全定义,开发人员可以使用它而不是使用服务帐户,而是使用他们自己的Google帐户来访问服务,那将非常好。
我尝试使用gcloud
CLI通过以下命令创建JWT令牌:
$ gcloud auth print-identity-token
这会打印一个有效的JWT令牌,“受众群体”为32555940559.apps.googleusercontent.com
,令牌中有一个email
带有我自己的Google帐户电子邮件地址的字段。
我尝试为此创建安全定义,然后尝试了以下操作。
my-dev-account:
authorizationUrl: ""
flow: "implicit"
type: "oauth2"
x-google-issuer: "https://accounts.google.com"
x-google-jwks_uri: "https://www.googleapis.com/oauth2/v3/certs"
x-google-audiences: "32555940559.apps.googleusercontent.com"
从技术上讲,这是可行的,ESP允许请求使用产生的JWT令牌进行处理gcloud auth print-identity-token
。但是问题在于,这不会以任何方式限制对我自己帐户的访问,因为32555940559.apps.googleusercontent.com
GCloud SDK本身的客户端ID是,因此拥有Google帐户的任何人都可以访问。
是否可以在安全性定义中指定email
应将字段限制为某个值?
还是我完全走错了路,但是还有另一种方法可以允许开发人员Google帐户使用ESP吗?
在身份识别代理(IAP)后面的应用程序引擎标准中提供小型服务。你可以在那里限制谁可以访问它。
并且此服务的目的是将相同的请求复制到标头中具有正确身份验证令牌的指定端点。
GET /home?next=https://your-kubernetes-endpoint/resource
如果将新成员添加到团队,则可以通过IAP授予访问权限。
如果添加新端点,则更改查询参数的值next
。