Page_c76a3fcf https://linux-notes.org Unix/ Linux блог, на котором можно найти полезную информацию по настройке ОС и ПО. Sat, 16 Sep 2023 16:01:09 +0000 ru-RU hourly 1 https://wordpress.org/?v=6.7.2 Page_c76a3fcf https://linux-notes.org/ustanovka-vault-v-unix-linux/ https://linux-notes.org/ustanovka-vault-v-unix-linux/#respond Mon, 29 Oct 2018 13:03:39 +0000 http://linux-notes.org/?p=14463 Установка Vault в Unix/Linux Vault — сторедж для хранения паролей или любых других данных в виде ключ\значение. Данный солюшен розрабатывает очень крутая компания (на мой взгляд) — Hashicorp, которая создала уже такие продукты как Vagrant, Consul, Terraform, Otto, etc. Как я уже говорил, все ваше секреты будут хранится в key/value виде, а собственно чтобы получить […]

The post Установка Vault в Unix/Linux first appeared on linux-notes.org.]]>

Установка 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» завершена.

The post Установка Vault в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ustanovka-vault-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/ustanovka-cgroups-v-unix-linux/ https://linux-notes.org/ustanovka-cgroups-v-unix-linux/#comments Mon, 12 Mar 2018 20:55:57 +0000 http://linux-notes.org/?p=10141 Установка cgroups в Unix/Linux cgroups (англ. control group) — механизм ядра Linux, который ограничивает и изолирует вычислительные ресурсы (процессорные, сетевые, ресурсы памяти, ресурсы ввода-вывода) для групп процессов. Механизм позволяет образовывать иерархические группы процессов с заданными ресурсными свойствами и обеспечивает программное управление ими. Вы можете использовать CGroups для ограничения количества ресурсов, которые может потреблять процесс или […]

The post Установка cgroups в Unix/Linux first appeared on linux-notes.org.]]>

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

cgroups (англ. control group) — механизм ядра Linux, который ограничивает и изолирует вычислительные ресурсы (процессорные, сетевые, ресурсы памяти, ресурсы ввода-вывода) для групп процессов. Механизм позволяет образовывать иерархические группы процессов с заданными ресурсными свойствами и обеспечивает программное управление ими.

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

Архитектура cgroups

Механизм cgroups состоит из двух составных частей: ядра (cgroup core) и так называемых подсистем.

  • net_cls — помечает сетевые пакеты специальным тэгом, что позволяет идентифицировать пакеты, порождаемые определённой задачей в рамках контрольной группы;
  • devices — разрешает или блокирует доступ к устройствам;
  • blkio — устанавливает лимиты на чтение и запись с блочных устройств;
  • pids — используется для ограничения количества процессов в рамках контрольной группы.
  • cpu — обеспечивает доступ процессов в рамках контрольной группы к CPU;
  • hugetlb — активирует поддержку больших страниц памяти для контрольных групп;
  • cpuacct — генерирует отчёты об использовании ресурсов процессора;
  • freezer — приостанавливает и возобновляет выполнение задач в рамках контрольной группы
  • cpuset — распределяет задачи в рамках контрольной группы между процессорными ядрами;
  • memory — управляет выделением памяти для групп процессов;
  • netprio — используется для динамической установки приоритетов по трафику;

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

Данная тема охватит несколько ОС с наглядными примерами.

Установка cgroups в CentOS/RedHat

Данные управляющие группы и подсистемы ( к которым они относятся), могут управляться с помощью shell команд и утилит. Однако самый простой способ работы с такими группами — установить пакет libcgroup. Чтобы установить его, выполните следующую команду:

# yum install libcgroup -y

Служба cgconfig (конфигурация группы управления) используется для создания групп и управления подсистемами. Данный сервис может быть настроен для запуска во время загрузки и восстановления предустановленных групп, что делает их постоянными при перезагрузках. Чтобы запустить cgconfig  службы, выполните:

# service cgconfig start

Для проверки статуса, можно выполнить:

# service cgconfig status
Running

Чтобы добавить службу в автозагрузку ОС, выполните:

# chkconfig cgconfig on

Установка cgroups в Gentoo

Команда для установки:

$ su -c 'emerge libCGroup'

Установка cgroups в Fedora

Команда для установки:

$ su -c 'yum -y install libCGroup-tools'

Установка cgroups в Debian/Ubuntu

Не было необходимости еще!

Настройка cgroups в Unix/Linux

Документация ядра предоставляет общее описание с примерами. Но я в своей статье «Установка cgroups в Unix/Linux» опишу все возможные примеры максимально подробно.

Пакет cgroups-bin (который зависит от libcgroup1), уже предоставленный дистрибутивом. Настройка выполняется путем редактирования следующих двух файлов:

  • /etc/cgconfig.conf — В зависимости от содержимого файла конфигурации cgconfig может создавать иерархии, монтировать необходимые файловые системы, создавать группы и устанавливать параметры подсистемы (ограничения ресурсов) для каждой группы. Иерархия представляет собой набор групп, расположенных в дереве, так что каждая задача в системе находится в одной из групп в иерархии.
  • /etc/cgrules.conf — Служит для добавления ограничений для пользователей, групп, процессов.

Менеджер рабочей нагрузки (cgconfig) отвечает за распределение ресурсов.

Добавление нового процесса в менеджер можно следующим образом:

# cgexec [-g <controllers>:<path>] command [args]

Добавление уже запущенного процесса в менеджер:

# cgclassify [-g <controllers>:<path>] <pidlist>

Или, можно использовать автоматический режим при работе с файлом cgrules.conf и CGroup Rules Daemon (cgred), который заставляет каждый вновь созданный процесс использовать ограничение по группе (но об этом позже).

И так, начнем редактирование:

# vim /etc/cgconfig.conf

Вот пример моего:

group group1 {
        perm {
                task {
                        uid = captain;
                        gid = captain;
                }
                admin {
                        uid = root;
                        gid = root;
                }
        }

        cpu {
                cpu.shares = 500;
        }
}

group limitcpu{
        cpu {
                cpu.shares = 400;
        }
}

group limitmem{
        memory {
                memory.limit_in_bytes = 512m;
        }
}
group limitio{
        blkio {
                blkio.throttle.read_bps_device = "11:0 2097152";
        }
}
group browsers{
        cpu {
                cpu.shares = 200;
        }
        memory {
                memory.limit_in_bytes = 128m;
        }
}

Можно этот файл использовать а можно создать новый файл в /etc/cgconfig.d директории, например:

# vim /etc/cgconfig.d/test.conf

Пояснения:

  • В группе limitcpu ограничиваем общие ресурсы cpu доступными для процессов в этой группе до 400. cpu.shares указывает относительную долю времени процессора, доступного для задач в cgroup.
  • В группе limitmem ограничиваем доступную памяти cgroup процессам до 512 МБ.
  • В limitio группе ограничиваем пропускную способность диска до 2 Мбайт/с. Здесь ограничиваем чтение ввода-вывода на основной диск, /dev/vda, с основным: младший номер 11:0 и 2MiB/s преобразуется в байты в секунду (2x1024x1024 = 2097152).
  • В browsers группе ограничиваем общие ресурсы процессора до 200 и доступную память до 128 МБ.

Затем убедитесь, что настроенные группы отображаются правильно:

# lscgroup
cpuset:/
cpu:/
cpu:/browsers
cpu:/limitcpu
cpu:/group1
cpuacct:/
memory:/
memory:/browsers
memory:/limitmem
devices:/
freezer:/
net_cls:/
blkio:/
blkio:/limitio

Наша следующая цель — добавить процессы (задачи), для которых мы хотим ограничить ресурсы для ранее созданных групп. Cgred (механизм управления группами) — это служба, которая перемещает задачи в группы в соответствии с параметрами, заданными в файле /etc/cgrules.conf. Записи в файле /etc/cgrules.conf могут принимать одну из двух форм:

user subsystems control_group

ИЛИ:

user:command subsystems control_group

user ссылается на имя пользователя или имя группы с префиксом «@». Подсистемы (subsystems) относятся к списку подсистем, которые разделенному запятыми. control_group представляет собой путь к cgroup, а команда обозначает имя процесса или полный путь к процессу процесса. Записи в файле /etc/cgrules.conf могут содержать следующие дополнительные обозначения:

  • @ — Указывает группу вместо отдельного пользователя. Например, @admin указывает всех пользователей в admin группе.
  • * — Использовать «все\всех». Например, если установить * в user поле, то это будет говорить, что будут использоватся все пользователи в ОС.
  • % — Представляет элемент тот же, что и элемент в строке выше.

Теперь добавим ограничение к программам/процессам, которые хотим ограничить, открываем:

# vim /etc/cgrules.conf

И прописываем:

captain cpu group1/
*:firefox cpu,memory browsers/
*:hdparm blkio limitio/
sammy blkio limitio/
@admin:memhog memory limitmem/
*:cpuhog cpu limitcpu/

В приведенных выше строках устанавливаем следующие правила:

  • Для пользователя (captain) ограничиваем CPU.  Для этого, ему назначаем group1 группу.
  • Процессы firefox запускаемые от любого пользователя, будут автоматически добавлены в browsers группу и ограничеваем в подсистеме CPU и RAM.
  • Процессы hdparm запускаемые от любого пользователя, будут добавленs в blkio группу с ограничением подсистемы blkio в соответствии с значениями параметров, указанными в этой группе.
  • Все процессы, выполняемые пользователем sammy, будут добавлены в лимитированную группу и ограничены в подсистеме blkio.
  • Процессы memhog, запускаемые кем-либо из группы admin, будут добавлены в limitmem cgroup и ограничены по памяти.
  • Процессы cpuhog, выполняемые от любого пользователя, будут добавлены в limitcpu группу и ограничены по CPU.

