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 コンソールへのアクセス。
  • ocpodmanaws バイナリーがインストールされたワークステーション。
  • OpenShift 環境用に管理対象の Amazon Web Service (AWS) リソースを有効にする。
  • 完全な権限を持つ 作成された Amazon アイデンティティーおよびアクセス管理 (IAM) ユーザー。これにより、IAM 操作の実行が可能になります。

    • このユーザーのアクセスキーを作成している。

手順

  1. ワークステーションでターミナルを開き、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 をクリックしてコマンドを表示します。

  2. AWS OIDC プロバイダー URL を検索します。

    $ oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}'

  3. RHTAS の設定を更新します。

    1. Securesign リソースを開いて編集します。

      構文

      oc edit Securesign NAME -n NAMESPACE

      $ oc edit Securesign securesign-sample -n trusted-artifact-signer

      注記

      RHTAS インストール用に作成されたプロジェクト名を namespace として使用する必要があります。

    2. 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
      ...

    3. 変更を保存し、エディターを終了します。数秒後、Operator は RHTAS ソフトウェアスタックを自動的に再設定します。
  4. アクセスキー、シークレットキー、デフォルトのリージョン、および出力形式を入力して、AWS コマンドラインツールを設定します。

    $ aws configure

  5. 以下の環境変数を設定します。

    $ 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

  6. 新しく作成された 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

  7. 信頼ポリシーを使用して、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"

  8. STS が有効になっている OpenShift クラスターで、新しいプロジェクト namespace を作成します。

    構文

    oc new-project NAMESPACE

    $ oc new-project rhtas-sts

  9. IAM ロールを一時的に設定して、OpenShift プロジェクトの namespace でワークロードを実行するサービスアカウントを作成します。

    1. サービスアカウントマニフェストを作成します。

      $ 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

    2. サービスアカウントマニフェストを OpenShift に適用します。

      $ oc apply -f service_account.yaml

  10. イメージレジストリーに、コンテナーイメージに署名するデプロイメントワークロードを新たに作成します。

    1. デプロイメントマニフェストを作成します。

      $ 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

    2. デプロイメントマニフェストを OpenShift に適用します。

      $ oc apply -f deployment.yaml

  11. 署名するテストコンテナーイメージを作成します。

    1. 空のコンテナーイメージを作成します。

      $ echo "FROM scratch" > ./tmp.Dockerfile
      $ podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h

    2. 空のコンテナーイメージを ttl.sh 一時レジストリーにプッシュします。

      $ podman push ttl.sh/rhtas/test-image:1h

    3. 一時的な Docker ファイルを削除します。

      $ rm ./tmp.Dockerfile

  12. テストコンテナーイメージに署名して検証することで、設定を検証します。

    1. 実行中の 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

    2. コンテナーイメージに署名します。

      $ cosign sign -y --identity-token=$(cat $AWS_WEB_IDENTITY_TOKEN_FILE) ttl.sh/rhtas/test-image:1h

    3. 署名済みコンテナーイメージを確認します。

      $ 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

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.