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

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

    重要

    次のステップに進む前に、キューが空になるまで待つ必要があります。ドレイン中にリーフがまだ統合中の場合、このプロセス中にログツリーをフリーズすると、ログパスが最大マージ遅延 (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

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

    重要

    次のステップに進む前に、キューが空になるまで待つ必要があります。ドレイン中にリーフがまだ統合中の場合、このプロセス中にログツリーをフリーズすると、ログパスが最大マージ遅延 (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 署名者鍵と証明書を使用するアーティファクトに署名して検証する準備が整いました。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat