乐趣区

关于程序员:彻底搞懂-etcd-系列文章四etcd-安全

0 专辑概述
etcd 是云原生架构中重要的根底组件,由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅能够作为服务注册与发现,还能够作为 key-value 存储的中间件。

《彻底搞懂 etcd 系列文章》将会从 etcd 的基本功能实际、API 接口、实现原理、源码剖析,以及实现中的踩坑教训等几方面具体开展介绍 etcd。预计会有 20 篇左右的文章,笔者将会每周继续更新,欢送关注。

1 etcd 平安
在上一篇文章介绍了 etcd 集群的运维部署之后,本文将会重点解说 etcd 的平安通信实际。etcd 反对通过 TLS 协定进行的加密通信。TLS 通道可用于对等体之间的加密外部群集通信以及加密的客户端流量。本文提供了应用对等和客户端 TLS 设置群集的示例。

2 TLS 与 SSL
互联网的通信安全,建设在 SSL/TLS 协定之上。不应用 SSL/TLS 的 HTTP 通信,就是不加密的通信。所有信息明文流传,带来了三大危险:

窃听危险(eavesdropping):第三方能够获知通信内容。
篡改危险(tampering):第三方能够批改通信内容。
假冒危险(pretending):第三方能够假冒别人身份参加通信。
SSL/TLS 协定是为了解决这三大危险而设计的,心愿达到:

所有信息都是加密流传,第三方无奈窃听。
具备校验机制,一旦被篡改,通信单方会立即发现。
装备身份证书,避免身份被假冒。
上面具体介绍下 SSL 与 TLS 的相干概念:

