HashiCorp Vault - это система управления секретами и шифрованием на основе удостоверений. Секрет - это все, к чему вы хотите жестко контролировать доступ, например, ключи шифрования API, пароли и сертификаты. Vault предоставляет услуги шифрования, которые защищены методами аутентификации и авторизации. Используя пользовательский интерфейс, CLI или HTTP API Vault, доступ к секретам и другим конфиденциальным данным может безопасно храниться и управляться, жестко контролироваться (ограничен) и проверяться.

VAULT - часть 1: Установка

VAULT - часть 1: Конфигурирование (Storage Filesystem: standalone)

VAULT - часть 1: Инициализация

VAULT - часть 1: Перегенерация master_key (Rekeing)

VAULT - часть 1: Процесс "распечатывания" (unseal)

Установка Vault

          Теперь вы можете использовать vault команду. Попробуйте проверить версию Vault, чтобы убедиться, что она работает. 

vault --version
Vault v1.13.2 ...

          Активировать автозаполнение

vault -autocomplete-install 

          Запустите новый сеанс терминала

Конфигурирование Vault

          Vault можно настроить путем редактирования файла /etc/vault.d/vault.hcl, включенного в установочный пакет.

          Ver1: Пример конфигурационного файла для запуска на порту 8200 без SSL\TLS. 

$ vi /etc/vault.d/vault.hcl
disable_mlock = true 
ui = true
# HTTP listener
listener "tcp" {
    address = "127.0.0.1:8200"
    tls_disable = 1
}
storage "file" {
    path = "/opt/vault/data"
}

      disable_mlock - по умолчанию Vault будет использовать mlock() для блокировки страниц памяти процесса, предотвращая их замену на диск. Вы всегда должны стремиться к тому, чтобы он был включен (он включен по умолчанию). Однако эта опция не поддерживается на некоторых платформах, таких как macOS или Windows.
    ui - ​включает встроенный веб-интерфейс, который доступен для всех слушателей (адрес + порт) на /ui пути. Браузеры, получающие доступ к стандартному адресу Vault API, будут автоматически перенаправляться туда. Это также может быть предоставлено через переменную окружения VAULT_UI.
        listener - ​настраивает, как Vault прослушивает запросы API.
      address - настраивает адрес привязки в формате host+port, где значением хоста может быть полное доменное имя (FQDN) или IP-адрес, а порт представляет порт Vault API, который по умолчанию равен 8200.
       tls_disable - TLS отключен для этого упрощенного примера, так что его легко использовать без необходимости генерировать сертификат сервера и закрытый ключ. Но вы всегда должны стремиться работать с Vault с включенным TLS.
        storage - используется для указания серверной части хранилища для постоянных данных Vault.

          Установите переменную среды VAULT_ADDR.

$ export VAULT_ADDR=http://127.0.0.1:8200

          Ver2: Следующий вариант конфигурации предпочтительней
          Пример конфигурационного файла для запуска на порту 8200 с отключенной проверкой SSL\TLS. 

$ echo "VAULT_API_ADDR=https://127.0.0.1:8200" > /etc/vault.d/vault.env
$ echo
 "VAULT_API_SKIP_VERIFY=true" >> /etc/vault.d/vault.env
$ vi /etc/vault.d/vault.hcl
disable_mlock = true 
ui = true
# HTTPS listener
listener "tcp" {
    address = "0.0.0.0:8200"
    tls_cert_file = "/opt/vault/tls/tls.crt"
    tls_key_file = "/opt/vault/tls/tls.key"
}
storage "file" {
    path = "/opt/vault/data"
}

        tls_cert_file – Указывает путь к сертификату для TLS. Для этого требуется файл с кодировкой PEM. Чтобы настроить прослушиватель для использования сертификата ЦС, объедините основной сертификат и сертификат CA вместе. Основной сертификат должен появиться первым в объединенном файле. 
          tls_key_file – Указывает путь к закрытому ключу сертификата. Для этого требуется файл с кодировкой PEM. Если файл ключа зашифрован, вам будет предложено ввести парольную фразу при запуске сервера.

          Запустите новый сеанс терминала и установите переменную среды VAULT_ADDR.

$ export VAULT_ADDR=https://127.0.0.1:8200
$ export
 VAULT_SKIP_VERIFY=true

          Добавляем системную переменную.

