Vault/Install
Vault/Install将介绍Vault的安装与设定。
简介
这边提供的方式是希望在AWS上面架设HA架构的Vault服务。
- 两台EC2主机执行Vault服务。
- 前端可以使用ELB或是利用Route 53提供HA界面。
- 后端部分使用KMS加密(即“Seal”),并且透过KMS在启动时自动解封(Auto-Unseal)。
- 储存部分使用DynamoDB(即“Storage”)。
安装
在minimal的环境里面,你会需要先装一些基本的东西:
apt install -y curl gnupg software-properties-common sudo
然后:
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -; sudo apt-add-repository "deb https://apt.releases.hashicorp.com $(lsb_release -cs) main"; sudo apt update && sudo apt install vault
设定KMS、DynamoDB与IAM
这边是以AWS环境下设计的模式。
DynamoDB
建立一个表格(这边叫vault
),依照官方的设计:
- Primary partition key设为
Path
(string)。 - Primary sort key设为
Key
(string)。
量很少时可以考虑使用on-demand模式按照读写的量计费,而非以保证读写的容量计费。
KMS
使用SYMMETRIC_DEFAULT
建立即可。
IAM
建立使用者并且产生对应的AWS key(access_key
与secret_key
),或是使用EC2的Role来提供权限。
接着挂入对应的Inline Policy Policy-Vault-DynamoDB
,需要修改账户编号(这边是123456789012
)与DynamoDB的表格名称部分(这边是vault
):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:BatchWriteItem",
"dynamodb:PutItem",
"dynamodb:DescribeTable",
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:Scan",
"dynamodb:ListTagsOfResource",
"dynamodb:Query",
"dynamodb:UpdateItem",
"dynamodb:DescribeTimeToLive",
"dynamodb:GetRecords"
],
"Resource": [
"arn:aws:dynamodb:ap-southeast-1:123456789012:table/vault/stream/*",
"arn:aws:dynamodb:ap-southeast-1:123456789012:table/vault/index/*",
"arn:aws:dynamodb:ap-southeast-1:123456789012:table/vault"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"dynamodb:DescribeReservedCapacityOfferings",
"dynamodb:ListTables",
"dynamodb:DescribeReservedCapacity",
"dynamodb:DescribeLimits"
],
"Resource": "*"
}
]
}
以及Policy-Vault-KMS
,需要修改账户编号(这边是123456789012
)与KMS的Key ID部分(UUID格式,这边是01234567-89ab-cdef-0123-456789abcdef
):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:DescribeKey"
],
"Resource": "arn:aws:kms:ap-southeast-1:123456789012:key/01234567-89ab-cdef-0123-456789abcdef"
}
]
}
建立系统的使用者
建立vault
使用者:
sudo groupadd -r vault; sudo useradd -g vault -r vault
设定vault.hcl
先建立对应的路径:
sudo mkdir /etc/vault.d; sudo touch /etc/vault.d/vault.hcl; sudo chown vault:vault /etc/vault.d/vault.hcl; sudo chmod 600 /etc/vault.d/vault.hcl
Vault的设定档建议的路径是/etc/vault.d/vault.hcl
,这点没有在官方的文件里提到,但官方的范例常使用这个路径[1]。需要修改自己的网络位置(这边使用10.10.10.10
)。
api_addr = "http://10.10.10.10:8200"
cluster_addr = "http://10.10.10.10:8201"
log_level = "Info"
ui = true
listener "tcp" {
address = "0.0.0.0:8200"
cluster_address = "10.10.10.10:8201"
tls_disable = "true"
}
seal "awskms" {
region = "ap-southeast-1"
access_key = "x"
secret_key = "x"
kms_key_id = "x"
}
storage "dynamodb" {
ha_enabled = "true"
region = "ap-southeast-1"
table = "vault"
access_key = "x"
secret_key = "x"
}
如果是把机器放在AWS内部的话,可以用EC2 Role的方式,就不需要在设定档内指定access_key
与secret_key
,Vault会自己去内部网络的169.254.169.254
里抓EC2 Role提供的权限。
设定systemd相关设定
放到/lib/systemd/system/vault.service
[1]:
[Unit]
Description="HashiCorp Vault - A tool for managing secrets"
Documentation=https://www.vaultproject.io/docs/
Requires=network-online.target
After=network-online.target
ConditionFileNotEmpty=/etc/vault.d/vault.hcl
StartLimitIntervalSec=60
StartLimitBurst=3
[Service]
User=vault
Group=vault
ProtectSystem=full
ProtectHome=read-only
PrivateTmp=yes
PrivateDevices=yes
SecureBits=keep-caps
AmbientCapabilities=CAP_IPC_LOCK
Capabilities=CAP_IPC_LOCK+ep
CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK
NoNewPrivileges=yes
ExecStart=/usr/local/bin/vault server -config=/etc/vault.d/vault.hcl
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGINT
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
StartLimitInterval=60
StartLimitIntervalSec=60
StartLimitBurst=3
LimitNOFILE=65536
LimitMEMLOCK=infinity
[Install]
WantedBy=multi-user.target
然后设定开机启动,并且马上启动:
sudo systemctl daemon-reload; sudo systemctl enable vault; sudo service vault start
初始化
第一次执行时需要初始化,在其中一台机器执行:
vault operator init -recovery-shares=1 -recovery-threshold=1 -address=http://127.0.0.1:8200
这边会产生root token让使用者操作。
设定ELB
这边建议用ALB:
- 使用ACM管理HTTPS所需要的凭证。
- 使用
/v1/sys/health
的状态设定health check,只有active node会传回200[2]。
检修
把vault.hcl
内的log_level
改为Debug
后,可以在/var/log/syslog
看到不少资讯。
参考文献
- ↑ 1.0 1.1 引用错误:
<ref>
标签无效;未给name(名称)为ops-deployment-guide
的ref(参考)提供文本 - ↑ /sys/health - HTTP API. [2020-07-17] (English).