安全通信#
openYuanrong 支持 TLS 1.2、TLS 1.3 协议用于外部及组件之间的安全通信,本节将介绍如何生成相关证书。
所需证书文件及目录规划如下。若不部署 dashboard,可跳过 dashboard 和 prometheus 证书生成过程。
${Your_Workspace}
├── etcd // etcd 证书目录
│ ├── ca.crt
│ ├── client.crt
│ ├── client.key
│ ├── server.crt
│ └── server.key
├── yr // openYuanrong 函数系统组件证书目录
│ ├── ca.crt
│ ├── module.crt
│ └── module.key
├── curve // openYuanrong 数据系统 curve 证书目录
│ ├── worker.key
│ ├── worker.key_secret
│ ├── client.key
│ ├── client.key_secret
│ └── worker_authorized_clients
│ ├── client.key
│ └── worker.key
├── dashboard // openYuanrong dashboard 组件单向认证证书目录
│ ├── server.crt
│ └── server.key
└── prometheus // prometheus 证书目录
├── ca.crt
├── client.crt
├── client.key
├── server.crt
└── server.key
环境准备#
一台 Linux 主机。
安装 openssl#
我们使用 openssl 生成 etcd 及 openYuanrong 函数系统相关证书。
yum install openssl -y
# 检查安装版本。
openssl version
安装 ZeroMQ#
openYuanrong 数据系统组件使用 ZeroMQ 作为 RPC 通信框架,公私钥依赖 ZeroMQ 所提供的接口生成,同时 ZeroMQ 的安全功能又依赖 libsodium。
下载 1.0.18 版本包 libsodium-1.0.18.tar.gz,参考如下命令安装 libsodium。
tar -zxvf libsodium-1.0.18.tar.gz
cd libsodium-1.0.18
./configure
make && make install
下载 4.3.5 版本包 zeromq-4.3.5.tar.gz,参考如下命令安装 ZeroMQ。
tar -zxvf zeromq-4.3.5.tar.gz
cd zeromq-4.3.5
mkdir build
cd build
cmake .. -DENABLE_CURVE:BOOL=ON -DWITH_LIBSODIUM:BOOL=ON -DWITH_LIBSODIUM_STATIC:BOOL=ON
make && make install
创建工作目录#
创建一个工作目录用于保存生成的证书文件,例如 /opt/security_deployment,后续操作将以 ${WorkSpace} 表示您的工作目录。
mkdir -p /opt/security_deployment
export WorkSpace=/opt/security_deployment
生成 etcd 证书等文件#
以下步骤将生成 etcd 的 CA 证书、服务端证书、服务端私钥、客户端证书和客户端私钥共 5 个文件。
生成 etcd CA 证书#
执行如下命令,生成 CA 证书文件 ca.crt。
mkdir -m 700 -p ${WorkSpace}/etcd
cd ${WorkSpace}/etcd
openssl genrsa -out ca.key 2048
# 证书 CN 可根据实际配置修改,默认 etcd-ca。days 为证书有效期(天数),证书过期后需要重新生成。
openssl req -x509 -new -nodes -key ca.key -subj "/CN=etcd-ca" -days 10000 -out ca.crt
生成 etcd 服务端私钥及证书#
创建 etcd.conf 文件, 其中 alt_names 配置项的值 127.0.0.1 替换为您 openYuanrong 集群主节点 IP。
cd ${WorkSpace}/etcd
cat >etcd.conf << EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = etcd-ca
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names
[alt_names]
IP.1 = 127.0.0.1
DNS.1 = 127.0.0.1
EOF
依次执行命令生成服务端私钥 server.key 以及服务端证书 server.crt 文件。
cd ${WorkSpace}/etcd
openssl genrsa -out server.key 2048
# 证书 CN 可根据实际配置修改,这里默认 etcd-server。
openssl req -new -key server.key -subj "/CN=etcd-server" -out server.csr -config etcd.conf
# days 为证书有效期(天数),证书过期后需要重新生成。
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 10000 -extfile etcd.conf -extensions v3_req
生成 etcd 客户端私钥和证书#
依次执行命令生成客户端私钥 client.key 以及客户端证书 client.crt 文件。
cd ${WorkSpace}/etcd
openssl genrsa -out client.key 2048
# 证书 CN 可根据实际配置修改,这里默认 etcd-client。
openssl req -new -key client.key -subj "/CN=etcd-client" -out client.csr
# days 为证书有效期(天数),证书过期后需要重新生成。
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 10000
保存 etcd 证书文件#
至此已完成 etcd 所需证书文件的生成,执行如下命令,保存这些文件到我们规划好的目录。
mkdir -p ${WorkSpace}/cert/etcd
cd ${WorkSpace}/etcd
cp -ar ca.crt client.crt client.key server.key server.crt ${WorkSpace}/cert/etcd
生成 openYuanrong 函数系统组件证书等文件#
以下步骤将生成 openYuanrong 函数系统组件的 CA 证书、私钥和证书共 3 个文件。
创建配置文件#
执行以下命令创建配置文件, 其中 alt_names 配置项的值 127.0.0.1 替换为您 openYuanrong 集群主节点 IP。
mkdir -p ${WorkSpace}/yr
cd ${WorkSpace}/yr
rm -rf demoCA 2>/dev/null
mkdir -p ./demoCA/newcerts/
touch ./demoCA/index.txt
touch ./demoCA/index.txt.attr
echo 01 > ./demoCA/serial
if [ ! -f ./demoCA/v3.ext ];
then
cat >./demoCA/v3.ext << EOF
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
[ alt_names ]
DNS.1 = test
DNS.2 = 127.0.0.1
IP.1 = 127.0.0.1
EOF
fi
生成 openYuanrong 函数系统组件 CA 证书#
执行如下命令,生成 CA 证书文件 ca.crt。
cd ${WorkSpace}/yr
openssl genrsa -out ca.key 2048
# subj 可根据实际配置修改。
openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=zhejiang/L=hangzhou/O=ha/OU=Personal/CN=rootCA"
# days 为证书有效期(天数),证书过期后需要重新生成。
openssl x509 -req -days 10000 -extfile ./demoCA/v3.ext -extensions v3_ca -signkey ca.key -in ca.csr -out ca.crt
生成 openYuanrong 函数系统组件私钥和证书#
依次执行命令生成私钥 module.key 以及证书 module.crt 文件。
cd ${WorkSpace}/yr
openssl genrsa -out module.key 2048
# subj 可根据实际配置修改
openssl req -new -key module.key -out module.csr -subj "/C=CN/ST=zhejiang/L=hangzhou/O=ha/OU=Personal/CN=test"
openssl ca -extfile ./demoCA/v3.ext -days 10000 -extensions v3_req -in module.csr -out module.crt -cert ca.crt -keyfile ca.key -notext -batch
保存 openYuanrong 函数系统组件证书文件#
至此已完成 openYuanrong 函数系统组件所需证书文件的生成,执行如下命令,保存这些文件到我们规划好的目录。
mkdir -p ${WorkSpace}/cert/yr
cd ${WorkSpace}/yr
cp -ar ca.crt module.crt module.key ${WorkSpace}/cert/yr
生成 openYuanrong 数据系统组件 Curve 证书文件#
生成 worker 及 client 公私钥#
我们将使用 ZeroMQ 的接口 zmq_curve_keypair 生成公私钥,详细接口介绍参考Zmq 接口文档。
创建工作目录。
mkdir -p ${WorkSpace}/yr_data_system
cd ${WorkSpace}/yr_data_system
在当前目录下新建 create_cert.cpp 文件,内容如下。
extern "C" {
#include <zmq.h>
}
#include <iostream>
#include <fstream>
bool GenerateCurveKeyPair(std::pair<std::string, std::string> &outKeyPair)
{
char publicKey[41];
char secretKey[41];
int ret = zmq_curve_keypair(publicKey, secretKey);
if (ret != 0) {
return true;
}
outKeyPair.first = publicKey;
outKeyPair.second = secretKey;
return false;
}
static void SaveFile(const std::string &fileName, const std::string &fileContent)
{
std::cout << "Saving file: " << fileName << std::endl;
std::ofstream public_file(fileName);
public_file << fileContent;
public_file.close();
}
int main(int argc, char **argv)
{
std::pair<std::string, std::string> keys;
bool ret = GenerateCurveKeyPair(keys);
if (ret) {
std::cout << "create cert for worker failed" << std::endl;
return -1;
}
// 请勿修改文件名
SaveFile("./worker.key", keys.first);
SaveFile("./worker.key_secret", keys.second);
std::pair<std::string, std::string> clientKeys;
ret = GenerateCurveKeyPair(clientKeys);
if (ret) {
std::cout << "create cert for client failed" << std::endl;
return -1;
}
// 请勿修改文件名
SaveFile("./client.key", clientKeys.first);
SaveFile("./client.key_secret", clientKeys.second);
}
依次执行如下命令:
g++ create_cert.cpp -lzmq -o create_cert
export LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib
./create_cert
确认无错误信息打印且目录下生成 worker.key、worker.key_secret、client.key 及 client.key_secret 4 个文件。
保存 openYuanrong 数据系统组件证书文件#
至此已完成 openYuanrong 数据系统组件所需证书文件的生成,执行如下命令,保存这些文件到我们规划好的目录。
mkdir -p ${WorkSpace}/cert/curve
cd ${WorkSpace}/yr_data_system
cp -ar worker.key worker.key_secret client.key client.key_secret ${WorkSpace}/cert/curve
mkdir -p ${WorkSpace}/cert/curve/worker_authorized_clients
cp ${WorkSpace}/cert/curve/worker.key ${WorkSpace}/cert/curve/worker_authorized_clients/worker.key
cp ${WorkSpace}/cert/curve/client.key ${WorkSpace}/cert/curve/worker_authorized_clients/client.key
生成 dashboard 证书文件#
以下步骤将生成 dashboard 用于单向认证通信的服务端证书和服务端私钥共 2 个文件。
mkdir -p ${WorkSpace}/cert/dashboard
cd ${WorkSpace}/cert/dashboard
openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 10000 -nodes -subj "/C=CN/ST=zhejiang/L=hangzhou/O=ha/OU=Personal/CN=dashboard"
生成 prometheus 证书等文件#
以下步骤将生成 prometheus 的 CA 证书、服务端证书、服务端私钥、客户端证书和客户端私钥共 5 个文件。
创建配置文件#
执行以下命令创建配置文件, 其中 alt_names 配置项的值 127.0.0.1 替换为您运行 prometheus 的机器 IP。
mkdir -p ${WorkSpace}/prometheus
cd ${WorkSpace}/prometheus
rm -rf demoCA 2>/dev/null
mkdir -p ./demoCA/newcerts/
touch ./demoCA/index.txt
touch ./demoCA/index.txt.attr
echo 01 > ./demoCA/serial
if [ ! -f ./demoCA/v3.ext ];
then
cat >./demoCA/v3.ext << EOF
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
[ alt_names ]
DNS.1 = prometheus
DNS.2 = 127.0.0.1
IP.1 = 127.0.0.1
EOF
fi
生成 prometheus CA 证书#
执行如下命令,生成 CA 证书文件 ca.crt。
cd ${WorkSpace}/prometheus
openssl genrsa -out ca.key 2048
# subj 可根据实际配置修改。
openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=zhejiang/L=hangzhou/O=ha/OU=Personal/CN=rootCA"
# days 为证书有效期(天数),证书过期后需要重新生成。
openssl x509 -req -days 10000 -extfile ./demoCA/v3.ext -extensions v3_ca -signkey ca.key -in ca.csr -out ca.crt
生成 prometheus 服务端私钥和证书#
依次执行命令生成服务端私钥 server.key 以及服务端证书 server.crt 文件。
cd ${WorkSpace}/prometheus
openssl genrsa -out server.key 2048
# subj 可根据实际配置修改
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=zhejiang/L=hangzhou/O=ha/OU=Personal/CN=prometheus"
openssl ca -extfile ./demoCA/v3.ext -days 10000 -extensions v3_req -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -notext -batch
生成 prometheus 客户端私钥和证书#
依次执行命令生成客户端私钥 client.key 以及客户端证书 client.crt 文件。
cd ${WorkSpace}/prometheus
openssl genrsa -out client.key 2048
# 证书 CN 可根据实际配置修改,这里默认 prometheus-client。
openssl req -new -key client.key -subj "/CN=prometheus-client" -out client.csr
# days 为证书有效期(天数),证书过期后需要重新生成。
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 10000
保存 prometheus 证书文件#
至此已完成 prometheus 所需证书文件的生成,执行如下命令,保存这些文件到我们规划好的目录。
mkdir -p ${WorkSpace}/cert/prometheus
cd ${WorkSpace}/prometheus
cp -ar ca.crt client.crt client.key server.key server.crt ${WorkSpace}/cert/prometheus
安全通信 prometheus 的配置和启动#
Step1: 基础配置
请先完成 prometheus 的基础配置,可参考prometheus 配置和启动。
Step2: 安全配置
在与 prometheus 程序同目录下,新增 web-config.yml 文件,文件内容如下:
tls_server_config:
cert_file: ${WorkSpace}/cert/prometheus/server.crt
key_file: ${WorkSpace}/cert/prometheus/server.key
client_auth_type: "RequireAndVerifyClientCert"
client_ca_file: ${WorkSpace}/cert/prometheus/ca.crt
Step3: 启动 prometheus
启动安全通信 prometheus 命令如下:
nohup ./prometheus --web.config.file=./web-config.yml > ./prometheus.log 2>&1 & # prometheus 默认端口为 9090
部署 openYuanrong 时配置安全通信#
创建自定义配置文件 config.toml,内容如下,替换其中的 /opt/ssl 为 ${WorkSpace} 路径。
仅部署基础组件
[values.fs.tls] enable = true base_path = "/opt/ssl/cert/yr" ca_file = "ca.crt" cert_file = "module.crt" key_file = "module.key" [values.ds.curve] enable = true base_path = "/opt/ssl/cert/curve" cache_storage_auth_type = "ZMQ" cache_storage_auth_enable = true [values.etcd] auth_type = "TLS" [values.etcd.auth] base_path = "/opt/ssl/cert/etcd" ca_file = "ca.crt" cert_file = "server.crt" key_file = "server.key" client_cert_file = "client.crt" client_key_file = "client.key"
部署基础组件和 Dashboard,按实际情况配置
metrics_config_file和address参数[mode.master] dashboard = true collector = true frontend = true [mode.agent] collector = true [function_agent.args] enable_metrics = true metrics_config_file = "/home/metrics/config.json" [values] log_level = "DEBUG" [values.fs.tls] enable = true base_path = "/opt/ssl/cert/yr" ca_file = "ca.crt" cert_file = "module.crt" key_file = "module.key" [values.ds.curve] enable = true base_path = "/opt/ssl/cert/curve" cache_storage_auth_type = "ZMQ" cache_storage_auth_enable = true [values.etcd] auth_type = "TLS" [values.etcd.auth] base_path = "/opt/ssl/cert/etcd" ca_file = "ca.crt" cert_file = "server.crt" key_file = "server.key" client_cert_file = "client.crt" client_key_file = "client.key" [values.dashboard.auth] enable = true cert_file = "/opt/ssl/cert/dashboard/server.crt" key_file = "/opt/ssl/cert/dashboard/server.key" [values.dashboard.prometheus] address = "10.88.0.3:9090" [values.dashboard.prometheus.auth] enable = true base_path = "/opt/ssl/cert/prometheus" ca_file = "ca.crt" cert_file = "client.crt" key_file = "client.key"
使用如下命令部署主节点:
yr -c ${YOUR_FILE_PATH}/config.toml start --master
参考如下命令部署从节点
yr -c ${YOUR_FILE_PATH}/config.toml start --master_address http://x.x.x.x:xxxx