使用Vault管理Kubernetes集群证书(一)

搭建vault server

  • what is vault?

Vault是一种安全访问机密的工具。 大多数软件系统都需要用到不同种类的私密信息:数据库凭证/登录密码/Token/证书/API Key 等私密信息。明码记录这些私密信息显然是很不安全的,不小心Push到远端那就可能跟某知名科技公司产品经理和程序员打架一样的处理结果了。

  • The key features of Vault

  • 集中管理各种私密信息(登陆密码/Token/证书/API Key)
  • 为私密信息设置租期(Lease),到期后自动失效
  • 密钥的动态生成、注销和滚动更新
  • 动态创建无需保存的一次性登录密钥
  • 作为数据加密/解密接口
  • 完整的审计记录
  • 命令行以及RESTful API 访问接口(本文使用该功能来产生k8s所使用到的证书)
  • Install Vault

找到适合自己系统的安装包并下载对应的zip压缩包,解压后得到vault二进制文件,将其copy到$PATH环境变量路径(such as: /usr/local/bin/)下即可使用

  • 验证vault是否安装正确
    [root@Caden-dev dl]# vault #执行vault命令可显示Help信息即可
    Usage: vault <command> [args]
    Common commands:
    read        Read data and retrieves secrets
    write       Write data, configuration, and secrets
    delete      Delete secrets and configuration
    list        List data or secrets
    login       Authenticate locally
    server      Start a Vault server
    status      Print seal and HA status
    unwrap      Unwrap a wrapped secret
    Other commands:
    audit          Interact with audit devices
    auth           Interact with auth methods
    lease          Interact with leases
    operator       Perform operator-specific tasks
    path-help      Retrieve API help for paths
    policy         Interact with policies
    secrets        Interact with secrets engines
    ssh            Initiate an SSH session
    token          Interact with tokens
    
  • 安装命令补全工具
    [root@Caden-dev dl]# vault -autocomplete-install
    [root@Caden-dev dl]# . ~/.bashrc
    
  • Starting the Vault Server

  • 在/etc/vault/目录下创建vault的配置文件 vault.json(自定义目录,下文用到)
{
  "backend": {
    "file": {
      "path": "/var/lib/vault/file"  # vault data dir
    }   
  },  
  "listener": {
    "tcp": {
      "address": "127.0.0.1:8200",
      "tls_disable": "true"
    }   
  },  
  "max_lease_ttl": "87600h" 
}
  • 将vault使用systemd管理,在/etc/systemd/system/目录下创建vault.service文件
[Unit]
Description=vault
Requires=network-online.target
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/usr/local/bin/vault server -config=/etc/vault/vault.json
ExecStop=/usr/local/bin/vault step-down
[Install]
WantedBy=multi-user.target
  • 启动vault service并初始化vault
    第一次vault init的时候vault会提供5把key和一个root token,将这5把Key和root token记录下来,分配给不同的人保管。 root token 相当于 Linux 系统中的 root user,具有最高的访问权限。而当用户要re-sealed,restarted, stopped, unseal vault的适合至少要输入正确的3 把keys才能执行。
    note: 如果启动vault时有如下报错,则需要导入环境变量
WARNING! The "vault init" command is deprecated. Please use "vault operator
init" instead. This command will be removed in Vault 0.11 (or later).
Error initializing: Put https://127.0.0.1:8200/v1/sys/init: http: server gave HTTP   response to HTTPS client
[root@tcz-dev-boob system]# export VAULT_ADDR=http://127.0.0.1:8200
[root@tcz-dev-boob system]# export VAULT_SKIP_VERIFY=1
[root@tcz-dev-adam dl]# systemctl start vault.service
[root@tcz-dev-adam dl]# systemctl status vault
● vault.service - vault
Loaded: loaded (/etc/systemd/system/vault.service; disabled; vendor preset: disabled)
 Active: active (running) since Sat 2018-08-04 16:41:35 UTC; 8s ago
 Main PID: 5091 (vault)
   Memory: 9.4M
   CGroup: /system.slice/vault.service
           └─5091 /usr/bin/vault server -config=/etc/vault/vault.json

Aug 04 16:41:35 tcz-dev-adam systemd[1]: Starting vault...
Aug 04 16:41:35 tcz-dev-adam vault[5091]: ==> Vault server configuration:
Aug 04 16:41:35 tcz-dev-adam vault[5091]: Cgo: disabled
Aug 04 16:41:35 tcz-dev-adam vault[5091]: Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", tls: "disabled")

[root@tcz-dev-adam vault]# vault operator init
Unseal Key 1: JcBq9m2Bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Unseal Key 2: fBhye17cyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Unseal Key 3: xywgUyjaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Unseal Key 4: b8Tscd2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Unseal Key 5: R/lThTExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Initial Root Token: 41b667xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.
Vault does not store the generated master key. Without at least 3 key to
reconstruct the master key, Vault will remain permanently sealed!
It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault rekey" for more information.
  • 解封vault

