管理ガイド


Red Hat Trusted Artifact Signer 1

Trusted Artifact Signer サービスの一般管理

Red Hat Trusted Documentation Team

概要

管理ガイドでは、Red Hat プラットフォームで実行される Trusted Artifact Signer サービスを運用する方法についてシステム管理者にガイダンスを提供します。

はじめに

Red Hat Trusted Artifact Signer 管理ガイドへようこそ。

このガイドは、Red Hat プラットフォーム上で実行される Red Hat Trusted Artifact Signer (RHTAS) サービスのメンテナンスルーチンとタスクに役立ちます。インストールプラットフォーム別に整理されたコンテンツ:

Trusted Artifact Signer サービスのデプロイに関する情報は デプロイメントガイド に記載されています。

第1章 Red Hat OpenShift Container Platform

1.1. 署名データの保護

システム管理者にとって、ハードウェア障害や誤ったデータ削除によるデータ損失が発生した場合、ソフトウェアサプライチェーンの署名データを保護することは非常に重要です。

OpenShift API Data Protection (OADP) 製品は、Red Hat OpenShift Container Platform 上で実行されるアプリケーションにデータ保護を提供します。OADP 製品を使用することで、ソフトウェア開発者はできるだけ早くコードの署名と検証を再開できるようになります。OADP Operator をインストールして設定したら、Red Hat Trusted Artifact Signer (RHTAS) データのバックアップと復元を開始できます。

1.1.1. OADP Operator のインストールと設定

OpenShift API Data Protection (OADP) Operator を使用すると、OpenShift アプリケーションリソースと内部コンテナーイメージをバックアップできるようになります。OADP Operator を使用して、Trusted Artifact Signer データをバックアップおよび復元できます。

重要

この手順では、Amazon Web Services (AWS) Simple Storage Service (S3) を使用してバケットを作成し、OADP Operator を設定する方法を説明します。AWS の代わりに、Red Hat OpenShift Data Foundation など、サポートされている別の S3 互換オブジェクトストレージプラットフォーム を使用することもできます。

前提条件

  • Red Hat OpenShift Container Platform 4.15 以降。
  • cluster-admin ロールでの OpenShift Web コンソールへのアクセス。
  • S3 互換のバケットを作成する機能。
  • oc および aws バイナリーがインストールされたワークステーション。

手順

  1. ワークステーションでターミナルを開き、OpenShift にログインします。

    構文

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注記

    OpenShift Web コンソールからコマンドラインで使用するログイントークンと URL を確認できます。OpenShift Web コンソールにログインします。ユーザー名をクリックし、Copy login command をクリックします。入力を求められた場合はユーザー名とパスワードをもう一度入力し、Display Token をクリックしてコマンドを表示します。

  2. 新しいバケットを作成します。

    構文

    export BUCKET=NEW_BUCKET_NAME
    export REGION=AWS_REGION_ID
    export USER=OADP_USER_NAME
    
    aws s3api create-bucket \
    --bucket $BUCKET \
    --region $REGION \
    --create-bucket-configuration LocationConstraint=$REGION
    Copy to Clipboard Toggle word wrap

    export BUCKET=example-bucket-name
    export REGION=us-east-1
    export USER=velero
    
    aws s3api create-bucket \
    --bucket $BUCKET \
    --region $REGION \
    --create-bucket-configuration LocationConstraint=$REGION
    Copy to Clipboard Toggle word wrap

  3. 新しいユーザーを作成します。

    aws iam create-user --user-name $USER
    Copy to Clipboard Toggle word wrap

  4. 新しいポリシーを作成します。

    cat > velero-policy.json <<EOF
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:DescribeVolumes",
                    "ec2:DescribeSnapshots",
                    "ec2:CreateTags",
                    "ec2:CreateVolume",
                    "ec2:CreateSnapshot",
                    "ec2:DeleteSnapshot"
                ],
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:DeleteObject",
                    "s3:PutObject",
                    "s3:AbortMultipartUpload",
                    "s3:ListMultipartUploadParts"
                ],
                "Resource": [
                    "arn:aws:s3:::${BUCKET}/*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation",
                    "s3:ListBucketMultipartUploads"
                ],
                "Resource": [
                    "arn:aws:s3:::${BUCKET}"
                ]
            }
        ]
    }
    EOF
    Copy to Clipboard Toggle word wrap

  5. このポリシーを新しいユーザーに関連付けます。

    aws iam put-user-policy \
    --user-name $USER \
    --policy-name velero \
    --policy-document file://velero-policy.json
    Copy to Clipboard Toggle word wrap

  6. アクセスキーを作成します。

    aws iam create-access-key --user-name $USER --output=json | jq -r '.AccessKey | [ "export AWS_ACCESS_KEY_ID=" + .AccessKeyId, "export AWS_SECRET_ACCESS_KEY=" + .SecretAccessKey ] | join("\n")'
    Copy to Clipboard Toggle word wrap

  7. AWS 秘密鍵情報を含む認証情報ファイルを作成します。

    構文

    cat << EOF > ./credentials-velero
    [default]
    aws_access_key_id=$AWS_ACCESS_KEY_ID
    aws_secret_access_key=$AWS_SECRET_ACCESS_KEY
    EOF
    Copy to Clipboard Toggle word wrap

  8. cluster-admin ロールを持つユーザーで OpenShift Web コンソールにログインします。
  9. Administrator パースペクティブで、Operators ナビゲーションメニューを展開し、OperatorHub をクリックします。
  10. 検索フィールドに oadp と入力し、Red Hat が提供する OADP Operator タイルをクリックします。
  11. Install ボタンをクリックして、Operator の詳細を表示します。
  12. デフォルト値を受け入れ、Install Operator ページで Install をクリックし、インストールが完了するまで待ちます。
  13. Operator のインストールが完了したら、ワークステーションのターミナルから、AWS 認証情報を使用して OpenShift のシークレットリソースを作成します。

    oc create secret generic cloud-credentials -n openshift-adp --from-file cloud=credentials-velero
    Copy to Clipboard Toggle word wrap

  14. OpenShift Web コンソールから、View Operator ボタンをクリックします。
  15. DataProtectionApplication (DPA) タイルで Create instance をクリックします。
  16. Create DataProtectionApplication ページで、YAML view を選択します。
  17. リソースファイルで次の値を編集します。

    1. metadata セクションで、velero-samplevelero に置き換えます。
    2. spec.configuration.nodeAgent セクションで、restickopia に置き換えます。
    3. spec.configuration.velero セクションの下に、resourceTimeout: 10m を追加します。
    4. spec.configuration.velero.defaultPlugins セクションの下に - csi を追加します。
    5. spec.snapshotLocations セクションで、us-west-2 の値を AWS リージョンの値に置き換えます。
    6. spec.backupLocations セクションで、us-east-1 の値を AWS リージョンの値に置き換えます。
    7. spec.backupLocations.objectStorage セクションで、my-bucket-name をバケット名に置き換えます。別の接頭辞を使用する場合は、velero をバケット接頭辞名に置き換えます。
  18. Create ボタンをクリックします。

1.1.2. Trusted Artifact Signer データのバックアップ

OpenShift API Data Protection (OADP) Operator をインストールし、インスタンスをデプロイすると、ボリュームスナップショットリソースと、Red Hat Trusted Artifact Signer データをバックアップするためのバックアップリソースを作成できます。

前提条件

  • Red Hat OpenShift Container Platform 4.15 以降。
  • cluster-admin ロールでの OpenShift Web コンソールへのアクセス。
  • OADP Operator のインストール
  • oc バイナリーがインストールされているワークステーション。

手順

  1. ワークステーションでターミナルを開き、OpenShift にログインします。

    構文

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注記

    OpenShift Web コンソールからコマンドラインで使用するログイントークンと URL を確認できます。OpenShift Web コンソールにログインします。ユーザー名をクリックし、Copy login command をクリックします。入力を求められた場合はユーザー名とパスワードをもう一度入力し、Display Token をクリックしてコマンドを表示します。

  2. VolumeSnapshotClass リソースを見つけて編集します。

    oc get VolumeSnapshotClass -n openshift-adp
    oc edit VolumeSnapshotClass csi-aws-vsc -n openshift-adp
    Copy to Clipboard Toggle word wrap

  3. リソースファイル内の次の値を更新します。

    1. metadata.labels セクションの下に、velero.io/csi-volumesnapshot-class: "true" ラベルを追加します。
    2. 変更を保存し、エディターを終了します。
  4. Backup リソースを作成します。

    cat <<EOF | oc apply -f -
    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: rhtas-backup
      labels:
        velero.io/storage-location: velero-1
      namespace: openshift-adp
    spec:
      schedule: 0 7 * * *
      hooks: {}
      includedNamespaces:
      - trusted-artifact-signer
      includedResources: []
      excludedResources: []
      snapshotMoveData: true
      storageLocation: velero-1
      ttl: 720h0m0s
    EOF
    Copy to Clipboard Toggle word wrap

    このバックアップを実行するための Cron スケジュールを有効にするには、スケジュールプロパティーを追加します。この例では、このバックアップリソースは毎日午前 7 時に実行されます。

    デフォルトでは、すべてのリソースは、trusted-artifact-signer 名前空間内でバックアップされます。includeResources プロパティーまたは excludedResources プロパティーを使用して、含めるリソースまたは除外するリソースを指定できます。

    重要

    バックアップターゲットのストレージクラスによっては、バックアップを成功させるために永続ボリュームを継続的に使用することはできません。

1.1.3. Trusted Artifact Signer データの復元

Red Hat Trusted Artifact Signer (RHTAS) および OpenShift API Data Protection (OADP) Operator がインストールされ、RHTAS 名前空間のバックアップリソースがあれば、データを OpenShift クラスターに復元できます。

前提条件

  • Red Hat OpenShift Container Platform バージョン 4.15 以降。
  • cluster-admin ロールでの OpenShift Web コンソールへのアクセス。
  • RHTAS Operator のインストール
  • OADP Operator のインストール
  • trusted-artifact-signer 名前空間構造のバックアップリソース。
  • oc バイナリーがインストールされているワークステーション。

手順

  1. RHTAS Operator を無効にします。

    oc scale deploy rhtas-operator-controller-manager --replicas=0 -n openshift-operators
    Copy to Clipboard Toggle word wrap

  2. Restore リソースを作成します。

    cat <<EOF | oc apply -f -
    apiVersion: velero.io/v1
    kind: Restore
    metadata:
      name: rhtas-restore
      namespace: openshift-adp
    spec:
      backupName: rhtas-backup
      includedResources: []
      restoreStatus:
        includedResources:
          - securesign.rhtas.redhat.com
          - trillian.rhtas.redhat.com
          - ctlog.rhtas.redhat.com
          - fulcio.rhtas.redhat.com
          - rekor.rhtas.redhat.com
          - tuf.rhtas.redhat.com
          - timestampauthority.rhtas.redhat.com
      excludedResources:
      - pod
      - deployment
      - nodes
      - route
      - service
      - replicaset
      - events
      - cronjob
      - events.events.k8s.io
      - backups.velero.io
      - restores.velero.io
      - resticrepositories.velero.io
      - pods
      - deployments
      restorePVs: true
      existingResourcePolicy: update
    EOF
    Copy to Clipboard Toggle word wrap

  3. RHTAS データを別の OpenShift クラスターに復元する場合は、次の手順を実行します。

    1. Trillian データベースのシークレットを削除します。

      oc delete secret securesign-sample-trillian-db-tls
      oc delete pod trillian-db-xxx
      Copy to Clipboard Toggle word wrap

      注記

      RHTAS Operator はシークレットを再作成し、Pod を再起動します。

    2. restoreOwnerReferences.sh スクリプトを実行します。
  4. RHTAS Operator を有効にします。

    oc scale deploy rhtas-operator-controller-manager --replicas=1 -n openshift-operators
    Copy to Clipboard Toggle word wrap

    重要

    復元を開始した後すぐに RHTAS Operator を起動すると、永続ボリュームの要求が確実に行われます。

1.2. The Update Framework

システム管理者として、Red Hat Trusted Artifact Signer (RHTAS) 向けの The Update Framework (TUF) の Red Hat の実装を理解することは、開発者向けのセキュアなコーディング環境を維持する上で重要です。コードベースでのミックスアンドマッチ攻撃を防ぐために、TUF のルートメタデータと非ルートメタデータを定期的に更新できます。TUF メタデータを更新することで、クライアントは古くなったファイルや改ざんされたファイルを検出して拒否できるようになります。

1.2.1. Trusted Artifact Signer による The Update Framework の実装

Red Hat Trusted Artifact Signer (RHTAS) バージョン 1.1 以降では、RHTAS サービスで使用される公開鍵と証明書を保存するための信頼されたルートとして The Update Framework (TUF) を実装しました。The Update Framework は、ソフトウェア更新システムを保護するための洗練されたフレームワークであり、提供されたアーティファクトを保護するのに最適です。The Update Framework は、RHTAS サービスを信頼されたルートターゲットとして参照します。信頼できるターゲットは 4 つで、RHTAS サービスごとに 1 つずつあります (Fulcio、Certificate Transparency (CT) ログ、Rekor、および Timestamp Authority (TSA))。cosign などのクライアントソフトウェアは、RHTAS 信頼ルートターゲットを使用してアーティファクト署名に署名し、検証します。シンプルな HTTP サーバーが公開鍵と証明書をクライアントソフトウェアに配布します。このシンプルな HTTP サーバーには、個々のターゲットの TUF リポジトリーがあります。

デフォルトでは、RHTAS を Red Hat OpenShift または Red Hat Enterprise Linux にデプロイするときに、TUF リポジトリーが作成され、個々のターゲットが事前に設定されます。デフォルトでは、すべてのメタデータファイルの有効期限は、RHTAS サービスをデプロイした時点から 52 週間です。Red Hat では、有効期限を短く選択し、公開鍵と証明書を頻繁にローテーションすることを推奨しています。これらのメンテナンスタスクを定期的に実行すると、コードベースへの攻撃を防ぐことができます。