$ vi /etc/environment
VAULT_ADDR=https://127.0.0.1:8200
VAULT_SKIP_VERIFY=true

VAULT_ENABLE_FILE_PERMISSIONS_CHECK=true

      Включаем проверку прав доступа к файлам с помощью переменной среды VAULT_ENABLE_FILE_PERMISSIONS_CHECK - позволяет Vault проверять, принадлежат ли каталог конфигурации и файлы пользователю, запустившему Vault. Он также проверяет, нет ли прав на запись или выполнение для группы или других.

          Добавляем несколько параметров конфигурации для активирования журнала событий

$ mkdir /var/log/vault/
$  
chown vault. ./vault/
$  vi /etc/vault.d/vault.hcl
log_level = "info" 
log_file = "/var/log/vault/vault.log" 
log_rotate_max_files = 7 
log_rotate_duration = "24h" 
log_rotate_bytes = 25000000 # 25Mb  

          Запускаем службу с добавлением в автозапуск.

$ systemctl enable vault --now

           Проверяем статус:

$  vault status
 Key                          Value
---                           -----
Seal Type               shamir
Initialized             false
Sealed                     true
Total Shares         0
Threshold             0
Unseal Progress 0/0
Unseal Nonce      n/a
Version                  1.13.2
Build Date             ...
Storage Type       file
HA Enabled          false

           Настраиваем firewall:

$ firewall-cmd --add-port=8200/tcp --permanent
$ firewall-cmd --add-port=8201/tcp --permanent

$ firewall-cmd --reload

Инициализация сервера Vault

     ИНИЦИАЛИЗАЦИЯ — это процесс настройки Vault. Это происходит только один раз, когда сервер запускается с новым сервером, который никогда раньше не использовался с Vault. При запуске в режиме HA это происходит один раз на кластер, а не на сервер. Во время инициализации генерируются ключи шифрования (master_key), создаются ключи отсеивания (Unseal Key) и создается начальный корневой токен (Root Token) .

       Это неаутентифицированный запрос, он работает только на совершенно новых хранилищах без существующих данных:

$ vault operator init

Unseal Key 1: 4jYbl2CBIv6SpkKj6Hos9iD32k5RfGkLzlosrrq
/JgOm 
Unseal Key 2: B05G1DRtfYckFV5BbdBvXq0wkK5HFqB9g2jc
DmNfTQiS 
Unseal Key 3: Arig0N9rN9ezkTRo7qTB7gsIZDaonOcc53EH
o83F5chA 
Unseal Key 4: 0cZE0C/gEk3YHaKjIWxhyyfs8REhqkRW/CSX
TnmTilv+ 
Unseal Key 5: fYhZOseRgzxmJCmIqUdxEm9C3jB5Q27AowE
R9w4FC2Ck 

Initial Root Token: s.KkNJYWF5g0pomcCLEmDdOVCW 

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 root key (previously known as master key). Without at least 3 key to reconstruct the root 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) и начальный корневой токен (Root Token). Это единственный раз, когда все эти данные известны Vault, а также единственный раз, когда ключи отсечка должны быть так близко друг к другу.

        При необходимости изменить количество ключей по умолчанию:

vault operator init -key-shares=3 -key-threshold=2  > /etc/vault.d/init.txt 

-key-shares=3                - количество ключей      
-key-threshold=2         - ​потребуется два ключа для "распечатывания" хранилища       
> /etc/vault.d/init.txt   - сохранить ключи в файл 

ПРИМЕЧАНИЕ. Обязательно сохраните ключи распечатывания и исходный корневой токен безопасным способом. Вы не сможете снова получить эти ключи и корневой токен. 

           Проверяем статус:

$  vault status 

         Initialized статус теперь будет установлен на trueTotal Shares а Threshold значения и будут отражать количество ключей и минимальное количество ключей, которое вам потребуется для вскрытия хранилища.  
      Обратите внимание, что в Unseal Progess строке указано значение 0/2. Начните распечатывать Хранилище, используя только что созданные токены распечатывания.

ДОПОЛНИТЕЛЬНО.  Инициализация с помощью ​HTTP API Vault:
Если конфигурация Vault с TLS/SSL необходимо добавить параметр  --cacert с указанием пути к CA сертификату

