3.4. Amazon STS を Trusted Artifact Signer の OpenID Connect プロバイダーとして設定する手順
Amazon の Security Token Service (STS) を、Red Hat Trusted Artifact Signer (RHTAS) サービスの OpenID Connect (OIDC) プロバイダーとして使用できます。RHTAS のデプロイメント時に、または後で Amazon STS を設定できます。
同じ設定で複数の異なる OIDC プロバイダーを定義できます。
前提条件
- Red Hat OpenShift Container Platform バージョン 4.13 以降
-
cluster-admin
ロールでの OpenShift Web コンソールへのアクセス。 -
oc
、podman
、aws
バイナリーがインストールされたワークステーション。 - OpenShift 環境用に管理対象の Amazon Web Service (AWS) リソースを有効にする。
完全な権限を持つ 作成された Amazon アイデンティティーおよびアクセス管理 (IAM) ユーザー。これにより、IAM 操作の実行が可能になります。
- このユーザーのアクセスキーを作成している。
手順
ワークステーションでターミナルを開き、OpenShift にログインします。
構文
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
例
$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注記OpenShift Web コンソールからコマンドラインで使用するログイントークンと URL を確認できます。OpenShift Web コンソールにログインします。ユーザー名をクリックし、Copy login command をクリックします。入力を求められた場合はユーザー名とパスワードをもう一度入力し、Display Token をクリックしてコマンドを表示します。
AWS OIDC プロバイダー URL を検索します。
例
$ oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}'
RHTAS の設定を更新します。
Securesign
リソースを開いて編集します。構文
oc edit Securesign NAME -n NAMESPACE
例
$ oc edit Securesign securesign-sample -n trusted-artifact-signer
注記RHTAS インストール用に作成されたプロジェクト名を namespace として使用する必要があります。
OIDCIssuers
セクションで、AWS STS クライアント識別子、発行者の URL を含む新しいサブセクションを追加し、Type
の値をkubernetes
に設定します。例
... 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 ...
- 変更を保存し、エディターを終了します。数秒後、Operator は RHTAS ソフトウェアスタックを自動的に再設定します。
アクセスキー、シークレットキー、デフォルトのリージョン、および出力形式を入力して、AWS コマンドラインツールを設定します。
例
$ aws configure
以下の環境変数を設定します。
例
$ 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 ロールに関連付けられる信頼ポリシーを作成します。
例
$ 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 ロールを作成します。
例
$ 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 クラスターで、新しいプロジェクト namespace を作成します。
構文
oc new-project NAMESPACE
例
$ oc new-project rhtas-sts
IAM ロールを一時的に設定して、OpenShift プロジェクトの namespace でワークロードを実行するサービスアカウントを作成します。
サービスアカウントマニフェストを作成します。
例
$ 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 に適用します。
例
$ oc apply -f service_account.yaml
イメージレジストリーに、コンテナーイメージに署名するデプロイメントワークロードを新たに作成します。
デプロイメントマニフェストを作成します。
例
$ 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 に適用します。
例
$ oc apply -f deployment.yaml
署名するテストコンテナーイメージを作成します。
空のコンテナーイメージを作成します。
例
$ echo "FROM scratch" > ./tmp.Dockerfile $ podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
空のコンテナーイメージを
ttl.sh
一時レジストリーにプッシュします。例
$ podman push ttl.sh/rhtas/test-image:1h
一時的な Docker ファイルを削除します。
例
$ rm ./tmp.Dockerfile
テストコンテナーイメージに署名して検証することで、設定を検証します。
実行中の Pod 内でリモートシェルセッションを開きます。
構文
oc rsh -n NAMESPACE deployment/cosign-sts env IMAGE=IMAGE_NAME:TAG /bin/sh
例
$ oc rsh -n rhtas-sts deployment/cosign-sts env IMAGE=ttl.sh/rhtas/test-image:1h /bin/sh
コンテナーイメージに署名します。
例
$ cosign sign -y --identity-token=$(cat $AWS_WEB_IDENTITY_TOKEN_FILE) ttl.sh/rhtas/test-image:1h
署名済みコンテナーイメージを確認します。
例
$ 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