“Vault/Install”的版本间的差异

来自Gea-Suan Lin's Wiki
跳到导航 跳到搜索
 
(未显示同一用户的34个中间版本)
第1行: 第1行:
'''Vault''' 是一套由[[HashiCorp]] 開發 密碼管理軟體
+
'''Vault/Install''' 將介紹[[Vault]]的 安裝與設定
  
==  概要 ==
+
==  簡介 ==
  
Vault 可以 拿來 放各類credential資料,像是Key或是Password
+
這邊提供的方式是希望在[[AWS]]上面架設HA架構的Vault服務。
 +
 
 +
* 兩台[[EC2]]主機執行Vault服務。
 +
* 前端 可以 使用[[ELB]]或是利用[[Route 53]]提供HA界面。
 +
* 後端部份使用[[KMS]]加密(即「Seal」),並且透過KMS在啟動時自動解封(Auto-Unseal)。
 +
* 儲 部份使用[[DynamoDB]](即「Storage」)
  
 
== 安裝 ==
 
== 安裝 ==
第9行: 第14行:
 
Vault是單執行檔,建議安裝的路徑是<code>/usr/local/bin/vault</code>,這點沒有在官方的文件裡提到,但官方的範例常使用這個路徑<ref name="ops-deployment-guide">{{Cite web |url=https://learn.hashicorp.com/vault/day-one/ops-deployment-guide |title=Vault Deployment Guide |accessdate=2020-07-15 |language=en}}</ref>。
 
Vault是單執行檔,建議安裝的路徑是<code>/usr/local/bin/vault</code>,這點沒有在官方的文件裡提到,但官方的範例常使用這個路徑<ref name="ops-deployment-guide">{{Cite web |url=https://learn.hashicorp.com/vault/day-one/ops-deployment-guide |title=Vault Deployment Guide |accessdate=2020-07-15 |language=en}}</ref>。
  
  以Linux 版的例子來說:
+
  以x86-64的Linux 版的例子來說:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
cd /tmp; wget -c https://releases.hashicorp.com/vault/1.4.3/vault_1.4.3_linux_amd64.zip; unzip vault_1.4.3_linux_amd64.zip; sudo cp vault /usr/local/bin/vault; sudo chmod 755 /usr/local/bin/vault
+
cd /tmp; wget -c https://releases.hashicorp.com/vault/1.7.0/vault_1.7.0_linux_amd64.zip; unzip vault_1.7.0_linux_amd64.zip; sudo cp -f vault /usr/local/bin/vault; sudo chmod 755 /usr/local/bin/vault
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== 設 ==
+
== 設 定KMS、DynamoDB與IAM ==
 
 
這邊是設定成:
 
 
 
* 使用[[AWS KMS]]加解密。
 
* 使用[[Amazon DynamoDB]]當作儲存空間。
 
  
=== AWS ===
+
這邊是以[[AWS]]環境下設計的模式。
  
==== DynamoDB ====
+
=== DynamoDB ===
  
 
 建立一個表格(這邊叫<code>vault</code>),依照官方的設計:
 
 建立一個表格(這邊叫<code>vault</code>),依照官方的設計:
第33行: 第33行:
 
 量很少時可以考慮使用on-demand模式按照讀寫的量計費,而非以保證讀寫的容量計費。
 
 量很少時可以考慮使用on-demand模式按照讀寫的量計費,而非以保證讀寫的容量計費。
  
==== KMS ====
+
=== KMS ===
  
 
 使用<code>SYMMETRIC_DEFAULT</code>建立即可。
 
 使用<code>SYMMETRIC_DEFAULT</code>建立即可。
  
==== IAM ====
+
=== IAM ===
  
 
 建立使用者並且產生對應的AWS key(<code>access_key</code>與<code>secret_key</code>)。
 
 建立使用者並且產生對應的AWS key(<code>access_key</code>與<code>secret_key</code>)。
第105行: 第105行:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== /etc/vault.d/vault.hcl ===
+
== 建立系統的使用者 ==
 +
 
 +
建立<code>vault</code>使用者:
 +
 
 +
<syntaxhighlight lang="bash">
 +
sudo groupadd -r vault; sudo useradd -g vault -r vault
 +
</syntaxhighlight>
 +
 
 +
== 設定vault.hcl ==
 +
 
 +
先建立對應的路徑:
 +
 
 +
<syntaxhighlight lang="bash">
 +
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
 +
</syntaxhighlight>
  
 
Vault的設定檔建議的路徑是<code>/etc/vault.d/vault.hcl</code>,這點沒有在官方的文件裡提到,但官方的範例常使用這個路徑<ref name="ops-deployment-guide"/>。需要修改自己的網路位置(這邊使用<code>10.10.10.10</code>)。
 
Vault的設定檔建議的路徑是<code>/etc/vault.d/vault.hcl</code>,這點沒有在官方的文件裡提到,但官方的範例常使用這個路徑<ref name="ops-deployment-guide"/>。需要修改自己的網路位置(這邊使用<code>10.10.10.10</code>)。
  
<syntaxhighlight lang="bash">
+
<syntaxhighlight lang="nginx">
 
api_addr = "http://10.10.10.10:8200"
 
api_addr = "http://10.10.10.10:8200"
 
cluster_addr = "http://10.10.10.10:8201"
 
cluster_addr = "http://10.10.10.10:8201"
 
log_level = "Info"
 
log_level = "Info"
 +
ui = true
  
 
listener "tcp" {   
 
listener "tcp" {   
第134行: 第149行:
 
   secret_key = "x"
 
   secret_key = "x"
 
}
 
}
 +
</syntaxhighlight>
 +
 +
如果是把機器放在AWS內部的話,可以用EC2 Role的方式,就不需要在設定檔內指定<code>access_key</code>與<code>secret_key</code>,Vault會自己去內部網路的<code>169.254.169.254</code>裡抓EC2 Role提供的權限。
 +
 +
== 設定systemd相關設定 ==
 +
 +
放到<code>/lib/systemd/system/vault.service</code><ref name="ops-deployment-guide"/>:
 +
 +
<syntaxhighlight lang="ini">
 +
[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
 +
</syntaxhighlight>
 +
 +
然後設定開機啟動,並且馬上啟動:
 +
 +
<syntaxhighlight lang="bash">
 +
sudo systemctl daemon-reload; sudo systemctl enable vault; sudo service vault start
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== 初始化 ==
 
== 初始化 ==
  
 第一次執行時需要初始化:
+
 第一次執行時需要初始化 ,在其中一台機器執行
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
vault operator init -recovery-shares=1 -recovery-threshold=1 -address=http://10.10.10.10:8200
+
vault operator init -recovery-shares=1 -recovery-threshold=1 -address=http://127.0.0.1:8200
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
這邊會產生root token讓使用者操作。
 +
 +
== 設定ELB ==
 +
 +
這邊建議用ALB:
 +
 +
* 使用ACM管理HTTPS所需要的憑證。
 +
* 使用<code>/v1/sys/health</code>的狀態設定health check,只有active node會傳回200<ref>{{Cite web |url=https://www.vaultproject.io/api/system/health.html |title=/sys/health - HTTP API |accessdate=2020-07-17 |language=en}}</ref>。
 +
 +
== 檢修 ==
 +
 +
把<code>vault.hcl</code>內的<code>log_level</code>改為<code>Debug</code>後,可以在<code>/var/log/syslog</code>看到不少資訊。
  
 
== 參考文獻 ==
 
== 參考文獻 ==
第148行: 第227行:
 
{{Reflist|2}}
 
{{Reflist|2}}
  
==  外部 連結 ==
+
==  相關 連結 ==
  
* {{Official|https://www.vaultproject.io/}} {{en}}
+
* [[Vault]]
  
[[Category: 軟體]]
+
[[Category:Vault]]

2021年4月1日 (四) 07:18的最新版本

Vault/Install將介紹Vault的安裝與設定。

簡介

這邊提供的方式是希望在AWS上面架設HA架構的Vault服務。

  • 兩台EC2主機執行Vault服務。
  • 前端可以使用ELB或是利用Route 53提供HA界面。
  • 後端部份使用KMS加密(即「Seal」),並且透過KMS在啟動時自動解封(Auto-Unseal)。
  • 儲存部份使用DynamoDB(即「Storage」)。

安裝

Vault是單執行檔,建議安裝的路徑是/usr/local/bin/vault,這點沒有在官方的文件裡提到,但官方的範例常使用這個路徑[1]

以x86-64的Linux版的例子來說:

cd /tmp; wget -c https://releases.hashicorp.com/vault/1.7.0/vault_1.7.0_linux_amd64.zip; unzip vault_1.7.0_linux_amd64.zip; sudo cp -f vault /usr/local/bin/vault; sudo chmod 755 /usr/local/bin/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_keysecret_key)。

接著掛入對應的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_keysecret_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. 1.0 1.1 1.2 Vault Deployment Guide. [2020-07-15] (English). 
  2. /sys/health - HTTP API. [2020-07-17] (English). 

相關連結