1.2.2. The Update Framework のメタデータファイルの更新

デフォルトでは、The Update Framework (TUF) メタデータファイルは、Red Hat Trusted Artifact Signer (RHTAS) のデプロイメント日から 52 週間後に期限切れになります。少なくとも、有効期限が切れる前に 52 週間ごとに 1 回は TUF メタデータファイルを更新する必要があります。Red Hat では、メタデータファイルを 1 年に 1 回以上更新することを推奨しています。

この手順では、ルートメタデータファイルと非ルートメタデータファイルを更新する手順を説明します。

前提条件

  • Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
  • Securesign インスタンスを実行する。
  • oc バイナリーがインストールされているワークステーション。

手順

  1. OpenShift クラスターからワークステーションに tuftool バイナリーをダウンロードします。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ホームページから ? アイコンをクリックして、Command line tools をクリックし、tuftool ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip tuftool-amd64.gz
      chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  2. コマンドラインから OpenShift にログインします。

    構文

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注記

    OpenShift Web コンソールからコマンドラインで使用するログイントークンと URL を確認できます。OpenShift Web コンソールにログインします。ユーザー名をクリックし、Copy login command をクリックします。入力を求められた場合はユーザー名とパスワードをもう一度入力し、Display Token をクリックしてコマンドを表示します。

  3. RHTAS プロジェクトに切り替えます。

    oc project trusted-artifact-signer
    Copy to Clipboard Toggle word wrap

  4. シェル環境を設定します。

    export WORK="${HOME}/trustroot-example"
    export ROOT="${WORK}/root/root.json"
    export KEYDIR="${WORK}/keys"
    export INPUT="${WORK}/input"
    export TUF_REPO="${WORK}/tuf-repo"
    export TUF_SERVER_POD="$(oc get pod --selector=app.kubernetes.io/component=tuf --no-headers -o custom-columns=":metadata.name")"
    export TIMESTAMP_EXPIRATION="in 10 days"
    export SNAPSHOT_EXPIRATION="in 26 weeks"
    export TARGETS_EXPIRATION="in 26 weeks"
    export ROOT_EXPIRATION="in 26 weeks"
    Copy to Clipboard Toggle word wrap

    要件に応じて有効期限を設定します。

  5. 一時的な TUF ディレクトリー構造を作成します。

    mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
    Copy to Clipboard Toggle word wrap

  6. TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。

    oc extract --to "${KEYDIR}/" secret/tuf-root-keys
    oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}"
    cp "${TUF_REPO}/root.json" "${ROOT}"
    Copy to Clipboard Toggle word wrap

  7. タイムスタンプ、スナップショット、ターゲットのメタデータをすべて 1 つのコマンドで更新できます。

    tuftool update \
      --root "${ROOT}" \
      --key "${KEYDIR}/timestamp.pem" \
      --key "${KEYDIR}/snapshot.pem" \
      --key "${KEYDIR}/targets.pem" \
      --timestamp-expires "${TIMESTAMP_EXPIRATION}" \
      --snapshot-expires "${SNAPSHOT_EXPIRATION}" \
      --targets-expires "${TARGETS_EXPIRATION}" \
      --outdir "${TUF_REPO}" \
      --metadata-url "file://${TUF_REPO}"
    Copy to Clipboard Toggle word wrap

    注記

    TUF メタデータファイルのサブセットに対して TUF メタデータ更新を実行することもできます。たとえば、timestamp.json メタデータファイルは、他のメタデータファイルよりも頻繁に期限切れになります。したがって、次のコマンドを実行するだけで、タイムスタンプメタデータファイルを更新できます。

    tuftool update \
      --root "${ROOT}" \
      --key "${KEYDIR}/timestamp.pem" \
      --timestamp-expires "${TIMESTAMP_EXPIRATION}" \
      --outdir "${TUF_REPO}" \
      --metadata-url "file://${TUF_REPO}"
    Copy to Clipboard Toggle word wrap
  8. ルートの有効期限が切れそうな場合にのみ、有効期限を更新します。

    tuftool root expire "${ROOT}" "${ROOT_EXPIRATION}"
    Copy to Clipboard Toggle word wrap

    注記

    ルートファイルの有効期限がまだ先の場合は、この手順をスキップできます。

  9. ルートバージョンを更新します。

    tuftool root bump-version "${ROOT}"
    Copy to Clipboard Toggle word wrap

  10. ルートメタデータファイルに再度署名します。

    tuftool root sign "${ROOT}" -k "${KEYDIR}/root.pem"
    Copy to Clipboard Toggle word wrap

  11. 新しいルートバージョンを設定し、ルートメタデータファイルを所定の場所にコピーします。

    export NEW_ROOT_VERSION=$(cat "${ROOT}" | jq -r ".signed.version")
    cp "${ROOT}" "${TUF_REPO}/root.json"
    cp "${ROOT}" "${TUF_REPO}/${NEW_ROOT_VERSION}.root.json"
    Copy to Clipboard Toggle word wrap

  12. これらの変更を TUF サーバーにアップロードします。

    oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
    Copy to Clipboard Toggle word wrap

1.3. 証明書と鍵のローテーション

システム管理者は、Red Hat OpenShift 上で実行されている Red Hat Trusted Artifact Signer (RHTAS) サービスで使用される証明書と署名者鍵をプロアクティブにローテーションできます。定期的に鍵をローテーションすることで、鍵の改ざんや盗難を防ぐことができます。これらの手順では、古い証明書と署名者鍵を期限切れにし、RHTAS を設定する基盤となるサービス用の新しい証明書と署名者鍵に置き換える手順を説明します。次のサービスの鍵と証明書をローテーションできます。

  • Rekor
  • Certificate Transparency ログ
  • Fulcio
  • タイムスタンプ機関

1.3.1. Rekor 署名者鍵のローテーション

シャーディング機能を使用してログツリーをフリーズし、新しい署名者鍵を使用して新しいログツリーを作成することで、Rekor の署名者鍵を積極的にローテーションできます。この手順では、古い Rekor 署名者鍵を期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用する新しい署名者鍵に置き換える手順を説明します。古い Rekor 署名者鍵の有効期限が切れても、古い鍵で署名されたアーティファクトを検証することは可能です。

重要

この手順では、Rekor サービスを停止する必要があります。

前提条件

  • Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
  • Securesign インスタンスを実行する。
  • ocopensslcosign バイナリーがインストールされたワークステーション。

手順

  1. OpenShift クラスターからワークステーションに rekor-cli バイナリーをダウンロードします。

    1. OpenShift Web コンソールにログインします。ホームページで ? アイコンをクリックし、Command line tools をクリックして rekor-cli ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip rekor-cli-amd64.gz
      chmod +x rekor-cli-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv rekor-cli-amd64 /usr/local/bin/rekor-cli
      Copy to Clipboard Toggle word wrap

  2. OpenShift クラスターからワークステーションに tuftool バイナリーをダウンロードします。

    重要

    tuftool バイナリーは Linux オペレーティングシステムでのみ使用できます。

    1. ホームページから ? アイコンをクリックして、Command line tools をクリックし、tuftool ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルから、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip tuftool-amd64.gz
      chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  3. コマンドラインから OpenShift にログインします。

    構文

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注記

    OpenShift Web コンソールからコマンドラインで使用するログイントークンと URL を確認できます。OpenShift Web コンソールにログインします。ユーザー名をクリックし、Copy login command をクリックします。入力を求められた場合はユーザー名とパスワードをもう一度入力し、Display Token をクリックしてコマンドを表示します。

  4. RHTAS プロジェクトに切り替えます。

    oc project trusted-artifact-signer
    Copy to Clipboard Toggle word wrap

  5. Rekor URL を取得します。

    export REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}')
    Copy to Clipboard Toggle word wrap

  6. アクティブシャードのログツリー識別子を取得します。

    export OLD_TREE_ID=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .TreeID)
    Copy to Clipboard Toggle word wrap

  7. ログツリーを DRAINING 状態に設定します。

    oc run --image registry.redhat.io/rhtas/updatetree-rhel9:1.1.0 --restart=Never --attach=true --rm=true -q -- updatetree --admin_server=trillian-logserver:8091 --tree_id=${OLD_TREE_ID} --tree_state=DRAINING
    Copy to Clipboard Toggle word wrap

    ツリーログは、drain の実行中に新しいエントリーを受け入れません。キューが空になるまで待ちます。

    重要

    次のステップに進む前に、キューが空になるまで待つ必要があります。drain の実行中にリーフがまだ統合中の場合、このプロセス中にログツリーをフリーズすると、ログパスが最大マージ遅延 (MMD) しきい値を超える可能性があります。

  8. ログツリーをフリーズします。

    oc run --image registry.redhat.io/rhtas/updatetree-rhel9:1.1.0 --restart=Never --attach=true --rm=true -q -- updatetree --admin_server=trillian-logserver:8091 --tree_id=${OLD_TREE_ID} --tree_state=FROZEN
    Copy to Clipboard Toggle word wrap

  9. フリーズしたログツリーの長さを取得します。

    export OLD_SHARD_LENGTH=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .ActiveTreeSize)
    Copy to Clipboard Toggle word wrap

  10. 古いシャードの Rekor の公開鍵を取得します。

    export OLD_PUBLIC_KEY=$(curl -s $REKOR_URL/api/v1/log/publicKey | base64 | tr -d '\n')
    Copy to Clipboard Toggle word wrap

  11. 新しいログツリーを作成します。

    export NEW_TREE_ID=$(oc run createtree --image registry.redhat.io/rhtas/createtree-rhel9:1.1.0 --restart=Never --attach=true --rm=true -q -- -logtostderr=false --admin_server=trillian-logserver:8091 --display_name=rekor-tree)
    Copy to Clipboard Toggle word wrap

    これで、ログツリーが 2 つ、フリーズしたツリーが 1 つ、およびアクティブなシャードになる新しいツリーが 1 つできました。

  12. 新しい秘密鍵を作成します。

    openssl ecparam -genkey -name secp384r1 -noout -out new-rekor.pem
    Copy to Clipboard Toggle word wrap

    重要

    新しい鍵には一意のファイル名が必要です。

  13. 新しい署名者鍵を使用して新しいシークレットリソースを作成します。

    oc create secret generic rekor-signer-key --from-file=private=new-rekor.pem
    Copy to Clipboard Toggle word wrap

  14. 新しいツリー識別子と古いシャーディング情報を使用して、Securesign Rekor 設定を更新します。

    read -r -d '' SECURESIGN_PATCH_1 <<EOF
    [
        {
            "op": "replace",
            "path": "/spec/rekor/treeID",
            "value": $NEW_TREE_ID
        },
        {
            "op": "add",
            "path": "/spec/rekor/sharding/-",
            "value": {
                "treeID": $OLD_TREE_ID,
                "treeLength": $OLD_SHARD_LENGTH,
                "encodedPublicKey": "$OLD_PUBLIC_KEY"
            }
        },
        {
            "op": "replace",
            "path": "/spec/rekor/signer/keyRef",
            "value": {"name": "rekor-signer-key", "key": "private"}
        }
    ]
    EOF
    Copy to Clipboard Toggle word wrap

    注記

    /spec/rekor/signer/keyPasswordRef に値が設定されている場合は、それを削除する新しい個別の更新を作成します。

    read -r -d '' SECURESIGN_PATCH_2 <<EOF
    [
        {
            "op": "remove",
            "path": "/spec/rekor/signer/keyPasswordRef"
        }
    ]
    EOF
    Copy to Clipboard Toggle word wrap

    最初の更新を適用した後、この更新を適用します。

  15. Securesign インスタンスを更新します。

    oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH_1"
    Copy to Clipboard Toggle word wrap

  16. Rekor サーバーが新しい署名者鍵で再デプロイされるのを待ちます。

    oc wait pod -l app.kubernetes.io/name=rekor-server --for=condition=Ready
    Copy to Clipboard Toggle word wrap

  17. 新しい公開鍵を取得します。

    export NEW_KEY_NAME=new-rekor.pub
    curl $(oc get rekor -o jsonpath='{.items[0].status.url}')/api/v1/log/publicKey -o $NEW_KEY_NAME
    Copy to Clipboard Toggle word wrap

  18. 新しい Rekor 公開鍵を使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      export WORK="${HOME}/trustroot-example"
      export ROOT="${WORK}/root/root.json"
      export KEYDIR="${WORK}/keys"
      export INPUT="${WORK}/input"
      export TUF_REPO="${WORK}/tuf-repo"
      export TUF_SERVER_POD="$(oc get pod --selector=app.kubernetes.io/component=tuf --no-headers -o custom-columns=":metadata.name")"
      Copy to Clipboard Toggle word wrap

    2. 一時的な TUF ディレクトリー構造を作成します。

      mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    3. TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。

      oc extract --to "${KEYDIR}/" secret/tuf-root-keys
      oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}"
      cp "${TUF_REPO}/root.json" "${ROOT}"
      Copy to Clipboard Toggle word wrap

    4. アクティブな Rekor 署名者鍵ファイル名を見つけます。ローカル TUF リポジトリー内の最新のターゲットファイル (例: 1.target.json) を開きます。このファイルには、アクティブな Rekor 署名者鍵ファイル名 (例: rekor.pub) が記載されています。次のアクティブな Rekor 署名者鍵ファイル名で環境変数を設定します。

      export ACTIVE_KEY_NAME=rekor.pub
      Copy to Clipboard Toggle word wrap

    5. 古い公開鍵を使用して Rekor 署名者鍵を更新します。

      echo $OLD_PUBLIC_KEY | base64 -d > $ACTIVE_KEY_NAME
      Copy to Clipboard Toggle word wrap

    6. 古い Rekor 署名者鍵を期限切れにします。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-rekor-target "${ACTIVE_KEY_NAME}" \
        --rekor-uri "${REKOR_URL}" \
        --rekor-status "Expired" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    7. 新しい Rekor 署名者鍵を追加します。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-rekor-target "${NEW_KEY_NAME}" \
        --rekor-uri "${REKOR_URL}" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    8. これらの変更を TUF サーバーにアップロードします。

      oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
      Copy to Clipboard Toggle word wrap

    9. 作業ディレクトリーを削除します。

      rm -r $WORK
      Copy to Clipboard Toggle word wrap

  19. 更新された TUF 設定で cosign 設定を更新します。

    cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
    Copy to Clipboard Toggle word wrap

    これで、新しい Rekor 署名者鍵を使用してアーティファクトに署名し、検証する準備が整いました。

1.3.2. Certificate Transparency ログ署名者アギのローテーション

シャーディング機能を使用してログツリーをフリーズし、新しい署名者鍵を使用して新しいログツリーを作成することにより、Certificate Transparency (CT) ログ署名者鍵をプロアクティブにローテーションできます。この手順では、古い CT ログ署名者鍵を期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用する新しい署名者鍵に置き換える手順を説明します。古い CT ログ署名者鍵の有効期限が切れても、古い鍵で署名されたアーティファクトを検証することは可能です。

前提条件

  • Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
  • Securesign インスタンスを実行する。
  • ocopensslcosign バイナリーがインストールされたワークステーション。

手順

  1. OpenShift クラスターからワークステーションに tuftool バイナリーをダウンロードします。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ホームページから ? アイコンをクリックして、Command line tools をクリックし、tuftool ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip tuftool-amd64.gz
      chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  2. コマンドラインから OpenShift にログインします。

    構文

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注記

    OpenShift Web コンソールからコマンドラインで使用するログイントークンと URL を確認できます。OpenShift Web コンソールにログインします。ユーザー名をクリックし、Copy login command をクリックします。入力を求められた場合はユーザー名とパスワードをもう一度入力し、Display Token をクリックしてコマンドを表示します。

  3. RHTAS プロジェクトに切り替えます。

    oc project trusted-artifact-signer
    Copy to Clipboard Toggle word wrap

  4. 現在の CT ログ設定と鍵のバックアップを作成します。

    export SERVER_CONFIG_NAME=$(oc get ctlog -o jsonpath='{.items[0].status.serverConfigRef.name}')
    oc get secret $SERVER_CONFIG_NAME -o jsonpath="{.data.config}" | base64 --decode > config.txtpb
    oc get secret $SERVER_CONFIG_NAME -o jsonpath="{.data.fulcio-0}" | base64 --decode > fulcio-0.pem
    oc get secret $SERVER_CONFIG_NAME -o jsonpath="{.data.private}" | base64 --decode > private.pem
    oc get secret $SERVER_CONFIG_NAME -o jsonpath="{.data.public}" | base64 --decode > public.pem
    Copy to Clipboard Toggle word wrap

  5. 現在のツリー識別子を取得します。

    export OLD_TREE_ID=$(oc get ctlog -o jsonpath='{.items[0].status.treeID}')
    Copy to Clipboard Toggle word wrap

  6. ログツリーを DRAINING 状態に設定します。

    oc run --image registry.redhat.io/rhtas/updatetree-rhel9:1.1.0 --restart=Never --attach=true --rm=true -q -- updatetree --admin_server=trillian-logserver:8091 --tree_id=${OLD_TREE_ID} --tree_state=DRAINING
    Copy to Clipboard Toggle word wrap

    ツリーログは、drain の実行中に新しいエントリーを受け入れません。キューが空になるまで待ちます。

    重要

    次のステップに進む前に、キューが空になるまで待つ必要があります。drain の実行中にリーフがまだ統合中の場合、このプロセス中にログツリーをフリーズすると、ログパスが最大マージ遅延 (MMD) しきい値を超える可能性があります。

  7. キューが完全に空になったら、ログをフリーズします。

    oc run --image registry.redhat.io/rhtas/updatetree-rhel9:1.1.0 --restart=Never --attach=true --rm=true -q -- updatetree --admin_server=trillian-logserver:8091 --tree_id=${OLD_TREE_ID} --tree_state=FROZEN
    Copy to Clipboard Toggle word wrap

  8. 新しい Merkle ツリーを作成し、新しいツリー識別子を取得します。

    export NEW_TREE_ID=$(kubectl run createtree --image registry.redhat.io/rhtas/createtree-rhel9:1.1.0 --restart=Never --attach=true --rm=true -q -- -logtostderr=false --admin_server=trillian-logserver:8091 --display_name=ctlog-tree)
    Copy to Clipboard Toggle word wrap

  9. 新しい証明書と新しい公開鍵および秘密鍵を生成します。

    openssl ecparam -genkey -name prime256v1 -noout -out new-ctlog.pem
    openssl ec -in new-ctlog.pem -pubout -out new-ctlog-public.pem
    openssl ec -in new-ctlog.pem -out new-ctlog.pass.pem -des3 -passout pass:"CHANGE_ME"
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しいパスワードに置き換えます。

    重要

    証明書と新しい鍵には一意のファイル名が必要です。

  10. CT ログ設定を更新します。

    1. config.txtpb ファイルを開いて編集します。
    2. ログをフリーズした場合、フリーズされたログエントリーに not_after_limit フィールドを追加し、接頭辞値を一意の名前に変更し、秘密鍵への古いパスを ctfe-keys/private-0 に置き換えます。

      ...
      log_configs:{
        # frozen log
        config:{
          log_id:2066075212146181968
          prefix:"trusted-artifact-signer-0"
          roots_pem_file:"/ctfe-keys/fulcio-0"
          private_key:{[type.googleapis.com/keyspb.PEMKeyFile]:{path:"/ctfe-keys/private-0" password:"Example123"}}
          public_key:{der:"0Y0\x13\x06\x07*\x86H\xce=\x02\x01\x06\x08*\x86H\xce=\x03\x01\x07\x03B\x00\x04)'.\xffUJ\xe2s)\xefR\x8a\xfcO\xdcewȶy\xa7\x9d<\x13\xb0\x1c\x99\x96\xe4'\xe3v\x07:\xc8I+\x08J\x9d\x8a\xed\x06\xe4\xaeI:q\x98\xf4\xbc<o4VD\x0cr\xf9\x9c\xecxT\x84"}
          not_after_limit:{seconds:1728056285 nanos:012111000}
          ext_key_usages:"CodeSigning"
          log_backend_name:"trillian"
        }
      Copy to Clipboard Toggle word wrap

      注記

      date +%s、および date +%N のコマンドを実行すると、秒とナノ秒の現在の時刻値を取得できます。

      重要

      not_after_limit フィールドは、フリーズされたログだけのタイムスタンプ範囲の終了を定義します。この時点以降の証明書は、このログに含めることができなくなります。

    3. 凍結されたログ config ブロックをコピーして貼り付け、設定ファイルに追加して新しいエントリーを作成します。
    4. 新しい config ブロック内の次の行を変更します。log_id を新しいツリー識別子に設定し、prefixtrusted-artifact-signerprivate_key パスを ctfe-keys/private に変更します。public_key 行は削除し、not_after_limitnot_after_start に変更して、タイムスタンプの範囲を設定します。

      ...
      log_configs:{
        # frozen log
        ...
        # new active log
        config:{
      	  log_id: NEW_TREE_ID
      	  prefix:"trusted-artifact-signer"
      	  roots_pem_file:"/ctfe-keys/fulcio-0"
      	  private_key:{[type.googleapis.com/keyspb.PEMKeyFile]:{path:"ctfe-keys/private" password:"CHANGE_ME"}}
      	  ext_key_usages:"CodeSigning"
      	  not_after_start:{seconds:1713201754 nanos:155663000}
      	  log_backend_name:"trillian"
        }
      Copy to Clipboard Toggle word wrap

      NEW_TREE_ID を追加し、CHANGE_ME は、新しい秘密鍵のパスワードに置き換えます。ここでのパスワードは、新しい秘密鍵と公開鍵を生成するために使用したパスワードと同じものに指定する必要があります。

      重要

      not_after_start フィールドは、タイムスタンプ範囲の開始 (開始地点を含む) を定義します。これは、この時点でログが証明書の受け入れを開始することを意味します。

  11. 新しいシークレットリソースを作成します。

    oc create secret generic ctlog-config \
    --from-file=config=config.txtpb \
    --from-file=private=new-ctlog.pass.pem \
    --from-file=public=new-ctlog-public.pem \
    --from-file=fulcio-0=fulcio-0.pem \
    --from-file=private-0=private.pem \
    --from-file=public-0=public.pem \
    --from-literal=password=CHANGE_ME
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しい秘密鍵のパスワードに置き換えます。

  12. 新しい CT ログ公開鍵を使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      export WORK="${HOME}/trustroot-example"
      export ROOT="${WORK}/root/root.json"
      export KEYDIR="${WORK}/keys"
      export INPUT="${WORK}/input"
      export TUF_REPO="${WORK}/tuf-repo"
      export TUF_SERVER_POD="$(oc get pod --selector=app.kubernetes.io/component=tuf --no-headers -o custom-columns=":metadata.name")"
      Copy to Clipboard Toggle word wrap

    2. 一時的な TUF ディレクトリー構造を作成します。

      mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    3. TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。

      oc extract --to "${KEYDIR}/" secret/tuf-root-keys
      oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}"
      cp "${TUF_REPO}/root.json" "${ROOT}"
      Copy to Clipboard Toggle word wrap

    4. アクティブな CT ログの公開鍵ファイル名を見つけます。ローカル TUF リポジトリー内の最新のターゲットファイル (例: 1.targets.json) を開きます。このターゲットファイルには、アクティブな CT ログ公開鍵ファイル名 (例: ctfe.pub) が含まれます。次のアクティブな CT ログ公開鍵ファイル名で環境変数を設定します。

      export ACTIVE_CTFE_NAME=ctfe.pub
      Copy to Clipboard Toggle word wrap

    5. OpenShift からアクティブな CT ログ公開鍵を抽出します。

      oc get secret $(oc get ctlog securesign-sample -o jsonpath='{.status.publicKeyRef.name}') -o jsonpath='{.data.public}' | base64 -d > $ACTIVE_CTFE_NAME
      Copy to Clipboard Toggle word wrap

    6. 古い CT ログ署名者鍵を期限切れにします。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-ctlog-target "$ACTIVE_CTFE_NAME" \
        --ctlog-uri "https://ctlog.rhtas" \
        --ctlog-status "Expired" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    7. 新しい CT ログ署名者鍵を追加します。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-ctlog-target "new-ctlog-public.pem" \
        --ctlog-uri "https://ctlog.rhtas" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    8. これらの変更を TUF サーバーにアップロードします。

      oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
      Copy to Clipboard Toggle word wrap

  13. 新しいツリー識別子を使用して Securesign CT ログ設定を更新します。

    read -r -d '' SECURESIGN_PATCH <<EOF
    [
    	{
        	"op": "replace",
        	"path": "/spec/ctlog/serverConfigRef",
        	"value": {"name": "ctlog-config"}
    	},
        {
            "op": "replace",
            "path": "/spec/ctlog/treeID",
            "value": $NEW_TREE_ID
        },
    	{
        	"op": "replace",
        	"path": "/spec/ctlog/privateKeyRef",
        	"value": {"name": "ctlog-config", "key": "private"}
    	},
        {
            "op": "replace",
            "path": "/spec/ctlog/privateKeyPasswordRef",
            "value": {"name": "ctlog-config", "key": "password"}
        },
    	{
        	"op": "replace",
        	"path": "/spec/ctlog/publicKeyRef",
        	"value": {"name": "ctlog-config", "key": "public"}
    	}
    ]
    EOF
    Copy to Clipboard Toggle word wrap

  14. Securesign インスタンスにパッチを適用します。

    oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH"
    Copy to Clipboard Toggle word wrap

  15. CT ログサーバーが再びデプロイされるまで待ちます。

    oc wait pod -l app.kubernetes.io/name=ctlog --for=condition=Ready
    Copy to Clipboard Toggle word wrap

  16. 作業ディレクトリーを削除します。

    rm -r $WORK
    Copy to Clipboard Toggle word wrap

  17. 更新された TUF 設定で cosign 設定を更新します。

    cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
    Copy to Clipboard Toggle word wrap

    これで、新しい CT ログ署名者鍵を使用してアーティファクトに署名し、検証する準備が整いました。

1.3.3. Fulcio 証明書のローテーション

Fulcio サービスで使用される証明書をプロアクティブにローテーションできます。この手順では、古い Fulcio 証明書の有効期限を切れさせ、Red Hat Trusted Artifact Signer (RHTAS) が使用できるように新しい証明書に置き換える手順を説明します。古い Fulcio 証明書の有効期限が切れても、古い証明書で署名されたアーティファクトを検証することは可能です。

前提条件

  • Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
  • Securesign インスタンスを実行する。
  • ocopensslcosign バイナリーがインストールされたワークステーション。

手順

  1. OpenShift クラスターからワークステーションに tuftool バイナリーをダウンロードします。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ホームページから ? アイコンをクリックして、Command line tools をクリックし、tuftool ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip tuftool-amd64.gz
      chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  2. コマンドラインから OpenShift にログインします。

    構文

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注記

    OpenShift Web コンソールからコマンドラインで使用するログイントークンと URL を確認できます。OpenShift Web コンソールにログインします。ユーザー名をクリックし、Copy login command をクリックします。入力を求められた場合はユーザー名とパスワードをもう一度入力し、Display Token をクリックしてコマンドを表示します。

  3. RHTAS プロジェクトに切り替えます。

    oc project trusted-artifact-signer
    Copy to Clipboard Toggle word wrap

  4. 新しい証明書と新しい公開鍵および秘密鍵を生成します。

    openssl ecparam -genkey -name prime256v1 -noout -out new-fulcio.pem
    openssl ec -in new-fulcio.pem -pubout -out new-fulcio-public.pem
    openssl ec -in new-fulcio.pem -out new-fulcio.pass.pem -des3 -passout pass:"CHANGE_ME"
    openssl req -new -x509 -key new-fulcio.pass.pem -out new-fulcio.cert.pem
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しいパスワードに置き換えます。

    重要

    証明書と新しい鍵には一意のファイル名が必要です。

  5. 新規シークレットを作成します。

    oc create secret generic fulcio-config \
    --from-file=private=new-fulcio.pass.pem \
    --from-file=cert=new-fulcio.cert.pem \
    --from-literal=password=CHANGE_ME
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しいパスワードに置き換えます。

    注記

    ここでのパスワードは、新しい秘密鍵と公開鍵を生成するために使用したパスワードと同じものに指定する必要があります。

  6. 新しい Fulcio 証明書を使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      export WORK="${HOME}/trustroot-example"
      export ROOT="${WORK}/root/root.json"
      export KEYDIR="${WORK}/keys"
      export INPUT="${WORK}/input"
      export TUF_REPO="${WORK}/tuf-repo"
      export TUF_SERVER_POD="$(oc get pod --selector=app.kubernetes.io/component=tuf --no-headers -o custom-columns=":metadata.name")"
      Copy to Clipboard Toggle word wrap

    2. 一時的な TUF ディレクトリー構造を作成します。

      mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    3. TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。

      oc extract --to "${KEYDIR}/" secret/tuf-root-keys
      oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}"
      cp "${TUF_REPO}/root.json" "${ROOT}"
      Copy to Clipboard Toggle word wrap

    4. アクティブな Fulcio 証明書ファイル名を見つけます。ローカル TUF リポジトリー内の最新のターゲットファイル (例: 1.targets.json) を開きます。このファイルには、アクティブな Fulcio 証明書ファイル名 (例: fulcio_v1.crt.pem) が記載されています。このアクティブな Fulcio 証明書ファイル名で環境変数を設定します。

      export ACTIVE_CERT_NAME=fulcio_v1.crt.pem
      Copy to Clipboard Toggle word wrap

    5. OpenShift からアクティブな Fulcio 証明書を抽出します。

      oc get secret $(oc get fulcio securesign-sample -o jsonpath='{.status.certificate.caRef.name}') -o jsonpath='{.data.cert}' | base64 -d > $ACTIVE_CERT_NAME
      Copy to Clipboard Toggle word wrap

    6. 古い証明書を期限切れにします。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-fulcio-target "$ACTIVE_CERT_NAME" \
        --fulcio-uri "https://fulcio.rhtas" \
        --fulcio-status "Expired" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    7. 新しい Fulcio 証明書を追加します。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-fulcio-target "new-fulcio.cert.pem" \
        --fulcio-uri "https://fulcio.rhtas" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    8. これらの変更を TUF サーバーにアップロードします。

      oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
      Copy to Clipboard Toggle word wrap

    9. 作業ディレクトリーを削除します。

      rm -r $WORK
      Copy to Clipboard Toggle word wrap

  7. Securesign Fulcio 設定を更新します。

    read -r -d '' SECURESIGN_PATCH <<EOF
    [
    {
        "op": "replace",
        "path": "/spec/fulcio/certificate/privateKeyRef",
        "value": {"name": "fulcio-config", "key": "private"}
    },
    {
        "op": "replace",
        "path": "/spec/fulcio/certificate/privateKeyPasswordRef",
        "value": {"name": "fulcio-config", "key": "password"}
    },
    {
        "op": "replace",
        "path": "/spec/fulcio/certificate/caRef",
        "value": {"name": "fulcio-config", "key": "cert"}
    },
    {
        "op": "replace",
        "path": "/spec/ctlog/rootCertificates",
        "value": [{"name": "fulcio-config", "key": "cert"}]
    }
    ]
    EOF
    Copy to Clipboard Toggle word wrap

  8. Securesign インスタンスにパッチを適用します。

    oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH"
    Copy to Clipboard Toggle word wrap

  9. Fulcio サーバーが再デプロイされるまで待ちます。

    oc wait pod -l app.kubernetes.io/name=fulcio-server --for=condition=Ready
    oc wait pod -l app.kubernetes.io/name=ctlog --for=condition=Ready
    Copy to Clipboard Toggle word wrap

  10. 更新された TUF 設定で cosign 設定を更新します。

    cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
    Copy to Clipboard Toggle word wrap

    これで、新しい Fulcio 証明書を使用してアーティファクトに署名し、検証する準備が整いました。

