安全etcd机群

    一个典型的分布式系统是etcd机群。一个etcd
    机群里,各个成员(member)之间可以用TLS身份证互相验证身份
    security。此外,客户端程序和成员之间也可以利用
    TLS身份证互相验证身份。前一种验证可以保证没有恶意etcd进程鱼目混珠地加
    入机群,窃取机群里的内容。后一种验证可以确定对etcd数据库的访问者都是合
    法的。

    etcd每个成员都可以监听一个peer端口——只要互相知道对方的host域名和peer端
    口,就可以互相确认身份,组成一个机群。此外,每个成员都可以监听一个
    client端口,和客户端通信。

    在下面这个例子里,我们启动一个三个成员的etcd机群。这三个进程都运行来本
    地,而且我们准备客户端也运行在本地,所以etcd机群的host域名可以就是
    localhost。这样,这三个etcd成员可以公用一个TLS身份证,其中CSR里的域名
    就是 localhost。我们用一个自签署的CA身份证来签署这个etcd成员公用的身份
    证,并且称之为 。

    实际情况通常比这个复杂:因为每个etcd成员运行在不同的机器上,所以三个成
    员应该有三个不同的TLS身份证,每个身份证里的CSR里的域名不同。但是都可以
    用自签署的CA身份证来签署

    要生成自签署的CA身份证,以及一对儿server和client身份证,我们可以复用
    《用Go语言写HTTPS程序》一文中
    一节中的脚本
    bidirectional/create_tls_asserts.bash

    我们接下来启动一个etcd机群,其中各个成员的端口号如下:

    我们可以运行附带的 来下载和安装 etcd,
    然后运行 来在本机启动etcd机群。

    机群启动脚本etcd.bash的主要内容如下。注意,其中
    每个成员都携带 , server.key, ca.crt。其中
    是所有成员公用的身份证,即在互相验证身份时使用,也在和客户端互相验证身
    份时使用。

    如果不告诉客户端它的身份证,那么etcd机群应该因为无法验证客户端身份而报错:

    结束试验只需要

    即可杀掉etcd机群。