第 4 章 轮转证书和密钥
作为系统管理员,您可以主动轮转 Red Hat Trusted Artifact Signer (RHTAS)服务在 Red Hat OpenShift 上运行的证书和签名者密钥。定期轮转密钥可防止密钥篡改和失窃。这些步骤指导您完成旧证书和签名者密钥,并将其替换为组成 RHTAS 的底层服务的新证书和签名者密钥。您可以为以下服务轮转密钥和证书:
- Rekor
- 证书转换日志
- Fulcio
- 时间戳授权
4.1. 轮转 Rekor signer 密钥 复制链接链接已复制到粘贴板!
您可以使用分片功能冻结日志树来主动轮转 Rekor 的 signer 密钥,并使用新的 signer 键创建新日志树。此流程指导您完成旧的 Rekor signer 密钥过期,并使用 Red Hat Trusted Artifact Signer (RHTAS)的新 signer 密钥替换它。使旧 Rekor signer 密钥过期仍允许您验证旧密钥签名的工件。
此流程需要停机到 Rekor 服务。
先决条件
- 安装在 Red Hat OpenShift Container Platform 上运行的 RHTAS operator。
- 正在运行的 Securesign 实例。
-
安装了
oc
、openssl
和cosign
二进制文件的工作站。
流程
将
tuftool
二进制文件从 OpenShift 集群下载到您的工作站。重要tuftool
二进制文件仅适用于 Linux 操作系统。- 在主页中,单击 ? 图标,单击 Command line tools,转至 tuftool 下载部分,然后点击您的平台的链接。
在工作站上的终端中,解压缩二进制
.gz
文件,并设置 execute 位:Example
gunzip tuftool-amd64.gz chmod +x tuftool-amd64
$ gunzip tuftool-amd64.gz $ chmod +x tuftool-amd64
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将二进制文件移到
$PATH
环境中的位置:Example
sudo mv tuftool-amd64 /usr/local/bin/tuftool
$ sudo mv tuftool-amd64 /usr/local/bin/tuftool
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
从命令行登录到 OpenShift:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您可以从 OpenShift Web 控制台找到用于命令行的登录令牌和 URL。登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如果被要求,再次提供您的用户名和密码,然后单击 Display Token 以查看该命令。
切换到 RHTAS 项目:
Example
oc project trusted-artifact-signer
$ oc project trusted-artifact-signer
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 获取 Rekor URL:
Example
export REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}')
$ export REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}')
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 获取活跃分片的日志树标识符:
Example
export OLD_TREE_ID=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .TreeID)
$ export OLD_TREE_ID=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .TreeID)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 缩减 Rekor 实例,并将日志树设置为
DRAINING
状态:Example
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
$ 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 Copied! Toggle word wrap Toggle overflow 在排空时,树形日志不接受任何新条目。观察并等待队列为空。
重要您必须等待队列为空,然后继续下一步。如果在排空时保留仍然集成,则在此过程中冻结日志树可能会导致日志路径超过最大合并延迟(MMD)。
冻结日志树:
Example
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
$ 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 Copied! Toggle word wrap Toggle overflow 获取 frozen 日志树的长度:
Example
export OLD_SHARD_LENGTH=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .ActiveTreeSize)
$ export OLD_SHARD_LENGTH=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .ActiveTreeSize)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 获取旧分片的 Rekor 的公钥:
Example
export OLD_PUBLIC_KEY=$(curl -s $REKOR_URL/api/v1/log/publicKey | base64 | tr -d '\n')
$ export OLD_PUBLIC_KEY=$(curl -s $REKOR_URL/api/v1/log/publicKey | base64 | tr -d '\n')
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建新日志树:
Example
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)
$ 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 Copied! Toggle word wrap Toggle overflow 现在,您有两个日志树、一个冻结树,以及一个将成为活跃分片的新树。
创建新私钥:
Example
openssl ecparam -genkey -name secp384r1 -noout -out new-rekor.pem
$ openssl ecparam -genkey -name secp384r1 -noout -out new-rekor.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要新密钥必须具有唯一的文件名。
使用新 signer 密钥创建新 secret 资源:
Example
oc create secret generic rekor-signer-key --from-file=private=new-rekor.pem
$ oc create secret generic rekor-signer-key --from-file=private=new-rekor.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用新树标识符和旧分片信息更新 Securesign Rekor 配置:
Example
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果您使用值设置了
/spec/rekor/signer/keyPasswordRef
,则创建一个新的单独更新来删除它:Example
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用第一次更新后应用此更新。
更新 Securesign 实例:
Example
oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH_1"
$ oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH_1"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 等待 Rekor 服务器使用新的签名者密钥重新部署:
Example
oc wait pod -l app.kubernetes.io/name=rekor-server --for=condition=Ready
$ oc wait pod -l app.kubernetes.io/name=rekor-server --for=condition=Ready
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 获取新公钥:
Example
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
$ 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 Copied! Toggle word wrap Toggle overflow 配置更新框架(TUF)服务,以使用新的 Rekor 公钥。
设置 shell 环境:
Example
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建临时 TUF 目录结构:
Example
mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
$ mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 TUF 内容下载到临时 TUF 目录结构中:
Example
oc extract --to "${KEYDIR}/" secret/tuf-root-keys oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}" cp "${TUF_REPO}/root.json" "${ROOT}"
$ 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 Copied! Toggle word wrap Toggle overflow 查找活跃的 Rekor signer 密钥文件名。在本地 TUF 存储库中打开最新的目标文件,例如
1.target.json
。在这个文件中,您将找到活跃的 Rekor signer 密钥文件名,例如rekor.pub
。使用这个活跃 Rekor signer 密钥文件名设置环境变量:Example
export ACTIVE_KEY_NAME=rekor.pub
$ export ACTIVE_KEY_NAME=rekor.pub
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用旧公钥更新 Rekor signer 密钥:
Example
echo $OLD_PUBLIC_KEY | base64 -d > $ACTIVE_KEY_NAME
$ echo $OLD_PUBLIC_KEY | base64 -d > $ACTIVE_KEY_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使旧的 Rekor signer 密钥过期:
Example
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加新的 Rekor signer 密钥:
Example
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将这些更改上传到 TUF 服务器:
Example
oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
$ oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除工作目录:
Example
rm -r $WORK
$ rm -r $WORK
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用更新的 TUF 配置更新
cosign
配置:Example
cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
$ cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 现在,您已使用新的 Rekor signer 密钥签名并验证您的工件。