[root@tcz-dev-adam vault]# vault operator unseal
Unseal Key (will be hidden): 
Key                Value
---                -----
Seal Type          shamir
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    1/3  # 第1把key
Unseal Nonce       9fed053c-90fb-ec27-d16b-1753f5007d2a
Version            0.9.6
HA Enabled         true
[root@tcz-dev-adam vault]# vault operator unseal
Unseal Key (will be hidden): 
Key                Value
---                -----
Seal Type          shamir
Sealed             true  # 密封状态,不可以对vault读写数据
Total Shares       5
Threshold          3
Unseal Progress    2/3  # 第2把key
Unseal Nonce       9fed053c-90fb-ec27-d16b-1753f5007d2a
Version            0.9.6
HA Enabled         true
[root@tcz-dev-adam vault]# vault operator unseal  #输入第3把Key
Unseal Key (will be hidden): 
Key             Value
---             -----
Seal Type       shamir
Sealed          false   # false表示已解封,可以往vault server里读写数据了
Total Shares    5
Threshold       3
Version         0.9.6
Cluster Name    vault-cluster-4af0fb83
Cluster ID      e75e85cd-a1b3-d6a2-91a4-89ebf1f7816c
HA Enabled      false
[root@tcz-dev-adam vault]# vault status
Key             Value
---             -----
Seal Type       shamir
Sealed          false
Total Shares    5
Threshold       3
Version         0.9.6
Cluster Name    vault-cluster-4af0fb83
Cluster ID      e75e85cd-a1b3-d6a2-91a4-89ebf1f7816c
HA Enabled      false
  • Vault login

[root@tcz-dev-adam vault]# vault login  #使用root token登陆vault
Token (will be hidden): 
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key                Value
---                -----
token              xxxxxxxxxxxxxxxxx62c1166ae759
token_accessor     xxxxxxxxxxxxxxx0-6a7c5e07b280
token_duration     ∞
token_renewable    false
token_policies     [root]
  • Write Vault

Vault 中用 Path 区分不同数据的存放位置。一个 Path 下可以包含多个键值对,但需要注意的是 write 命令是覆盖式的而不是追加式的,所以第一条命令写入的值会被后来的所覆盖,因此你必须确保在同一个命令中一次性写入所有的内容。先将要写入vault的信息写到一个脚本里k8s_pki.sh,执行脚本后将所有数据写入vault,后续我将使用vault的api来调用这些写入的数据。

[root@tcz-dev-adam vault] cat <<EOF > k8s_pki.sh
> mount_path="pki/k8s-fat01"
> vault secrets enable -path ${mount_path} pki 
> vault write ${mount_path}/roles/kubernetes allow_any_name=true enforce_hostnames=false exclude_cn_from_sans=true
> vault write ${mount_path}/roles/kubelet allow_any_name=true enforce_hostnames=false exclude_cn_from_sans=true organization=system:nodes
> vault write ${mount_path}/roles/kube-proxy allow_any_name=true enforce_hostnames=false exclude_cn_from_sans=true organization=system:node-proxier
> vault write ${mount_path}/roles/kube-admin allow_any_name=true enforce_hostnames=false exclude_cn_from_sans=true organization=system:masters server_flag=false
> vault write ${mount_path}/roles/etcd allow_any_name=true enforce_hostnames=false exclude_cn_from_sans=true
EOF
[root@tcz-dev-adam vault]# sh k8s_pki.sh 
Success! Enabled the pki secrets engine at: pki/k8s-fat01/
Success! Data written to: pki/k8s-fat01/roles/kubernetes
Success! Data written to: pki/k8s-fat01/roles/kubelet
Success! Data written to: pki/k8s-fat01/roles/kube-proxy
Success! Data written to: pki/k8s-fat01/roles/kube-admin
Success! Data written to: pki/k8s-fat01/roles/etcd

如果不再需要该数据,可以用 vault delete $path 命令将其删除

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,591评论 18 139
  • 前言 尝到k8s甜头以后,我们就想着应用到生产环境里去,以提高业务迭代效率,可是部署在生产环境里有一个要求,就是k...
    我的橙子很甜阅读 12,877评论 0 15
  • 参考文档 https://www.linuxidc.com/Linux/2017-09/146760.htmhtt...
    三杯水Plus阅读 4,255评论 0 8
  • 时隔大半年,我又回来了,这回带来的是最近非常火的容器编排工具——kubernetes 先附上docker 官网和k...
    我的橙子很甜阅读 13,182评论 2 79
  • 20160616 对小动物谈不上喜欢还是讨厌 他们可以永远生活在图片or视频里 只要不近距离接触我 害怕毛茸茸的东...
    eternity5阅读 155评论 1 0