1.3.4. タイムスタンプ機関の署名者鍵と証明書チェーンのローテーション

タイムスタンプ機関 (TSA) の署名者鍵と証明書チェーンをプロアクティブにローテーションできます。この手順では、古い TSA 署名者鍵と証明書チェーンを期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用できるように新しいものに置き換える手順を説明します。古い TSA 署名者鍵と証明書チェーンを期限切れにしても、古い鍵と証明書チェーンによって署名されたアーティファクトを検証することは可能です。

前提条件

  • Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
  • Securesign インスタンスを実行する。
  • oc および openssl バイナリーがインストールされたワークステーション。

手順

  1. OpenShift クラスターからワークステーションに tuftool バイナリーをダウンロードします。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ホームページから ? アイコンをクリックして、Command line tools をクリックし、tuftool ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip tuftool-amd64.gz
      chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  2. コマンドラインから OpenShift にログインします。

    構文

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注記

    OpenShift Web コンソールからコマンドラインで使用するログイントークンと URL を確認できます。OpenShift Web コンソールにログインします。ユーザー名をクリックし、Copy login command をクリックします。入力を求められた場合はユーザー名とパスワードをもう一度入力し、Display Token をクリックしてコマンドを表示します。

  3. RHTAS プロジェクトに切り替えます。

    oc project trusted-artifact-signer
    Copy to Clipboard Toggle word wrap

  4. 新しい証明書チェーンと新しい署名者鍵を生成します。

    重要

    新しい証明書と鍵には一意のファイル名が必要です。

    1. 一時作業ディレクトリーを作成します。

      mkdir certs && cd certs
      Copy to Clipboard Toggle word wrap

    2. ルート認証局 (CA) の秘密鍵を作成し、パスワードを設定します。

      openssl req -x509 -newkey rsa:2048 -days 365 -sha256 -nodes \
      -keyout rootCA.key.pem -out rootCA.crt.pem \
      -passout pass:"CHANGE_ME" \
      -subj "/C=CC/ST=state/L=Locality/O=RH/OU=RootCA/CN=RootCA" \
      -addext "basicConstraints=CA:true" -addext "keyUsage=cRLSign, keyCertSign"
      Copy to Clipboard Toggle word wrap

      CHANGE_ME は、新しいパスワードに置き換えます。

    3. 中間 CA 秘密鍵と証明書署名要求 (CSR) を作成し、パスワードを設定します。

      openssl req -newkey rsa:2048 -sha256 \
      -keyout intermediateCA.key.pem -out intermediateCA.csr.pem \
      -passout pass:"CHANGE_ME" \
      -subj "/C=CC/ST=state/L=Locality/O=RH/OU=IntermediateCA/CN=IntermediateCA"
      Copy to Clipboard Toggle word wrap

      CHANGE_ME は、新しいパスワードに置き換えます。

    4. ルート CA を使用して中間 CA 証明書に署名します。

      openssl x509 -req -in intermediateCA.csr.pem -CA rootCA.crt.pem -CAkey rootCA.key.pem \
      -CAcreateserial -out intermediateCA.crt.pem -days 365 -sha256 \
      -extfile <(echo -e "basicConstraints=CA:true\nkeyUsage=cRLSign, keyCertSign\nextendedKeyUsage=critical,timeStamping") \
      -passin pass:"CHANGE_ME"
      Copy to Clipboard Toggle word wrap

      中間 CA 証明書に署名するには、CHANGE_ME をルート CA 秘密鍵のパスワードに置き換えます。

    5. リーフ CA の秘密鍵と CSR を作成し、パスワードを設定します。

      openssl req -newkey rsa:2048 -sha256 \
      -keyout leafCA.key.pem -out leafCA.csr.pem \
      -passout pass:"CHANGE_ME" \
      -subj "/C=CC/ST=state/L=Locality/O=RH/OU=LeafCA/CN=LeafCA"
      Copy to Clipboard Toggle word wrap

    6. 中間 CA を使用してリーフ CA 証明書に署名します。

      openssl x509 -req -in leafCA.csr.pem -CA intermediateCA.crt.pem -CAkey intermediateCA.key.pem \
        -CAcreateserial -out leafCA.crt.pem -days 365 -sha256 \
        -extfile <(echo -e "basicConstraints=CA:false\nkeyUsage=cRLSign, keyCertSign\nextendedKeyUsage=critical,timeStamping") \
        -passin pass:"CHANGE_ME"
      Copy to Clipboard Toggle word wrap

      リーフ CA 証明書に署名するには、CHANGE_ME を中間 CA 秘密鍵のパスワードに置き換えます。

    7. 新しく作成した証明書を組み合わせて証明書チェーンを作成します。

      cat leafCA.crt.pem intermediateCA.crt.pem rootCA.crt.pem > new-tsa.certchain.pem
      Copy to Clipboard Toggle word wrap

  5. 署名者鍵を使用して新しいシークレットリソースを作成します。

    oc create secret generic rotated-signer-key --from-file=rotated-signer-key=certs/leafCA.key.pem
    Copy to Clipboard Toggle word wrap

  6. 新しい証明書チェーンを使用して新しいシークレットリソースを作成します。

    oc create secret generic rotated-cert-chain --from-file=rotated-cert-chain=certs/new-tsa.certchain.pem
    Copy to Clipboard Toggle word wrap

  7. パスワード用の新しいシークレットリソースを作成します。

    oc create secret generic rotated-password --from-literal=rotated-password=CHANGE_ME
    Copy to Clipboard Toggle word wrap

    CHANGE_ME を中間 CA 秘密鍵のパスワードに置き換えます。

  8. アクティブな TSA 証明書ファイル名、TSA URL 文字列を見つけて、次の値を使用してシェル環境を設定します。

    export ACTIVE_CERT_CHAIN_NAME=tsa.certchain.pem
    export TSA_URL=$(oc get timestampauthority securesign-sample -o jsonpath='{.status.url}')/api/v1/timestamp
    curl $TSA_URL/certchain -o $ACTIVE_CERT_CHAIN_NAME
    Copy to Clipboard Toggle word wrap

  9. Securesign TSA 設定を更新します。

    read -r -d '' SECURESIGN_PATCH <<EOF
    [
        {
            "op": "replace",
            "path": "/spec/tsa/signer/certificateChain",
            "value": {
                "certificateChainRef" : {"name": "rotated-cert-chain", "key": "rotated-cert-chain"}
            }
        },
        {
            "op": "replace",
            "path": "/spec/tsa/signer/file",
            "value": {
                    "privateKeyRef": {"name": "rotated-signer-key", "key": "rotated-signer-key"},
                    "passwordRef": {"name": "rotated-password", "key": "rotated-password"}
                }
        }
    ]
    EOF
    Copy to Clipboard Toggle word wrap

  10. Securesign インスタンスにパッチを適用します。

    oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH"
    Copy to Clipboard Toggle word wrap

  11. TSA サーバーが新しい署名者鍵と証明書チェーンを使用してもう一度デプロイされるのを待ちます。

    oc get pods -w -l app.kubernetes.io/name=tsa-server
    Copy to Clipboard Toggle word wrap

  12. 新しい証明書チェーンを取得します。

    export NEW_CERT_CHAIN_NAME=new-tsa.certchain.pem
    curl $TSA_URL/certchain -o $NEW_CERT_CHAIN_NAME
    Copy to Clipboard Toggle word wrap

  13. 新しい TSA 証明書チェーンを使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      export WORK="${HOME}/trustroot-example"
      export ROOT="${WORK}/root/root.json"
      export KEYDIR="${WORK}/keys"
      export INPUT="${WORK}/input"
      export TUF_REPO="${WORK}/tuf-repo"
      export TUF_SERVER_POD="$(oc get pod --selector=app.kubernetes.io/component=tuf --no-headers -o custom-columns=":metadata.name")"
      Copy to Clipboard Toggle word wrap

    2. 一時的な TUF ディレクトリー構造を作成します。

      mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    3. TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。

      oc extract --to "${KEYDIR}/" secret/tuf-root-keys
      oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}"
      cp "${TUF_REPO}/root.json" "${ROOT}"
      Copy to Clipboard Toggle word wrap

    4. 古い TSA 証明書を期限切れにします。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-tsa-target "$ACTIVE_CERT_CHAIN_NAME" \
        --tsa-uri "$TSA_URL" \
        --tsa-status "Expired" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    5. 新しい TSA 証明書を追加します。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-tsa-target "$NEW_CERT_CHAIN_NAME" \
        --tsa-uri "$TSA_URL" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    6. これらの変更を TUF サーバーにアップロードします。

      oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
      Copy to Clipboard Toggle word wrap

    7. 作業ディレクトリーを削除します。

      rm -r $WORK
      Copy to Clipboard Toggle word wrap

  14. 更新された TUF 設定で cosign 設定を更新します。

    cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
    Copy to Clipboard Toggle word wrap

    これで、新しい TSA 署名者鍵と証明書を使用するアーティファクトに署名して検証する準備が整いました。

1.4. 独自の認証局バンドルの使用

Red Hat の Trusted Artifact Signer (RHTAS) サービスを使用して、ビルドアーティファクトの署名と検証に組織の認証局 (CA) バンドルを使用できます。

前提条件

  • Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
  • Securesign インスタンスを実行する。
  • CA ルート証明書。
  • oc バイナリーがインストールされているワークステーション。

