使用服务账户进行GCR扫描

Google GCR - 使用GCP服务账户进行身份验证/扫描

最佳实践是不要依赖用户归属的账户进行集成。 GCP支持使用服务账户访问GCR。 以下是为GCR启用服务账户并使用它从SUSE® Security触发储存库扫描的步骤。

从SUSE® Security开始,在这里首先设置一个新的注册表:

GCR

通过选择Google容器注册表作为储存库类型,此面板已定制以接受使用您的GCR所需的输入。

  1. 名称 - 在这里您可以为此特定的储存库条目命名。这仅仅是为了在SUSE® Security界面中稍后识别它。

  2. 注册表 - 这是您需要确保从GCR实例收集正确数据的第一处。虽然 https://gcr.io的示例是最常见的,但我们需要确保它准确反映您在GCP中设置的GCR。例如,它可能是 https://us.gcr.io。我们将在下一部分检查它。

  3. JSON密钥 - 显而易见,这将是一个JSON格式的密钥。而且,正如您可能已经注意到的模式,我们将通过GCP找到它。

  4. 过滤器 - 请注意,您可能需要在这里用实际的储存库名称替换任何过滤器。同样,这在GCR界面中。

GCR

现在让我们前往GCP中的GCR屏幕。我们所需的大部分信息就在这个页面上。

  1. 请查看主机名下的"`gcr.io`"?这就是在SUSE® Security界面中属于项目#2,注册表的内容。(不要忘记 https://部分)

  2. 储存库的ID实际上在顶级项目下。这就是您将在#3中使用的内容,过滤器。请参见下面的env-demo示例。

GCR

JSON密钥引导我们探索另一个非常重要的步骤,这将带我们进入GCP的IAM和管理员部分,在那里我们将创建(或确认设置)服务账户。请看下面:

GCR

一旦您输入了创建服务账户第一步所需的数据,您需要点击"`CREATE`"按钮,以使第二步能够接受输入。

GCR

确保选择基本-→查看者作为访问权限。如果您有现有的服务账户,请确保访问权限设置为这种方式。(提示:即使是看起来更强大的访问权限似乎也不允许适当的访问。请勿跳过此步骤。

完成此步骤后,您可以轻松通过第3步并继续创建服务账户。

如果您没有立即进入新服务账户的信息面板,请确保在服务账户列表中前往该面板。请参见下面的图5。

GCR

单击"`ADD KEY`" -→ “Create New Key”

GCR

正如您已经得出的结论,JSON在这里是首选。选择"`CREATE`"将导致您可以在浏览器中下载的文件。此文件的内容应粘贴到SUSE® Security中的第3个 JSON 密钥字段中;请参见图 1。

在您过于兴奋之前,还有一件事需要确保。为了使SUSE® Security中的扫描仪能够使用 API 扫描和保护您的图像,必须在您的 GCP 账户中启用该 API。您可以通过命令行启用它,方法是

gcloud services enable artifactregistry.googleapis.com

或者您可以使用 GCP GUI。前往 “API Library”,搜索 “Artifact Registry API”,并确保它在您的项目中已开启。请参见图 7。

GCR

您应该已经就绪了!请参见下面的图 8,了解如何使用我们示例中的数据配置正确的注册表:

GCR

使用 REST API 获取访问令牌

可以使用 SUSE® Security REST API 通过服务账户进行身份验证。下面的示例使用 gcloud 获取访问令牌。 用户名是 “oauth2accesstoken”。

gcloud auth print-access-token
ya29.a0AfH6SMAvyZ2zkD3MZD_K8Lqr7qkIsRkGNqhAGthJ_A7lp8OGRe7xh5KmuQY-VJfqu83C9e1gi7A_m1InNm8QIoTGf9WHXnOeAr1gT_O6b6K667NUz1_YDunjdW09jt0XvcBGQaxjJ3c4aHlxdehBFiE_9PMk13JDt_T6f0_6vzS7

在 SUSE® Security 储存库扫描中使用访问令牌

下面的示例脚本结合访问令牌触发 GCR 储存库扫描。

_curCase_=`echo $0 | awk -F"." '{print $(NF-1)}' | awk -F"/" '{print $NF}'`
_DESC_="able to scan ubuntu:16.04 image"
_ERRCODE_=0
_ERRTYPE_=1
_RESULT_="pass"

# please remember to specify the controller ip address here
_controllerIP_="10.1.24.252"
_controllerRESTAPIPort_="10443"
_neuvectorUsername_="admin"
_neuvectorPassword_="admin"
_registryURL_="https://us.gcr.io/"

# registry urls could also be gcr.io, eu.gcr.io, asia.gcr.io etc
_registryUsername_="oauth2accesstoken"
_registryPassword_=$(gcloud auth print-access-token)
_repository_="bionic-union-271100/alpine"
_tag_="latest"

curl -k -H "Content-Type: application/json" -d '{"password": {"username": "'$_neuvectorUsername_'", "password": "'$_neuvectorPassword_'"}}' "https://$_controllerIP_:$_controllerRESTAPIPort_/v1/auth" > /dev/null 2>&1 > token.json
_TOKEN_=`cat token.json | jq -r '.token.token'`
echo `date +%Y%m%d_%H%M%S` scanning an image ...
curl -k -H "Content-Type: application/json" -H "X-Auth-Token: $_TOKEN_" -d '{"request": {"registry": "'$_registryURL_'", "username": "'$_registryUsername_'", "password": "'$_registryPassword_'", "repository": "'$_repository_'", "tag": "'$_tag_'"}}' "https://$_controllerIP_:$_controllerRESTAPIPort_/v1/scan/repository" > /dev/null 2>&1 > scan_repository.json

while [ `wc -c < scan_repository.json` = "0" ]; do
 echo `date +%Y%m%d_%H%M%S` scanning is still in progress ...
    sleep 5
    curl -k -H "Content-Type: application/json" -H "X-Auth-Token: $_TOKEN_" -d '{"request": {"registry": "'$_registryURL_'", "username": "'$_registryUsername_'", "password": "'$_registryPassword_'", "repository": "'$_repository_'", "tag": "'$_tag_'"}}' "https://$_controllerIP_:$_controllerRESTAPIPort_/v1/scan/repository" > /dev/null 2>&1 > scan_repository.json
done

echo `date +%Y%m%d_%H%M%S` log out
curl -k -X 'DELETE' -H "Content-Type: application/json" -H "X-Auth-Token: $_TOKEN_" "https://$_controllerIP_:$_controllerRESTAPIPort_/v1/auth" > /dev/null 2>&1
cat scan_repository.json | jq .
rm *.json
echo `date +%Y%m%d_%H%M%S` [$_curCase_] $_DESC_: $_RESULT_-$_ERRCODE_