第 2 章 Red Hat Quay 和 SQL 之间的基于证书的身份验证
Red Hat Quay 管理员可以通过为客户端侧验证提供自己的 SSL/TLS 证书,在 Red Hat Quay 和 SQL (PostgreSQL 和 GCP CloudSQL)之间配置基于证书的身份验证。这提供了增强的安全性,并可更轻松地对 Red Hat Quay registry 的自动化。
以下小节演示了如何在 Red Hat Quay 和 PostgreSQL 和 Red Hat Quay 和 CloudSQL 之间配置基于证书的身份验证。
2.1. 使用 SQL 配置基于证书的身份验证
以下流程演示了如何使用安全客户端证书将 Red Hat Quay 与 SQL 数据库连接。此方法确保通过证书信任验证功能和验证,因为它会根据可信证书颁发机构(CA)验证 SQL 服务器的证书。这提高了 Red Hat Quay 和 SQL 服务器之间的连接安全性,同时简化部署的自动化。虽然示例使用 Google Cloud Platform 的 CloudSQL,但该流程也适用于 PostgreSQL 和其他支持的数据库。
先决条件
-
您生成了自定义证书颁发机构(CA)和 SSL/TLS 证书和密钥,可以使用
PEM
格式,用于生成带有 CloudSQL 数据库的 SSL 连接。如需更多信息,请参阅 Red Hat Quay 的 SSL 和 TLS。 -
您有
base64 将原始配置捆绑包解码
为一个config.yaml
文件。如需更多信息 ,请参阅下载现有配置。 -
您使用外部管理的 PostgreSQL 或 CloudSQL 数据库。如需更多信息,请参阅使用带有
DB_URI
变量集的和现有的 PostgreSQL 数据库。 - 为 SSL/TLS 配置外部管理的 PostgreSQL 或 CloudSQL 数据库。
-
QuayRegistry
CRD 的postgres
组件被设置为managed: false
,您的 CloudSQL 数据库使用DB_URI
配置变量设置。以下流程使用postgresql://<cloudsql_username>:<dbpassword>@<database_host>:<port>/<database_name>
。
流程
在为您的 CloudSQL 数据库生成 CA 和 SSL/TLS 证书和密钥后,并确保它们采用
.pem
格式,测试到 CloudSQL 服务器的 SSL 连接:输入以下命令启动到 CloudSQL 服务器的连接:
$ psql "sslmode=verify-ca sslrootcert=<ssl_server_certificate_authority>.pem sslcert=<ssl_client_certificate>.pem sslkey=<ssl_client_key>.pem hostaddr=<database_host> port=<5432> user=<cloudsql_username> dbname=<cloudsql_database_name>"
在 Red Hat Quay 目录中,运行以下命令来创建一个新的 YAML 文件,如
quay-config-bundle.yaml
:$ touch quay-config-bundle.yaml
输入以下命令来创建
postgresql-client-certs
资源:$ oc -n <quay_namespace> create secret generic postgresql-client-certs \ --from-file config.yaml=<path/to/config.yaml> 1 --from-file=tls.crt=<path/to/ssl_client_certificate.pem> 2 --from-file=tls.key=<path/to/ssl_client_key.pem> 3 --from-file=ca.crt=<path/to/ssl_server_certificate.pem> 4
编辑
'quay-config-bundle.yaml
文件,使其包含以下数据库连接设置:重要-
DB_CONNECTION_ARGS
变量中包含的信息,如sslmode
,sslrootcert
,sslcert
, 和sslkey
必须与 附加到DB_URI
变量的信息匹配。不匹配可能会导致连接失败。 -
您不能指定自定义文件名或路径。
sslrootcert
、sslcert
和sslkey
的证书文件路径是硬编码的默认值,并挂载到 Kubernetes secret 中的Quay
pod 中。您必须遵循以下命名约定,否则将导致连接失败。
DB_CONNECTION_ARGS: autorollback: true sslmode: verify-ca 1 sslrootcert: /.postgresql/root.crt 2 sslcert: /.postgresql/postgresql.crt 3 sslkey: /.postgresql/postgresql.key 4 threadlocals: true 5 DB_URI: postgresql://<dbusername>:<dbpassword>@<database_host>:<port>/<database_name>?sslmode=verify-full&sslrootcert=/.postgresql/root.crt&sslcert=/.postgresql/postgresql.crt&sslkey=/.postgresql/postgresql.key 6
- 1
- 使用
verify-ca
可确保数据库连接使用 SSL/TLS,并根据可信 CA 验证服务器证书。这可与可信 CA 和自签名 CA 证书一起使用。但是,此模式不会验证服务器的主机名。如需完整的主机名和证书验证,请使用verify-full
。有关可用选项的更多信息,请参阅 PostgreSQL SSL/TLS 连接参数。 - 2
root.crt
文件包含用来验证与 CloudSQL 数据库的 SSL/TLS 连接的根证书。此文件挂载到来自 Kubernetes secret 的Quay
pod 中。- 3
postgresql.crt
文件包含用于验证与 CloudSQL 数据库连接的客户端证书。此文件挂载到来自 Kubernetes secret 的Quay
pod 中。- 4
postgresql.key
文件包含与客户端证书关联的私钥。此文件挂载到来自 Kubernetes secret 的Quay
pod 中。- 5
- 为连接启用自动滚动。
- 6
- 访问 CloudSQL 数据库的 URI。必须使用
sslmode
类型、root.crt
、postgresql.crt
和postgresql.key
文件附加。DB_URI
中包含的 SSL/TLS 信息必须与DB_CONNECTION_ARGS
中提供的信息匹配。如果使用 CloudSQL,则必须在此变量中包含数据库用户名和密码。
-
输入以下命令来创建
configBundleSecret
资源:$ oc create -n <namespace> -f quay-config-bundle.yaml
输出示例
secret/quay-config-bundle created
输入以下命令更新
QuayRegistry
YAML 文件来引用quay-config-bundle
对象:$ oc patch quayregistry <registry_name> -n <namespace> --type=merge -p '{"spec":{"configBundleSecret":"quay-config-bundle"}}'
输出示例
quayregistry.quay.redhat.com/example-registry patched
输入以下命令来确保
QuayRegistry
YAML 文件已更新为使用额外的 CA 证书configBundleSecret
资源:$ oc get quayregistry <registry_name> -n <namespace> -o yaml
输出示例
# ... configBundleSecret: quay-config-bundle # ...