手順

  1. コマンドラインから OpenShift にログインします。

    構文

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注記

    OpenShift Web コンソールからコマンドラインで使用するログイントークンと URL を確認できます。OpenShift Web コンソールにログインします。ユーザー名をクリックし、Copy login command をクリックします。入力を求められた場合はユーザー名とパスワードをもう一度入力し、Display Token をクリックしてコマンドを表示します。

  2. RHTAS プロジェクトに切り替えます。

    oc project trusted-artifact-signer
    Copy to Clipboard Toggle word wrap

  3. 組織の CA ルート証明書バンドルを使用して新しい ConfigMap を作成します。

    oc create configmap custom-ca-bundle --from-file=ca-bundle.crt
    Copy to Clipboard Toggle word wrap

    重要

    証明書ファイル名は ca-bundle.crt である必要があります。

  4. 編集のために Securesign リソースを開きます。

    oc edit Securesign securesign-sample
    Copy to Clipboard Toggle word wrap

    1. metadata.annotations セクションの下に rhtas.redhat.com/trusted-ca を追加します。

      apiVersion: rhtas.redhat.com/v1alpha1
      kind: Securesign
      metadata:
        name: example-instance
        annotations:
      	rhtas.redhat.com/trusted-ca: custom-ca-bundle
      spec:
      ...
      Copy to Clipboard Toggle word wrap

    2. 保存してエディターを終了します。
  5. Fulcio リソースを編集用に開きます。

    oc edit Fulcio securesign-sample
    Copy to Clipboard Toggle word wrap

    1. metadata.annotations セクションの下に rhtas.redhat.com/trusted-ca を追加します。

      apiVersion: rhtas.redhat.com/v1alpha1
      kind: Fulcio
      metadata:
        name: example-instance
        annotations:
          rhtas.redhat.com/trusted-ca: custom-ca-bundle
      spec:
      ...
      Copy to Clipboard Toggle word wrap

    2. 保存してエディターを終了します。
  6. アーティファクトに署名して検証する前に、RHTAS Operator が再設定するのを待ちます。

第2章 Red Hat Enterprise Linux

2.1. 署名データの保護

システム管理者にとって、ハードウェア障害や誤ったデータ削除によるデータ損失が発生した場合、ソフトウェアサプライチェーンの署名データを保護することは非常に重要です。

Red Hat Enterprise Linux 上の Red Hat Trusted Artifact Signer (RHTAS) デプロイメントでは、署名データの暗号化されたバックアップをローカルファイルシステムに簡単に作成できます。

2.1.1. Trusted Artifact Signer データのバックアップ

マウントされたファイルシステムへの Red Hat Trusted Artifact Signer (RHTAS) データの自動バックアップをスケジュールできます。データのバックアップは SSL で暗号化され、圧縮されます。

重要

RHTAS サービスは、同時の手動バックアップおよび復元操作をサポートしていません。

前提条件

  • Red Hat Enterprise Linux 9.4 以降。
  • Ansible によって管理される Red Hat Enterprise Linux 上で実行される RHTAS のデプロイメント。
  • 管理対象ノードに対するルートレベルの権限を持つ、管理対象ノードへの SSH 接続。

手順

  1. RHTAS Ansible Playbook を開いて編集します。
  2. tas_single_node_backup_restore.backup セクションで、enabled 変数を true に設定します。

    tas_single_node_backup_restore:
      backup:
        enabled: true
    Copy to Clipboard Toggle word wrap

  3. デフォルトでは、毎日のバックアップジョブは毎日深夜に実行されます。スケジュールに合わせてこれを変更できます。

    tas_single_node_backup_restore:
      backup:
        enabled: true
        schedule: "*-*-* 00:00:00"
    Copy to Clipboard Toggle word wrap

  4. passphrase を設定し、ローカルバックアップディレクトリーを指定します。

    tas_single_node_backup_restore:
      backup:
        enabled: true
        schedule: "*-*-* 00:00:00"
        force_run: false
        passphrase: "example123"
        directory: /root/tas_backups
    Copy to Clipboard Toggle word wrap

  5. オプション: 即時バックアップジョブを開始するには、force_run 変数を true に設定します。
  6. 変更を保存し、エディターを終了します。
  7. 変更を適用するには、RHTAS Ansible Playbook を実行します。

    ansible-playbook -i inventory play.yml
    Copy to Clipboard Toggle word wrap

    バックアップが完了すると、暗号化され圧縮されたファイル名の形式は、BACKUP-<date-and-time>-UTC.tar.gz.enc です。

2.1.2. Trusted Artifact Signer データの復元

バックアップソースから Red Hat Trusted Artifact Signer (RHTAS) データのスナップショットを復元できます。

前提条件

  • Red Hat Enterprise Linux 9.4 以降。
  • Ansible によって管理される Red Hat Enterprise Linux 上で実行される RHTAS のデプロイメント。
  • 管理対象ノードに対するルートレベルの権限を持つ、管理対象ノードへの SSH 接続。
  • バックアップソースファイルがある。
  • バックアップソースに使用されるパスフレーズを把握している。

手順

  1. バックアップデータファイルを Ansible コントロールノード上のディレクトリーにコピーします。
  2. RHTAS Ansible Playbook を開いて編集します。
  3. tas_single_node_backup_restore.restore セクションで、enabled 変数を true に設定します。

    tas_single_node_backup_restore:
      ...
      restore:
        enabled: true
    Copy to Clipboard Toggle word wrap

  4. バックアップファイルのソースの場所を指定し、正しいパスフレーズを入力します。

    tas_single_node_backup_restore:
      ...
      restore:
        enabled: true
        source: "PATH_TO_BACKUP_FILE"
        passphrase: "example123"
    Copy to Clipboard Toggle word wrap

  5. tas_single_node_backup_restore.backup セクションで、force_run 変数が false になっていることを確認します。force_run 変数が true の場合は、false に設定します。
  6. .変更を適用するには、RHTAS Ansible Playbook を実行します。

    ansible-playbook -i inventory play.yml
    Copy to Clipboard Toggle word wrap

    復元プロセスが開始され、すべてのタスクが再実行され、RHTAS サービスの整合性が検証されます。

2.2. The Update Framework

システム管理者として、Red Hat Trusted Artifact Signer (RHTAS) 向けの The Update Framework (TUF) の Red Hat の実装を理解することは、開発者向けのセキュアなコーディング環境を維持する上で重要です。コードベースでのミックスアンドマッチ攻撃を防ぐために、TUF のルートメタデータと非ルートメタデータを定期的に更新できます。TUF メタデータを更新することで、クライアントは古くなったファイルや改ざんされたファイルを検出して拒否できるようになります。

2.2.1. Trusted Artifact Signer による The Update Framework の実装

Red Hat Trusted Artifact Signer (RHTAS) バージョン 1.1 以降では、RHTAS サービスで使用される公開鍵と証明書を保存するための信頼されたルートとして The Update Framework (TUF) を実装しました。The Update Framework は、ソフトウェア更新システムを保護するための洗練されたフレームワークであり、提供されたアーティファクトを保護するのに最適です。The Update Framework は、RHTAS サービスを信頼されたルートターゲットとして参照します。信頼できるターゲットは 4 つで、RHTAS サービスごとに 1 つずつあります (Fulcio、Certificate Transparency (CT) ログ、Rekor、および Timestamp Authority (TSA))。cosign などのクライアントソフトウェアは、RHTAS 信頼ルートターゲットを使用してアーティファクト署名に署名し、検証します。シンプルな HTTP サーバーが公開鍵と証明書をクライアントソフトウェアに配布します。このシンプルな HTTP サーバーには、個々のターゲットの TUF リポジトリーがあります。

デフォルトでは、RHTAS を Red Hat OpenShift または Red Hat Enterprise Linux にデプロイするときに、TUF リポジトリーが作成され、個々のターゲットが事前に設定されます。デフォルトでは、すべてのメタデータファイルの有効期限は、RHTAS サービスをデプロイした時点から 52 週間です。Red Hat では、有効期限を短く選択し、公開鍵と証明書を頻繁にローテーションすることを推奨しています。これらのメンテナンスタスクを定期的に実行すると、コードベースへの攻撃を防ぐことができます。

2.2.2. The Update Framework のメタデータファイルの更新

デフォルトでは、The Update Framework (TUF) メタデータファイルは、Red Hat Trusted Artifact Signer (RHTAS) のデプロイメント日から 52 週間後に期限切れになります。少なくとも、有効期限が切れる前に 52 週間ごとに 1 回は TUF メタデータファイルを更新する必要があります。Red Hat では、メタデータファイルを 1 年に 1 回以上更新することを推奨しています。

この手順では、ルートメタデータファイルと非ルートメタデータファイルを更新する手順を説明します。

前提条件

  • Ansible 管理の Red Hat Enterprise Linux (RHEL) 上で実行される RHTAS のインストール。
  • rsync および podman バイナリーがインストールされたワークステーション。
  • 管理対象ノードに対するルートレベルの権限を持つ、管理対象ノードへの SSH 接続。

手順

  1. ローカルのコマンドラインインターフェイス (CLI) ツールのダウンロードページから tuftool バイナリーをワークステーションにダウンロードします。

    注記

    URL アドレスは、tas_single_node_base_hostname 変数によって定義された設定済みノードです。tas_single_node_base_hostname の値が example.com の場合、URL アドレスの例は https://cli-server.example.com です。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ダウンロードページから、tuftool のダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip tuftool-amd64.gz
      chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  2. シェル環境を設定します。

    export WORK="${HOME}/trustroot-example"
    export ROOT="${WORK}/root/root.json"
    export KEYDIR="${WORK}/keys"
    export INPUT="${WORK}/input"
    export TUF_REPO="${WORK}/tuf-repo"
    export MANAGED_NODE_IP=IP_OF_ANSIBLE_MANAGED_NODE
    export MANAGED_NODE_SSH_USER=USER_TO_CONNECT_TO_MANAGED_NODE
    export REMOTE_KEYS_VOLUME=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman volume mount tuf-signing-keys" | tr -d '[:space:]')
    export REMOTE_TUF_VOLUME=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman volume mount tuf-repository" | tr -d '[:space:]')
    export TIMESTAMP_EXPIRATION="in 10 days"
    export SNAPSHOT_EXPIRATION="in 26 weeks"
    export TARGETS_EXPIRATION="in 26 weeks"
    export ROOT_EXPIRATION="in 26 weeks"
    Copy to Clipboard Toggle word wrap

    IP_OF_ANSIBLE_MANAGED_NODEUSER_TO_CONNECT_TO_MANAGED_NODE を適切な値に置き換えます。

    要件に応じて有効期限を設定します。

  3. 一時的な TUF ディレクトリー構造を作成します。

    mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
    Copy to Clipboard Toggle word wrap

  4. TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。

    rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:"${REMOTE_KEYS_VOLUME}/" "${KEYDIR}"
    rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:"${REMOTE_TUF_VOLUME}/" "${TUF_REPO}"
    cp "${TUF_REPO}/root.json" "${ROOT}"
    Copy to Clipboard Toggle word wrap

  5. タイムスタンプ、スナップショット、ターゲットのメタデータをすべて 1 つのコマンドで更新できます。

    tuftool update \
      --root "${ROOT}" \
      --key "${KEYDIR}/timestamp.pem" \
      --key "${KEYDIR}/snapshot.pem" \
      --key "${KEYDIR}/targets.pem" \
      --timestamp-expires "${TIMESTAMP_EXPIRATION}" \
      --snapshot-expires "${SNAPSHOT_EXPIRATION}" \
      --targets-expires "${TARGETS_EXPIRATION}" \
      --outdir "${TUF_REPO}" \
      --metadata-url "file://${TUF_REPO}"
    Copy to Clipboard Toggle word wrap

    注記

    TUF メタデータファイルのサブセットに対して TUF メタデータ更新を実行することもできます。たとえば、timestamp.json メタデータファイルは、他のメタデータファイルよりも頻繁に期限切れになります。したがって、次のコマンドを実行するだけで、タイムスタンプメタデータファイルを更新できます。

    tuftool update \
      --root "${ROOT}" \
      --key "${KEYDIR}/timestamp.pem" \
      --timestamp-expires "${TIMESTAMP_EXPIRATION}" \
      --outdir "${TUF_REPO}" \
      --metadata-url "file://${TUF_REPO}"
    Copy to Clipboard Toggle word wrap
  6. ルートの有効期限が切れそうな場合にのみ、有効期限を更新します。

    tuftool root expire "${ROOT}" "${ROOT_EXPIRATION}"
    Copy to Clipboard Toggle word wrap

    注記

    ルートファイルの有効期限がまだ先の場合は、この手順をスキップできます。

  7. ルートバージョンを更新します。

    tuftool root bump-version "${ROOT}"
    Copy to Clipboard Toggle word wrap

  8. ルートメタデータファイルに再度署名します。

    tuftool root sign "${ROOT}" -k "${KEYDIR}/root.pem"
    Copy to Clipboard Toggle word wrap

  9. 新しいルートバージョンを設定し、ルートメタデータファイルを所定の場所にコピーします。

    export NEW_ROOT_VERSION=$(cat "${ROOT}" | jq -r ".signed.version")
    cp "${ROOT}" "${TUF_REPO}/root.json"
    cp "${ROOT}" "${TUF_REPO}/${NEW_ROOT_VERSION}.root.json"
    Copy to Clipboard Toggle word wrap

  10. これらの変更を TUF サーバーにアップロードします。

    1. TUF リポジトリーの圧縮アーカイブを作成します。

      tar -C "${WORK}" -czvf repository.tar.gz tuf-repo
      Copy to Clipboard Toggle word wrap

    2. 次の 2 行を追加して RHTAS Ansible Playbook を更新します。

      tas_single_node_trust_root:
        full_archive: "{{ lookup('file', 'repository.tar.gz') | b64encode }}"
      Copy to Clipboard Toggle word wrap

    3. 変更を適用するには、RHTAS Anisble Playbook を実行します。

      ansible-playbook -i inventory play.yml
      Copy to Clipboard Toggle word wrap

2.3. 証明書と鍵のローテーション

システム管理者は、Red Hat OpenShift 上で実行されている Red Hat Trusted Artifact Signer (RHTAS) サービスで使用される証明書と署名者鍵をプロアクティブにローテーションできます。定期的に鍵をローテーションすることで、鍵の改ざんや盗難を防ぐことができます。これらの手順では、古い証明書と署名者鍵を期限切れにし、RHTAS を設定する基盤となるサービス用の新しい証明書と署名者鍵に置き換える手順を説明します。次のサービスの鍵と証明書をローテーションできます。

  • Rekor
  • Certificate Transparency ログ
  • Fulcio
  • タイムスタンプ機関

2.3.1. Rekor 署名者鍵のローテーション