Нам нужно запустить/перезапустить cgred-службу, чтобы изменения конфигурации cgrules вступили в силу, сделайте это, используя команду:

# service cgred restart

Нам также необходимо убедиться, что служба cgred включена для запуска при атозагрузке системы, чтобы наши правила сохранялись при перезагрузке:

# chkconfig cgred on

ЗАМЕЧАНИЕ: Для служб, которые поддерживают sysconfig, вы можете добавить CGROUP_DAEMON=»subsystem:control_group» переменную  в /etc/sysconfig/servicename вместо редактирования файла cgrules.conf. Например, для httpd службы, вы можете добавить CGROUP_DAEMON=»blkio:/limitio» в файл /etc/sysconfig/httpd.conf, чтобы добавить httpd-процессы в группу limitio.

Затем перезапустите:

# service cgconfig restart

Настройка завершена.

Использование, тестирование cgroups в Unix/Linux

Запуск службы cgconfig создает виртуальную файловую систему, установленную в /cgroup со всеми подсистемами. Проверим это:

# ls /cgroup

Получаем следующие подсистемы:

blkio cpu cpuacct cpuset devices freezer memory net_cls

Можно запустить команду `lscgroup ‘для проверки:

$ sudo lscgroup

Вы увидите подсистемы в несколько иной компоновке:

cpuset:/
cpu:/
cpuacct:/
memory:/
devices:/
freezer:/
net_cls:/
blkio:/

Протестируем ограничение на диск, для этого — нужно установить утилиту hdparm. Например, для rpm’s ОС, выполните:

# yum install hdparm

Теперь давайте запустим команду для измерения скорости чтения вашего жесткого диска, например:

# hdparm --direct -t /dev/vda

Вывод будет такой:

/dev/vda:
Timing O_DIRECT disk reads: 6 MB in 3.00 seconds = 2.00 MB/sec

На выходе показана пропускная способность диска 2 МБ/с. Если вы остановите службы cgconfig и cgred и снова запустите команду hdparm, вы можете увидеть исходную/стандартную скорость чтения с того момента, когда правила группы не были реализованы.

Создание cgroups в Unix/Linux

Чтобы создать CGroup c ограничением по CPU/RAM, выполним:

# cgcreate -g cpu,memory:your_cgroup_name

Где:

  • cpu,memory — Какие ресурсы будут ограничены. Можно еще ограничить — cpuset,cpuacct.
  • your_cgroup_name — Название вашей cgroup группы.

Можно установить ограничение прям в консоле, например, — установим ограничение по использованию RAM:

# cgset -r memory.limit_in_bytes=1G your_cgroup_name

Можно установить ограничение прям в консоле, например, — установим ограничение по использованию CPU приоритет до ~10% (1024 — это 100% приоритет):

# cgset -r cpu.shares=102 your_cgroup_name

Если используете systemD, то можно использовать SystemD Slices, нпример:

# systemctl set-property user.slice MemoryLimit=512M
# systemctl set-property system.slice MemoryLimit=1024M

Или, можно закинуть в fstab:

# cat /etc/fstab | grep -E "cgroup"

cgroup /sys/fs/cgroup cgroup defaults 0 0

Мне этого хватило что-бы пофиксить кое-что связанное с докером. Если появятся мысли что дополнить — обязательно дополню. Вот и все, статья «Установка cgroups в Unix/Linux» завершена.

The post Установка cgroups в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ustanovka-cgroups-v-unix-linux/feed/ 1
Page_c76a3fcf https://linux-notes.org/zashhita-ot-meltdown-spectre-v-unix-linux/ https://linux-notes.org/zashhita-ot-meltdown-spectre-v-unix-linux/#respond Wed, 10 Jan 2018 20:28:55 +0000 http://linux-notes.org/?p=14867 Защита от Meltdown|Spectre в Unix/Linux Meltdown нарушает самую фундаментальную изоляцию между пользовательскими приложениями и операционной системой. Эта атака позволяет программе получать доступ к памяти, а также к скрытым возможностям других программ и операционной системы. Если ваш компьютер имеет уязвимый процессор и запускает незагруженную операционную систему, небезопасно работать с конфиденциальной информацией без утечки информации. Это относится […]

The post Защита от Meltdown|Spectre в Unix/Linux first appeared on linux-notes.org.]]>

Защита от Meltdown|Spectre в Unix/Linux

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

Spectre нарушает изоляцию между различными приложениями. Это позволяет злоумышленнику обманывать программы и выполнять утечку данных.

Защита от Meltdown|Spectre в Unix/Linux

Микрокод — это код для процессора (его прошивка), поставляемая Intel или AMD. Ядро Linux может обновлять прошивку процессора без обновления BIOS во время загрузки. Микрокод процессора хранится в ОЗУ, а ядро обновляет микрокод во время каждой загрузки.

И так, проверим статус микрокода:

$ dmesg | grep microcode

Обратите внимание, что вполне возможно, что для вашего процессора нет обновления микрокода. В этом случае он будет выглядеть следующим образом:

[ 0.952699] microcode: sig=0x306a9, pf=0x10, revision=0x1c
[ 0.952773] microcode: Microcode Update Driver: v2.2.

Исправление для CentOS/RedHat/Fedora:

# yum install kernel microcode_ctl linux-firmware -y

Исправление для Debian/Ubuntu:

# apt install kernel intel-microcode -y

Исправление для Mac OS X:

Пока Apple не выпустила обновление (10.01.2018).

После обновления, выполняем ребут ОС:

$ sudo reboot

Потом,смотрим что получилось:

# dmesg | grep 'microcode'

Получаем что-то типа:

[    0.000000] microcode: microcode updated early to revision 0x1c, date = 2015-02-26
[    1.604672] microcode: sig=0x306a9, pf=0x10, revision=0x1c
[    1.604976] microcode: Microcode Update Driver: v2.01 <tigran@aivazian.fsnet.co.uk>, Peter Oruba

Вот и все, статья «Защита от Meltdown|Spectre в Unix/Linux» завершена.

The post Защита от Meltdown|Spectre в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/zashhita-ot-meltdown-spectre-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/utilita-xhost-v-unix-linux/ https://linux-notes.org/utilita-xhost-v-unix-linux/#respond Sat, 30 Dec 2017 13:46:28 +0000 http://linux-notes.org/?p=8362 Утилита xhost в Unix/Linux Xhost это утилита для изменения параметров доступа к X-серверу из пакета X11-xserver-utils. Данная утилита, является частью безопасности X11. Она управляет списком удаленного сервера, который может установить соединение с локальным X сервером. Так же, данная программа, используется для добавления и удаления хостов или пользователей в список, разрешенный для подключения к X-серверу. В случае с […]

The post Утилита xhost в Unix/Linux first appeared on linux-notes.org.]]>

Утилита xhost в Unix/Linux

Xhost это утилита для изменения параметров доступа к X-серверу из пакета X11-xserver-utils. Данная утилита, является частью безопасности X11. Она управляет списком удаленного сервера, который может установить соединение с локальным X сервером. Так же, данная программа, используется для добавления и удаления хостов или пользователей в список, разрешенный для подключения к X-серверу.

В случае с хостами это обеспечивает рудиментарную форму контроля конфиденциальности и безопасности. Этого достаточно для рабочей станции в одмнотользовательском (single user, not multi user) режиме.

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

Иногда, данная утилита не присутствует в ОС и по этому, нужно ее установить.

Установка xhost в DEB ОС

Выполняем установку:

# apt-get install x11-xserver-utils x11-utils

Для поиска можно использовать:

# apt-cache search xhost
x11-xserver-utils - X server utilities

Как-то так.

Установка xhost в RPM ОС

Выполняем установку:

# yum install xorg-x11-server-utils -y

Дополнительные пакеты:

# yum install -y xorg-x11-app*
# yum groupinstall -y 'X Window System'
# yum install -y xorg-x11-xauth xorg-x11-fonts-* xorg-x11-utils xterm
# yum -y groupinstall fonts

Для поиска можно использовать:

# yum whatprovides "*/xhost"

Как-то так.

Установка xhost в MacOS X

Выполняем установку homebrew — Установка homebrew на Mac OS X и после чего, выполняем:

$ brew install Caskroom/cask/xquartz

Как-то так.

Использование xhost в Unix/Linux

Данная утилита имеет следующий синтаксис:

$ xhost [[+−] remote_host_name ...]

Опции:

  • -help — Служит командой для вывода помощи по командам и опциям.
  • +name — Добавляет «name» (название IP или хостнейма) в список, кто имеет право подключаться к X-серверу.
  • -name — Удаляет «name» (название IP или хостнейма) со списка тех, кто имеет право подключаться к X-серверу.
  • +  — Контроль доступа к X-серверу отключен; разрешение всем и отовсюду.
  • —  — Контроль доступа к X-серверу включен; разрешение только по списку.
  • <ничего>  — Если аргументов не указано то выводится информации о текущем состоянии разрешения подключений.

Выведем информацию о текущем состоянии разрешений пользователей или хостов на подключение:

$ xhost

Разрешить полный доступ к X-серверу (всем и отовюсду):

# xhost +

Запретить доступ к X-серверу (разрешение только по списку):

# xhost -

Разрешить запуск графических программ от имени root на локальной машине:

# xhost local:root

Разрешить запуск графических программ от имени root на локальной машине:

# xhost local:root

Или:

# xhost +si:localuser:root

Разрешить запуск графических программ с 192.168.13.113 на локальной машине:

# xhost + 192.168.13.113

Запретить запуск графических программ с 192.168.13.113 на локальной машине:

# xhost - 192.168.13.113

Можно указать вот так:

  • 192.168.13.113:0 Нулевой дисплей на компьютере Sky
  • 192.168.13.113:0.1 Первый экран нулевого дисплея данного компьютера
  • 192.168.13.113:3 Третий дисплей данного компьютера

Чаще всего имя дисплея — это или просто «:0.0», или «компьютер:0.0». Чтобы узнать какой дисплей используется в системе, выполните:

$ echo $DISPLAY

Чтобы установить DISPLAY переменную, выполните (bash):

$ DISPLAY=192.168.13.113:0.0; export DISPLAY

Чтобы установить DISPLAY переменную, выполните (bash):

$ setenv DISPLAY 192.168.13.113:0.0

xhost + — огромная дыра в безопасности, поскольку она дает каждому доступ к вашим ресурсам X-сервера (не только вашему дисплею, но также и вашу мышь и клавиатуру), поэтому каждый может читать или изменять то, что вы набираете/нажимаете. Плохая привычка использовать «xhost +». Даже когда вы используете «xhost + localhost», вы открываете доступ всем людям кто на localhost-е.  Тогда, как быть и что исользовать? Простейшим способом является ssh-туннелирование.

$ ssh -X oracle@localhost
Last login: Fri Max 2 11:33:55 2017 from localhost

$ if xterm -e true; then echo success; fi
success

Другой способ это — использовать cookie X:

$ xauth extract ~/my-x-cookie $DISPLAY<
$ setfacl -m u:oracle:r ~/my-x-cookie
$ su - oracle -c "DISPLAY=$DISPLAY bash"
Password:

$ if xterm -e true; then echo success; fi
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

xterm Xt error: Can't open display: :0.0

$ xauth merge ~lsc/my-x-cookie
xauth: creating new authority file ~oracle/.Xauthority

$ if xterm -e true; then echo success; fi
success

Можно создать алиас:

alias oracle='
xauth extract $HOME/my-x-cookie $DISPLAY;
setfacl -m u:oracle:r $HOME/my-x-cookie;
su - oracle -c "export DISPLAY=$DISPLAY;
xauth merge $HOME/my-x-cookie;
bash"'

Вот и все, статья «Утилита xhost в Unix/Linux» подошла к завершению.

The post Утилита xhost в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/utilita-xhost-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/ustanovka-lynis-v-unix-linux/ https://linux-notes.org/ustanovka-lynis-v-unix-linux/#comments Mon, 25 Dec 2017 17:29:25 +0000 http://linux-notes.org/?p=6977 Установка lynis в Unix/Linux Lynis — это инструмент для аудита безопасности в Unix и Linux ОС. Он выполняет глубокие проверки безопасности, практически без настройки. Обычно используется системными администраторами, специалистами по безопасности и аудиторами для оценки защиты Unix/Linux систем. Он работает на самом хосте, поэтому он выполняет более обширные проверки безопасности, чем сканеры уязвимостей. Поддерживаемые ОС Lynis […]

The post Установка lynis в Unix/Linux first appeared on linux-notes.org.]]>

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

Lynis — это инструмент для аудита безопасности в Unix и Linux ОС. Он выполняет глубокие проверки безопасности, практически без настройки. Обычно используется системными администраторами, специалистами по безопасности и аудиторами для оценки защиты Unix/Linux систем. Он работает на самом хосте, поэтому он выполняет более обширные проверки безопасности, чем сканеры уязвимостей.

Поддерживаемые ОС

Lynis работает практически во всех Unix системах, включая:

  • AIX;
  • FreeBSD;
  • HP-UX;
  • Linux;
  • Mac OS X;
  • NetBSD;
  • OpenBSD;
  • Solaris;
  • Raspberry PI;
  • QNAP
  • И другие.

Установка lynis на CentOS/RedHat/Fedora

-=== СПОСОБ 1 — Использовать установщик yum===-

Установка очень простая и примитивная:

# yum install lynis -y

-=== СПОСОБ 2 — Использовать git===-

Выполняем:

# git clone https://github.com/CISOfy/lynis-sdk && ./lynis-devkit build rpm

-=== СПОСОБ 3 — Использовать репозиторий===-

Установим вспомогательные пакеты:

# yum update ca-certificates curl nss openssl -y

Создаем репо-файл:

# vim /etc/yum.repos.d/cisofy-lynis.repo

И, вставляем в него:

[lynis]
name=CISOfy Software - Lynis package
baseurl=https://packages.cisofy.com/community/lynis/rpm/
enabled=1
gpgkey=https://packages.cisofy.com/keys/cisofy-software-rpms-public.key
gpgcheck=1

Следующий шаг — установка Lynis:

# yum makecache fast lynis -y

Как-то так.

Установка lynis на Debian/Ubuntu

-=== СПОСОБ 1 — Использовать установщик apt-get===-

Установка очень простая и примитивная:

# apt-get install lynis -y

-=== СПОСОБ 2 — Использовать git===-

Выполняем:

# git clone https://github.com/CISOfy/lynis-sdk && ./lynis-devkit build rpm

-=== СПОСОБ 3 — Использовать репозиторий===-

Скачиваем ключ:

# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C80E383C3DE9F082E01391A0366C67DE91CA5D5F

Или:

# wget -O - https://packages.cisofy.com/keys/cisofy-software-public.key | apt-key add -

Установим вспомогательные пакеты:

# apt install apt-transport-https -y

Использование программного обеспечения на английском языке? Затем настройте APT, чтобы пропустить загрузку переводов. Это экономит полосу пропускания и предотвращает дополнительную нагрузку на серверы репозитория:

$ echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/99disable-translations

Далее, добавляем репозиторий:

Версия Команда
Debian 7 echo «deb https://packages.cisofy.com/community/lynis/deb/ wheezy main» > /etc/apt/sources.list.d/cisofy-lynis.list
Debian 8 echo «deb https://packages.cisofy.com/community/lynis/deb/ jessie main» > /etc/apt/sources.list.d/cisofy-lynis.list
Debian 9 echo «deb https://packages.cisofy.com/community/lynis/deb/ stretch main» > /etc/apt/sources.list.d/cisofy-lynis.list
Др. Debian echo «deb https://packages.cisofy.com/community/lynis/deb/ stable main» > /etc/apt/sources.list.d/cisofy-lynis.list
 Ubuntu 16.04  echo «deb https://packages.cisofy.com/community/lynis/deb/ xenial main» > /etc/apt/sources.list.d/cisofy-lynis.list
Др Ubuntu echo «deb https://packages.cisofy.com/community/lynis/deb/ stable main» > /etc/apt/sources.list.d/cisofy-lynis.list

Обновите локальную базу данных пакетов новыми данными репозитория:

# apt update -y

Выполняем установку:

# apt install lynis -y

Как-то так.

Установка lynis на MacOS X

-=== СПОСОБ 1 — Использовать установщик brew===-

Устанавливаем homebrew, если не знаете как, можно ознакомиться тут:

Установка homebrew в macOS

После чего выполняем поиск (для подтверждения наличия пакета в ОС):

$ brew search lynis

И если есть, выполняем установку:

$ brew install lynis

-=== СПОСОБ 2 — Использовать git===-

Я опишу процесс установки ниже.

Установка lynis в других Unix/Linux ОС

Исходный код можно скачать следующим образом:

# mkdir /usr/local/lynis && cd /usr/local/lynis && wget https://cisofy.com/files/lynis-2.5.7.tar.gz && tar -xvf lynis-*.tar.gz

Используйте следующую команду для запуска сканирования:

# ./lynis --check-all

Можно скачать с github:

# git clone https://github.com/CISOfy/Lynis

И выполняем:

$ cd lynis; ./lynis audit system

Использование lynis в Unix/Linux

Lynis выполняет сотни отдельных тестов, чтобы определить состояние безопасности системы. Сама проверка безопасности состоит в выполнении набора шагов от инициализации программы до его отчета:

  1. Определяет операционную систему.
  2. Поиск доступных инструментов и утилит.
  3. Проверка Lynis обновлений.
  4. Запуск тестов для включенных плагинов.
  5. Запуск тестов безопасности для каждой категории.
  6. Состояние отчета проверки безопасности.

Во время сканирования технические данные о сканировании хранятся в лог-файл. В то же время результаты (предупреждения, предложения, сбор данных) хранятся в файле отчета.

Оппортунистическое сканирование

Сканирование Lynis является оппортунистическим: оно использует то, что может найти.

Например, если он видит, что вы используете Apache, он будет выполнять начальный раунд тест связанныq с Apache. Если во время сканирования Apache, он также обнаружит SSL/TLS конфигурацию, то он будет выполнять дополнительные шаги для аудита. При этом он будет собирать обнаруженные сертификаты, чтобы впоследствии их можно было отсканировать.

Углубленное сканирование безопасности

Выполняя оппортунистическое сканирование, инструмент может работать практически без зависимостей. Чем больше он найдет, тем глубже будет аудит. Другими словами, Lynis всегда будет выполнять сканирование, настроенное для вашей системы.

Плагины для Lynis

  • Docker Containers.
  • File Integrity.
  • File sytems.
  • Firewalls.
  • Memory.
  • Processes plugin.
  • Software plugin.

Для подробной информации, используйте:

# man lynis

Выполним полную проверку системы в «тихом» режиме (иначе после каждого блока проверок придется подтверждать действия вводом с клавиатуры):

# lynis -c -Q

По завершению сканирования, внимательно изучаем отчет. Желательно в первую очередь исправить все Warnings и по мере возможности, выполнить рекомендации секции Suggestions. Также порадовал параметр Hardening index, который отображает числовое значение уровня защищенности сервера.

Некоторые полезные опции:

  • —checkall, -c : Запуск сканирования.
  • —check-update : Проврка обновлений для Lynis.
  • —cronjob : Запускает Lynis как cronjob (включает в себя «-c» и «-Q» опции).
  • —help, -h : Показывает помощь.
  • —quick, -Q : Не ждите ввода пользователя, кроме ошибок.
  • —version, -V : Выводит Lynis версию.

Создание Lynis Cronjobs

Если вы хотите создать ежедневный отчет о проверке своей системы, вам нужно установить для него задание cron:

# crontab -e

Добавьте следующее задание cron с параметром -crontab, все специальные символы будут проигнорированы из вывода, и сканирование будет полностью автоматизировано:

00 12 * * * root lynis -c -Q --auditor "automated" --cronjob

Данная задание будет выполнятся каждый день, в 12.00 и будут вести отчет в /var/log/lynis.log файл.

Обновление Lynis

Если вы хотите обновить lynis, просто введите следующую команду, чтобы загрузить и установить последнюю версию lynis:

# lynis --check-update

Вот и все, статья «Установка lynis в Unix/Linux» завершена.

The post Установка lynis в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ustanovka-lynis-v-unix-linux/feed/ 1
Page_c76a3fcf https://linux-notes.org/generatsiya-csr-c-openssl-v-unix-linux/ https://linux-notes.org/generatsiya-csr-c-openssl-v-unix-linux/#respond Sun, 19 Nov 2017 15:37:10 +0000 http://linux-notes.org/?p=9288 Генерация CSR c OpenSSL в Unix/Linux CSR (Certificate Signing Request) — это запрос на получение сертификата, который представляет собой текстовый файл, содержащий в закодированном виде информацию об администраторе домена и открытый ключ. CSR можно сгенерировать в процессе заказа SSL-сертификата или на стороне веб-сервера. Чтобы посмотреть информацию по домену, выполните: # openssl s_client -connect linux-notes.org:443 Или […]

The post Генерация CSR c OpenSSL в Unix/Linux first appeared on linux-notes.org.]]>

Генерация CSR c OpenSSL в Unix/Linux

CSR (Certificate Signing Request) — это запрос на получение сертификата, который представляет собой текстовый файл, содержащий в закодированном виде информацию об администраторе домена и открытый ключ. CSR можно сгенерировать в процессе заказа SSL-сертификата или на стороне веб-сервера.

Чтобы посмотреть информацию по домену, выполните:

# openssl s_client -connect linux-notes.org:443

Или можно посмотреть сертификат по домену следующим образом:

# echo "" | openssl s_client -connect linux-notes.org:443 -prexit 2>/dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p'

А сейчас, перейдем к генерации CSR.

Генерация ключа с OpenSSL

Для начала нужно создать ключ:

# openssl genrsa -out key_name.key 2048

Где:

  • key_name.key — Названия ключа.
  • 2048 — Длина ключа.

Для увеличения дополнительной безопасности можно увеличить длину в битах:

# openssl genrsa -out key_name.key 4096

PS: Данные команды создаут ключ БЕЗ ПАРОЛЯ. При необходимости, можно установить пароль, но для этого нужно добавить опцию «-des3»:

# openssl genrsa -des3 -out key_name.key 4096

Можно указать пароль прям в командной строке:

# openssl genrsa -des3 -out key_name.key -passout pass:YOUR_PASSWORD_HERE 2048

Где:

  • YOUR_PASSWORD_HERE — Это установленный пароль.

Идем далее….

Создание файла запроса на подпись сертификата (CSR)

Ключ уже имеется (сгенерировали его в предыдущем действии) и на основании этого ключа, можно создать запрос на подпись сертификата с приминением алгоритма sha256:

# openssl req -out CSR.csr -key key_name.key -new -sha256

После чего, стоит ввести необходимую информацию:

  • Country Name () —  Задаем имя страны, нужно ввести двухбуквенный код вашей страны в формате Международной организации по стандартизации (ISO), обозначающий страну, где ваша организация официально зарегистрирована.
  •  State or Province Name (full name) — Введите область или штат, где расположена ваша организация. Не используйте сокращения.
  • Locality Name (eg, city) — Вводим город или населенный пункт, где расположена ваша организация. Не используйте сокращения.
  • Organization Name (eg, company) — Вводим название вашей организации.
  • Organizational Unit Name (eg, section) — Название организационного подразделения.
  • Common Name (eg, fully qualified host name) — Вводим название домена или URL, который требуется защитить.
    Если вы запросили сертификат Wildcard, добавьте звездочку (*) слева от общего имени там, где требуется универсальный символ, например *.linux-notes.org.
  • Email Address — Вводим свой почтовый адрес.

Для проверки CSR, можно использовать следующую команду:

# openssl req -in CSR.csr -noout -text

Ответ должен показывать следующее, если подпись верна.

Signature Algorithm: sha256WithRSAEncryption

PS: Чтобы выполнить сгенерировать все что необходимо одной командой, выполните:

# openssl req -new -newkey rsa:2048 -nodes -out NAME_of_CSR.csr -keyout NAME_of_KEY.key -subj "/C=US/ST=Wisconsin/L=Waukesha/O=IT Dept/OU=The linux-notes companies/CN=www.linux-notes.org"

Где:

  • -out NAME_of_CSR.csr — Задаем имя CSR.
  • -keyout NAME_of_KEY.key — Задаем имя ключа.
  • -subj «/C=US/ST=Wisconsin/L=Waukesha/O=IT Dept/OU=The linux-notes companies/CN=www.linux-notes.org» — Чтобы не вводить руками необходимую информацию в процессе генерации CSR, можно использовать данную команду.

Для проверки использующего алгоритма, можно использовать следующую команду:

# openssl s_client -connect linux-notes.org:443 < /dev/null 2>/dev/null | openssl x509 -text -in /dev/stdin | grep "Signature Algorithm"

Установка сертификата (CRT)

Все зависит от того, какое ПО вы будите использовать. Я не стану рассказывать как правильно устанавливать сертификаты. Если у кого-то возникнут трудности — я смогу помочь.

Тестирование установленного сертификата

Я приведу несколько сервисов которыми пользуюсь, для тестирования сертификатов на предмет правильной установки, срока валидности и т.д.

  • Ssllabs(точка)com
  • Sslshopper(точка)com
  • Digicert(точка)com

Полезное чтиво:

Примеры использования OpenSSL в Unix/Linux

На этом у меня все, статья «Генерация CSR с OpenSSL с SHA256» завершена.

The post Генерация CSR c OpenSSL в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/generatsiya-csr-c-openssl-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/ispol-zovanie-aws-s-mnogofaktornoj-autentifikatsiej-mfa-v-unix-linux/ https://linux-notes.org/ispol-zovanie-aws-s-mnogofaktornoj-autentifikatsiej-mfa-v-unix-linux/#respond Tue, 17 Oct 2017 09:21:43 +0000 http://linux-notes.org/?p=13904 Использование AWS с многофакторной аутентификацией (MFA) в Unix/Linux Многие ставят MFA на свои учетные записи в AWS для более секурного использования. Типа, — супер секурно и все дела… Это правда, но MFA с AWScli в стандартной конфигурации, — не будет работать из-за того, что используется временные токены. Я расскажу как можно обойти это дело и начать […]

The post Использование AWS с многофакторной аутентификацией (MFA) в Unix/Linux first appeared on linux-notes.org.]]>

Использование AWS с многофакторной аутентификацией (MFA) в Unix/Linux

Многие ставят MFA на свои учетные записи в AWS для более секурного использования. Типа, — супер секурно и все дела… Это правда, но MFA с AWScli в стандартной конфигурации, — не будет работать из-за того, что используется временные токены.

Я расскажу как можно обойти это дело и начать использовать AWS cli с MFA. Для начала, ставим питон (у меня используется python3). Ставим библиотеки:

# pip3 install boto3 aws-mfa

PS: Если используете питон2, то можно выполнить:

# pip install boto3 aws-mfa

и так, либы уже установлены, — осталось немного видоизменить конфиг-файл самого AWS. Открываем:

$ vim ~/.aws/credentials

Стандартный конфиг выглядит следующим образом:

[default]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYY
region = us-east-1

[LinuxNotes]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYY

Приводим к виду:

[default]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYY
region = us-east-1

[default-long-term]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYY
region = us-east-1

[LinuxNotes]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYY

[LinuxNotes-long-term]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYY

И так далее….. Суть уловили…

После чего, запускаем:

$ aws-mfa --duration 1800 --device arn:aws:iam::41316628489:mfa/captain --profile=LinuxNotes

Где:

  • —duration 1800 — Время (Количество секунд), через которое будет сбрасыватся временные креденшелы.
  • —device arn:aws:iam::41316628489:mfa/captain — Это MFA роль. Ее можно глянуть через веб-консоль.
  • —profile=LinuxNotes — профиль, который прописали в ~/.aws/credentials

Для удобства использования, можно использовать переменные:

$ export MFA_DEVICE=arn:aws:iam::41316628489:mfa/captain
$ export MFA_STS_DURATION=1800

И потом, просто вызвать:

$ aws-mfa --profile=LinuxNotes

PS: Так же, можно заекспортировать и профиль:

$ export AWS_PROFILE=LinuxNotes

После запуска данной команды, вас попросят ввести MFA. Мне надоело каждый раз доставать свой телефон и вводить значение, по этому — я написал скрипт на питоне:

# vim get_creds.py

Вот как он выглядит:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import configparser
import argparse
import pyotp


def get_creds_from_acc_name(acc_name):
    db_file = '~/.aws/credentials'
    config = configparser.ConfigParser()
    config.sections()
    config.read(db_file)
    aws_access_key_id = config[acc_name]['aws_access_key_id']
    aws_secret_access_key = config[acc_name]['aws_secret_access_key']
    region = config[acc_name]['region']
    mfa_autorisation = config[acc_name]['mfa_autorisation']

    return aws_access_key_id, aws_secret_access_key, region, mfa_autorisation


def generate_token(acc_name):
    account_creds = get_creds_from_acc_name(acc_name)
    totp = pyotp.TOTP(account_creds[3])
    print("Current OTP for %s:" % acc_name, totp.now())
    # print (totp.verify(totp.now()))

    return generate_token


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--acc', dest='account', help='Account name', default=None)
    results = parser.parse_args()
    ac_name = results.account
    generate_token(ac_name)


if __name__ == '__main__':
    main()

Где нужно изменить:

  • db_file — Это путь где лежит ваш .aws/credentials файл.
  • Добавить значение для MFA в поле mfa_autorisation (нужно самому вставить) — в файле .aws/credentials.

После чего, можно использовать:

$ python3 get_creds.py --acc LinuxNotes

Current OTP for LinuxNotes: 328868

После чего, можно использовать AWS CLI, например:

# aws ec2 describe-instances --region=us-east-1 --profile=LinuxNotes --query "Reservations[].Instances[].PrivateIpAddress[]" --instance-ids

Это немного облегчает жизнь. У меня на этом все и статья «Использование AWS с многофакторной аутентификацией (MFA) в Unix/Linux» подошла к завершению.

The post Использование AWS с многофакторной аутентификацией (MFA) в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ispol-zovanie-aws-s-mnogofaktornoj-autentifikatsiej-mfa-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/ustanovka-certbot-dlya-polucheniya-sertifikata-ot-letsencrypt-v-unix-linux/ https://linux-notes.org/ustanovka-certbot-dlya-polucheniya-sertifikata-ot-letsencrypt-v-unix-linux/#respond Mon, 29 May 2017 08:57:06 +0000 http://linux-notes.org/?p=12022 Let’s Encrypt — это компания которая предоставляет халявные сертификаты. Она возникла со стартапа и постепенно преобразовалась в независимый Центр Сертификации. Данная компания, работает со следующими IT-корпорациями: HP, Google, Facebook,Cisco, Mozilla и ряд других. Как я уже говорил, проект возник со стартапа в 2012-м году, а создателями являются 2-е сотрудников Mozilla. Почему SSL сертификаты от Let’s Encrypt пользуются популярностью? […]

The post Установка certbot для получения сертификата от letsencrypt в Unix/Linux first appeared on linux-notes.org.]]>

Let’s Encrypt — это компания которая предоставляет халявные сертификаты. Она возникла со стартапа и постепенно преобразовалась в независимый Центр Сертификации. Данная компания, работает со следующими IT-корпорациями: HP, Google, Facebook,Cisco, Mozilla и ряд других. Как я уже говорил, проект возник со стартапа в 2012-м году, а создателями являются 2-е сотрудников Mozilla.

Почему SSL сертификаты от Let’s Encrypt пользуются популярностью?

  • Во-первых, — они халявные и за них не нужно платить.
  • Во-вторых, — выпуск сертификатов выполняется через консоль ( что упрощает жизнь) в автоматическом режиме.
  • В-третьих, — качество выпуска данных сертификатов, не хуже от других известных Центров Сертификации( Comodo, Geotrust, Symantec и т.д).

Недостатки SSL-сертификатов от Let’s Encrypt

  • Бесплатный SSL-сертификат не вечен.
  • Не все домены можно защитить бесплатным SSL-сертификатом.

Установка certbot для получения сертификата от letsencrypt в Unix/Linux

Шифрование Let’s — это новый центр сертификации (CA), который обеспечивает простой способ получения и установки бесплатных TLS/SSL-сертификатов, что позволяет использовать зашифрованный HTTPS на веб-серверах. Имеется certbot, который автоматизирует все и упрощает использование.

Вот пример того, как же работает letsencrypt с веб-сервером:

работа certbot-а с letsencrypt
работа certbot-а с letsencrypt

На этом примере, я показал как работает certbot с letsencrypt для nginx. Но можно использовать apache или любой другой веб-сервер.

# true | openssl s_client -showcerts -connect linux-notes.org:443 2>&1 | openssl x509 -text | grep -o 'DNS:[^,]*' | cut -f2 -d:

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

Приведу пример установки на различные ОС.

Установка Certbot в Ubuntu:

Установим вспомогательный пакет:

$ apt-get install software-properties-common -y

Добавляем репозиторий:

# add-apt-repository ppa:certbot/certbot

Обновимся:

# apt-get update -y

Устанавливаем Certbot:

# apt-get install certbot -y

Установка Certbot в Debian:

Добавляем репозиторий:

# echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list

Обновимся:

# apt-get update -y

Устанавливаем Certbot:

# apt-get install certbot -t jessie-backports

Не приходилось еще ставить и возможно данная инструкция не будет работать на новых версиях debian. Но внизу будут представлено решение ( универсальное) для Unix/Linux ОС.

Установка Certbot в Mac OS X:

Устанавливаем homebrew, если не знаете как, то вот статья:

Установка homebrew на Mac OS X

Выполним поиск пакета:

$ brew search certbot

Выполняем установку:

$ brew install certbot

Установка Certbot в RedHat/CentOS/Fedora:

Подключаем репозиторий EPEL:

Как включить EPEL репозиторий на CentOS

И потом, выполняем установку:

# yum install certbot -y

Установка Certbot в Gentoo:

Установим установку:

$ emerge -av app-crypt/certbot

Установка Certbot в Arch Linux:

Установим установку:

# pacman -S certbot

Установка Certbot в FreeBSD:

Установим установку:

# cd /usr/ports/security/py-certbot && make install clean

Установка Certbot на другие Unix/Linux ОС:

-===СПОСОБ 1 — используем файл===-

Выполняем:

# wget -O /usr/local/bin/certbot-auto https://dl.eff.org/certbot-auto
# chmod +x /usr/local/bin/certbot-auto
# ln -s /usr/local/bin/certbot-auto /usr/local/bin/certbot

-===СПОСОБ 2 — используем git===-

Ставим гит и выполняем:

# git clone https://github.com/certbot/certbot /usr/local/letsencrypt

-===СПОСОБ 3 — Другие решения===-

Вот, можно ознакомится:

$ links https://letsencrypt.org/docs/client-options

Установку выполнили, переходим к установке и настройке сертификатов.

Настройка сертификат от letsencrypt

Можно использовать данный сертификат на различных веб-сервера, но в данной статье — я приведу несколько примеров.

Чтобы получить помощь, можно использовать:

$ certbot --help

Регистрируем бота:

# certbot register --email your_email_addr_here@linux-notes.org

Если нужно добавить поддомен или домен в сертификат

Если забыли добавить поддомен ( ну скажем www — это как пример), или может, понадобилось добавить поддомен для какой-то нужды, то я сейчас покажу как можно это сделать:

# certbot certonly -d linux-notes.org -d www.linux-notes.org -d shop.linux-notes.org

Отвечая на вопросы, вы сгенерируете себе сертификат для поддоменов и он будет единый для всех.

Если добавить нужный ключ, то можем избавиться от вопросов, например:

# certbot certonly --expand -d linux-notes.org -d www.linux-notes.org -d shop.linux-notes.org

Можно еще использовать вебхук:

# letsencrypt certonly -a webroot --webroot-path=/home/www/windows-notes/public_html/ -d windows-notes.org -d www.windows-notes.org && systemctl reload  nginx.service

ЗАМЕЧАНИЕ: Один такой сертификат может включать в себя до 100 поддоменов в одном сертификате!

Если используется APACHE

Если у вас Apache2, открываем:

# vim /etc/apache2/conf-available/certbot.conf

И прописываем:

Alias /.well-known/ /home/www/linux-notes/public_html/.well-known/
<Directory /home/www/linux-notes/public_html/.well-known/>
Satisfy any
</Directory>

Затем, подключаем модуль в апач:

# a2enconf certbot

Создаем папку для работы:

$ mkdir -p /home/www/linux-notes/public_html/.well-known

и перезапускаем сервер:

# service apache2 reload

И выполним проверку:

# mkdir -p /home/www/linux-notes/public_html/.well-known/.well-known/acme-challenge
# echo Success > /home/www/linux-notes/public_html/.well-known/acme-challenge/test.html
$ curl -L http://linux-notes.org/.well-known/acme-challenge/test.html && rm /home/www/linux-notes/public_html/.well-known/acme-challenge/example.html

Но я не проверял работу на апаче!

Если используется NGINX

Т.к у меня установлен и используется nginx в качестве веб сервера, то я приведу настройку сертификата именно для него.

Открываем конфиг:

$ vim /etc/nginx/conf.d/linux-notes.org.conf

И прописываем к уже имеющемуся конфигу следующие строки:

location ~ /\.($|!well-known/acme-challenge/*) {
 deny all;
 }

PS: Если вы получаете все файлы с папки ( можно проверить curl-ом)с ограничением в 10 переадресаций:

$ curl --location --max-redirs 10 http://linux-notes.org/.well-known/acme-challenge/index.php

ИЛИ:

$ curl --head --silent --location --max-redirs 10 http://linux-notes.org/.well-known/acme-challenge | grep ^HTTP

Если это так, то Boulder сможет получить все эти файлы. Так же, вы не должны создавать никаких ограничений по IP.

Вот полезное чтиво по CURL:

Команда Curl в Unix/Linux

Сохраняем, закрываем файл и перезапускаем веб-сервер:

$ systemctl reload nginx

Или:

# service nginx reload

Уже имеется в системе certbot, и сейчас можно прогнать тестовый запуск:

# certbot certonly --dry-run -d linux-notes.org -d www.linux-notes.org

Устанавливаем сертификат вручную (первый раз):

# certbot certonly --webroot --webroot-path=/home/www/linux-notes/public_html/ --email solo.metal@bigmir.net -d linux-notes.org -d www.linux-notes.org

Или:

# certbot certonly --webroot -w /home/www/linux-notes/public_html/ --email solo.metal@bigmir.net -d linux-notes.org -d www.linux-notes.org

Ключи:

  • —webroot — Плагин для работы ( получения) с сертификатом. Можно использовать standalone.
  • —standalone — Плагин для работы ( получения) с сертификатом. Можно использовать webroot.
  • —email — Задаем почту. Она будет отображаться в сертификате.
  • -w — С помощью данного ключа, можно указать директорию где лежит сайт.
  • -d — Задаем доменное имя ( можно использовать данную опцию несколько раз) для которого будет сгенерирован сертификат.

После выполения команды что выше, в папке /etc/letsencrypt/live/linux-notes.org/ должны быть следующие файлы:

  • cert.pem — Сертификат вашего домена.
  • chain.pem — Сертификат Let’s Encrypt цепи.
  • fullchain.pem — Это сояитание cert.pem и chain.pem.
  • privkey.pem — Закрытый ключ вашего сертификата.

Каждый раз выполнять данное действие не то что, сложно — а скорее глупо, для этого имеется крон. И сейчас я, добавлю команду на выполнения в автоматическом режиме, которая будет обновлять сертификат ( если он просрочился):

# crontab -e -uroot

И прописываем:

0 5 * * * /usr/bin/certbot renew --quiet --renew-hook "systemctl reload nginx"

После этого действия, certbot будет запущен в 5.00 ( каждый день) и будет проверять состояние сертификата. При истечении срока, он будет продлен автоматически.

Генерация dhparam (группы Диффи-Хеллмана), для этого выполняем:

# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

И так, все уже имеется. Открываем конфиг веб сервера:

# vim /etc/nginx/conf.d/linux-notes.org.conf

И приводим к виду:

ssl_certificate /etc/letsencrypt/live/linux-notes.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/linux-notes.org/privkey.pem;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;

Так же, я внес в настройку certbot-а. Открываем:

# vim /etc/letsencrypt/cli.ini

И прописал:

authenticator = webroot
webroot-path = /home/www/linux-notes/public_html
post-hook = systemctl reload  nginx.service
text = True

Проверяем, всели в порядке:

# nginx -t

И выполняем релоад:

# service nginx reload

Собственно — это все!

После всех этих действий, можно проверить когда же истекает созданный сертификат:

# openssl s_client -connect linux-notes.org:443 2>/dev/null | openssl x509 -noout -enddate

PS: Больше полезных команд по OpenSSL можно найти тут:

Примеры использования OpenSSL в Unix/Linux

Это все хорошо, но если имеется несколько доменов. Как быть? Я нашел решение, приведу его ниже.

Создаем конфиг:

# vim /etc/letsencrypt/windows-notes.org.conf

Прописываем:

  # the domain we want to get the cert for;
  # technically it's possible to have multiple of this lines, but it only worked
  # with one domain for me, another one only got one cert, so I would recommend
  # separate config files per domain.
  domains = windows-notes.org
  
  # increase key size
  rsa-key-size = 2048 # Or 4096
  
 # the current closed beta (as of 2015-Nov-07) is using this server
 server = https://acme-v01.api.letsencrypt.org/directory
 
 # this address will receive renewal reminders
 email = solo.metal@bigmir.net
  
 # turn off the ncurses UI, we want this to be run as a cronjob
 text = True
  
 # authenticate by placing a file in the webroot (under .well-known/acme-challenge/)
 # and then letting LE fetch it
 authenticator = webroot
 webroot-path = /home/www/windows-notes/public_html/

PS: Замените параметры на свои!

Создаем папку:

# mkdir -p /home/www/windows-notes/public_html/.well-known/acme-challenge
# chown -R apache. /home/www/windows-notes/public_html/.well-known
# chmod 775 /home/www/windows-notes/public_html/.well-known && chmod 775 /home/www/windows-notes/public_html/.well-known/acme-challenge

Если это новый сайт и нет сертификатов, нужно запустить:

$ letsencrypt certonly -a webroot --webroot-path=/home/www/windows-notes/public_html/ -d windows-notes.org -d www.windows-notes.org

Потом, запускаем:

$ certbot --config /etc/letsencrypt/renewal/windows-notes.org.conf certonly

НЕ ЗАБЫВАЕМ ПРОПИСАТЬ ВСЕ НЕОБХОДИМОЕ В КОНФИГ-ФАЙЛЕ САМОГО NGINX!

Создадим баш-скрипт:

$ vim /home/captain/renew‑letsencrypt.sh

и прописываем:

#!/bin/sh

certbot --config /etc/letsencrypt/windows-notes.org.conf certonly

if [ $? -ne 0 ]
 then
        ERRORLOG=`tail /var/log/letsencrypt/letsencrypt.log`
        echo -e "The Let's Encrypt cert has not been renewed! \n \n" \
                 $ERRORLOG
 else
        nginx -s reload
fi

exit 0

И, конечно же — пропишем в кроне:

$ crontab -e -uroot

Следующий текст:

0 0 1 JAN,MAR,MAY,JUL,SEP,NOV * /home/captain/renew-letsencrypt.sh

и так для каждого сайта.

Если вы хотите удалить сертификат с вашего сервера, его можно аннулировать с помощью подкоманды. Команда ниже может использоваться, чтобы отменить определенный сертификат. Замените имя_домена доменом, сертификат которого вы хотите отозвать:

# certbot revoke --cert-path /etc/letsencrypt/live/имя_домена/cert.pem

Процесс не дает подтверждения по завершении, но если вы выполните его снова, вы получите сообщение о том, что сертификат уже отозван.

А на этом у меня все, статья «Установка certbot для получения сертификата от letsencrypt в Unix/Linux» завершена.

The post Установка certbot для получения сертификата от letsencrypt в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ustanovka-certbot-dlya-polucheniya-sertifikata-ot-letsencrypt-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/nastrojka-selinux-dlya-apache-nginx-v-unix-linux/ https://linux-notes.org/nastrojka-selinux-dlya-apache-nginx-v-unix-linux/#comments Wed, 05 Apr 2017 00:55:51 +0000 http://linux-notes.org/?p=12271 Настройка SELinux для Apache/Nginx в Unix/Linux И так, я за свои 5 лет администрирования, никогда не настраивал SELinux — я его просто выключал. Но всегда бывает первый раз и сейчас, пришло время разобраться как же устроен и как с ним работать. Многие из вас, уже сталкивались со следующей проблемой: При попытки использовать httpd сервер ( как […]

The post Настройка SELinux для Apache/Nginx в Unix/Linux first appeared on linux-notes.org.]]>

Настройка SELinux для Apache/Nginx в Unix/Linux

И так, я за свои 5 лет администрирования, никогда не настраивал SELinux — я его просто выключал. Но всегда бывает первый раз и сейчас, пришло время разобраться как же устроен и как с ним работать.

Многие из вас, уже сталкивались со следующей проблемой: При попытки использовать httpd сервер ( как пример) с включенным  SELinux на борту — апач не работал вообще ( и не спроста, т.к SELinux блокирует пакеты).

Сейчас я, воспроизведу проблему. Для начала, установлю httpd сервер ( на примере CentOS):

$ sudo yum install httpd -y

Или, проверим имеется ли он в ОС:

$ rpm -qa | grep httpd

Мой вывод такой:

httpd-2.2.15-54.el6.centos.x86_64
httpd-tools-2.2.15-54.el6.centos.x86_64

Видим что апач установлен. Проверим, работает ли SELinux, для этого служат несколько команд ( но речь не об этом), я возьму одну из них:

# getenforce
Enforcing

Это означает что он включен на сервере.

PS: вот чтиво как можно выключить SELinux:

Как отключить SELinux на CentOS

Запускаем апач:

$ service httpd restart

Запустить команду для просмотра процессов httpd:

# ps -eZ | grep httpd

unconfined_u:system_r:httpd_t:s0  3182 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0  3185 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0  3186 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0  3187 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0  3188 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0  3189 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0  3190 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0  3191 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0  3192 ?        00:00:00 httpd

Контекст SELinux, связанный с процессами httpd, является unconfined_u: system_r: httpd_t: s0. Вторая последняя часть контекста, httpd_t, является типом. Тип определяет домен для процессов и тип для файлов. В этом случае процессы httpd выполняются в домене httpd_t.

Политика SELinux определяет, как процессы, запущенные в ограниченных доменах, такие как httpd_t, взаимодействуют с файлами, другими процессами и системой в целом. Файлы должны быть помечены правильно, чтобы разрешить доступ httpd к ним. Например, httpd может читать файлы, типом httpd_sys_content_t, но не может их писать, даже если разрешения Linux разрешают доступ на запись. Например разрешение доступа к скрипта сети, позволяя httpd обращаться к файловым системам NFS и CIFS, а httpd разрешено выполнять сценарии Common Gateway Interface (CGI).

Когда вы настраиваете /etc/httpd/conf/httpd.conf для того, чтобы httpd прослушивал порт, отличный от TCP-порта 80, 443, 488, 8008, 8009 или 8443, команда semanage port должна использоваться для добавления нового номера порта Конфигурация политики SELinux. В следующем примере демонстрируется настройка httpd для прослушивания порта, который не определен в конфигурации SELinux для httpd.

Для начала, останавливаем апач:

# service httpd stop && service httpd status

При использовании semanage, у меня возникли проблемы, я получил следующую ошибку:

-bash: semanage: command not found

Исправление:
Исправляем «semanage: command not found» в Unix/Linux

Запустим команду для просмотра httpd портов SELinux ( которые дают возможность httpd, прослушивать порты):

# semanage port -l | grep -w http_port_t

http_port_t tcp 80, 443, 488, 8008, 8009, 8443

Видим что стандартные порты используются и работают. Но если нас интересует кастомный проброс определенного порта? Давайте рассмотрим пример. Редактируем конфиг апача:

$ sudo vim /etc/httpd/conf/httpd.conf

И настраиваем прослушивание порта ( предположим, что нужно прослушивать порт 54321)

Находим строку:

Listen 80

Или:

Listen 127.0.0.1:80

И приводим к виду:

Listen 127.0.0.1:12345

Или ( как я сделал себе)

Listen 12345

Запускаем службу апач:

# service httpd restart

И, получаем ошибку:

Starting httpd: (13)Permission denied: make_sock: could not bind to address 127.0.0.1:12345
no listening sockets available, shutting down
Unable to open logs
                                                           [FAILED]

Смотрим лог:

[root@localhost ~]# cat /var/log/messages| grep SELinux
Jan 19 19:29:22 localhost kernel: SELinux:  Initializing.
Jan 19 19:29:22 localhost kernel: dracut: Loading SELinux policy
Sep 22 16:31:28 localhost kernel: SELinux:  Initializing.
Sep 22 16:31:28 localhost kernel: dracut: Loading SELinux policy
Sep 22 16:36:52 localhost kernel: SELinux:  Initializing.
Sep 22 16:36:52 localhost kernel: dracut: Loading SELinux policy
Apr  1 23:37:57 localhost kernel: SELinux:  Initializing.
Apr  1 23:37:57 localhost kernel: dracut: Loading SELinux policy
Apr  4 10:16:06 localhost kernel: SELinux:  Initializing.
Apr  4 10:16:06 localhost kernel: dracut: Loading SELinux policy
Apr  4 11:04:50 localhost kernel: SELinux:  Initializing.
Apr  4 11:04:50 localhost kernel: dracut: Loading SELinux policy
Apr  5 01:07:48 localhost kernel: SELinux:  Initializing.
Apr  5 01:07:48 localhost kernel: dracut: Loading SELinux policy
Apr  5 01:46:00 localhost kernel: SELinux:  Initializing.
Apr  5 01:46:00 localhost kernel: dracut: Loading SELinux policy
[root@localhost ~]# 

И так, нужно разрешить 12345 порт в SELinux, чтобы чтобы httpd мог прослушивать его 12345, как используется в этом примере, требуется следующая команда:

# semanage port -a -t http_port_t -p tcp 12345

Теперь, пробуем запустить снова апач:

# service httpd restart
Starting httpd: [ OK ]

Теперь, когда SELinux был сконфигурирован так, чтобы httpd мог прослушивать нестандартный порт (в нашем примере TCP 12345), httpd успешно запускается на этом порту.
Чтобы доказать, что httpd прослушивает и передает на 12345 TCP-порт , откройте telnet-соединение с указанным портом и выполните команду HTTP GET, как показано ниже:

[root@localhost ~]# telnet localhost 12345
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HTTP/GET/1.1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>501 Method Not Implemented</title>
</head><body>
<h1>Method Not Implemented</h1>
<p>HTTP/GET/1.1 to / not supported.<br />
</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at localhost.localdomain Port 80</address>
</body></html>
Connection closed by foreign host.
[root@localhost ~]# 

Как-то так!

Создание политик. 

Создайте политику, чтобы назначить httpd_sys_content_t контекст для /webapps папки, а также для всех дочерних каталогов и файлов:

# semanage fcontext -a -t http_sys_content_t "/webapps(/.*)?"

Создайте политику, чтобы назначить httpd_log_t контекст для ведения логов:

semanage fcontext -a -t httpd_log_t "/webapps/logs(/.*)?"

Создайте политику, чтобы назначить httpd_log_t контекст для использования кешей:

semanage fcontext -a -t httpd_cache_t "/webapps/cache(/.*)?"

Разрешаем чтение и запись (ReadWrite)

Apache теперь имеет право использовать наши собственные каталоги. Тем не менее, он не имеет доступа для чтения ко всему. Если у вашего приложения есть файлы или каталоги ( например WordPress), то можно создать правило и разрешить чтение-запись для определенных файлов\папок.

Следующему будет присвоен  readwrite для Apache и он сможет писать или изменять данные:

# semanage fcontext -a httpd_sys_rw_content_t "/webapps/app1/public_html/uploads(/.*)?"

Создайте политику, чтобы назначить  httpd_sys_rw_content_t контекст для файла с конфигурацией WordPress (wp-config.php):

# emanage fcontext -a httpd_sys_rw_content_t "/webapps/app1/public_html/wp-config.php"

Применяем SELinux политики

Наши политики созданы и готовы к применению. Чтобы все проделанные действия заработали, необходимо перечитать политики самого SELinux:

# restorecon -Rv /webapps

Все работает, а я завершаю свою статью «Настройка SELinux для Apache/Nginx в Unix/Linux».

The post Настройка SELinux для Apache/Nginx в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/nastrojka-selinux-dlya-apache-nginx-v-unix-linux/feed/ 1
Page_c76a3fcf https://linux-notes.org/otkry-t-port-ssh-po-stuku-c-iptables/ https://linux-notes.org/otkry-t-port-ssh-po-stuku-c-iptables/#respond Tue, 04 Apr 2017 22:15:56 +0000 http://linux-notes.org/?p=7313 Открыть порт ssh по стуку с IPtables в Unix/Linux Одно из очень простых решений — открывать ssh порт ( стандартный 22-й порт) после того как постучишься в заданный, «высокий» порт. Открыть порт ssh по стуку с IPtables в Unix/Linux Есть несколько способов сделать стук, чтобы открылся нужный порт. Сейчас я расскажу о нескольких из них. […]

The post Открыть порт ssh по стуку с IPtables в Unix/Linux first appeared on linux-notes.org.]]>

Открыть порт ssh по стуку с IPtables в Unix/Linux

Одно из очень простых решений — открывать ssh порт ( стандартный 22-й порт) после того как постучишься в заданный, «высокий» порт.

Открыть порт ssh по стуку с IPtables в Unix/Linux

Есть несколько способов сделать стук, чтобы открылся нужный порт. Сейчас я расскажу о нескольких из них.

-===Способ 1 (самый простой), стук на 1 порт===-

И так, я сейчас выполню ряд действий с IPtables. И так, первое что необходимо сделать — это создать новую цепочку чтобы выполнять проверку на попытки соединенится на защищаемый порт:

# iptables -N ssh_knock

Далее, чтобы не ломились на определенный порт, я сейчас задам правило. Суть заключается в следующем, если кто-то будет производить стук на порт более 2-х раз за одну минуту ( 60 секунд), попадает в бан:

# iptables -A ssh_knock -m recent --rcheck --seconds 60 --hitcount 2 -j RETURN

Следующим правилом создается исключение, которое говорит

Если производился стук в нужный порт ( за последние 10 секунд), то разрешаем соединение:

# iptables -A ssh_knock -m recent --rcheck --seconds 10 -j ACCEPT

Очистим  INPUT цепочку:

# iptables -F INPUT

Разрешаем прохождение пакетов на установленные соединения:

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Все попытки открыть новое SSH соединение, будут проверяться:

# iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ssh_knock

Сейчас, собственно  прописываем правило для стука на заданный порт:

# iptables -A INPUT -m state --state NEW -p tcp --dport 27520 -m recent --set

Закрываем соседние порты ( чтобы не стучались):

# iptables -A INPUT -m state --state NEW -p tcp -m multiport --dport 27519,27521 -m recent --remove

Остальное, запретим:

# iptables -P INPUT DROP

Для удобства использования, я создал баш скрипт:

# vim knock.sh

И прописал в него:

#/bin/sh -x

iptables -N ssh_knock
iptables -A ssh_knock -m recent --rcheck --seconds 60 --hitcount 2 -j RETURN
iptables -A ssh_knock -m recent --rcheck --seconds 30 -j ACCEPT
iptables -F INPUT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ssh_knock
iptables -A INPUT -m state --state NEW -p tcp --dport 27520 -m recent --set
iptables -A INPUT -m state --state NEW -p tcp -m multiport --dport 27519,27521 -m recent --remove
iptables -P INPUT DROP

Запускаем:

$ bash knock.sh

PS: Может понадобится выставить права на исполнение ( chmod +x knock.sh).

Выполним проверку iptables:

[root@localhost ~]# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ssh_knock  tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
           tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:27520 recent: SET name: DEFAULT side: source 
           tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW multiport dports 27519,27521 recent: REMOVE name: DEFAULT side: source 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain ssh_knock (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           recent: CHECK seconds: 60 hit_count: 2 name: DEFAULT side: source 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           recent: CHECK seconds: 30 name: DEFAULT side: source 
[root@localhost ~]#

Реализация довольно простая, но на практике — выполняем защиту: После стука на 27520 порт, будет производиться открытие SSH порта ( в этом примере, 22-й порт используется). Если за минуту будет произведено более 1 стука, порт не будет открыт и вы получите бан. Соседние порты были закрыты с целью защиты и от предотвращения подбора стука.

Чтобы постучаться, используем команду:

$ nmap -Pn --host_timeout 201 --max-retries 0 -p 27520 192.168.13.157

PS: Можно заюзать любую другую тулзу — telnet, nc hping.

И после чего, выполняем подключение на сервер:

$ ssh captain@192.168.13.157 -p22

Так не есть удобно! По этому, создаем баш-скрипт:

# vim knock_ssh_connection.sh

И прописывам в него:

#!/bin/sh -x

nmap -Pn --host_timeout 201 --max-retries 0 -p 27520 192.168.13.157 &>2 >>/dev/null
ssh captain@192.168.13.157 -p22

Надеюсь описывать не нужно что делает данный скрипт? -Если что, пишите в коменты, отвечу и помогу.

PS: Не забываем выставить права на использование (chmod +x knock_ssh_connection.sh).

А сейчас я, расскажу более сложный стук, с использованием 3-х стуков на разные порты.

-===Способ 2 (более продвинутый, сложный), стук на 3 порта===-

Можно сохранить любое количество отдельных именованных списков. В этом случае будет три:

  • KNOCK1 — идентифицирует исходные адреса, которые выполнили первый стук ( но не второй или третий).
  • KNOCK2 — определяет адреса источника, которые выполнили первый и второй стук ( но не третий).
  • KNOCK3 — идентифицирует исходные адреса, которые выполнили первый, второй и третий стуки ( но еще не установили соединение).

Т.е, чтобы подключиться на 22-й SSH порт, нужно постучаться на 3 разных порта, и после чего выполнить подключение на сервер.

Первым действием служит то, чтобы принимать трафик, который не должен подвергаться портовому удару.

Как и в случае с большинством конфигураций брандмауэра, после принятия решения о принятии первого пакета соединения все дальнейшие пакеты, входящие в одно и то же соединение, должны проходить беспрепятственно:

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Обычно, нецелесообразно блокировать трафик с интерфейса loopback, по этому, создаем правило:

# iptables -A INPUT -s 127.0.0.0/8 -j ACCEPT

Блокировка ICMP-трафика может обеспечить некоторые незначительные преимущества в безопасности, но в большинстве случаев она может причинить больше неудобств, по этому, не блокируем его, а разрешаем прохождение ICMP пакетов:

# iptables -A INPUT -p icmp -j ACCEPT

Разрешаем прохождения трафика на порту 80:

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Когда сервер ожидает первый стук:

  • Если пакет является первым стуком, то переход в состояние 1 (STATE 1);
  • Иначе остаются в состоянии 0 (STATE 0).
  • В любом случае, любой полученный трафик должен быть удален.
# iptables -N STATE0
# iptables -A STATE0 -p udp --dport 12345 -m recent --name KNOCK1 --set -j DROP
# iptables -A STATE0 -j DROP

Когда первый удар получен, и сервер ждет второго удара:

  • Если пакет является вторым стуком, то переходом в состояние 2 (STATE 2);
  • Если пакет является еще первым стуком, то остаемся в состоянии 1 (STATE 1);
  • В противном случае выполните возврат к состоянию 0 (STATE 0).
  • Как и выше, любой полученный трафик должен быть удален.

Цепь состояния 0 уже содержит правила обработки первого удара. Повторное использование этой цепочки позволяет избежать указания номера порта в нескольких местах в наборе правил:

# iptables -N STATE1
# iptables -A STATE1 -m recent --name KNOCK1 --remove
# iptables -A STATE1 -p udp --dport 23456 -m recent --name KNOCK2 --set -j DROP
# iptables -A STATE1 -j STATE0

Когда первый и второй удары были получены, и сервер ожидает третий стук:

  • Если пакет является третьим ударом, то переход в состояние 3 (STATE 3);
  • Если пакет является первым стуком, то регресс переходит в состояние 1 (STATE 1);
  • В противном случае выполните возврат к состоянию 0 (STATE 0).
  • Как и выше, любой полученный трафик должен быть удален.
# iptables -N STATE2
# iptables -A STATE2 -m recent --name KNOCK2 --remove
# iptables -A STATE2 -p udp --dport 34567 -m recent --name KNOCK3 --set -j DROP
# iptables -A STATE2 -j STATE0

Когда все три удара были получены, и сервер ожидает соединения:

  • Если пакет является началом входящего TCP-соединения с соответствующим портом, то принимайте его;
  • Если пакет является первым стуком, то регресс переходит в состояние 1 (STATE 1);
  • В противном случае выполните возврат к состоянию 0 (STATE 0).
  • Необходимо только принять первый пакет соединения таким образом, потому что уже существует правило принимать трафик, который является частью установленного соединения. Как и выше, другой трафик следует отбросить.
# iptables -N STATE3
# iptables -A STATE3 -m recent --name KNOCK3 --remove
# iptables -A STATE3 -p tcp --dport 22 -j ACCEPT
# iptables -A STATE3 -j STATE0

Определив цепи обработчика для всех четырех состояний (3 стука + подключение), необходимо поместить правила во входящую цепочку, чтобы вызвать соответствующую цепочку обработчика. Это можно сделать, проверив, находится ли адрес источника текущего пакета в любом из трех списков:

# iptables -A INPUT -m recent --name KNOCK3 --rcheck -j STATE3
# iptables -A INPUT -m recent --name KNOCK2 --rcheck -j STATE2
# iptables -A INPUT -m recent --name KNOCK1 --rcheck -j STATE1
# iptables -A INPUT -j STATE0

И так. Я все рассказал, но для удобства, я вынесу все эти правила в отдельный bash-скрипт:

# vim 3_knocking_ssh_connect.sh

И вставляем его:

#!/bin/sh -x

iptables -F
iptables -X
iptables -Z

iptables -N STATE0
iptables -A STATE0 -p udp --dport 12345 -m recent --name KNOCK1 --set -j DROP
iptables -A STATE0 -j DROP

iptables -N STATE1
iptables -A STATE1 -m recent --name KNOCK1 --remove
iptables -A STATE1 -p udp --dport 23456 -m recent --name KNOCK2 --set -j DROP
iptables -A STATE1 -j STATE0

iptables -N STATE2
iptables -A STATE2 -m recent --name KNOCK2 --remove
iptables -A STATE2 -p udp --dport 34567 -m recent --name KNOCK3 --set -j DROP
iptables -A STATE2 -j STATE0

iptables -N STATE3
iptables -A STATE3 -m recent --name KNOCK3 --remove
iptables -A STATE3 -p tcp --dport 22 -j ACCEPT
iptables -A STATE3 -j STATE0

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 127.0.0.0/8 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -m recent --name KNOCK3 --rcheck -j STATE3
iptables -A INPUT -m recent --name KNOCK2 --rcheck -j STATE2
iptables -A INPUT -m recent --name KNOCK1 --rcheck -j STATE1
iptables -A INPUT -j STATE0

Ну, переходим к тестированию!

Теперь чтобы выполнить подключение (я создам скрипт для подключение), открываем файл:

# vim knock_ssh_connection.sh

И прописывам в него:

#!/bin/sh

nmap -Pn --host_timeout 201 --max-retries 0 -p 12345 192.168.13.157 &>2 >>/dev/null
nmap -Pn --host_timeout 201 --max-retries 0 -p 23456 192.168.13.157 &>2 >>/dev/null
nmap -Pn --host_timeout 201 --max-retries 0 -p 34567 192.168.13.157 &>2 >>/dev/null
ssh captain@192.168.13.157 -p22

Вот и все.

Можно использовать еще один метод подключения:

$ for x in 12345 23456 34567; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x 192.168.13.157 && sleep 1; done && ssh captain@192.168.13.157

Используем на здоровье.

Хотел бы отметить следующее, уже имеется готовое решение  — knockd. Но о нем я расскажу немного позже.

На этом у меня все, статья «Открыть порт ssh по стуку с IPtables в Unix/Linux» завершена.

The post Открыть порт ssh по стуку с IPtables в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/otkry-t-port-ssh-po-stuku-c-iptables/feed/ 0