安全通信#

openYuanrong 支持 TLS 1.2、TLS 1.3 协议用于外部及组件之间的安全通信,本节将介绍如何生成相关证书。

所需证书文件及目录规划如下:

${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.keyworker.key_secretclient.keyclient.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 时配置安全通信#

详细配置说明参考部署参数表中的安全配置。

  • 部署基础组件,主节点参考命令如下:

    yr start --master \
    --ssl_base_path=${WorkSpace}/cert/yr --ssl_enable=true \
    --curve_key_path=${WorkSpace}/cert/curve \
    --runtime_ds_encrypt_enable=true --ds_component_auth_enable=true \
    --etcd_auth_type=TLS --etcd_ssl_base_path=${WorkSpace}/cert/etcd \
    --cache_storage_auth_type=ZMQ --cache_storage_auth_enable=true
    
  • 部署基础组件和 dashboard 功能,主节点参考命令如下:

    yr start --master \
    --ssl_base_path=${WorkSpace}/cert/yr --ssl_enable=true \
    --curve_key_path=${WorkSpace}/cert/curve \
    --runtime_ds_encrypt_enable=true --ds_component_auth_enable=true \
    --etcd_auth_type=TLS --etcd_ssl_base_path=${WorkSpace}/cert/etcd \
    --cache_storage_auth_type=ZMQ --cache_storage_auth_enable=true \
    --enable_dashboard=true --enable_collector=true --enable_separated_redirect_runtime_std=true \
    --prometheus_address=prometheus_ip:prometheus_port --enable_metrics=true --metrics_config_file={file_name}.json \
    --prometheus_ssl_enable=true --prometheus_ssl_base_path=${WorkSpace}/cert/prometheus \
    --dashboard_ssl_enable=true --dashboard_ssl_base_path=${WorkSpace}/cert/dashboard