403 请求在容器内访问 GCP 上的 Secret 时出现身份验证不足问题

Posted

技术标签:

【中文标题】403 请求在容器内访问 GCP 上的 Secret 时出现身份验证不足问题【英文标题】:403 Request had insufficient authentication issues while accessing Secrets on GCP within a container 【发布时间】:2021-08-26 18:09:13 【问题描述】:

我正在尝试访问 GCP Secrets 上的密钥,但出现以下错误:

in get_total_results "api_key": get_credentials("somekey").get("somekey within key"), File
 "/helper.py", line 153, in get_credentials response = client.access_secret_version(request="name": resource_name)
 File "/usr/local/lib/python3.8/site-packages/google/cloud/secretmanager_v1/services/secret_manager_service/client.py", 
line 1136, in access_secret_version response = rpc(request, retry=retry, timeout=timeout, metadata=metadata,) 
File "/usr/local/lib/python3.8/site-packages/google/api_core/gapic_v1/method.py", line 145, in __call__ 
return wrapped_func(*args, **kwargs) File "/usr/local/lib/python3.8/site-packages/google/api_core/retry.py", line 285, in retry_wrapped_func return retry_target( File "/usr/local/lib/python3.8/site-packages/google/api_core/retry.py", 
line 188, in retry_target return target() File "/usr/local/lib/python3.8/site-packages/google/api_core/grpc_helpers.py", 
line 69, in error_remapped_callable six.raise_from(exceptions.from_grpc_error(exc), exc) File "<string>", 
line 3, in raise_from google.api_core.exceptions.PermissionDenied: 
403 Request had insufficient authentication scopes.

代码相当简单:-

def get_credentials(secret_id):
    project_id = os.environ.get("PROJECT_ID")
    resource_name = f"projects/project_id/secrets/secret_id/versions/1"

    client = secretmanager.SecretManagerServiceClient()
    response = client.access_secret_version(request="name": resource_name)

    secret_string = response.payload.data.decode("UTF-8")
    secret_dict = json.loads(secret_string)
    return secret_dict

所以,我有一个云功能,它使用触发器部署,并使用具有所有者角色的服务帐户。

云函数触发一个 Kubernetes 工作作业并创建一个容器,该容器在容器内下载一个 repo 并执行它。

Dockerfile 是:

FROM gcr.io/project/repo:latest
FROM python:3.8-slim-buster
COPY . /some_dir
WORKDIR /some_dir
COPY --from=0 ./repo /a_repo
RUN pip install -r requirements.txt & pip install -r a_repo/requirements.txt 
ENTRYPOINT ["python3" , "main.py"]

【问题讨论】:

我猜当容器中的代码尝试访问秘密版本而不是云函数中的代码时会发生错误 - 对吗?如果是 - 请检查运行容器代码的服务帐户吗?它的 IAM 角色,并检查秘密方面的权限,好吗?而且,另外,项目id,所以代码不会尝试访问其他项目中的秘密版本,好吗? 是的,是容器内的代码试图访问容器。我不确定秘密版本应该具有哪些所有权限才能访问。 cloud.google.com/secret-manager/docs/access-control 资源最少 => 秘密... “容器内的代码”正在某个服务帐户“下”执行。该服务帐户应具有相关权限。如果云功能不直接访问机密,则云功能服务帐户并不重要。 您是否尝试过使用 secretmanager.viewer 或 secretmanager.secretAccessor 角色?丢弃或不丢弃与角色相关的问题。 【参考方案1】:

GCE 实例可能没有正确的身份验证范围。

发件人:https://developers.google.com/identity/protocols/oauth2/scopes#secretmanager

https://www.googleapis.com/auth/cloud-platform 是必需的范围。

创建 GCE 实例时,您需要选择为实例提供正确范围以调用云 API 的选项:

【讨论】:

以上是关于403 请求在容器内访问 GCP 上的 Secret 时出现身份验证不足问题的主要内容,如果未能解决你的问题,请参考以下文章

GCP 云上的长时间运行作业

如何对 GCP Cloud Run 上的联合 GraphQL 服务进行身份验证?

HTTP 错误 403.9 - 禁止访问:连接的用户过多

不使用 gcloud 实用程序从 docker 容器访问 GCP 云存储桶

GCP:403来电者没有权限

GCP API Gateway JWT 总是返回 403