3.4. 将 Amazon STS 配置为 Trusted Artifact Signer 的 OpenID Connect 供应商
您可以将 Amazon 的安全令牌服务(STS)用作红帽受信任的工件签名程序(RHTAS)服务的 OpenID Connect (OIDC)供应商。您可以决定在RHAS 部署期间或稍后配置 Amazon STS。
您可以在同一配置中定义多个不同的 OIDC 供应商。
先决条件
- Red Hat OpenShift Container Platform 版本 4.13 或更高版本。
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 -
安装了
oc
、podman
和aws
二进制文件的工作站。 - 为 OpenShift 环境启用受管 Amazon Web Service (AWS)资源。
创建了一个具有完整权限的 Amazon Identity and Access Management (IAM)用户。这允许访问运行 IAM 操作。
- 为此用户创建访问密钥。
流程
在工作站上打开一个终端,并登录到 OpenShift:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Example
$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注意您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
查找 AWS OIDC 供应商 URL:
Example
$ oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}'
更新 RHTAS 配置。
打开以编辑
Securesign
资源:语法
oc edit Securesign NAME -n NAMESPACE
Example
$ oc edit Securesign securesign-sample -n trusted-artifact-signer
注意您必须使用为 RHTAS 安装创建的项目名称作为命名空间。
在
OIDCIssuers
部分下,使用 AWS STS 客户端标识符、签发者的 URL 添加新子,并将Type
值设置为kubernetes
:Example
... OIDCIssuers: - Issuer: "https://example.s3.us-east-1.aws.com/47bd6cg0vs5nn01mue83fbof94dj4m9c" IssuerURL: "https://example.s3.us-east-1.aws.com/47bd6cg0vs5nn01mue83fbof94dj4m9c" ClientID: "trusted-artifact-signer" Type: kubernetes ...
- 保存更改,退出编辑器。几秒钟后,操作员会自动重新配置 RHTAS 软件堆栈。
输入您的访问密钥、secret 密钥、默认区域和输出格式来配置 AWS 命令行工具:
Example
$ aws configure
设置以下环境变量:
Example
$ export account_id=$(aws sts get-caller-identity --query "Account" --output text) $ export oidc_provider="$(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}' | cut -d '/' -f3-)" $ export role_name=rhtas-sts $ export namespace=rhtas-sts $ export service_account=cosign-sts
创建与新创建的 IAM 角色关联的信任策略:
Example
$ cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::${account_id}:oidc-provider/${oidc_provider}" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "${oidc_provider}:aud": "trusted-artifact-signer" } } } ] } EOF
使用信任策略为 RHTAS 服务创建一个新的 IAM 角色:
Example
$ aws iam create-role --role-name rhtas-sts --assume-role-policy-document file://trust-relationship.json --description "Red Hat Trusted Artifact Signer STS Role"
在启用了 STS 的 OpenShift 集群中,创建一个新项目命名空间:
语法
oc new-project NAMESPACE
Example
$ oc new-project rhtas-sts
为假设 IAM 角色创建服务帐户,并在 OpenShift 项目命名空间中运行工作负载。
创建服务帐户清单:
Example
$ cat >service_account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: $service_account namespace: $namespace annotations: eks.amazonaws.com/role-arn: "arn:aws:iam::${account_id}:role/${role_name}" # optional: Defaults to "sts.amazonaws.com" if not set eks.amazonaws.com/audience: "trusted-artifact-signer" # optional: When "true", adds AWS_STS_REGIONAL_ENDPOINTS env var to containers eks.amazonaws.com/sts-regional-endpoints: "true" # optional: Defaults to 86400 for expirationSeconds if not set eks.amazonaws.com/token-expiration: "86400" EOF
将服务帐户清单应用到 OpenShift:
Example
$ oc apply -f service_account.yaml
创建新的部署工作负载,以便在镜像 registry 中签名容器镜像。
创建部署清单:
Example
$ cat >deployment.yaml <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: cosign-sts namespace: ${namespace} spec: selector: matchLabels: app: cosign-sts template: metadata: labels: app: cosign-sts spec: securityContext: runAsNonRoot: true serviceAccountName: cosign-sts containers: - args: - -c - env; cosign initialize --mirror=\$COSIGN_MIRROR --root=\$COSIGN_ROOT; while true; do sleep 86400; done command: - /bin/sh name: cosign image: registry.redhat.io/rhtas-tech-preview/cosign-rhel9@sha256:f4c2cec3fc1e24bbe094b511f6fe2fe3c6fa972da0edacaf6ac5672f06253a3e pullPolicy: IfNotPresent env: - name: AWS_ROLE_SESSION_NAME value: signer-identity-session - name: AWS_REGION value: us-east-1 - name: OPENSHIFT_APPS_SUBDOMAIN value: $(oc get cm -n openshift-config-managed console-public -o go-template="{{ .data.consoleURL }}" | sed 's@https://@@; s/^[^.]*\.//') - name: OIDC_AUTHENTICATION_REALM value: "trusted-artifact-signer" - name: COSIGN_FULCIO_URL value: $(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) - name: COSIGN_OIDC_ISSUER value: $(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}') - name: COSIGN_CERTIFICATE_OIDC_ISSUER value: $(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}') - name: COSIGN_REKOR_URL value: $(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) - name: COSIGN_MIRROR value: $(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) - name: COSIGN_ROOT value: "$(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer)/root.json" - name: COSIGN_YES value: "true" securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: runAsNonRoot: true serviceAccount: ${service_account} serviceAccountName: ${service_account} terminationGracePeriodSeconds: 30 EOF
将部署清单应用到 OpenShift:
Example
$ oc apply -f deployment.yaml
创建测试容器镜像以签名。
创建一个空容器镜像:
Example
$ echo "FROM scratch" > ./tmp.Dockerfile $ podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
将空容器镜像推送到
ttl.sh
临时 registry:Example
$ podman push ttl.sh/rhtas/test-image:1h
删除临时 Docker 文件:
Example
$ rm ./tmp.Dockerfile
通过签名和验证测试容器镜像来验证配置。
在正在运行的 pod 中打开远程 shell 会话:
语法
oc rsh -n NAMESPACE deployment/cosign-sts env IMAGE=IMAGE_NAME:TAG /bin/sh
Example
$ oc rsh -n rhtas-sts deployment/cosign-sts env IMAGE=ttl.sh/rhtas/test-image:1h /bin/sh
为容器镜像签名:
Example
$ cosign sign -y --identity-token=$(cat $AWS_WEB_IDENTITY_TOKEN_FILE) ttl.sh/rhtas/test-image:1h
验证签名的容器镜像:
Example
$ cosign verify --certificate-identity=https://kubernetes.io/namespaces/$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)/serviceaccounts/cosign-sts --certificate-oidc-issuer=$COSIGN_CERTIFICATE_OIDC_ISSUER ttl.sh/rhtas/test-image:1h