シャーディング機能を使用してログツリーをフリーズし、新しい署名者鍵を使用して新しいログツリーを作成することで、Rekor の署名者鍵を積極的にローテーションできます。この手順では、古い Rekor 署名者鍵を期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用する新しい署名者鍵に置き換える手順を説明します。古い Rekor 署名者鍵の有効期限が切れても、古い鍵で署名されたアーティファクトを検証することは可能です。

重要

この手順では、Rekor サービスを停止する必要があります。

前提条件

  • Ansible 管理の Red Hat Enterprise Linux 上で実行される RHTAS のインストール。
  • rsyncopensslcosign バイナリーがインストールされたワークステーション。
  • 管理対象ノードに対するルートレベルの権限を持つ、管理対象ノードへの SSH 接続。

手順

  1. ローカルのコマンドラインインターフェイス (CLI) ツールのダウンロードページから rekor-cli バイナリーをワークステーションにダウンロードします。

    1. Web ブラウザーを開き、CLI サーバーの Web ページに移動します。

      注記

      URL アドレスは、tas_single_node_base_hostname 変数によって定義された設定済みノードです。tas_single_node_base_hostname の値が example.com の場合、URL アドレスの例は https://cli-server.example.com です。

    2. ダウンロードページから rekor-cli ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    3. ワークステーションでターミナルから、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip rekor-cli-amd64.gz
      chmod +x rekor-cli-amd64
      Copy to Clipboard Toggle word wrap

    4. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv rekor-cli-amd64 /usr/local/bin/rekor-cli
      Copy to Clipboard Toggle word wrap

  2. ローカルコマンドラインインターフェイス (CLI) ツールのダウンロードページから tuftool バイナリーをワークステーションにダウンロードします。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ダウンロードページから、tuftool のダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルから、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip tuftool-amd64.gz
      chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  3. シェル変数をベースホスト名と Rekor URL に割り当てます。

    export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE
    export REKOR_URL=https://rekor.${BASE_HOSTNAME}
    Copy to Clipboard Toggle word wrap

    BASE_HOSTNAME_OF_RHTAS_SERVICEtas_single_node_base_hostname 変数の値に置き換えます。

  4. アクティブシャードのログツリー識別子を取得します。

    export OLD_TREE_ID=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .TreeID)
    Copy to Clipboard Toggle word wrap

  5. シェル環境を設定します。

    export MANAGED_NODE_IP=IP_OF_ANSIBLE_MANAGED_NODE
    export MANAGED_NODE_SSH_USER=USER_TO_CONNECT_TO_MANAGED_NODE
    export REMOTE_KEYS_VOLUME=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman volume mount tuf-signing-keys" | tr -d '[:space:]')
    export REMOTE_TUF_VOLUME=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman volume mount tuf-repository" | tr -d '[:space:]')
    Copy to Clipboard Toggle word wrap

    IP_OF_ANSIBLE_MANAGED_NODEUSER_TO_CONNECT_TO_MANAGED_NODE をご使用の環境の値に置き換えます。

  6. ログツリーを DRAINING 状態に設定します。

    ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman run --network=rhtas --rm registry.redhat.io/rhtas/updatetree-rhel9:1.1.0 --admin_server=trillian-logserver-pod:8091 --tree_id=${OLD_TREE_ID} --tree_state=DRAINING"
    Copy to Clipboard Toggle word wrap

    ツリーログは、drain の実行中に新しいエントリーを受け入れません。キューが空になるまで待ちます。

    重要

    次のステップに進む前に、キューが空になるまで待つ必要があります。drain の実行中にリーフがまだ統合中の場合、このプロセス中にログツリーをフリーズすると、ログパスが最大マージ遅延 (MMD) しきい値を超える可能性があります。

  7. ログツリーをフリーズします。

    ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman run --network=rhtas --rm registry.redhat.io/rhtas/updatetree-rhel9:1.1.0 --tree_id=${OLD_TREE_ID} --admin_server=trillian-logserver-pod:8091 --tree_state=FROZEN"
    Copy to Clipboard Toggle word wrap

  8. フリーズしたログツリーの長さを取得します。

    export OLD_SHARD_LENGTH=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .ActiveTreeSize)
    Copy to Clipboard Toggle word wrap

  9. 古いシャードの Rekor の公開鍵を取得します。

    export OLD_PUBLIC_KEY=$(curl -s $REKOR_URL/api/v1/log/publicKey | base64 | tr -d '\n')
    Copy to Clipboard Toggle word wrap

  10. 新しいログツリーを作成します。

    export NEW_TREE_ID=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman run -q --network=rhtas --rm registry.redhat.io/rhtas/createtree-rhel9:1.1.0 --logtostderr=false --admin_server=trillian-logserver-pod:8091 --display_name=rekor-tree | tr -d '[:punct:][:blank:][:cntrl:]'")
    Copy to Clipboard Toggle word wrap

    これで、ログツリーが 2 つ、フリーズしたツリーが 1 つ、およびアクティブなシャードになる新しいツリーが 1 つできました。

  11. 新しい秘密鍵と関連する公開鍵を作成します。

    openssl ecparam -genkey -name secp384r1 -noout -out new-rekor.pem
    openssl ec -in new-rekor.pem -pubout -out new-rekor.pub
    export NEW_KEY_NAME=new-rekor.pub
    Copy to Clipboard Toggle word wrap

    重要

    新しい鍵には一意のファイル名が必要です。

  12. アクティブな Rekor 署名鍵を取得し、その鍵をファイルに保存します。

    rsync --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:/etc/rhtas/certs/rekor-signer0.key ./rekor-signer0.key
    echo "$OLD_PUBLIC_KEY" | base64 -d > rekor.pub
    Copy to Clipboard Toggle word wrap

  13. RHTAS Ansible Playbook で Rekor 設定を更新します。

    tas_single_node_rekor:
      active_signer_id: "new-rekor-key"
      active_tree_id: NEW_TREE_ID
      private_keys:
        - id: "new-rekor-key"
          key: |
            {{ lookup('file', 'new-rekor.pem') }}
        - id: "private-0"
          key: |
            {{ lookup('file', 'rekor-signer0.key') }}
      public_keys:
        - id: "new-rekor-pubkey"
          key: |
            {{ lookup('file', 'new-rekor.pub') }}
        - id: "public-0"
          key: |
            {{ lookup('file', 'rekor.pub') }}
      sharding_config:
        - tree_id: OLD_TREE_ID
          tree_length: OLD_SHARD_LENGTH
          pem_pub_key: "public-0"
    Copy to Clipboard Toggle word wrap

  14. 新しい Rekor 公開鍵を使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      export WORK="${HOME}/trustroot-example"
      export ROOT="${WORK}/root/root.json"
      export KEYDIR="${WORK}/keys"
      export INPUT="${WORK}/input"
      export TUF_REPO="${WORK}/tuf-repo"
      export TUF_URL="https://tuf.${BASE_HOSTNAME}"
      Copy to Clipboard Toggle word wrap

    2. 一時的な TUF ディレクトリー構造を作成します。

      mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    3. TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。

      rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:"${REMOTE_KEYS_VOLUME}/" "${KEYDIR}"
      rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:"${REMOTE_TUF_VOLUME}/" "${TUF_REPO}"
      cp "${TUF_REPO}/root.json" "${ROOT}"
      Copy to Clipboard Toggle word wrap

    4. アクティブな Rekor 署名者キーファイル名に環境変数を割り当てます。

      export ACTIVE_KEY_NAME=rekor.pub
      Copy to Clipboard Toggle word wrap

    5. 古い Rekor 署名者鍵を期限切れにします。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-rekor-target "${ACTIVE_KEY_NAME}" \
        --rekor-uri "${REKOR_URL}" \
        --rekor-status "Expired" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    6. 新しい Rekor 署名者鍵を追加します。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-rekor-target "${NEW_KEY_NAME}" \
        --rekor-uri "${REKOR_URL}" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    7. 更新された TUF リポジトリーの圧縮アーカイブファイルを作成します。

      tar -C "${WORK}" -czvf repository.tar.gz tuf-repo
      Copy to Clipboard Toggle word wrap

    8. 新しい圧縮アーカイブファイル名を tas_single_node_trust_root 変数に追加して、RHTAS Ansible Playbook を更新します。

      tas_single_node_trust_root:
        full_archive: "{{ lookup('file', 'repository.tar.gz') | b64encode }}"
      Copy to Clipboard Toggle word wrap

    9. 作業ディレクトリーを削除します。

      rm -r $WORK
      Copy to Clipboard Toggle word wrap

  15. 変更を適用するには、RHTAS Ansible Playbook を実行します。

    ansible-playbook -i inventory play.yml
    Copy to Clipboard Toggle word wrap

  16. 更新された TUF 設定で cosign 設定を更新します。

    cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
    Copy to Clipboard Toggle word wrap

    これで、新しい Rekor 署名者鍵を使用してアーティファクトに署名し、検証する準備が整いました。

2.3.2. Certificate Transparency ログ署名者アギのローテーション

シャーディング機能を使用してログツリーをフリーズし、新しい署名者鍵を使用して新しいログツリーを作成することにより、Certificate Transparency (CT) ログ署名者鍵をプロアクティブにローテーションできます。この手順では、古い CT ログ署名者鍵を期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用する新しい署名者鍵に置き換える手順を説明します。古い CT ログ署名者鍵の有効期限が切れても、古い鍵で署名されたアーティファクトを検証することは可能です。

前提条件

  • Ansible 管理の Red Hat Enterprise Linux 上で実行される RHTAS のインストール。
  • rsyncopensslcosign バイナリーがインストールされたワークステーション。
  • 管理対象ノードに対するルートレベルの権限を持つ、管理対象ノードへの SSH 接続。

