Add bare-metal install instructions

Add instructions for a bare-metal install (like on a raspberry pi) for
use with transit-keys and break-glass scenarios.
This commit is contained in:
ducoterra
2021-07-18 21:15:49 -04:00
parent 5bbe8337c0
commit 0b2319e75e

122
README.md
View File

@@ -9,6 +9,115 @@ brew install hashicorp/tap/vault
brew install jq
```
## Install (bare metal)
1. [Download Vault](https://www.vaultproject.io/downloads)
2. Create a vault user
```bash
useradd --system --home /etc/vault.d --shell /bin/false vault
```
2. Create a config file
```bash
mkdir -p /etc/vault.d
touch /etc/vault.d/vault.hcl
chmod 640 /etc/vault.d/vault.hcl
chown --recursive vault:vault /etc/vault.d
```
3. Add the following
```hcl
storage "file" {
path = "/vault/data"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 0
tls_cert_file = "/etc/ssl/certs/pi-vault.pem"
tls_key_file = "/etc/vault.d/pi-vault.key"
}
ui = true
```
4. Add your CA (if you have one) to /etc/ssl/certs and run `update-ca-certificates`
5. Create a vault storage location
```bash
mkdir -p /vault/data
chown --recursive vault:vault /vault/data/
```
6. Allow vault to use mlock syscall to prevent memory from being swapped
```bash
setcap cap_ipc_lock=+ep /usr/local/bin/vault
```
7. Create a systemd process
```bash
touch /etc/systemd/system/vault.service
```
8. Add the following
```conf
[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
EOF
```
9. Start the service with `systemctl start vault`
10. Run `vault operator init` on the server to generate keys
11. Unseal the vault
12. Add the following backup job to /etc/crontab
```crontab
0 0 * * * root tar czvf /vault/backups/$(date +\%y-\%m-\%d-\%H-\%M)-pivault.tar.gz /vault/data
0 0 * * * root find /vault/backups/* -mtime +7 -exec rm {} +
```
## Install (Standalone)
```bash
@@ -582,11 +691,12 @@ Add signing role
vault write ssh-client-signer/roles/ducoterra -<<"EOH"
{
"allow_user_certificates": true,
"allowed_users": "*",
"allowed_users": "ducoterra",
"allowed_extensions": "permit-pty,permit-port-forwarding",
"default_extensions": [
{ "permit-pty": "" }
],
"algorithm_signer": "rsa-sha2-512",
"key_type": "ca",
"default_user": "ducoterra",
"ttl": "30m0s"
@@ -598,11 +708,12 @@ EOH
vault write ssh-client-signer/roles/pi -<<"EOH"
{
"allow_user_certificates": true,
"allowed_users": "*",
"allowed_users": "pi",
"allowed_extensions": "permit-pty,permit-port-forwarding",
"default_extensions": [
{ "permit-pty": "" }
],
"algorithm_signer": "rsa-sha2-512",
"key_type": "ca",
"default_user": "pi",
"ttl": "30m0s"
@@ -614,11 +725,12 @@ EOH
vault write ssh-client-signer/roles/rancher -<<"EOH"
{
"allow_user_certificates": true,
"allowed_users": "*",
"allowed_users": "rancher",
"allowed_extensions": "permit-pty,permit-port-forwarding",
"default_extensions": [
{ "permit-pty": "" }
],
"algorithm_signer": "rsa-sha2-512",
"key_type": "ca",
"default_user": "rancher",
"ttl": "30m0s"
@@ -629,7 +741,7 @@ EOH
Sign a key
```bash
export SSHUSER=pi; vault write -field=signed_key ssh-client-signer/sign/$SSHUSER public_key=@$HOME/.ssh/test_rsa.pub > ~/.ssh/test_rsa-cert.pub
export SSHUSER=pi; vault write -field=signed_key ssh-client-signer/sign/$SSHUSER public_key=@$HOME/.ssh/id_rsa.pub > ~/.ssh/id_rsa-cert.pub
```
SSH using the signed key
@@ -638,7 +750,7 @@ SSH using the signed key
# If you saved the signed pub as key_name"-cert.pub" then you don't need to specify the signed-cert.pub part.
ssh -i signed-cert.pub -i ~/.ssh/test_rsa client
# or without the cert (using default client)
# without the cert (using default client)
ssh -i ~/.ssh/test_rsa client
```