SSL (Secure Socket Layer):为 Netscape 所研发,用以保障在 Internet 上数据传输之平安,利用数据加密 (Encryption) 技术,可确保数据在网络上之传输过程中不会被截取。目前个别通用之规格为 40 bit 之平安规范,美国则已推出 128 bit 之更高平安规范,但限度入境。只有 3.0 版本以上之 I.E. 或 Netscape 浏览器即可反对 SSL。
平安传输层协定(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协定由两层组成:TLS 记录协定(TLS Record)和 TLS 握手协定(TLS Handshake)。较低的层为 TLS 记录协定,位于某个牢靠的传输协定(例如 TCP)下面。
想要实现数据 HTTPS 加密协议拜访,保障数据的平安,就须要 SSL 证书,TLS 是 SSL 与 HTTPS 平安传输层协定名称。

3 进行 TLS 加密实际
为了进行实际,咱们将会装置一些实用的命令行工具,其中包含 cfssl、cfssljson。

cfssl 是 CloudFlare 的 PKI/TLS 利器。它既是命令行工具,又能够用于签名,验证和捆绑 TLS 证书的 HTTP API 服务器,环境构建方面须要 Go 1.12+。

cfssljson 程序,从 cfssl 获取 JSON 输入,并将证书、密钥、CSR 和 bundle 写入指定地位。

「环境配置」

HostName ip 客户端交互端口 peer 通信端口
infra0 192.168.202.128 2379 2380
infra1 192.168.202.129 2379 2380
infra2 192.168.202.130 2379 2380
3.1 装置 cfssl
$ ls ~/Downloads/cfssl
cfssl-certinfo_1.4.1_linux_amd64 cfssl_1.4.1_linux_amd64 cfssljson_1.4.1_linux_amd64
chmod +x cfssl_1.4.1_linux_amd64 cfssljson_1.4.1_linux_amd64 cfssl-certinfo_1.4.1_linux_amd64

mv cfssl_1.4.1_linux_amd64 /usr/local/bin/cfssl
mv cfssljson_1.4.1_linux_amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_1.4.1_linux_amd64 /usr/bin/cfssl-certinfo
装置实现之后,查看版本信息的后果:

$ cfssl version

Version: 1.4.1
Runtime: go1.12.12
3.2 配置 CA 并创立 TLS 证书
咱们将应用 CloudFlare’s PKI 工具 cfssl 来配置 PKI Infrastructure,而后应用它去创立 Certificate Authority(CA),并为 etcd 创立 TLS 证书。

首先创立 ssl 配置目录:

mkdir /opt/etcd/{bin,cfg,ssl} -p
cd /opt/etcd/ssl/
etcd ca 配置:

cat << EOF | tee ca-config.json
{
“signing”: {

"default": {"expiry": "87600h"},
"profiles": {
  "etcd": {
     "expiry": "87600h",
     "usages": [
        "signing",
        "key encipherment",
        "server auth",
        "client auth"
    ]
  }
}

}
}
EOF
etcd ca 证书:

cat << EOF | tee ca-csr.json
{

"CN": "etcd CA",
"key": {
    "algo": "rsa",
    "size": 2048
},
"names": [
    {
        "C": "CN",
        "L": "Shanghai",
        "ST": "Shanghai"
    }
]

}
EOF
生成 CA 凭证和私钥:

$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca

2020/04/30 20:36:58 [INFO] generating a new CA key and certificate from CSR
2020/04/30 20:36:58 [INFO] generate received request
2020/04/30 20:36:58 [INFO] received CSR
2020/04/30 20:36:58 [INFO] generating key: rsa-2048
2020/04/30 20:36:58 [INFO] encoded CSR
2020/04/30 20:36:58 [INFO] signed certificate with serial number 252821789025044258332210471232130931231440888312

$ ls

ca-config.json ca-csr.json ca-key.pem ca.csr ca.pem
etcd server 证书:

cat << EOF | tee server-csr.json
{

"CN": "etcd",
"hosts": [
"192.168.202.128",
"192.168.202.129",
"192.168.202.130"
],
"key": {
    "algo": "rsa",
    "size": 2048
},
"names": [
    {
        "C": "CN",
        "L": "Beijing",
        "ST": "Beijing"
    }
]

}
EOF
生成 server 证书:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd server-csr.json | cfssljson -bare server
2020/04/30 20:44:37 [INFO] generate received request
2020/04/30 20:44:37 [INFO] received CSR
2020/04/30 20:44:37 [INFO] generating key: rsa-2048
2020/04/30 20:44:37 [INFO] encoded CSR
2020/04/30 20:44:37 [INFO] signed certificate with serial number 73061688633166283265484923779818839258466531108

ls
ca-config.json ca-csr.json ca-key.pem ca.csr ca.pem server-csr.json server-key.pem server.csr server.pem
启动 etcd 集群,配置如下:

etcd1 启动

$ /opt/etcd/bin/etcd –name etcd1 –initial-advertise-peer-urls https://192.168.202.128:2380 \

 --listen-peer-urls https://192.168.202.128:2380 \
 --listen-client-urls https://192.168.202.128:2379,https://127.0.0.1:2379 \
 --advertise-client-urls https://192.168.202.128:2379 \
 --initial-cluster-token etcd-cluster-1 \
 --initial-cluster etcd1=https://192.168.202.128:2380, etcd2=https://192.168.202.129:2380, etcd3=https://192.168.202.130:2380 \
 --initial-cluster-state new \
 --client-cert-auth --trusted-ca-file=/opt/etcd/ssl/ca.pem \
 --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem \
 --peer-client-cert-auth --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
 --peer-cert-file=/opt/etcd/ssl/server.pem --peer-key-file=/opt/etcd/ssl/server-key.pem

etcd2 启动

/opt/etcd/bin/etcd –name etcd2 –initial-advertise-peer-urls https://192.168.202.129:2380 \

  --listen-peer-urls https://192.168.202.129:2380 \
  --listen-client-urls https://192.168.202.129:2379,https://127.0.0.1:2379 \
  --advertise-client-urls https://192.168.202.129:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster etcd1=https://192.168.202.128:2380, etcd2=https://192.168.202.129:2380, etcd3=https://192.168.202.130:2380 \
  --initial-cluster-state new \
  --client-cert-auth --trusted-ca-file=/opt/etcd/ssl/ca.pem \
  --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem \
  --peer-client-cert-auth --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
  --peer-cert-file=/opt/etcd/ssl/server.pem --peer-key-file=/opt/etcd/ssl/server-key.pem

etcd3 启动

/opt/etcd/bin/etcd –name etcd3 –initial-advertise-peer-urls https://192.168.202.130:2380 \

   --listen-peer-urls https://192.168.202.130:2380 \
   --listen-client-urls https://192.168.202.130:2379,https://127.0.0.1:2379 \
   --advertise-client-urls https://192.168.202.130:2379 \
   --initial-cluster-token etcd-cluster-1 \
   --initial-cluster etcd1=https://192.168.202.128:2380, etcd2=https://192.168.202.129:2380, etcd3=https://192.168.202.130:2380 \
   --initial-cluster-state new \
   --client-cert-auth --trusted-ca-file=/opt/etcd/ssl/ca.pem \
   --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem \
   --peer-client-cert-auth --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
   --peer-cert-file=/opt/etcd/ssl/server.pem --peer-key-file=/opt/etcd/ssl/server-key.pem

通过三台服务器的控制台能够晓得,集群曾经胜利建设,咱们进行验证:

$ /opt/etcd/bin/etcdctl –cacert=/opt/etcd/ssl/ca.pem –cert=/opt/etcd/ssl/server.pem –key=/opt/etcd/ssl/server-key.pem –endpoints=”https://192.168.202.128:2379,

退出移动版