安全通信#

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

环境准备#

一台 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 -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

部署 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