2

我来自 AWS 不知道如何使用 gcp 做到这一点。以前我问过一个关于服务帐户的更一般的问题,这是 gke 特有的。

在 AWS 中,我可以创建一个 ECS 服务角色。我将策略附加到该角色以为其提供所需的访问权限。然后我将角色附加到 ECS 服务。所以我可以将多个服务部署到同一个 ECS 集群,并在不使用静态密钥、不传递任何秘密的情况下为它们提供不同的访问权限。

我如何用 gke 做到这一点?如何将 gcp iam 服务帐户附加到 gke 部署/服务等?您可以在部署 yaml 中使用注释来附加服务帐户吗?

我想在同一个 gke 集群上隐式使用不同的服务帐户进行多个部署和服务(不使用密钥)

4

1 回答 1

4

介绍:

一个 Google Cloud Kubernetes 集群由 Compute Engine 虚拟机实例组成。创建集群时,每个 VM 实例都会附加一个默认服务帐户。这些凭证存储在实例元数据中,可以通过使用默认应用程序Client()实例化(Application Default Credentials)或指定凭证位置来访问。

ADC 凭证搜索:

from google.cloud import storage
client = storage.Client()

或仅来自元数据:

from google.auth import compute_engine
from google.cloud import storage
credentials = compute_engine.Credentials()
client = storage.Client(credentials=credentials, project=project)

[更新]

我不想宣传糟糕的安全实践。上述技术应该在安全的生产 Kubernetes 集群上被阻止。

  1. 为 Kubernetes 集群使用最低权限的服务帐户。
  2. 禁用旧的元数据服务器 API 并使用元数据隐藏。
  3. 使用 Pod 安全策略。
  4. 为节点池使用单独的服务帐户。
  5. 使用网络策略限制 pod 之间的流量。

[结束更新]

Google Kubernetes 方法:

Kubernetes 的推荐技术是为集群中运行的每个应用程序创建一个单独的服务帐户,并减少应用于默认服务帐户的范围。分配给每个服务帐户的角色因应用程序所需的权限而异。

服务帐户凭据以 Json 文件的形式下载,然后以Secret. 然后,您将使用密钥(凭据)安装卷。然后,在容器中运行的应用程序将需要在创建 Google 应用程序客户端(例如访问云存储)时加载凭据。

此命令会将下载的凭证文件存储到 Kubernetes 机密卷中,作为名为service-account-credentials. Kubernetes 内部的凭证文件名为key.json. 凭据是从名为 `/secrets/credentials.json 的 Google Cloud 下载的文件中加载的

kubectl create secret generic service-account-credentials --from-file=key.json=/secrets/credentials.json

在您的部署文件中添加以下内容以安装卷。

spec:
  volumes:
  - name: google-cloud-key
    secret:
      secretName: service-account-credentials
...
  containers:
    volumeMounts:
    - name: google-cloud-key
      mountPath: /var/secrets/google

在容器内,凭据是从/var/secrets/google/key.json

蟒蛇示例:

from google.cloud import storage
client = storage.Client.from_service_account_json('/var/secrets/google/key.json')

本文档提供了有关 Kubernetes 服务帐户凭据的分步详细信息。

使用服务帐号向云平台进行身份验证

于 2018-12-03T00:08:45.017 回答