手順

  1. ローカルコマンドラインインターフェイス (CLI) ツールのダウンロードページから tuftool バイナリーをワークステーションにダウンロードします。

    注記

    URL アドレスは、tas_single_node_base_hostname 変数によって定義された設定済みノードです。tas_single_node_base_hostname の値が example.com の場合、URL アドレスの例は https://cli-server.example.com です。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ダウンロードページから、tuftool のダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip tuftool-amd64.gz
      chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  2. シェル環境を設定します。

    export MANAGED_NODE_IP=IP_OF_ANSIBLE_MANAGED_NODE
    export MANAGED_NODE_SSH_USER=USER_TO_CONNECT_TO_MANAGED_NODE
    export REMOTE_KEYS_VOLUME=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman volume mount tuf-signing-keys" | tr -d '[:space:]')
    export REMOTE_TUF_VOLUME=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman volume mount tuf-repository" | tr -d '[:space:]')
    export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE
    Copy to Clipboard Toggle word wrap

    BASE_HOSTNAME_OF_RHTAS_SERVICEtas_single_node_base_hostname 変数の値に置き換えます。

  3. CTlog configuration map、CTlog キー、および Fulcio ルート証明書をワークステーションにダウンロードします。

    rsync --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:/etc/rhtas/configs/ctlog-config.yaml ./ctlog-config.yaml
    rsync --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:/etc/rhtas/certs/ctlog0.key ./ctfe.key
    rsync --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:/etc/rhtas/certs/ctlog0.pub ./ctfe.pub
    rsync --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:/etc/rhtas/certs/fulcio.pem ./fulcio-0.pem
    Copy to Clipboard Toggle word wrap

  4. 現在のツリー識別子を取得します。

    export OLD_TREE_ID=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo cat /etc/rhtas/configs/ctlog-treeid-config.yaml | grep 'tree_id:' | awk '{print \$2}'" | tr -d '[:punct:][:blank:][:cntrl:]')
    Copy to Clipboard Toggle word wrap

  5. ログツリーを DRAINING 状態に設定します。

    ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman run --network=rhtas --rm registry.redhat.io/rhtas/updatetree-rhel9:1.1.0 --tree_id=${OLD_TREE_ID} --admin_server=trillian-logserver-pod:8091 --tree_state=DRAINING"
    Copy to Clipboard Toggle word wrap

    ツリーログは、drain の実行中に新しいエントリーを受け入れません。キューが空になるまで待ちます。

    重要

    次のステップに進む前に、キューが空になるまで待つ必要があります。drain の実行中にリーフがまだ統合中の場合、このプロセス中にログツリーをフリーズすると、ログパスが最大マージ遅延 (MMD) しきい値を超える可能性があります。

  6. キューが完全に空になったら、ログをフリーズします。

    ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman run --network=rhtas --rm registry.redhat.io/rhtas/updatetree-rhel9:1.1.0 --tree_id=${OLD_TREE_ID} --admin_server=trillian-logserver-pod:8091 --tree_state=FROZEN"
    Copy to Clipboard Toggle word wrap

  7. 新しい Merkle ツリーを作成し、新しいツリー識別子を取得します。

    export NEW_TREE_ID=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman run -q --network=rhtas --rm registry.redhat.io/rhtas/createtree-rhel9:1.1.0 --logtostderr=false --admin_server=trillian-logserver-pod:8091 --display_name=ctlog-tree" | tr -d '[:punct:][:blank:][:cntrl:]')
    Copy to Clipboard Toggle word wrap

  8. 新しい証明書と新しい公開鍵および秘密鍵を生成します。

    openssl ecparam -genkey -name prime256v1 -noout -out new-ctlog.pem
    openssl ec -in new-ctlog.pem -pubout -out new-ctlog-public.pem
    openssl ec -in new-ctlog.pem -out new-ctlog.pass.pem -des3 -passout pass:"CHANGE_ME"
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しいパスワードに置き換えます。

    重要

    証明書と新しい鍵には一意のファイル名が必要です。

  9. CT ログ設定を更新します。

    1. RHTAS Ansible Playbook を開いて編集します。
    2. CTlog 署名者キーのローテーションを初めて設定する場合は、tas_single_node_ctlog.sharding_config セクションに以下を追加する必要があります。

      tas_single_node_ctlog:
        sharding_config:
          - treeid: OLD_TREE_ID # frozen log
            prefix: "rhtasansible"
            private_key: "private-0"
            password: "rhtas"
            root_pem_file: "/ctfe-keys/fulcio-0"
            not_after_limit:
              seconds: 1728056285
              nanos: 012111000
      Copy to Clipboard Toggle word wrap

      OLD_TREE_ID は、$OLD_TREE_ID 環境変数に含まれる内容に置き換えます。

      注記

      date +%s、および date +%N のコマンドを実行すると、秒とナノ秒の現在の時刻値を取得できます。

      重要

      not_after_limit フィールドは、フリーズされたログだけのタイムスタンプ範囲の終了を定義します。この時点以降の証明書は、このログに含めることができなくなります。

    3. フリーズされたログブロックをコピーして貼り付け、tas_single_node_ctlog.sharding_config セクションに追加して、新しいエントリーを作成します。
    4. 新しいログブロック内の次の行を変更します。treeid を新しいツリー識別子に設定します。prefixtrusted-artifact-signer に、private_key パスは private-1 に、not_after_limitnot_after_start に変更してタイムスタンプの範囲を設定し、Fulcio が新しいログを利用できるように tas_single_node_fulcio.ct_log_prefix を更新します。

      tas_single_node_ctlog:
        sharding_config:
           ... # frozen log
           - treeid: NEW_TREE_ID # new active log
             prefix: "trusted-artifact-signer"
             private_key: "private-1"
             password: "CHANGE_ME"
             root_pem_file: "/ctfe-keys/fulcio-0"
             not_after_start:
               seconds: 1713201754
               nanos: 155663000
      tas_single_node_fulcio:
        ct_log_prefix: "trusted-artifact-signer"
      Copy to Clipboard Toggle word wrap

      CHANGE_ME は、新しい秘密鍵のパスワードに置き換えます。ここでのパスワードは、新しい秘密鍵と公開鍵を生成するために使用したパスワードと同じものに指定する必要があります。

      重要

      not_after_start フィールドは、タイムスタンプ範囲の開始 (開始地点を含む) を定義します。これは、この時点でログが証明書の受け入れを開始することを意味します。

  10. CTlog の tas_single_node_ctlog セクションを更新して、新しいキーを管理対象ノードに配布します。

    tas_single_node_ctlog:
      ...
      private_keys:
        - id: private-0
          key: |
            {{ lookup('file', 'ctfe.key') }}
        - id: private-1
          key: |
            {{ lookup('file', 'new-ctlog.pass.pem') }}
      public_keys:
        - id: public-0
          key: |
            {{ lookup('file', 'ctfe.pub') }}
        - id: public-1
          key: |
            {{ lookup('file', 'new-ctlog-public.pem') }}
    Copy to Clipboard Toggle word wrap

  11. 新しい CT ログ公開鍵を使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      export WORK="${HOME}/trustroot-example"
      export ROOT="${WORK}/root/root.json"
      export KEYDIR="${WORK}/keys"
      export INPUT="${WORK}/input"
      export TUF_REPO="${WORK}/tuf-repo"
      export TUF_URL="https://tuf.${BASE_HOSTNAME}"
      Copy to Clipboard Toggle word wrap

    2. 一時的な TUF ディレクトリー構造を作成します。

      mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    3. TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。

      rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:"${REMOTE_KEYS_VOLUME}/" "${KEYDIR}"
      rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:"${REMOTE_TUF_VOLUME}/" "${TUF_REPO}"
      cp "${TUF_REPO}/root.json" "${ROOT}"
      Copy to Clipboard Toggle word wrap

    4. アクティブな CT ログ署名者キーファイル名に環境変数を割り当てます。

      export ACTIVE_CTFE_NAME=ctfe.pub
      Copy to Clipboard Toggle word wrap

    5. 古い CT ログ署名者鍵を期限切れにします。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-ctlog-target "$ACTIVE_CTFE_NAME" \
        --ctlog-uri "https://ctlog.rhtas" \
        --ctlog-status "Expired" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    6. 新しい CT ログ署名者鍵を追加します。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-ctlog-target "new-ctlog-public.pem" \
        --ctlog-uri "https://ctlog.rhtas" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    7. 更新された TUF リポジトリーの圧縮アーカイブファイルを作成します。

      tar -C "${WORK}" -czvf repository.tar.gz tuf-repo
      Copy to Clipboard Toggle word wrap

    8. 新しい圧縮アーカイブファイル名を tas_single_node_trust_root 変数に追加して、RHTAS Ansible Playbook を更新します。

      tas_single_node_trust_root:
        full_archive: "{{ lookup('file', 'repository.tar.gz') | b64encode }}"
      Copy to Clipboard Toggle word wrap

    9. Playbook への変更を保存し、テキストエディターを閉じます。
  12. RHTAS Ansible Playbook を実行して変更を適用します。

    ansible-playbook -i inventory play.yml
    Copy to Clipboard Toggle word wrap

  13. 作業ディレクトリーを削除します。

    rm -r $WORK
    Copy to Clipboard Toggle word wrap

  14. 更新された TUF 設定で cosign 設定を更新します。

    cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
    Copy to Clipboard Toggle word wrap

    これで、新しい CT ログ署名者鍵を使用してアーティファクトに署名し、検証する準備が整いました。

2.3.3. Fulcio 証明書のローテーション

Fulcio サービスで使用される証明書をプロアクティブにローテーションできます。この手順では、古い Fulcio 証明書の有効期限を切れさせ、Red Hat Trusted Artifact Signer (RHTAS) が使用できるように新しい証明書に置き換える手順を説明します。古い Fulcio 証明書の有効期限が切れても、古い証明書で署名されたアーティファクトを検証することは可能です。

前提条件

  • Ansible 管理の Red Hat Enterprise Linux 上で実行される RHTAS のインストール。
  • rsyncopensslcosign バイナリーがインストールされたワークステーション。
  • 管理対象ノードに対するルートレベルの権限を持つ、管理対象ノードへの SSH 接続。

手順

  1. ローカルコマンドラインインターフェイス (CLI) ツールのダウンロードページから tuftool バイナリーをワークステーションにダウンロードします。

    注記

    URL アドレスは、tas_single_node_base_hostname 変数によって定義された設定済みノードです。tas_single_node_base_hostname の値が example.com の場合、URL アドレスの例は https://cli-server.example.com です。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ダウンロードページから、tuftool のダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip tuftool-amd64.gz
      chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  2. 新しい証明書と新しい公開鍵および秘密鍵を生成します。

    openssl ecparam -genkey -name prime256v1 -noout -out new-fulcio.pem
    openssl ec -in new-fulcio.pem -pubout -out new-fulcio-public.pem
    openssl ec -in new-fulcio.pem -out new-fulcio.pass.pem -des3 -passout pass:"CHANGE_ME"
    openssl req -new -x509 -key new-fulcio.pass.pem -out new-fulcio.cert.pem
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しいパスワードに置き換えます。

    重要

    証明書と新しい鍵には一意のファイル名が必要です。

  3. 新しい秘密鍵ファイル名、新しい証明書の内容、およびパスワードを tas_single_node_fulcio 変数に追加して、RHTAS Ansible Playbook を更新します。

    tas_single_node_fulcio:
      root_ca: "{{ lookup('file', 'new-fulcio.cert.pem') }}"
      private_key: "{{ lookup('file', 'new-fulcio.pass.pem') }}"
      ca_passphrase: CHANGE_ME
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しいパスワードに置き換えます。

    注記

    ここでのパスワードは、新しい秘密鍵と公開鍵を生成するために使用したパスワードと同じものに指定する必要があります。

    注記

    パスフレーズはファイルから取得するか、Ansible Vault を使用して暗号化することを推奨します。

  4. 新しい Fulcio 証明書を使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      export WORK="${HOME}/trustroot-example"
      export ROOT="${WORK}/root/root.json"
      export KEYDIR="${WORK}/keys"
      export INPUT="${WORK}/input"
      export TUF_REPO="${WORK}/tuf-repo"
      export TUF_URL="https://tuf.${BASE_HOSTNAME}"
      export MANAGED_NODE_IP=IP_OF_ANSIBLE_MANAGED_NODE
      export MANAGED_NODE_SSH_USER=USER_TO_CONNECT_TO_MANAGED_NODE
      export REMOTE_KEYS_VOLUME=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman volume mount tuf-signing-keys" | tr -d '[:space:]')
      export REMOTE_TUF_VOLUME=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman volume mount tuf-repository" | tr -d '[:space:]')
      Copy to Clipboard Toggle word wrap

    2. 一時的な TUF ディレクトリー構造を作成します。

      mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    3. TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。

      rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:"${REMOTE_KEYS_VOLUME}/" "${KEYDIR}"
      rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:"${REMOTE_TUF_VOLUME}/" "${TUF_REPO}"
      cp "${TUF_REPO}/root.json" "${ROOT}"
      Copy to Clipboard Toggle word wrap

    4. アクティブな Fulcio 証明書ファイル名を見つけます。ローカル TUF リポジトリー内の最新のターゲットファイル (例: 1.targets.json) を開きます。このファイルには、アクティブな Fulcio 証明書ファイル名 (例: fulcio_v1.crt.pem) が記載されています。このアクティブな Fulcio 証明書ファイル名で環境変数を設定します。

      export ACTIVE_CERT_NAME=fulcio_v1.crt.pem
      Copy to Clipboard Toggle word wrap

    5. 管理対象ノードからアクティブな Fulico 証明書を取得します。

      rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:/etc/rhtas/certs/fulcio.pem "${ACTIVE_CERT_NAME}"
      Copy to Clipboard Toggle word wrap

    6. 古い証明書を期限切れにします。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-fulcio-target "$ACTIVE_CERT_NAME" \
        --fulcio-uri "https://fulcio.rhtas" \
        --fulcio-status "Expired" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    7. 新しい Fulcio 証明書を追加します。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-fulcio-target "new-fulcio.cert.pem" \
        --fulcio-uri "https://fulcio.rhtas" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    8. 更新された TUF リポジトリーの圧縮アーカイブファイルを作成します。

      tar -C "${WORK}" -czvf repository.tar.gz tuf-repo
      Copy to Clipboard Toggle word wrap

    9. 新しい圧縮アーカイブファイルの内容を tas_single_node_trust_root 変数に追加して、RHTAS Ansible Playbook を更新します。

      tas_single_node_trust_root:
        full_archive: "{{ lookup('file', 'repository.tar.gz') | b64encode }}"
      Copy to Clipboard Toggle word wrap

    10. 作業ディレクトリーを削除します。

      rm -r $WORK
      Copy to Clipboard Toggle word wrap

  5. 変更を適用するには、RHTAS Ansible Playbook を実行します。

    ansible-playbook -i inventory play.yml
    Copy to Clipboard Toggle word wrap

  6. 更新された TUF 設定で cosign 設定を更新します。

    cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
    Copy to Clipboard Toggle word wrap

    これで、新しい Fulcio 証明書を使用してアーティファクトに署名し、検証する準備が整いました。

2.3.4. タイムスタンプ機関の署名者鍵と証明書チェーンのローテーション

タイムスタンプ機関 (TSA) の署名者鍵と証明書チェーンをプロアクティブにローテーションできます。この手順では、古い TSA 署名者鍵と証明書チェーンを期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用できるように新しいものに置き換える手順を説明します。古い TSA 署名者鍵と証明書チェーンを期限切れにしても、古い鍵と証明書チェーンによって署名されたアーティファクトを検証することは可能です。

前提条件

  • Ansible 管理の Red Hat Enterprise Linux 上で実行される RHTAS のインストール。
  • rsyncopensslcosign バイナリーがインストールされたワークステーション。
  • 管理対象ノードに対するルートレベルの権限を持つ、管理対象ノードへの SSH 接続。

