Пост

Nginx Reverse Proxy для HashiCorp Vault в Centos 8

Обратный прокси-сервер (reverse proxy) — тип прокси-сервера, который ретранслирует запросы клиентов из внешней сети на один или несколько серверов, логически расположенных во внутренней сети. При этом для клиента это выглядит так, будто запрашиваемые ресурсы находятся непосредственно на прокси-сервере.

В предыдущей статье мы рассматривали установку HashiCorp Vault и настройку собственного центра сертификации Vault PKI. После того, как в собственном центре сертификации мы выпустили SSL сертификат для домена vault.example.com, перенастроим Vault на использование SSL

Установка Nginx

Установим утилиту dnf-utils

1
$ sudo dnf -y install dnf-utils

Добавим репозиторий Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sudo nano /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Устанавливаем Nginx

1
$ sudo dnf -y install nginx

Запускам сервис, добавляем его в автозагрузку и проверяем статус

1
2
$ sudo systemctl enable --now nginx
$ systemctl status nginx

Настраиваем Firewall

Открываем порты 80/443

1
2
3
$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
$ sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
$ sudo firewall-cmd --reload

Настройка Nginx

Отключаем дефолтный конфиг

1
$ sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf_disabled

Создаем новый конфиг Nginx для Vault

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ sudo nano /etc/nginx/conf.d/vault.example.com.conf
server {
  listen 80 default_server;
  server_name _;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl default_server;
  server_name _;

  ssl on;
  ssl_certificate /etc/nginx/conf.d/vault.example.com.crt.pem;
  ssl_certificate_key /etc/nginx/conf.d/vault.example.com.crt.key;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;

  ssl_prefer_server_ciphers on;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;

  location / {
    proxy_pass http://127.0.0.1:8200;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
  }
}

Копируем сертификаты, которые создали раньше

1
$ sudo cp ~/vault.example.com.crt.* /etc/nginx/conf.d/

При создании PKI мы указывали URL корневого и промежуточного центра сертификации без https и с портом (http://vault.example.com:8200). Через веб-интерфейс (или через терминал) надо поменять URL для корневого центра сертификации (https://vault.example.com), удалить промежуточный центр сертификации и пересоздать его с правильными URL(с момента где мы создаем CSR-файл и до конца).

Таким образом корневой центр сертификации (который мы распространяем) у нас остается прежний, а промежуточный и сертификат сервера - новые.

Либо на этапе создания собственного центра сертификации можно учесть этот момент, что будет правильнее.

Перезапускаем Nginx

1
$ sudo systemctl restart nginx

Настройка Vault

Редактируем конфиг Vault

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ sudo nano /etc/vault.d/vault.hcl
disable_cache = true
disable_mlock = true
ui = true
listener "tcp" {
    address          = "127.0.0.1:8200"
    tls_disable      = 1
}
# listener "tcp" {
#     tls_disable = 0
#     address     = "0.0.0.0:8200"
#     tls_cert_file = "/etc/vault.d/vault.example.com.crt.pem"
#     tls_key_file = "/etc/vault.d/vault.example.com.crt.key"
# }
# storage "file" {
#     path  = "/var/lib/vault/data"
# }
storage "postgresql" {
    connection_url = "postgres://vltusr:dnTkb35qNURNeV@localhost:5432/vaultdb?sslmode=disable"
    table          = "vault_kv_store"
    max_parallel   = "128"
}
api_addr         = "http://127.0.0.1:8200"
max_lease_ttl         = "10h"
default_lease_ttl    = "10h"
cluster_name         = "vault"
raw_storage_endpoint     = true
disable_sealwrap     = true
disable_printable_check = true

Перезапускаем Vault

1
$ sudo systemctl restart vault

Экспортируем переменную

1
$ export VAULT_ADDR=http://127.0.0.1:8200

Редактируем файл .bashrc

1
2
3
$ nano ~/.bashrc
[…]
export VAULT_ADDR=http://127.0.0.1:8200

Так же можно удалить строку с нашим хостом и IP-адресом из файла /etc/hosts

Проверяем статус, распаковываем хранилище, авторизуемся

1
2
3
$ vault status
$ vault operator unseal
$ vault login

Продолжение настройки Firewall

Закрываем порт 8200

1
2
$ sudo firewall-cmd --zone=public --remove-port=8200/tcp --permanent
$ sudo firewall-cmd --reload
Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.