跳到内容

启用集合签名

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 环境内运行。

Bash 命令
django-admin add-signing-service \  #(1)
    unique-name \  #(2)
    /abs/path/to/script.sh \ #(3)
    GPG_KEY_ID #(4)
  1. 一个 django 管理命令。
  2. 签名服务应在数据库中获取的名称。
  3. 执行签名的 Shell 脚本的绝对路径。
  4. 公钥的密钥 ID。

add-signing-service 命令的位置参数

重要

将密钥导入密钥环时,信任级别必须设置为高于 3 的值。例如:echo "${KEY_FINGERPRINT}:6:" | gpg --batch --import-ownertrust

配置 Galaxy 使用签名服务

要告诉 Galaxy 使用哪个签名服务,您需要在 pulp 设置中进行设置。

选项 1

/etc/pulp/settings.py
GALAXY_COLLECTION_SIGNING_SERVICE = "unique-name"  #(1)

  1. 创建的签名服务的名称

选项 2

环境变量
export PULP_GALAXY_COLLECTION_SIGNING_SERVICE=unique-name #(1)

  1. 创建的签名服务的名称

配置 Galaxy 在批准期间自动签名

选项 1

/etc/pulp/settings.py
GALAXY_AUTO_SIGN_COLLECTIONS = True  #(1)

  1. 一个布尔值,启用批准时的自动签名

选项 2

环境变量
export PULP_GALAXY_AUTO_SIGN_COLLECTIONS=True #(1)

  1. 在 env var 上可以是 true, True, 1, on, enabled 之一

警告

只有当 GALAXY_REQUIRE_CONTENT_APPROVALTrue 时,才必须启用自动签名,否则所有发布的内容都将在没有进一步检查的情况下被签名。

单击此处获取完整示例脚本
####################################
# 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"
}'
  1. 0.0.0.0:8002 替换为您的 FQDN
  2. 提供您的 Galaxy API 令牌

提示

省略 version 以签署整个集合,省略 collection 以签署整个命名空间,省略 namespace 并提供以签署整个存储库,或者提供 content_units=["*"]content_units=["pulp_hrefs", ...]

通过 UI 签名

在 Galaxy UI 上,签名按钮位于以下页面下

  • 命名空间(签署整个命名空间)
  • 集合(签署整个集合,签署 x.y.z 版本)
  • 审批仪表板(签名并批准,如果启用)

签名上传

注意 签名上传不需要 SigningService,服务器的要求是存在一个带有公钥的密钥环来执行签名验证。

在 Galaxy 服务器上启用签名上传支持

  1. 在设置文件中设置变量 GALAXY_SIGNATURE_UPLOAD_ENABLED=True
  2. 在密钥环上创建一个密钥环,并在上传期间将能够验证签名的公钥导入到该密钥环。

    gpg --batch --no-default-keyring \
        --keyring /etc/pulp/certs/galaxy.kbx \
        --import path_to_your_public.key
    

  3. 设置目标存储库以使用密钥环。

    django-admin set-repo-keyring repo-name /etc/pulp/certs/galaxy.kbx
    
    例如,如果上传将在批准之前执行,请将密钥环设置为 staging 存储库。

通过以上配置,现在存储库能够接受签名上传,并在上传过程中验证签名。

注意 如果未设置密钥环,则会拒绝上传,以避免上传无效签名。

需要签名才能批准

当启用签名上传并且还启用了内容批准时,可以设置 GALAXY_REQUIRE_SIGNATURE_FOR_APPROVAL=True,然后批准仪表板将仅允许批准具有签名的集合。

手动签名集合

签名也可以在本地手动创建,然后上传到 Galaxy 以附加到集合版本。

  1. 在本地下载(或构建)集合
  2. 从集合 tarball 中提取 MANIFEST.json
  3. 使用 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
    
  4. 签名生成一个文件 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 上公开。