手順

  1. ローカルコマンドラインインターフェイス (CLI) ツールのダウンロードページから tuftool バイナリーをワークステーションにダウンロードします。

    注記

    URL アドレスは、tas_single_node_base_hostname 変数によって定義された設定済みノードです。tas_single_node_base_hostname の値が example.com の場合、URL アドレスの例は https://cli-server.example.com です。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ダウンロードページから、tuftool のダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip tuftool-amd64.gz
      chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  2. 新しい証明書チェーンと新しい署名者鍵を生成します。

    重要

    新しい証明書と鍵には一意のファイル名が必要です。

    1. 一時作業ディレクトリーを作成します。

      mkdir certs && cd certs
      Copy to Clipboard Toggle word wrap

    2. ルート認証局 (CA) の秘密鍵を作成し、パスワードを設定します。

      openssl req -x509 -newkey rsa:2048 -days 365 -sha256 -nodes \
      -keyout rootCA.key.pem -out rootCA.crt.pem \
      -passout pass:"CHANGE_ME" \
      -subj "/C=CC/ST=state/L=Locality/O=RH/OU=RootCA/CN=RootCA" \
      -addext "basicConstraints=CA:true" -addext "keyUsage=cRLSign, keyCertSign"
      Copy to Clipboard Toggle word wrap

      CHANGE_ME は、新しいパスワードに置き換えます。

    3. 中間 CA 秘密鍵と証明書署名要求 (CSR) を作成し、パスワードを設定します。

      openssl req -newkey rsa:2048 -sha256 \
      -keyout intermediateCA.key.pem -out intermediateCA.csr.pem \
      -passout pass:"CHANGE_ME" \
      -subj "/C=CC/ST=state/L=Locality/O=RH/OU=IntermediateCA/CN=IntermediateCA"
      Copy to Clipboard Toggle word wrap

      CHANGE_ME は、新しいパスワードに置き換えます。

    4. ルート CA を使用して中間 CA 証明書に署名します。

      openssl x509 -req -in intermediateCA.csr.pem -CA rootCA.crt.pem -CAkey rootCA.key.pem \
      -CAcreateserial -out intermediateCA.crt.pem -days 365 -sha256 \
      -extfile <(echo -e "basicConstraints=CA:true\nkeyUsage=cRLSign, keyCertSign\nextendedKeyUsage=critical,timeStamping") \
      -passin pass:"CHANGE_ME"
      Copy to Clipboard Toggle word wrap

      中間 CA 証明書に署名するには、CHANGE_ME をルート CA 秘密鍵のパスワードに置き換えます。

    5. リーフ CA の秘密鍵と CSR を作成し、パスワードを設定します。

      openssl req -newkey rsa:2048 -sha256 \
      -keyout leafCA.key.pem -out leafCA.csr.pem \
      -passout pass:"CHANGE_ME" \
      -subj "/C=CC/ST=state/L=Locality/O=RH/OU=LeafCA/CN=LeafCA"
      Copy to Clipboard Toggle word wrap

    6. 中間 CA を使用してリーフ CA 証明書に署名します。

      openssl x509 -req -in leafCA.csr.pem -CA intermediateCA.crt.pem -CAkey intermediateCA.key.pem \
        -CAcreateserial -out leafCA.crt.pem -days 365 -sha256 \
        -extfile <(echo -e "basicConstraints=CA:false\nkeyUsage=cRLSign, keyCertSign\nextendedKeyUsage=critical,timeStamping") \
        -passin pass:"CHANGE_ME"
      Copy to Clipboard Toggle word wrap

      リーフ CA 証明書に署名するには、CHANGE_ME を中間 CA 秘密鍵のパスワードに置き換えます。

    7. 新しく作成した証明書を組み合わせて証明書チェーンを作成します。

      cat leafCA.crt.pem intermediateCA.crt.pem rootCA.crt.pem > new-tsa.certchain.pem
      Copy to Clipboard Toggle word wrap

  3. 新しい証明書チェーン、秘密鍵、およびパスワードを使用して RHTAS Playbook を更新します。

    tas_single_node_tsa:
      certificate_chain: "{{ lookup('file', 'new-tsa.certchain.pem') }}"
      signer_private_key: "{{ lookup('file', 'leafCA.key.pem') }}"
      ca_passphrase: CHANGE_ME
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、リーフ CA 秘密鍵のパスワードに置き換えます。

    注記

    Red Hat では、パスフレーズをファイルから取得するか、Ansible Vault を使用して暗号化することを推奨しています。

  4. アクティブな TSA 証明書ファイル名、TSA URL 文字列を見つけて、次の値を使用してシェル環境を設定します。

    export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE
    export ACTIVE_CERT_CHAIN_NAME=tsa.certchain.pem
    export TSA_URL=https://tsa.${BASE_HOSTNAME}/api/v1/timestamp
    curl $TSA_URL/certchain -o $ACTIVE_CERT_CHAIN_NAME
    Copy to Clipboard Toggle word wrap

  5. 新しい TSA 証明書チェーンを使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      export WORK="${HOME}/trustroot-example"
      export ROOT="${WORK}/root/root.json"
      export KEYDIR="${WORK}/keys"
      export INPUT="${WORK}/input"
      export TUF_REPO="${WORK}/tuf-repo"
      export TUF_URL="https://tuf.${BASE_HOSTNAME}"
      export MANAGED_NODE_IP=IP_OF_ANSIBLE_MANAGED_NODE
      export MANAGED_NODE_SSH_USER=USER_TO_CONNECT_TO_MANAGED_NODE
      export NEW_CERT_CHAIN_NAME=new-tsa.certchain.pem
      Copy to Clipboard Toggle word wrap

    2. 一時的な TUF ディレクトリー構造を作成します。

      mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    3. TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。

      export REMOTE_KEYS_VOLUME=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman volume mount tuf-signing-keys" | tr -d '[:space:]')
      export REMOTE_TUF_VOLUME=$(ssh ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP} -t "sudo podman volume mount tuf-repository" | tr -d '[:space:]')
      rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:"${REMOTE_KEYS_VOLUME}/" "${KEYDIR}"
      rsync -r --rsync-path="sudo rsync" ${MANAGED_NODE_SSH_USER}@${MANAGED_NODE_IP}:"${REMOTE_TUF_VOLUME}/" "${TUF_REPO}"
      cp "${TUF_REPO}/root.json" "${ROOT}"
      Copy to Clipboard Toggle word wrap

    4. 古い TSA 証明書を期限切れにします。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-tsa-target "$ACTIVE_CERT_CHAIN_NAME" \
        --tsa-uri "$TSA_URL" \
        --tsa-status "Expired" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    5. 新しい TSA 証明書を追加します。

      tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-tsa-target "$NEW_CERT_CHAIN_NAME" \
        --tsa-uri "$TSA_URL" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    6. 更新された TUF リポジトリーの圧縮アーカイブファイルを作成します。

      tar -C "${WORK}" -czvf repository.tar.gz tuf-repo
      Copy to Clipboard Toggle word wrap

    7. 新しい圧縮アーカイブファイル名を tas_single_node_trust_root 変数に追加して、RHTAS Ansible Playbook を更新します。

      tas_single_node_trust_root:
        full_archive: "{{ lookup('file', 'repository.tar.gz') | b64encode }}"
      Copy to Clipboard Toggle word wrap

    8. 作業ディレクトリーを削除します。

      rm -r $WORK
      Copy to Clipboard Toggle word wrap

  6. 変更を適用するには、RHTAS Ansible Playbook を実行します。

    ansible-playbook -i inventory play.yml
    Copy to Clipboard Toggle word wrap

  7. 更新された TUF 設定で cosign 設定を更新します。

    cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
    Copy to Clipboard Toggle word wrap

    これで、新しい TSA 署名者鍵と証明書を使用するアーティファクトに署名して検証する準備が整いました。

2.4. 独自の認証局バンドルの使用

Red Hat の Trusted Artifact Signer (RHTAS) サービスを使用して、ビルドアーティファクトの署名と検証に組織の認証局 (CA) バンドルを使用できます。

前提条件

  • Ansible 管理の Red Hat Enterprise Linux 上で実行される RHTAS のインストール。
  • CA ルート証明書。

手順

  1. RHTAS Ansible Playbook を開いて編集します。
  2. tas_single_node_fulcio セクションで、カスタム CA バンドルファイルを使用して、trusted_ca を更新します。

    ...
    tas_single_node_fulcio:
      trusted_ca: "{{ lookup('file', 'ca-bundle.crt') }}"
    ...
    Copy to Clipboard Toggle word wrap

    重要

    証明書ファイル名は ca-bundle.crt である必要があります。

  3. 保存してエディターを終了します。
  4. 変更を適用するには、RHTAS Ansible Playbook を実行します。

    $ ansible-playbook -i inventory play.yml
    Copy to Clipboard Toggle word wrap

第3章 オフライン環境で署名されたアーティファクトを検証する

場合によっては、アーティファクトの信頼性を検証する必要がありますが、そのアーティファクトに署名した Red Hat Trusted Artifact Signer (RHTAS) サービスにアクセスできないことがあります。このような場合でも、オフライン検証を行うことでアーティファクトの署名を検証できます。

オフラインでのアーティファクト検証を開始する前に、RHTAS 署名環境とイメージレジストリーへのアクセスが必要です。オフライン環境では、署名環境と同じイメージレジストリーへのアクセスのみが必要です。

前提条件

  • Red Hat OpenShift Container Platform 上、または Ansible 管理の Red Hat Enterprise Linux (RHEL) 上で実行される RHTAS のインストール。
  • cosigntuftooltarsha256sum バイナリーがインストールされたワークステーション。
  • 現在の署名環境での cosign の初期化。

手順

  1. 署名環境で、次の手順を実行します。

    1. cosign を使用してイメージに署名します。

      構文

      cosign sign IMAGE_NAME:TAG
      Copy to Clipboard Toggle word wrap

      cosign sign -y ttl.sh/rhtas/example-image:1h
      Copy to Clipboard Toggle word wrap

    2. 信頼ルート URL を取得します。

      1. Red Hat Enterprise Linux 上の RHTAS デプロイメントの場合:

        export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE
        export TUF_SERVER_URL=https://tuf.${BASE_HOSTNAME}
        Copy to Clipboard Toggle word wrap

      2. Red Hat OpenShift Container Platform 上の RHTAS デプロイメントの場合:

        export TUF_SERVER_URL="$(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer)"
        Copy to Clipboard Toggle word wrap

    3. 信頼ルートのクローンをローカルに作成します。

      export TUF_REPOSITORY="${HOME}/repository"
      tuftool clone --allow-root-download --metadata-dir "${TUF_REPOSITORY}" --targets-dir "${TUF_REPOSITORY}/targets" --metadata-url "${TUF_SERVER_URL}" --targets-url "${TUF_SERVER_URL}/targets"
      Copy to Clipboard Toggle word wrap

    4. 信頼ルートの圧縮アーカイブファイルを作成します。

      tar -czvf repository.tar.gz "${TUF_REPOSITORY}"
      sha256sum repository.tar.gz
      Copy to Clipboard Toggle word wrap

      後でオフライン環境で使用するために、チェックサムの出力をメモしておきます。

    5. 圧縮されたアーカイブファイルをオフライン環境にコピーします。

      重要

      The Update Framework (TUF) メタデータファイルを更新するたび、または RHTAS コンポーネントキーと証明書をローテーションするたびに、Trust Root の圧縮アーカイブファイルをコピーする必要があります。

  2. オフライン環境では、次の手順を実行します。

    1. 信頼ルートの圧縮アーカイブファイルをコピーしたディレクトリーに変更します。
    2. 署名環境のチェックサム値を使用してチェックサムを検証します。

      echo "SHA256_CHECKSUM repository.tar.gz" > checksum.txt
      sha256sum --check checksum.txt || echo "Archive integrity compromised, don't continue with the procedure\!"
      Copy to Clipboard Toggle word wrap

      重要

      整合性チェックが成功した場合のみ続行します。

    3. 圧縮されたアーカイブファイルを展開します。

      tar -xzvf repository.tar.gz
      Copy to Clipboard Toggle word wrap

  3. cosign を初期化します。

    cd repository/
    cosign initialize --mirror=file://$(pwd)/ --root=$(pwd)/1.root.json
    Copy to Clipboard Toggle word wrap

  4. 署名されたアーティファクトを検証します。

    export IMAGE="IMAGE_NAME:TAG"
    export SIGNING_EMAIL_ADDR=SIGNING_EMAIL_ADDRESS
    export SIGNING_OIDC_ISSUER=OIDC_ISSUER_URL
    cosign verify --certificate-identity="${SIGNING_EMAIL_ADDR}" --certificate-oidc-issuer="${SIGNING_OIDC_ISSUER}" "${IMAGE}"
    Copy to Clipboard Toggle word wrap

付録A 所有者参照の復元スクリプト

この Bash スクリプトは、Red Hat Trusted Artifact Signer (RHTAS) データを別の OpenShift クラスターに復元するときに、ownerReferences を復元するためのものです。

#!/bin/bash

# List of resources to check
RESOURCES=("Fulcio" "Rekor" "Trillian" "TimestampAuthority" "CTlog" "Tuf")


function validate_owner() {
    local RESOURCE=$1
    local ITEM=$2
    local OWNER_NAME=$3

    # Check all the labels exist and are the same
    LABELS=("app.kubernetes.io/instance" "app.kubernetes.io/part-of" "velero.io/backup-name" "velero.io/restore-name")
    for LABEL in "${LABELS[@]}"; do
        PARENT_LABEL=$(oc get Securesign "$OWNER_NAME" -o json | jq -r ".metadata.labels[\"$LABEL\"]")
        CHILD_LABEL=$(oc get $RESOURCE "$ITEM" -o json | jq -r ".metadata.labels[\"$LABEL\"]")

        if [[ -z "$CHILD_LABEL" || $CHILD_LABEL == "null" ]]; then
            echo "  $LABEL label missing in $RESOURCE"
            return 1
        elif [[ -z "$PARENT_LABEL" || $PARENT_LABEL == "null" ]]; then
            echo "  $LABEL label missing in Securesign"
            return 1
        elif [[ "$CHILD_LABEL" != "$PARENT_LABEL" ]]; then
            echo "  $LABEL labels not matching: $CHILD_LABEL != $PARENT_LABEL"
            return 1
        fi
    done

    return 0
}


for RESOURCE in "${RESOURCES[@]}"; do
    echo "Checking $RESOURCE ..."

    # Get all resources missing ownerReferences
    MISSING_REFS=$(oc get $RESOURCE -o json | jq -r '.items[] | select(.metadata.ownerReferences == null) | .metadata.name')

    for ITEM in $MISSING_REFS; do
        echo "  Missing ownerReferences in $RESOURCE/$ITEM"

        # Find the expected owner based on labels
        OWNER_NAME=$(oc get $RESOURCE "$ITEM" -o json | jq -r '.metadata.labels["app.kubernetes.io/name"]')

        if [[ -z "$OWNER_NAME" || "$OWNER_NAME" == "null" ]]; then
            echo "  Skipping $RESOURCE/$ITEM: name not found in labels"
            continue
        fi

        if ! validate_owner $RESOURCE $ITEM $OWNER_NAME; then
          echo "  Skipping ..."
          continue
        fi

        # Try to get the owner's UID from Securesign
        OWNER_UID=$(oc get Securesign "$OWNER_NAME" -o jsonpath='{.metadata.uid}' 2>/dev/null)

        if [[ -z "$OWNER_UID" || "$OWNER_UID" == "null" ]]; then
            echo "  Failed to find Securesign/$OWNER_NAME UID, skipping ..."
            continue
        fi

        echo "  Found owner: Securesign/$OWNER_NAME (UID: $OWNER_UID)"

        # Patch the object with the restored ownerReference
        oc patch $RESOURCE "$ITEM" --type='merge' -p "{
          \"metadata\": {
            \"ownerReferences\": [
              {
                \"apiVersion\": \"rhtas.redhat.com/v1alpha1\",
                \"kind\": \"Securesign\",
                \"name\": \"$OWNER_NAME\",
                \"uid\": \"$OWNER_UID\",
                \"controller\": true,
                \"blockOwnerDeletion\": true
              }
            ]
          }
        }"

        echo "Restored ownerReferences for $RESOURCE/$ITEM"
    done
done

echo "Done"
Copy to Clipboard Toggle word wrap

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2026 Red Hat
トップに戻る