启用集合签名¶
Galaxy 服务器可以创建、同步、接收以及上传、验证和提供集合签名。
签名通常是 GPG ASCII 装甲分离工件,换句话说,是由基于 MANIFEST.json
文件的 GPG 兼容脚本创建的文件,例如:MANIFEST.json.asc
。
MANIFEST.json
文件已包含用于验证集合内所有其他工件的校验和,这就是为什么签名是基于此文件创建的原因。
在 pulp 安装程序上启用签名
如果使用 pulp-installer 进行配置,则 pulp 安装程序也可以配置为启用签名 https://github.com/pulp/pulp_installer/tree/main/roles/galaxy_post_install#variables-for-the-signing-service,您可以跳过此页面的创建签名服务
部分。
创建签名¶
可以手动创建签名,然后再将其上传到 Galaxy 服务器,或者 Galaxy 服务器可以在内部为每个集合创建签名。
签名服务¶
签名服务是在 pulp 后端上定义的对象,它组合了 GPG 密钥 和可执行脚本的绝对路径。
创建签名服务¶
要在 Galaxy 服务器上创建签名服务,需要访问 django-admin
实用程序并执行
重要
该命令必须在安装 galaxy_ng worker 的 Python 环境内运行。
django-admin add-signing-service \ #(1)
unique-name \ #(2)
/abs/path/to/script.sh \ #(3)
GPG_KEY_ID #(4)
- 一个 django 管理命令。
- 签名服务应在数据库中获取的名称。
- 执行签名的 Shell 脚本的绝对路径。
- 公钥的密钥 ID。
add-signing-service
命令的位置参数
- name:必须是用于标识签名服务对象的唯一名称。
- script:必须是 pulp worker 进程用户可访问和运行的可执行文件的路径。一个示例脚本可以在 pulp 文档中找到:https://docs.pulpproject.org/pulpcore/workflows/signed-metadata.html#metadata-signing
- GPG_KEY_ID:必须是标识全局用户密钥环上密钥的 ID 或电子邮件。GPG 密钥必须位于 pulp 用户级别的密钥环中,并且必须是有效的 GPG,这里有一个关于如何创建有效 gpg 密钥的指南 https://access.redhat.com/articles/3359321
重要
将密钥导入密钥环时,信任级别必须设置为高于 3 的值。例如:echo "${KEY_FINGERPRINT}:6:" | gpg --batch --import-ownertrust
配置 Galaxy 使用签名服务¶
要告诉 Galaxy 使用哪个签名服务,您需要在 pulp 设置中进行设置。
选项 1
GALAXY_COLLECTION_SIGNING_SERVICE = "unique-name" #(1)
- 创建的签名服务的名称
选项 2
export PULP_GALAXY_COLLECTION_SIGNING_SERVICE=unique-name #(1)
- 创建的签名服务的名称
配置 Galaxy 在批准期间自动签名¶
选项 1
GALAXY_AUTO_SIGN_COLLECTIONS = True #(1)
- 一个布尔值,启用批准时的自动签名
选项 2
export PULP_GALAXY_AUTO_SIGN_COLLECTIONS=True #(1)
- 在 env var 上可以是
true, True, 1, on, enabled
之一
警告
只有当 GALAXY_REQUIRE_CONTENT_APPROVAL
为 True
时,才必须启用自动签名,否则所有发布的内容都将在没有进一步检查的情况下被签名。
单击此处获取完整示例脚本
####################################
# 1. Create the GPG key if not exists
####################################
gpg --full-gen-key
# Please select what kind of key you want:
# (4) RSA (sign only)
# Your selection? 4
#
# What keysize do you want? (2048)
# Requested keysize is 2048 bits
#
# Please specify how long the key should be valid.
# Key is valid for? (0)
# Key does not expire at all
#
# Is this correct? (y/N) y
#
# Inform extra data such as Real Name, Company and email address.
#############################################
# 2. List the keys to fetch the KEY_FINGERPRINT
#############################################
# replace KEY with the key id from previous output or email.
export KEY_FINGERPRINT=\
$(gpg -k --with-fingerprint --with-colons KEY|awk -F: '$1 == "fpr" {print $10;}'|head -n1)
#############################################
# 3. Set the trust level
#############################################
echo "${KEY_FINGERPRINT}:6:" | gpg --batch --import-ownertrust
#############################################
# Create the signing script
#############################################
cat <<EOF >> /etc/pulp/scripts/collection_sign.sh
#!/usr/bin/env bash
FILE_PATH=$1
SIGNATURE_PATH="$1.asc"
ADMIN_ID="$KEY_FINGERPRINT"
PASSWORD="password if needed"
# Create a detached signature
gpg --quiet --batch --pinentry-mode loopback --yes --passphrase \
$PASSWORD --homedir ~/.gnupg/ --detach-sign --default-key $ADMIN_ID \
--armor --output $SIGNATURE_PATH $FILE_PATH
# Check the exit status
STATUS=$?
if [ $STATUS -eq 0 ]; then
echo {\"file\": \"$FILE_PATH\", \"signature\": \"$SIGNATURE_PATH\"}
else
exit $STATUS
fi
EOF
##########################################
# Create the signing service
##########################################
django-admin add-signing-service \
ansible-default \
/etc/pulp/scripts/collection_sign.sh \
$KEY_FINGERPRINT
################################################
# Enable the signing service on galaxy settings
################################################
echo "GALAXY_COLLECTION_SIGNING_SERVICE='ansible-default'" >> /etc/pulp/settings.py
# OR
export PULP_GALAXY_COLLECTION_SIGNING_SERVICE=ansible-default
####################################################
# Optionally enable automatic signing upon approval
# NOTE: this must be enabled only if
# `GALAXY_REQUIRE_CONTENT_APPROVAL` is True.
####################################################
echo "GALAXY_AUTO_SIGN_COLLECTIONS=True" >> /etc/pulp/settings.py
# OR
export PULP_GALAXY_AUTO_SIGN_COLLECTIONS=True
通过 API 签名¶
curl -X POST \
'http://0.0.0.0:8002/api/automation-hub/_ui/v1/collection_signing/' \ # (1)
--header 'Authorization: Token abcdefghijklmnopqrstuvwxyz1234567890' \ # (2)
--header 'Content-Type: application/json' \
--data-raw '{
"signing_service": "ansible-default",
"distro_base_path": "staging",
"namespace": "awx",
"collection": "collection_name",
"version": "0.1.0"
}'
- 将
0.0.0.0:8002
替换为您的 FQDN - 提供您的 Galaxy
API 令牌
提示
省略 version
以签署整个集合,省略 collection
以签署整个命名空间,省略 namespace
并提供以签署整个存储库,或者提供 content_units=["*"]
或 content_units=["pulp_hrefs", ...]
通过 UI 签名¶
在 Galaxy UI 上,签名按钮位于以下页面下
- 命名空间(签署整个命名空间)
- 集合(签署整个集合,签署 x.y.z 版本)
- 审批仪表板(签名并批准,如果启用)
签名上传¶
注意 签名上传不需要 SigningService,服务器的要求是存在一个带有公钥的密钥环来执行签名验证。
在 Galaxy 服务器上启用签名上传支持¶
- 在设置文件中设置变量
GALAXY_SIGNATURE_UPLOAD_ENABLED=True
。 -
在密钥环上创建一个密钥环,并在上传期间将能够验证签名的公钥导入到该密钥环。
gpg --batch --no-default-keyring \ --keyring /etc/pulp/certs/galaxy.kbx \ --import path_to_your_public.key
-
设置目标存储库以使用密钥环。
例如,如果上传将在批准之前执行,请将密钥环设置为django-admin set-repo-keyring repo-name /etc/pulp/certs/galaxy.kbx
staging
存储库。
通过以上配置,现在存储库能够接受签名上传,并在上传过程中验证签名。
注意 如果未设置密钥环,则会拒绝上传,以避免上传无效签名。
需要签名才能批准
当启用签名上传并且还启用了内容批准时,可以设置 GALAXY_REQUIRE_SIGNATURE_FOR_APPROVAL=True
,然后批准仪表板将仅允许批准具有签名的集合。
手动签名集合¶
签名也可以在本地手动创建,然后上传到 Galaxy 以附加到集合版本。
- 在本地下载(或构建)集合
- 从集合 tarball 中提取 MANIFEST.json
- 使用 GPG 分离并使用与 Galaxy 存储库上配置的相同的密钥来签名集合。示例
# Having the private key set locally # (the same private key that matched the repo keyring previously configured) gpg --quiet --batch --pinentry-mode loopback --yes --homedir ~/.gnupg/ --detach-sign --default-key KEY_ID \ --armor --output MANIFEST.json.asc MANIFEST.json
- 签名生成一个文件
MANIFEST.json.asc
,现在可以将其上传到 Galaxy 服务器。
通过 API 上传签名¶
curl -X 'POST' \
'http://0.0.0.0:5001/pulp/api/v3/content/ansible/collection_signatures/' \
-H 'accept: application/json' \
-H 'Authorization: Basic YWRtaW46YWRtaW4=' \
-H 'Content-Type: multipart/form-data' \
-F 'file=@MANIFEST.json.asc;type=text/plain' \
-F 'repository=/pulp/api/v3/repositories/ansible/ansible/43dd716c-f7dd-4a80-b889-36818ed3e347/' \
-F 'signed_collection=/pulp/api/v3/content/ansible/collection_versions/40f85531-29a5-4eb7-b4cd-a850f8824daf/'
警告
此端点位于 /pulp/
命名空间下,需要使用 pulp_hrefs
(pulp 对象的完整 url)设置关系
通过 UI 上传签名¶
启用后,页面上将有上传按钮
- 集合版本
- 审批仪表板
同步签名¶
从远程服务器同步时,如果远程服务器提供签名,则 Galaxy 也会同步所有现有签名。
签名是累加的,因此每个集合可以包含多个签名。
在 galaxy 存储库管理 -> 远程
中,可以将远程设置为 仅同步已签名
的集合
在 API 上提供签名¶
签名在 v3/content/collections
API 的 signatures
字段下提供。
在 UI 上公开签名状态¶
UI 显示以下徽章
- 已签名(集合下的所有版本都已签名)
- 部分(某些版本已签名,但不是整个集合)
- 未签名(集合的任何版本都未签名)
签名验证¶
获取公钥¶
Galaxy 服务器上签名服务的公钥在 URL https://FQDN/pulp/api/v3/signing-services/ 上公开
如果签名来自远程服务器,则其公钥必须直接在远程服务器上找到。
安装期间的验证¶
签名验证由 ansible-galaxy
CLI 执行。
https://docs.ansible.org.cn/ansible/devel/user_guide/collections_using.html#signature-verification
功能标志¶
Web UI 从 settings.GALAXY_FEATURE_FLAGS
中读取特性标志。这是一个 Python dict
对象,其中包含用于精细控制签名功能的键。这些标志具有基于 settings
计算的默认值,通常情况下无需手动更改,但如果需要,可以手动更改。
例如,要启用签名功能 + 上传签名
export PULP_GALAXY_FEATURE_FLAGS__signatures_enabled=true
export PULP_GALAXY_FEATURE_FLAGS__can_upload_signatures=true
提示 以上内容也可以在
/etc/pulp/settings.py
中定义,删除PULP_
前缀并使用 Python 布尔值GALAXY_FEATURE_FLAGS__signatures_enabled = True
签名标志¶
signatures_enabled
- 重命名
collection_signing
(为保持兼容性,将保留) - 默认值:
collection_signing
标志的值 (当settings.GALAXY_COLLECTION_SIGNING_SERVICE
为非空字符串时,该值为 true)
- 重命名
require_upload_signatures
- 如果需要签名,是否应禁用批准按钮?
- 默认值:settings.GALAXY_REQUIRE_SIGNATURE_FOR_APPROVAL 的值 AND signatures_enabled
can_create_signatures
- UI 是否应在命名空间和版本页面上显示用于签名集合的链接?
- 默认值:signature_enabled AND settings.COLLECTION_SIGNING_SERVICE 已设置 AND
SigningService
配置了签名密钥。
can_upload_signatures
- UI 是否应显示上传签名按钮?
- 默认值:signatures_enabled AND require_upload_signatures 或 settings.GALAXY_SIGNATURE_UPLOAD_ENABLED 为 True
collection_auto_sign
- 在手动批准或自动批准期间,是否应自动签名集合?
- 默认值:signatures_enabled AND can_create_signatures and GALAXY_AUTO_SIGN_COLLECTIONS
display_signatures
- UI 是否应显示:徽章、文本、签名文本、过滤器?
- 默认值:signatures_enabled AND ( can_create_signatures OR can_upload_signatures)
上述标志在
/api/automation-hub/_ui/v1/feature-flags/
URL 上公开。