Установка Vault в Unix/Linux

Установка 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:

Тестовый AWS юзерИ так, запустим следующую команду:

$ 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» завершена.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.