
Установка Vault в Unix/Linux
Vault — сторедж для хранения паролей или любых других данных в виде ключ\значение. Данный солюшен розрабатывает очень крутая компания (на мой взгляд) — Hashicorp, которая создала уже такие продукты как Vagrant, Consul, Terraform, Otto, etc. Как я уже говорил, все ваше секреты будут хранится в key/value виде, а собственно чтобы получить к ним досут используется исключительно API.
Для чего нужен Vault:
- Все ваши данные сохраняются в контейнер, которые имеет шифрование. И если кто-то сможет поулчить сам контейнер, то его данные не будут раскрыты.
- Vault поддерживает очень гибкие полиси для доступа. Можно создавать нужное количество токенов для доступа и юзать их для работы с секретами. Есть возможность назначать политики, которые необходимы для работы.
- Поддерживается аудит доступов к секретам, т.е каждый ваш запрос будет добавлен в лог-файл для того чтобы можно было его изучить и проанализировать.
- Данный сервис умеет автоматически генерировать секреты ( Например — postgresql, mysql, mssql, cassandra, rabbitmq, ssh, aws и многие другие).
- Имеется шифрование-дешифрование ваших данных без их сохранения. Это полезно при передачи их же в зашифрованном виде по незащищённым каналам связи.
- Позволяет задавать жизненный цикл создаваемого секрета: создание/отзыв/завершение срока хранения/продление.
- Очень крутая фишка — создания собственного CA (Certificate Authority) для управления самоподписанными сертификатами внутри своей инфраструктуры.
- Есть cubbyhole (это бэкенд), который дает возможность создавать свое хранилище секретов и которое будет не доступно даже по другим корневым-токенам.
Установка Vault в CentOS/Fedora/RedHat
Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_linux_386.zip
Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_linux_amd64.zip
Если у вас используется ARM, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_linux_arm.zip
Если у вас используется ARM64, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_linux_arm64.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка Vault в Debian/Ubuntu
Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_linux_386.zip
Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_linux_amd64.zip
Если у вас используется ARM, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_linux_arm.zip
Если у вас используется ARM64, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_linux_arm64.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка Vault в Mac OS X
Для скачивания ПО, можно использовать следующу команду:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_darwin_amd64.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка Vault в FreeBSD
Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_freebsd_386.zip
Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_freebsd_amd64.zip
Если у вас используется ARM, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_freebsd_arm.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка Vault в OpenBSD
Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_openbsd_386.zip
Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_openbsd_amd64.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка Vault в Solaris
Для скачивания ПО, можно использовать следующу команду:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/vault/0.11.4/vault_0.11.4_solaris_amd64.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка Vault для других Unix/Linux ОС
Можно попробовать скомпилировать данное ПО. Я работу не проверял, но разработчики выкладуют исходный код на гитхабе и его можно попробовать заюзать.
# cd /usr/local/src && git clone https://github.com/hashicorp/vault.git
2-й вариант — заюзать докер. Пример докерфайла:
FROM centos:7 MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com" LABEL architecture="amd64" \ OS="CentOS" \ License=GPLv2 \ Description="My dockerfile with vault" \ Vendor="Natarov Vitaliy" \ Version="1.0.0" ARG VAULT_VERSION=0.11.4 ENV PATH="$HOME/bin:/usr/local/bin:/usr/local/sbin:/sbin:/bin:/opt/local/bin:/opt/local/sbin:${PATH}" ENV LANGUAGE=en_US.UTF-8 LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 RUN yum install -y \ epel-release \ yum-plugin-ovl \ wget \ which \ unzip \ rsync \ openssh \ jq \ openssh-clients \ python-pip && \ yum clean all RUN wget -q https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip && \ unzip -q vault_${VAULT_VERSION}_linux_amd64.zip && \ yes|mv -f vault /usr/local/bin/vault && \ chmod +x /usr/local/bin/vault && \ rm -f vault_${VAULT_VERSION}_linux_amd64.zip && \ wget -q https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 -O /usr/local/bin/jq && \ chmod +x /usr/local/bin/jq # ###/usr/local/bin/vault -autocomplete-install # RUN useradd vault USER vault ENV USER vault EXPOSE 8200 ENV VAULT_ADDR='http://127.0.0.1:8200' WORKDIR /home/vault ENTRYPOINT ["/usr/local/bin/vault"] CMD ["server", "-dev"]
Билдаем его:
$ docker build -t vault:0.11.4 -f vault/Dockerfile .
Ранаем:
$ docker run -d -ti -p127.0.0.1:8200:8200 --name=vault vault:0.11.4
И дальше следовать инструкциям.
Для установки Vault, я написал скрипт:
# vim install_Vault.sh
Который имеет следующий код:
#!/bin/bash -x # CREATED: # vitaliy.natarov@yahoo.com # # Unix/Linux blog: # http://linux-notes.org # Vitaliy Natarov # function install_vault () { # if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ] ; then #update OS yum update &> /dev/null -y && yum upgrade &> /dev/null -y # if ! type -path "wget" > /dev/null 2>&1; then yum install wget &> /dev/null -y; fi if ! type -path "curl" > /dev/null 2>&1; then yum install curl &> /dev/null -y; fi if ! type -path "unzip" > /dev/null 2>&1; then yum install unzip &> /dev/null -y; fi if [ -z "`rpm -qa | grep redhat-lsb-core`" ]; then yum install redhat-lsb-core &> /dev/null -y fi OS=$(lsb_release -ds|cut -d '"' -f2|awk '{print $1}') OS_MAJOR_VERSION=$(sed -rn 's/.*([0-9]).[0-9].*/\1/p' /etc/redhat-release) OS_MINOR_VERSION=$(cat /etc/redhat-release | cut -d"." -f2| cut -d " " -f1) Bit_OS=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/') echo "$OS-$OS_MAJOR_VERSION.$OS_MINOR_VERSION with $Bit_OS bit arch" # site="https://releases.hashicorp.com/vault/" Latest_vault_version=$(curl -s "$site" --list-only | grep -E "vault_" | head -n1| cut -d ">" -f2| cut -d "<" -f1| cut -c8-) URL_with_latest_vault_package=$site$Latest_vault_version # if [ "`uname -m`" == "x86_64" ]; then Latest_vault_package=$(curl -s "$URL_with_latest_vault_package/" --list-only |grep -E "vault_" | grep -E "linux_amd64"|cut -d ">" -f2| cut -d "<" -f1) Current_link_to_archive=$URL_with_latest_vault_package/$Latest_vault_package elif [ "`uname -m`" == "i386|i686" ]; then Latest_vault_package=$(curl -s "$URL_with_latest_vault_package/" --list-only |grep -E "vault_" | grep -Ev "(SHA256SUMS|windows)"| grep -E "linux_386"|cut -d ">" -f2| cut -d "<" -f1) Current_link_to_archive=$URL_with_latest_vault_package/$Latest_vault_package fi echo $Current_link_to_archive cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null unzip $Latest_vault_package rm -rf /usr/local/src/$Latest_vault_package* yes|mv -f /usr/local/src/vault /usr/local/bin/vault chmod +x /usr/local/bin/vault elif [ -f /etc/fedora_version ]; then if ! type -path "wget" > /dev/null 2>&1; then apt-get install wget &> /dev/null -y; fi if ! type -path "curl" > /dev/null 2>&1; then apt-get install curl &> /dev/null -y; fi if ! type -path "unzip" > /dev/null 2>&1; then apt-get install unzip &> /dev/null -y; fi echo "Fedora"; OS=$(lsb_release -ds|cut -d '"' -f2|awk '{print $1}') OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*/\1/p' /etc/fedora_version` OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/\1/p' /etc/fedora_version` Bit_OS=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/') echo "$OS-$OS_MAJOR_VERSION.$OS_MINOR_VERSION($CODENAME) with $Bit_OS bit arch" # site="https://releases.hashicorp.com/vault/" Latest_vault_version=$(curl -s "$site" --list-only | grep -E "vault_" | head -n1| cut -d ">" -f2| cut -d "<" -f1| cut -c8-) URL_with_latest_vault_package=$site$Latest_vault_version # if [ "`uname -m`" == "x86_64" ]; then Latest_vault_package=$(curl -s "$URL_with_latest_vault_package/" --list-only |grep -E "vault_" | grep -E "linux_amd64"|cut -d ">" -f2| cut -d "<" -f1) Current_link_to_archive=$URL_with_latest_vault_package/$Latest_vault_package elif [ "`uname -m`" == "i386|i686" ]; then Latest_vault_package=$(curl -s "$URL_with_latest_vault_package/" --list-only |grep -E "vault_" | grep -Ev "(SHA256SUMS|windows)"| grep -E "linux_386"|cut -d ">" -f2| cut -d "<" -f1) Current_link_to_archive=$URL_with_latest_vault_package/$Latest_vault_package fi echo $Current_link_to_archive cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null unzip $Latest_vault_package rm -rf /usr/local/src/$Latest_vault_package* yes|mv -f /usr/local/src/vault /usr/local/bin/vault chmod +x /usr/local/bin/vault # elif [ -f /etc/debian_version ]; then #update OS apt-get update &> /dev/null -y && apt-get upgrade &> /dev/null -y yes| apt-get install apt-transport-https &> /dev/null # if ! type -path "wget" > /dev/null 2>&1; then yes| apt-get install wget &> /dev/null; fi if ! type -path "curl" > /dev/null 2>&1; then yes| apt-get install curl &> /dev/null; fi if ! type -path "unzip" > /dev/null 2>&1; then yes| apt-get install unzip &> /dev/null; fi # echo "Debian/Ubuntu/Kali Linux"; OS=$(lsb_release -ds|cut -d '"' -f2|awk '{print $1}') OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*/\1/p' /etc/debian_version` OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/\1/p' /etc/debian_version` Bit_OS=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/') # CODENAME=`cat /etc/*-release | grep "VERSION="` CODENAME=${CODENAME##*\(} CODENAME=${CODENAME%%\)*} echo "$OS-$OS_MAJOR_VERSION.$OS_MINOR_VERSION($CODENAME) with $Bit_OS bit arch" # site="https://releases.hashicorp.com/vault/" Latest_vault_version=$(curl -s "$site" --list-only | grep -E "vault_" | head -n1| cut -d ">" -f2| cut -d "<" -f1| cut -c8-) URL_with_latest_vault_package=$site$Latest_vault_version # if [ "`uname -m`" == "x86_64" ]; then Latest_vault_package=$(curl -s "$URL_with_latest_vault_package/" --list-only |grep -E "vault_" | grep -E "linux_amd64"|cut -d ">" -f2| cut -d "<" -f1) Current_link_to_archive=$URL_with_latest_vault_package/$Latest_vault_package elif [ "`uname -m`" == "i386|i686" ]; then Latest_vault_package=$(curl -s "$URL_with_latest_vault_package/" --list-only |grep -E "vault_" | grep -Ev "(SHA256SUMS|windows)"| grep -E "linux_386"|cut -d ">" -f2| cut -d "<" -f1) Current_link_to_archive=$URL_with_latest_vault_package/$Latest_vault_package fi echo $Current_link_to_archive cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null unzip $Latest_vault_package rm -rf /usr/local/src/$Latest_vault_package* yes|mv -f /usr/local/src/vault /usr/local/bin/vault chmod +x /usr/local/bin/vault elif [ -f /usr/sbin/system_profiler ]; then OS=$(uname) Mac_Ver=$(sw_vers -productVersion | awk -F '.' '{print $1 "." $2}') Bit_OS=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/') echo "MacOS: $OS-$Mac_Ver with $Bit_OS bit arch" which -s brew if [[ $? != 0 ]] ; then # Install Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" else # update homebrew brew update && brew upgrade fi Latest_vault_package=$(curl -s "$URL_with_latest_vault_package/" --list-only |grep -E "vault_" | grep -E "darwin_amd64"|cut -d ">" -f2| cut -d "<" -f1) Current_link_to_archive=$URL_with_latest_vault_package/$Latest_vault_package echo $Current_link_to_archive cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null unzip $Latest_vault_package rm -rf /usr/local/src/$Latest_vault_package* yes|mv -f /usr/local/src/vault /usr/local/bin/vault chmod +x /usr/local/bin/vault else OS=$(uname -s) VER=$(uname -r) echo 'OS=' $OS 'VER=' $VER fi } install_vault echo "========================================================================================================"; echo "================================================FINISHED================================================"; echo "========================================================================================================";
Запустить установку можно следующим образом:
# bash install_Vault.sh
Проверялось на Debian 8, CentOS 6/7 и на Mac OS X.
Использование Vault в Unix/Linux
Установка прошла, vault имеется в системе. Настройку я не выполнял, т.к у меня только первое знакомство с данной технологией.
Создание secret-а в Vault
Давайте создадим перый секрет:
$ vault kv put secret/hello foo=world Key Value --- ----- created_time 2018-10-25T13:06:18.101894889Z deletion_time n/a destroyed false version 1
Создадим еще один:
$ vault kv put secret/index key=value Key Value --- ----- created_time 2018-10-25T13:06:36.999736313Z deletion_time n/a destroyed false version 1
Т.е, с самого начала, имеется путь «secret» и в него можно писать секреты. У меня это hello и index. Далее идет ключ и его значение. Можно предположить что secret/hello и secret/index — это так званая БД где будут лежать все ваши значения.
Можно писать в один и тот же секрет, одно и тоже:
$ vault kv put secret/index key=value excited=yes Key Value --- ----- created_time 2018-10-25T13:06:51.263653593Z deletion_time n/a destroyed false version 2
Более подробно опишу позже или в другой раз.
Получение secret-а в Vault
Как и следовало ожидать, секреты можно получить с помощью:
$ vault kv get secret/hello ====== Metadata ====== Key Value --- ----- created_time 2018-10-25T13:06:18.101894889Z deletion_time n/a destroyed false version 1 === Data === Key Value --- ----- foo world
И мой 2-й секрет:
$ vault kv get secret/index ====== Metadata ====== Key Value --- ----- created_time 2018-10-25T13:06:51.263653593Z deletion_time n/a destroyed false version 2 ===== Data ===== Key Value --- ----- excited yes key value
Если планируете юзать скрипты, то стоит заюзать jq утилиту, например:
$ vault kv get -format=json secret/index | jq -r .data.data.excited yes
Или вот еще пример:
$ vault kv get -format=json secret/index | jq -r .data.metadata.version 2
Чтобы понять работу, стоит убрать поля и выполнить:
$ vault kv get -format=json secret/index | jq -r { "request_id": "89f94d63-0695-3fca-4d43-0f92e48432f5", "lease_id": "", "lease_duration": 0, "renewable": false, "data": { "data": { "excited": "yes", "key": "value" }, "metadata": { "created_time": "2018-10-25T13:06:51.263653593Z", "deletion_time": "", "destroyed": false, "version": 2 } }, "warnings": null }
Ничего сложного нет! Если кто-то не поймет, пишите комментарий и я помогу…
При поддержке поля, вы также можете получить его напрямую:
$ vault kv get -field=excited secret/index yes
Удаление secret-а в Vault
Создавать уже научились, выгребать данные — тоже. Сейчас покажу как можно удалить:
$ vault kv delete secret/hello Success! Data deleted (if it existed) at: secret/hello
Проверим что получилось:
$ vault kv get secret/hello ====== Metadata ====== Key Value --- ----- created_time 2018-10-25T13:06:18.101894889Z deletion_time 2018-10-25T13:28:32.333383028Z destroyed false version 1
С вывода видно что пропали ключ\значение.
Создание/Включение произвольного Secrets Engines в Vault
Раньше я показывал, как читать и писать произвольные секреты в Vault. Возможно, вы заметили, что все запросы начинаются с secret/. Попробуйте использовать другой префикс и Vault вернет ошибку:
$ vault write secr/serc key=value Error writing data to secr/serc: Error making API request. URL: PUT http://127.0.0.1:8200/v1/secr/serc Code: 404. Errors: * no handler for route 'secr/serc'
По умолчанию, vault разрешен secrets engine с kv типом и расположеном по secret/ пути. Именно kv secrets engine читает/пишет необработанные данные (raw data) в бэкенд сторедж. Vault поддерживает множество других секретов (кроме kv), и эта функция делает Vault гибким и уникальным.
Чтобы начать работу с secrets engine, необходимо включить другой экземпляр kv по другому пути. Подобно файловой системе, Vault может включить механизм секретов на разным путях. Каждый путь полностью изолирован и не может разговидить\слушать с другими путями.
Чтобы включить secrets engine выполните:
$ vault secrets enable -path=my_kv_path kv Success! Enabled the kv secrets engine at: my_kv_path/
Чтобы проверить что у нас вышло, выполните:
$ vault secrets list Path Type Accessor Description ---- ---- -------- ----------- cubbyhole/ cubbyhole cubbyhole_e60821e9 per-token private secret storage identity/ identity identity_f300f948 identity store my_kv_path/ kv kv_130ea72f n/a secret/ kv kv_79611998 key/value secret storage sys/ system system_f19deefe system endpoints used for control, policy and debugging
Как видно с вывода, my_kv_path создался и его можно использовать.
Можно добавить дескрипшен\описание создаваемого пути, например:
$ vault secrets enable -path=my_kv -description="k/v secret storage" kv Success! Enabled the kv secrets engine at: my_kv/
Для всех используемых параметров, вызовете хелп:
$ vault secrets enable -h
Давайте что-то запишем, прочитаем и запием некоторые данные в новый движок. Вот несколько идей для начала:
$ vault write my_kv_path/my-secr value="GGwp6699_guys" Success! Data written to: my_kv_path/my-secr
Создадим еще пример:
$ vault write my_kv_path/variable target=test_key Success! Data written to: my_kv_path/variable
Другая вариация создания секрета:
$ vault write my_kv_path/company type=apple class=macbook Success! Data written to: my_kv_path/company
Смотрим что вышло, выполняем команду:
$ vault list my_kv_path Keys ---- company my-secr variable
Давайте создадим еще ключ-значение для созданного энжина:
$ vault kv put my_kv_path key=value Success! Data written to: my_kv_path
И дальше аналогичным способом.
Удаление выключение произвольного Secrets Engines в Vault
Создали все это добро, но если нужно удалить или выключить такой сикрет-энжин, то легко это можно сделать.
Чтобы выключить secrets engine выполните:
Когда secrets engine больше не нужен, его можно отключить. Когда он отключен, все секреты аннулируются, и соответствующие данные и конфигурация Vault удаляются. Если по какой-либо причине Vault не может удалить данные, операция отключения завершится с ошибкой. Если это произойдет, энжин останется включенным и доступным, но запрос вернет ошибку.
$ vault secrets disable my_kv_path/ Success! Disabled the secrets engine (if it existed) at: my_kv_path/
Проверяем:
$ vault list my_kv_path No value found at my_kv_path/
Динамические секреты (Dynamic Secrets) в Vault
В отличие от kv секретов, примеры показывал выше, динамические секреты генерируются при их доступе. Такие секреты, не существуют до тех пор, пока они не будут прочитаны, поэтому нет риска, что кто-то украдет их. Поскольку у хранилища есть встроенные механизмы аннулирования, динамические секреты могут быть отменены сразу после использования, сводя к минимуму время, в течение которого существовал секрет.
Возьму пример, но для этого стоит создать Secrets Engine:
$ vault secrets enable -path=aws aws Success! Enabled the aws secrets engine at: aws/
Для этого кейса, механизм AWS секретов генерирует динамические учетные данные доступа для AWS по требованию.
можно восспользоватся помощью:
$ vault path-help aws ## DESCRIPTION The AWS backend dynamically generates AWS access keys for a set of IAM policies. The AWS access keys have a configurable lease set and are automatically revoked at the end of the lease. After mounting this backend, credentials to generate IAM keys must be configured with the "root" path and policies must be written using the "roles/" endpoints before any access keys can be generated. ## PATHS The following paths are supported by this backend. To view help for any of the paths below, use the help command with any route matching the path pattern. Note that depending on the policy of your auth token, you may or may not be able to access certain paths. ^(creds|sts)/(?P<name>\w(([\w-.]+)?\w)?)$ Generate AWS credentials from a specific Vault role. ^config/lease$ Configure the default lease information for generated credentials. ^config/root$ Configure the root credentials that are used to manage IAM. ^config/rotate-root$ Request to rotate the AWS credentials used by Vault ^roles/(?P<name>\w(([\w-.]+)?\w)?)$ Read, write and reference IAM policies that access keys can be made for. ^roles/?$ List the existing roles in this backend
Для конкретного пути можно использовать:
$ vault path-help aws/creds/my-non-existent-role Request: creds/my-non-existent-role Matching Route: ^(creds|sts)/(?P<name>\w(([\w-.]+)?\w)?)$ Generate AWS credentials from a specific Vault role. ## PARAMETERS name (string) Name of the role role_arn (string) ARN of role to assume when credential_type is assumed_role ttl (duration (sec)) Lifetime of the returned credentials in seconds ## DESCRIPTION This path will generate new, never before used AWS credentials for accessing AWS. The IAM policy used to back this key pair will be the "name" parameter. For example, if this backend is mounted at "aws", then "aws/creds/deploy" would generate access keys for the "deploy" role. The access keys will have a lease associated with them. The access keys can be revoked by using the lease ID when using the iam_user credential type. When using AWS STS credential types (assumed_role or federation_token), revoking the lease does not revoke the access keys.
Я залогинился в AWS и создал тестового юзера — test:
И так, запустим следующую команду:
$ vault write aws/config/root \ access_key=AKIAI267GYIXDYEWHZGQ \ secret_key=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<br>
PS: Не пробуйте даже юзать мои креды, т.к я создал их только для этого примера.
Создаем AWS роль, например:
$ vault write aws/roles/my-role \ credential_type=iam_user \ policy_document=-<<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:*", "Resource": "*" } ] } EOF
Сейчас, попробуем получить креды с созданной роли:
$ vault read aws/creds/my-role Key Value --- ----- lease_id aws/creds/my-role/1spBFNw4by436tB0k6AGXevW lease_duration 768h lease_renewable true access_key AKIAINY7NOQHI5EZDWLA secret_key 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 security_token <nil>
Или, можно создать полиси с использованием AWS policy ARN:
$ vault write aws/roles/my-other-role \ policy_arns=arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess,arn:aws:iam::aws:policy/IAMReadOnlyAccess \ credential_type=iam_user \ policy_document=<<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:*", "Resource": "*" } ] } EOF
Получим креды:
$ vault read aws/creds/my-other-role Key Value --- ----- lease_id aws/creds/my-other-role/7FI8VUA02RB4AFWWHs7kh79V lease_duration 768h lease_renewable true access_key AKIAI4Y4X2TBQQ7KIIIQ secret_key 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 security_token <nil>
Еще пример:
$ vault write aws/roles/ec2_admin \ credential_type=federation_token \ policy_document=@policy.json
PS: Создаем файл policy.json и в него прописывем:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "ec2:*", "Resource": "*" } }
Ну и получим данные:
$ vault read aws/creds/ec2_admin Key Value --- ----- lease_id aws/creds/ec2_admin/1CaRH0337sjh5EliD3a0qZoK lease_duration 59m58s lease_renewable false access_key ASIASN2MW3H7WC7S326L secret_key dW+FhYfyRiSEDADRt3uM8psmhXPAVrorT5pz9FH6 security_token FQoGZXIvYXdzEC0aDFLe1u6ltrjDIGI0qyLjAex0mJiHG1AHgjG2Dvl/knlbIqIMYrl7jmjtRgLHFXnAwLRv5NDWLTgZ6eNNtTth+8KzncTaRhTOX46r40a4PXALxNUYJh1oGv4HrW0JkbkFYSC4CNkspXTZnswDNTxUQuQFs5Nu5iI64RBG3tHAneph2yh2ElPutXpe8/ONXPS/eeYX7iNBpdd7UOfUHFqrNE8B94Wmc3+fslj7nGC9EGjYvQDH0nw5Hv3Z4YiFw3KSmF/WRIQaW+IrKCekZk3X+W0oTBFij/moIIgJ5wxr7VrxcVU6mADbj9ccTxQjCNb5tjskKMz2y94F
Чтобы перегенерировать данные и указать TTL, заюзайте:
$ vault write aws/sts/ec2_admin ttl=60m Key Value --- ----- lease_id aws/sts/ec2_admin/MxMGEwwDPry3yLNC1Y1soFKM lease_duration 59m59s lease_renewable false access_key ASIASN2MW3H7T52QUUEM secret_key 8okOF8CYP6+DR891B3uYva5iP1ZEmfBif05Bq35I security_token FQoGZXIvYXdzEC0aDCt0s3A4bblQoiEbaCLjAUJrML4wHFW+fwf6RgfKMI1dqUFWGHGydQzDLxD1p50xvkLIEbrP1yUaEZ0VPoHySxuDV2hYCHTjkQ8Fh3OkS5tbfzxrzeUaWrLEdApfDJ3eEhRbCgg8USEaD3cSuMuixC/2PkE3M2pATkXw+kbEpMQdINBnog7BddNSe6XPcTTq0EHThZAFPCXgcwQ1RU7lfAS1GUBZAHLo4s4XC6snIeZGws47XL3lVUsxxQLjr/3KacR6lmyiSqZ5hk///1P7P2AO1JhvuhuxhWqP9kxAt46Ts7+NDokQBXVKABg5OjMYtmv5KKX4y94F
Отменить секрет (Revoke the Secret) можно следующим образом:
$ vault lease revoke aws/sts/ec2_admin/MxMGEwwDPry3yLNC1Y1soFKM All revocation operations queued successfully!
Аутентификация в Vault
Аутентификация — это процесс, посредством которого информация, предоставленная пользователем, проверяется и преобразуется в Vault токен (с необходимой политикой). Аутентификация по токену включена по умолчанию в Vault и не может быть отключена. Когда вы запускаете dev-сервер с помощью «vault server -dev» команды, он выводит ваш root-овый токен. Корневой или рутовый токен — это первичный токен доступа для Vault настроек. Он имеет привилегии root-а, поэтому он может выполнять любую операцию в Vault.
Создадим новый токен:
$ vault token create Key Value --- ----- token 5o2mxKn4tZu8Wjkn0basVt8j token_accessor 7079rzYT2QgX6V6DGg3BYDuZ token_duration ∞ token_renewable false token_policies ["root"] identity_policies [] policies ["root"]
По умолчанию это создаст дочерний токен вашего текущего токена, который наследует все те же политики. Концепция «child» (ребенок) здесь важна: у токенов всегда есть родительский элемент, и когда этот родительский токен отменяется, дочерние токены также могут быть отменены за одну операцию.
После создания токена вы можете отменить его (сделать revoke):
$ vault token revoke 5o2mxKn4tZu8Wjkn0basVt8j Success! Revoked token (if it existed)
Логинг
Я нашел в системе (записал созданный токен при установке vault-а) и с помощью него, я могу выполнить login (вход):
$ vault login 4PGcwIpnpShLdZEDNfz0Upc3 Success! You are now authenticated. The token information displayed below is already stored in the token helper. You do NOT need to run "vault login" again. Future Vault requests will automatically use this token. Key Value --- ----- token 4PGcwIpnpShLdZEDNfz0Upc3 token_accessor 3o28DaM6OF5Ah2RU2D60FUCV token_duration ∞ token_renewable false token_policies ["root"] identity_policies [] policies ["root"]
На практике вы не должны использовать команду создания токена для генерации Vault токенов. Вместо этого должны заюзать аутентификацию в Vault с использованием любых настроенных методов (например GitHub, LDAP, AppRole. Для устаревших приложений, которые не могут генерировать свой собственный токен, вы можете создать токен заранее.
Методы Auth
Vault поддерживает множество методов auth, но их необходимо активировать перед использованием. В качестве примера метода аутентификации я возьму сервис GitHub. Включаем его:
$ vault auth enable -path=github github Success! Enabled github auth method at: github/
PS: auth-методы по умолчанию используют свой TYPE как PATH, поэтому следующие команды эквивалентны:
$ vault auth enable github
Я оставлю по умолчанию, т.к меня все это устраивает.
Затем настроим метод auth в GitHub:
$ vault write auth/github/config organization=linux-notes Success! Data written to: auth/github/config
Данная команда настраивает хранилище для логина из «linux-notes» организации в GitHub.
Следующая команда сообщает Vault сопоставить всех пользователей, которые являются членами команды «prod-team» (в организации linux-notes), для сопоставления политик «default» и «my-policy». Эти политики еще не должны существовать в системе — Vault будет просто вызывать предупреждение при входе в систему:
$ vault write auth/github/map/teams/prod-team value=default,my-policy Success! Data written to: auth/github/map/teams/prod-team
Можно вывести все включенные и доступные auth методы с помощью следующей команды:
$ vault auth list Path Type Accessor Description ---- ---- -------- ----------- github/ github auth_github_9b874563 n/a token/ token auth_token_0a92a0c4 token based credentials
Чтобы вызвать помощь, введите:
$ vault auth -h
Можно получить помощь для конкретного аута:
$ vault auth help aws
Или:
$ vault auth help github
Или:
$ vault auth help userpass
Или:
$ vault auth help token
Сгенерируйте токен в админ-панели самого github аккаунта. После этого выполним:
$ vault login -method=github token=818bf579a0785f3f48a855006c848b3aa9b769 Success! You are now authenticated. The token information displayed below is already stored in the token helper. You do NOT need to run "vault login" again. Future Vault requests will automatically use this token. Key Value --- ----- token yw3uDKAwG5Nne7QZiwrm6A4 token_accessor 1uPsc5G6Ql46dd5STL2Ah4c token_duration 768h token_renewable true token_policies ["default"] identity_policies [] policies ["default"] token_meta_org linux-notes token_meta_username SebastianUA
Залогинимся с помощью токена:
$ vault login <initial-root-token>
Можно отменить любой логин из auth метода:
$ vault token revoke -mode path auth/github
Кроме того, если вы хотите полностью отключить метод auth для gitHub, выполните:
$ vault auth disable github
Полиси в Vault
Политики в Vault контролируют доступ пользователя.
Формат полиси.
Обычные сервера имеют версию 1 для конфигурирования полисов:
path "secret/*" { capabilities = ["create"] } path "secret/foo" { capabilities = ["read"] }
Если сервис был запущен как «vault -dev», — это означает что сервис запущен в режиме дев, то в таком случае стоит юзать (используется 2-я версия):
path "secret/data/*" { capabilities = ["create"] } path "secret/data/foo" { capabilities = ["read"] }
Создаем my-policy.hcl файл и впишим в него строки.
Проверка форматирования полисов.
После чего, проверяем форматирование (чтобы убедится что у нас верный формат используемого файла с полисами):
$ vault policy fmt my-policy.hcl Success! Formatted policy: my-policy.hcl
Запись полисов
Если имеется файл с полисами, выполните следующую команду чтобы записать ваши policy:
$ vault policy write my-policy my-policy.hcl
Можно заливать полисы прямо через терминал, например:
$ vault policy write my-policy -<<EOF # Normal servers have version 1 of KV mounted by default, so will need these # paths: path "secret/*" { capabilities = ["create"] } path "secret/foo" { capabilities = ["read"] } # Dev servers have version 2 of KV mounted by default, so will need these # paths: path "secret/data/*" { capabilities = ["create"] } path "secret/data/foo" { capabilities = ["read"] } EOF
Просмотр доступных политик.
Если хотите посмотреть все доступные политики, выполните:
$ vault policy list
Просмотр политики.
Можно посмотреть что имеется в той или иной политике, например:
$ vault policy read my-policy
Тестирование политик.
Например:
$ vault token create -policy=my-policy
И так, создался токен по созданной политике, проверим что будет на ДЕВ-сервере:
$ vault kv put secret/bar robot=beepboop
И:
$ vault kv put secret/foo robot=beepboop
На ПРОД-сервере:
$ vault kv put secret/bar robot=beepboop Success! Data written to: secret/bar $ vault kv put secret/foo robot=beepboop Error writing data to secret/foo: Error making API request. URL: PUT http://127.0.0.1:8200/v1/secret/foo Code: 403. Errors: * permission denied
Mapping политик в Auth методы
Давайте замапаем политику:
$ vault write auth/github/map/teams/default value=my-policy
Настройка Vault в Unix/Linux
Как я описывал выше ,я запустил vault в режиме «-dev», это означает что все данные он сохраняет в РАМу. Чтобы сделать полноценный сторедж без потерь данных, — стоит заюзать consul в виде бэкенда.
Я такой метод еще не опробывал, по этому — будет но не сразу.
Вот и все, статья «Установка Vault в Unix/Linux» завершена.