HashiCorp Vault使用说明

概述

在深入了解Vault之前,让我们试着了解它试图解决的问题:机密信息管理。

大多数应用程序都需要存储一些机密信息,如数据库的账号密码,其他供应商的api秘钥等。之前我们一般将这些数据存储在配置文件中。但是这样并不安全,只要有服务器访问权限的人,都能随时查看并访问这些信息。这样会带来极大的安全风险。

而且随着项目的成长,复杂度不断上升,各种分布式及微服务的兴起,敏感信息会分布在各个机器上,同时不断在服务器之间传播,大大增加了安全隐患。

这时候就需要一个统一的机密信息管理服务,vault就在这样的背景下诞生了。

使用说明

安装

下载软件:https://www.vaultproject.io/downloads

解压后得到可执行文件,该文件是同时使服务器也是客户端。

启动

vault 使用HCL格式的配置文件。新建 config.hcl并填入以下内容:

# 开启web界面,http://127.0.0.1:8200/ui。不需要可以去掉
ui = true

# 使用文件存储
storage "file" {
  path    = "data"
}

# 此处不开启tls,正式环境下请配置证书
listener "tcp" {
  address     = "127.0.0.1:8200" 
  tls_disable = 1
}

更多配置请查看:https://www.vaultproject.io/docs/configuration

启动服务器

$ vault server -config=config.hcl

==> Vault server configuration:

                     Cgo: disabled
              Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
               Log Level: info
                   Mlock: supported: false, enabled: false
           Recovery Mode: false
                 Storage: file
                 Version: Vault v1.4.2

==> Vault server started! Log data will stream in below:

如果出现以下提示:

Error initializing core: Failed to lock memory: cannot allocate memory

This usually means that the mlock syscall is not available.
Vault uses mlock to prevent memory from being swapped to
disk. This requires root privileges as well as a machine
that supports mlock. Please enable mlock on your system or
disable Vault from using it. To disable Vault from using it,
set the `disable_mlock` configuration option in your configuration
file.

可以根据提示内容,将 disable_mlock 设为true。线上环境建议使用支持mlock的系统

初始化

在第一次使用的时候,需要初始化vault。之后再启动将不需要进行该操作。

$ vault operator init

Unseal Key 1: 9t43suWPep3s7z1vOS0RmowPm22Iu2NQg7WilKdrCm6c
Unseal Key 2: R9uaDFGzIoBEAgd15MQAbAxXXz8PslPJNId6SU7urDL6
Unseal Key 3: u2i5zcldyFLxh4I3uZ64aIxKSO0nu/jv3xaIqtZj7k9C
Unseal Key 4: BQ0Zcvz1/HboAmAXEtLfCiiW+8UOimCL6PyP9a1WITLR
Unseal Key 5: ByBsXsY1He6xfFCrZYaFnSsBANqoiKdHcp0YITLbEGF0

Initial Root Token: s.QIysbqxb4We3k9QBZmXf2e4g

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 operator rekey" for more information.

上面最重要的数据是
Unseal Key
Initial Root Token
这些数据只会在第一次初始化的时候显示,之后再也不会显示了,如果丢失该数据,以后将无法使用系统,所以请妥善保管这些数据。

seal / unseal

当前服务为seal状态,也就是“密封”状态,无法进行任何操作。我们需要先进行unseal,然后才能进行后续操作。注意:服务重启后默认为seal状态。每次重启服务都需要unseal。

输入以下命令:

$ vault operator unseal

Unseal Key (will be hidden):
Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    1/3
Unseal Nonce       c767af4b-6faa-893b-0a87-234113fba0af
Version            1.4.2
HA Enabled         false

提示输入unseal key,输完之后,发现Sealed 还是true,其中Unseal Progress 1/3。

我们需要输入之前给的5个unseal key 中的3个不同的key才能解锁。继续输入之前的命令,直到输入第三次出现如下提示:

$ vault operator unseal

Unseal Key (will be hidden):
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    5
Threshold       3
Version         1.4.2
Cluster Name    vault-cluster-02ad08de
Cluster ID      9224f28f-f454-93bf-db06-0d0f88a8da76
HA Enabled      false

这时候系统已经解锁,可以进行后续操作

登录

使用之前init的时候得到的Initial Root Token进行登录

$ vault login s.QIysbqxb4We3k9QBZmXf2e4g

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                s.QIysbqxb4We3k9QBZmXf2e4g
token_accessor       LQjYKYNbD9K6qffjaFQvDF9l
token_duration       ∞
token_renewable      false
token_policies       ["root"]
identity_policies    []
policies             ["root"]