$ curl -s --request POST --data '{"secret_shares": 3, "secret_threshold": 2}' ​$VAULT_ADDR/v1/sys/init | jq

     Vault возвращает ключи разблокировки как в шестнадцатеричном коде, так и в кодировке base64, а также значение начального корневого маркера в виде открытого текста, когда вы инициализируете его с помощью HTTP API.

         Вы можете вызвать API Vault для проверки статуса инициализации.
Если конфигурация Vault с TLS/SSL необходимо добавить параметр  --cacert с указанием пути к CA сертификату

$ curl ​$VAULT_ADDR/v1/sys/init 
{ "initialized": true }

Перегенирация master_key Vault

      При первой инициализации сервера Vault генерирует корневой ключ (ранее известный как master key) и разделяет этот корневой ключ на ряд общих ключей в соответствии с алгоритмом секретного обмена Shamir. Корневой ключ используется для расшифровки базового ключа шифрования. Vault использует ключ шифрования для шифрования данных в состоянии покоя в серверной части хранилища, такой как интегрированное хранилище. Каждая из этих ключевых акций распределяется между доверенными сторонами в организации. Эти стороны должны объединиться, чтобы "распечатать" хранилище, введя свою долю ключей.     

       В некоторых случаях вы можете повторно сгенерировать корневой ключ (master key) и его общие ключевые ресурсы. Вот несколько примеров: 
         ·      Кто-то присоединяется к организации или покидает 
         ·      Безопасность хочет изменить количество акций или порог 
         ·      Соблюдение требует, чтобы ключи менялись через регулярный промежуток времени

         Инициализируйте операцию повторного ввода. Флаги представляют собой новое желаемое количество ключей и порог для распечатывания хранилища.

$ vault operator rekey -init -key-shares=3 -key-threshold=2     

          Каждый держатель ключа выполняет следующую команду и вводит свой ключ unseal.

vault operator rekey    

          Повторите шаг, чтобы завершить операцию rekey. Когда последний держатель ключа введет свой ключ, Vault выведет новые ключи.

          Rekeying с помощью ​HTTP API Vault:

c at << EOF > init.json 
{   
  "secret_shares": 5,   
  "secret_threshold": 3 

EOF

$ curl -s --header "X-Vault-Token: your_​Root Token" --request POST --data @init.json ​$VAULT_ADDR/v1/sys/rekey/init | jq 
    

           Отменить инициализацию rekey

curl -s --header "X-Vault-Token: your_​Root Token" --request DELETE $VAULT_ADDR /v1/sys/rekey/init | jq 

           Отправить ключ оператора

$ cat << EOF > key.json 
{   
  "key": "your_key",   
  "nonce": "your_nonce

EOF 

$ curl --header "X-Vault-Token: your_​Root Token" --request POST --data @key.json
$VAULT_ADDR /v1/sys/rekey/update 

          Повторите шаг, чтобы завершить операцию rekey. Когда последний держатель ключа введет свой ключ, Vault выведет новые ключи.

READ MORE

Процесс unseal "распечатывание"

          Запустите команду и введите любой из ваших ключей при появлении запроса: 

vault operator unseal    

       После его ввода выходные данные команды будут указывать на то, что распечатывание выполняется, но по-прежнему требуется еще один ключ распечатывания, прежде чем хранилище будет готово к использованию. 
        Обратите внимание, как Unseal Progress 1/3 изменилась строка на выходе. Запустите unseal команду еще раз. 

vault operator unseal    

        Введите ключ, отличный от того, который вы уже использовали. Запустите команду равное количеству key-threshold. Выходные данные команды показывают, что процесс вскрытия успешно завершен. Хранилище теперь распечатано и готово к использованию.

        Распечатывание с помощью ​HTTP API Vault:    

  curl --request POST --data '{"key": " your_keys"}' ​$VAULT_ADDR/v1/sys/unseal | jq         

    Каждый инициализированный сервер Vault запускается в запечатанном состоянии. Vault может получить доступ к физическому хранилищу, но не может прочитать его, потому что не знает, как его расшифровать. Процесс обучения Vault расшифровке данных известен как "распечатывание" Vault.
      Эти действия по распечатыванию необходимы при каждом запуске или перезапуске Vault. Однако "распечатывание" — это процесс, отличный от обычного взаимодействия с Vault (например, чтение и запись значений), которые аутентифицируются с помощью токенов
        

В следующей части мы настроим Кластер Vault High Availability