ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ScyllaDB 加密通信实践:使用 openssl 生成自签名证书链与信任库配置

ScyllaDB 加密通信实践:使用 openssl 生成自签名证书链与信任库配置 ScyllaDB 加密通信实践使用 openssl 生成自签名证书链与信任库配置【免费下载链接】scylladbNoSQL data store using the Seastar framework, compatible with Apache Cassandra and Amazon DynamoDB项目地址: https://gitcode.com/GitHub_Trending/sc/scylladb在 ScyllaDB 集群中启用 TLS/SSL 加密通信无论是节点之间的数据传输还是客户端与节点之间的 CQL 连接第一步都是为集群准备可信的证书体系。本指南以 docs/operating-scylla/security/generate-certificate.rst 为核心完整演示如何使用openssl构建一条自签名 CA 证书链并详细讲解如何将生成的证书、私钥与信任库分别配置到 ScyllaDB 的server_encryption_options与client_encryption_options中。读完本文你将能够独立为 ScyllaDB 生成一套可投入生产验证的证书链并在日志中确认加密服务成功启动。为什么需要自签名证书链对于本地或内部网络通信自签名证书配合私有信任库private trust store通常足以保证通信安全。ScyllaDB 官方文档明确说明多个节点可以共享同一份证书前提是确保信任配置不被篡改。这意味着你不需要为每个节点分别向公共 CA 申请证书只需维护一个内部 CACertificate Authority并让所有节点信任它。自签名证书链的结构如下CA 私钥与 CA 证书内部自签名的根证书示例中为cadb.key与cadb.pem仅用于签发其他证书节点证书与私钥由 CA 签名、供 ScyllaDB 数据库节点实际使用的证书示例中为db.crt与db.key信任库持有 CA 证书的文件客户端或节点用它来验证对端证书的合法性。由于 node-node-encryption.rst 中提到 ScyllaDB 的 TLS 实现基于 OpenSSL其使用的 OpenSSL 库为 FIPS 140-2 认证上述证书最终将由 OpenSSL 工具链生成并被 ScyllaDB 加载解析。第一步编写证书配置文件.cfg构建证书链的第一步是创建一个 OpenSSL 配置文件其中定义了密钥长度、证书主体信息distinguished name以及 X.509 扩展。模板如下[ req ] default_bits 4096 default_keyfile hostname.key distinguished_name req_distinguished_name req_extensions v3_req prompt no [ req_distinguished_name ] C country code ST state L locality/city O domain OU organization, usually domain CN hostname.domain emailAddress email [v3_ca] subjectKeyIdentifierhash authorityKeyIdentifierkeyid:always,issuer:always basicConstraints CA:true [v3_req] # Extensions to add to a certificate request basicConstraints CA:FALSE keyUsage nonRepudiation, digitalSignature, keyEncipherment各字段含义[req]段控制证书请求CSR的生成行为。default_bits 4096指定密钥长度default_keyfile指定默认私钥文件名prompt no表示不进行交互式提问直接使用配置中的值[req_distinguished_name]段填写证书主体信息。CNCommon Name必须设置为主机名.域名的形式例如db.foo.bar[v3_ca]段用于签发 CA 证书其中basicConstraints CA:true表明这是一把 CA 身份[v3_req]段用于证书签名请求basicConstraints CA:FALSE表明被签发的证书是终端实体证书keyUsage定义其允许的密钥用途。将尖括号中的占位值替换为你组织的信息。官方示例中主机名为db、域名为foo.bar配置文件保存为db.cfg[ req ] default_bits 4096 default_keyfile db.key distinguished_name req_distinguished_name req_extensions v3_req prompt no [ req_distinguished_name ] C SE ST Stockholm L Stockholm O foo.bar OU foo.bar CN db.foo.bar emailAddress postmasterfoo.bar [v3_ca] subjectKeyIdentifierhash authorityKeyIdentifierkeyid:always,issuer:always basicConstraints CA:true [v3_req] # Extensions to add to a certificate request basicConstraints CA:FALSE keyUsage nonRepudiation, digitalSignature, keyEncipherment重要注意事项每一张新签发的证书其req_distinguished_name段中的CN值必须不同否则将无法通过openssl verify校验。也就是说如果你要为多台主机签发证书需要为每台主机准备或临时修改各自的 CN。第二步生成 CA 私钥与自签名 CA 证书先为内部 CA 生成一个 4096 位的 RSA 私钥openssl genrsa -out cadb.key 4096再用该私钥配合db.cfg配置生成一张自签名-x509的 CA 证书有效期 3650 天约 10 年-nodes表示私钥不加密openssl req -x509 -new -nodes -key cadb.key -days 3650 -config db.cfg -out cadb.pemcadb.pem即为整个集群的信任锚点trust anchor后续它将被放入所有节点和客户端的信任库中。第三步生成节点私钥与证书签名请求CSR为数据库节点生成独立的私钥openssl genrsa -out db.key 4096从该私钥生成证书签名请求openssl req -new -key db.key -out db.csr -config db.cfgdb.csr是未签名的请求文件其中包含节点的公钥与主体信息等待 CA 签名。第四步签发节点证书用 CA 私钥对 CSR 进行签名生成最终可用的节点证书openssl x509 -req -in db.csr -CA cadb.pem -CAkey cadb.key -CAcreateserial -out db.crt -days 365 -sha256参数说明-CA cadb.pem -CAkey cadb.key指定签发用的 CA 证书与私钥-CAcreateserial首次签发时自动创建序列号文件cadb.srl-days 365节点证书有效期 1 年-sha256使用 SHA-256 摘要算法签名。第五步核对产物并部署签发完成后你会得到以下文件文件用途db.keyPEM 格式私钥由数据库节点使用仅节点持有注意保密db.crt由cadb.pem签名、与db.key配对的 PEM 格式证书由数据库节点使用cadb.pemPEM 格式 CA 身份可作为信任库使用同时用于签发将要连接数据库的客户端证书将文件放到你选择的目录官方配置示例中常放在/etc/scylla/下并确保设置好文件权限使 ScyllaDB 实例能够读取它们。然后更新服务端/客户端配置来引用这些文件路径。第六步在 ScyllaDB 中启用加密并验证证书就绪后需要将其配置到 ScyllaDB 主配置文件/etc/scylla/scylla.yaml中然后重启节点。仓库中的 conf/scylla.yaml第 504-522 行给出了两组配置项的完整模板。配置节点间加密server_encryption_options启用节点间加密由server_encryption_options控制详见 node-node-encryption.rst其 yaml 结构如下server_encryption_options: internode_encryption: none|rack|dc|all|transitional certificate: path to a PEM-encoded certificate file keyfile: path to a PEM-encoded key for certificate truststore: path to a PEM-encoded trust store (optional) certficate_revocation_list: path to a PEM-encoded CRL file (optional)各参数含义与取值internode_encryption控制节点间加密范围可选值none默认所有流量不加密all加密所有节点间流量dc仅加密跨数据中心data center之间的流量rack仅加密跨机架rack之间的流量transitional所有出站流量加密但允许未加密的入站流量用于集群零停机升级certificatePEM 格式证书可以是自签名证书也可以是由 CA 签发的证书keyfile与证书对应的 PEM 格式私钥truststore可选PEM 格式的受信任 CA 证书库路径若未提供ScyllaDB 会尝试使用系统信任库来认证证书certficate_revocation_list可选PEM 编码的证书吊销列表CRL路径用于列出在到期前已被吊销的证书require_client_auth设为True时要求对端提供客户端证书默认Falsepriority_string指定 TLS 握手的算法与选项GnuTLS 优先级字符串语法默认无。修改后重启节点使配置生效注意需要逐节点操作避免集群中断。配置客户端到节点加密client_encryption_options客户端与节点之间启用 TLS 后所有客户端与节点的通信都通过 TLS/SSL 传输。参考 client-node-encryption.rst配置示例client_encryption_options: enabled: true certificate: /etc/scylla/db.crt keyfile: /etc/scylla/db.key truststore: path to a PEM-encoded trust store (optional) certficate_revocation_list: path to a PEM-encoded CRL file (optional) require_client_auth: ... priority_string: SECURE128:-VERS-TLS1.0:-VERS-TLS1.1关键说明enabled默认false若使用自签名证书truststore参数必须设置为包含 CA 私钥的 PEM 容器即上文生成的cadb.pempriority_string可精确控制 TLS 版本与安全强度。例如SECURE128:-VERS-TLS1.0:-VERS-TLS1.1表示最低 128 位安全强度并禁用 TLS 1.0/1.1SECURE128:SECURE192:-VERS-ALL:VERS-TLS1.2:VERS-TLS1.3表示启用 128/192 位安全密码套件且只允许 TLS 1.2 与 TLS 1.3enable_session_tickets默认true见 conf/scylla.yaml 第 522 行。配置客户端到节点加密时建议逐节点操作先nodetool drain停止 ScyllaDB修改配置后启动新集群可跳过前两步。在日志中验证加密生效重启 ScyllaDB 后根据启用的加密类型日志中会出现对应的确认信息节点间加密生效时Starting Encrypted Messaging Service on SSL port 7001客户端到节点加密生效时Enabling encrypted CQL connections between client and server客户端到节点加密还可以通过journalctl _COMMscylla查看日志中出现storage_service - Enabling encrypted CQL connections between client and node即表示加密连接已启用。客户端证书与 keystore 的配套使用生成证书链的产物同样服务于客户端验证环节client-node-encryption.rst 的 Validate the Clients 部分使用 cqlsh 连接启用 SSL 的集群时需要先生成~/.cassandra/cqlshrc配置文件详见 gen-cqlsh-file.rst。自签名证书场景下[ssl]段写法如下[ssl] certfile /etc/scylla/db.crt validate true userkey /etc/scylla/db.key usercert /etc/scylla/db.crt注意当validate true时证书名称必须与机器主机名匹配若启用了客户端认证require_client_auth true还需指定userkey与usercert。保存后使用cqlsh --ssl连接验证。使用cassandra-stress压测时需要把db.key、db.crt、cadb.key、cadb.pem复制到客户端并用openssl pkcs12与keytool生成 Java keystore/truststorekeystore.jks与truststore.jks随后通过-transport keystore... keystore-password... truststore... truststore-password...参数指定。证书热加载Hot Reload一旦internode_encryption或client_encryption_options被启用即设置值不为 noneScyllaDB 会持续监控 scylla.yaml 中指定的 SSL/TLS 证书与密钥文件详见 ssl-hot-reload.rst。当文件在磁盘上被更新时ScyllaDB 会自动重新加载它们并用于后续的新连接——这意味着证书轮换rotation时无需重启节点即可生效方便在证书到期前平滑更新。零停机迁移已有集群到 TLS对于已运行但未启用 TLS 的集群node-node-encryption.rst 给出了三步渐进式迁移方案被动监听阶段为每个节点加上ssl_storage_port: 7001与一套server_encryption_optionsinternode_encryption仍为none重启节点。此时节点在 7001 端口开启被动 TLS 监听但出站流量仍不加密ssl_storage_port: 7001 server_encryption_options: internode_encryption: none certificate: path to a PEM-encoded certificate file keyfile: path to a PEM-encoded key for certificate truststore: path to a PEM-encoded trust store (optional) certficate_revocation_list: path to a PEM-encoded CRL file (optional)过渡阶段将每个节点的internode_encryption改为transitional并重启所有出站流量开始加密同时仍接受未加密入站流量强制执行阶段将每个节点改为all、rack或dc并重启出站按目标类型加密入站也按模式强制要求加密完成全量加密。源码侧实现印证上述配置项并非文档虚构而是由 ScyllaDB 配置系统直接解析。在 db/config.cc 中可以看到server_encryption_options的正式定义其说明文字明确写道internode_encryption默认值为none用于控制节点间通信的加密使用 TLS_RSA_WITH_AES_128_CBC_SHA 密码套件进行认证、密钥交换与数据传输。在传输层transport/controller.cc 负责处理client_encryption_options对应的加密 CQL 连接逻辑。当你按照本文步骤完成配置并重启后ScyllaDB 会在启动阶段加载证书文件、初始化 TLS 上下文并在日志中输出前文所述的确认信息。相关文档节点间传输加密Node-to-Node客户端到节点传输加密Client-to-Node生成 cqlshrc 文件授权Authorization【免费下载链接】scylladbNoSQL data store using the Seastar framework, compatible with Apache Cassandra and Amazon DynamoDB项目地址: https://gitcode.com/GitHub_Trending/sc/scylladb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表