作为一个root user。我们可以重新seal服务,命令为:vault operator seal。该命令可以在紧急情况锁定整个系统,禁止其他人使用。

创建secrets

在vault中,我们具体的数据保存在secrets中,产看当前所拥有的secrets:

$ vault secrets list

Path          Type         Accessor              Description
----          ----         --------              -----------
cubbyhole/    cubbyhole    cubbyhole_607ffff0    per-token private secret storage
identity/     identity     identity_c728700b     identity store
sys/          system       system_f9998969       system endpoints used for control, policy and debugging

创建我们需要的secrets:

$ vault secrets enable -path=my-secret kv

Success! Enabled the kv secrets engine at: my-secret/

上面的kv代表类型Secrets Engine。更多Engine类型查看:https://www.vaultproject.io/docs/secrets

添加policy并创建token

接下来会创建两个Policy,一个是admin,一个是reader。admin可以进行任何操作,用于管理数据。而reader则只能进行读操作。

首先创建文件admin.hcl:

# my-secret是之前创建的secrets
path "my-secret/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}

接着创建文件reader.hcl:

# my-secret是之前创建的secrets
path "my-secret/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}

然后再命令行执行:

$ vault policy write admin-policy admin.hcl

Success! Uploaded policy: admin-policy
$ vault policy write reader-policy reader.hcl

Success! Uploaded policy: reader-policy

creaete token

$ vault token create -policy=admin-policy
Key                  Value
---                  -----
token                s.aZUepwj4AL2vsC5bHIfkN15U
token_accessor       pGg98pa7i9SnqaZg1Q3yjMu8
token_duration       768h
token_renewable      true
token_policies       ["admin-policy" "default"]
identity_policies    []
policies             ["admin-policy" "default"]
$ vault token create -policy=reader-policy
Key                  Value
---                  -----
token                s.5mTr03zVlAlrDim9jEwud5nF
token_accessor       f4oYLlEVkkb5HL3PzH6yk3rF
token_duration       768h
token_renewable      true
token_policies       ["default" "reader-policy"]
identity_policies    []
policies             ["default" "reader-policy"]

请将上面创建的两个token妥善保存,后续读写操作都用这两个token来完成。

到目前为止,我们已经完成了初始工作,考虑到线上环境一般都是通过接口方式对数据进行读写,接下来会用http api的方式进行操作。

为了便于区分两个token,同时方便后续调用,将两个token写入环境变量:

# admin的token
$ export VAULT_TOKEN_ADMIN = s.aZUepwj4AL2vsC5bHIfkN15U

# reader的token
$ export VAULT_TOKEN_READER = s.5mTr03zVlAlrDim9jEwud5nF

写入

通过admin的token写入数据:

$  curl \
    --header "X-Vault-Token: $VAULT_TOKEN_ADMIN" \
    --request POST \
    --data '{ "mysql": {"username":"myname","password": "my-long-password"} }' \
    http://127.0.0.1:8200/v1/my-secret/data/creds

其中v1是前缀,my-secret 是之前创建的secrets,data/creds 是后面的path,可以任意创建。

这次试用reader的token来写入数据:

$  curl \
    --header "X-Vault-Token: $VAULT_TOKEN_READER" \
    --request POST \
    --data '{ "mysql": {"username":"myname","password": "my-long-password"} }' \
    http://127.0.0.1:8200/v1/my-secret/data/creds

提示无权限,表示之前创建的policy正式起效:

{
    "errors": [
        "1 error occurred:\n\t* permission denied\n\n"
    ]
}

这次试用reader token来获取数据:

$  curl \
    --header "X-Vault-Token: $VAULT_TOKEN_READER" \
    --request GET \
    http://127.0.0.1:8200/v1/my-secret/data/creds
{
    "request_id": "33dc39a8-b64d-14f7-2512-88a8806131bb",
    "lease_id": "",
    "renewable": false,
    "lease_duration": 2764800,
    "data": {
        "mysql": {
            "password": "my-long-password",
            "username": "myname"
        }
    },
    "wrap_info": null,
    "warnings": null,
    "auth": null
}

其中的data字段就是之前存入的数据。
到目前为止,vault的基本试用方式以及介绍完毕。想要了解更多可查看官方资料:
基本教程:https://www.vaultproject.io/docs
api教程:https://www.vaultproject.io/api-docs

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