Kubernetes — OpenVAS

 

Пример манифеста для создания конфигмапа, деплоймента, сервиса и ингреса для OpenVAS

manifest.yml

apiVersion: v1
kind: ConfigMap
metadata:
  name: openvas
  namespace: default
  labels:
    app: openvas
data:
  PUBLIC_HOSTNAME: "openvas.artem.services"
  OV_PASSWORD: "MY_PASSWORD"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: openvas
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: openvas
  template:
    metadata:
      labels:
        app: openvas
    spec:
      containers:
      - name: openvas
        image: mikesplain/openvas
        imagePullPolicy: "IfNotPresent"
        ports:
        - containerPort: 443
        envFrom:
          - configMapRef:
              name: openvas
---
apiVersion: v1
kind: Service
metadata:
  name: openvas
  namespace: default
spec:
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443
  selector:
    app: openvas
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: openvas
  namespace: default
spec:
  rules:
  - host: openvas.artem.services
    http:
      paths:
      - backend:
          serviceName: openvas
          servicePort: 443
        path: /

 

 

Логин по умолчанию — "admin", если не задаете пароль через переменную "OV_PASSWORD", то пароль — "admin"

CentOS 8 — Docker установка

 

Установим необходимые утилиты:

dnf install -y dnf-utils \
device-mapper-persistent-data lvm2

 

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

dnf config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

 

Теперь попытке установить Docker мы получим следующую ошибку:

Error:
 Problem: package docker-ce-3:19.03.5-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
  - cannot install the best candidate for the job
  - package containerd.io-1.2.10-3.2.el7.x86_64 is excluded
  - package containerd.io-1.2.2-3.3.el7.x86_64 is excluded
  - package containerd.io-1.2.2-3.el7.x86_64 is excluded
  - package containerd.io-1.2.4-3.1.el7.x86_64 is excluded
  - package containerd.io-1.2.5-3.1.el7.x86_64 is excluded
  - package containerd.io-1.2.6-3.3.el7.x86_64 is excluded
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

 

Читать далее "CentOS 8 — Docker установка"

VirtualBox — CentOS 8 монтирование директории с хост машины

 

Все команды были выполнены из под пользователя root, вы можете использовать sudo

Устанавливаем EPEL репозиторий:

dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

 

Устанавливаем необходимые зависимости:

dnf install -y tar bzip2 kernel-devel-$(uname -r) kernel-headers perl gcc make elfutils-libelf-devel

 

В VirtualBox подключаем "Дополнения гостевой ОС" и после монтируем диск:

mount /dev/cdrom /media/

 

Устанавливаем дополнения:

/media/VBoxLinuxAdditions.run

 

После этого в настройках виртуальной машины добавляем общую папку, указываем путь к ней и задаем имя, остальные опции не трогаем.

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

mkdir ~/mount

 

И монтируем ее:

mount -t vboxsf VirtualBox ~/Master

 

Где VirtualBox — имя папки, которое мы задавали при создании в VirtualBox'е, а mount — созданная директория на CentOS

FIX ERROR — Helm: incompatible versions client server

При попытке выполнить "helm install …" появилась следующая ошибка:

Error: incompatible versions client[v2.14.3] server[v2.11.0]

 

Решение:

Смотрим версию клиента и сервера:

helm version
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}

 

Если они не совпадают, выполняем:

helm init --upgrade

 

И снова смотрим версии:

helm version
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}

CloudFlare — Отправка уведемлений в Slack

 

Данный Python скрипт позволяет отправлять уведомления о событиях CloudFlare Firewall в Slack канал:

import os
import requests
import json
import datetime

### CloudFlare ###
token = "XXXXXXXXXXXXXXXX"
zoneId = "XXXXXXXXXXXXXXXX"
timeRange = 5 # Minutes
source = "waf"
action = "drop" # drop|simulate|challenge More info: https://api.cloudflare.com/#firewall-events-list-events
urlCloudFlare = "https://api.cloudflare.com/client/v4/zones/" + zoneId + "/security/events"
### END OF BLOCK ###

### Slack ###
webHook = "https://hooks.slack.com/services/AAAAAAAA/BBBBBBBB/CCCCCCCCCCCCCCCC"
channelId = "XXXXXXXX"
### END OF BLOCK ###

### Functions ###
def slackNotify(ip, country, time, ruleMessage):
    headers = {
        'Content-type': 'application/json',
    }

    data = '{"channel":"' + channelId + '","text":"IP address: `' + ip + '` from: `' + country + '` was blocked by `' + source + '` at ' + time + ' UTC' + '\nReason: ' + ruleMessage + '\n\n"}'

    response = requests.post(webHook, headers=headers, data=data)
### END OF BLOCK ###

sinceTime = (datetime.datetime.utcnow() - datetime.timedelta(minutes=timeRange))
sinceTime = sinceTime.strftime("%Y-%m-%dT%H:%M:%SZ")

headers = {
    'Authorization': 'Bearer ' + token,
}

params = (
    ('kind', 'firewall'),
    ('since', sinceTime),
    ('action', action),
    ('source', source),
)

response = requests.get(urlCloudFlare, headers=headers, params=params).json()

count = len(response['result'])

for x in range(count):
    ip = response['result'][x]['ip']
    country = response['result'][x]['country']
    time = response['result'][x]['occurred_at']
    ruleMessage = response['result'][x]['matches'][0]['metadata']['rule_message']
    time = datetime.datetime.strptime(time, '%Y-%m-%dT%H:%M:%SZ')
    slackNotify(ip, country, str(time), ruleMessage)

### Print for debugging ###
# response = json.dumps(response, indent=4)
# print(response)
### END OF BLOCK ###

 

Данный скрипт проверяет события за последние 5 минут, соответственно ставим его в cron с частотой каждые 5 минут.

 

 

Читать далее "CloudFlare — Отправка уведемлений в Slack"

AWS — EC2 Instance start|stop by tag

Данный BASH скрипт позволяет остановить или запустить все инстансы с определенным тегом.

 

#!/bin/bash

AWS="$(which aws)"
PROFILE="default"
REGION="eu-west-2"
TAG_KEY="Owner"
TAG_VALUE="Artem"

if [ "$#" == 0 ]
then
  echo "This script for start/stop AWS EC Instances by tag"
  echo "Usage  : $0 [start|stop]"
  echo "Example: $0 start"
  exit 1
fi

if [ "$1" == "start" ]
then
	$AWS --profile $PROFILE --region $REGION ec2 start-instances --instance-ids `$AWS --profile $PROFILE --region $REGION ec2 describe-instances --filters "Name=tag:$TAG_KEY,Values=$TAG_VALUE" --query 'Reservations[].Instances[].InstanceId' --output text`
elif [ "$1" == "stop" ]
then
	$AWS --profile $PROFILE --region $REGION ec2 stop-instances --instance-ids `$AWS --profile $PROFILE --region $REGION ec2 describe-instances --filters "Name=tag:$TAG_KEY,Values=$TAG_VALUE" --query 'Reservations[].Instances[].InstanceId' --output text`
else
	exec $0
fi

 

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

import boto3
import sys
from botocore.exceptions import ClientError

profile = "default"
region = "eu-west-2"
tagName = "Owner"
tagValue = "Artem"

if sys.argv[1:]:
	action = sys.argv[1].upper()
else:
	action = "help"

session = boto3.Session(profile_name=profile)
ec2 = session.client('ec2',region_name=region)

custom_filter_start = [{
    'Name':'tag:' + tagName, 
    'Values': [tagValue]},
    {
    'Name': 'instance-state-name',
    'Values': ['stopped']}]

custom_filter_stop = [{
    'Name':'tag:' + tagName, 
    'Values': [tagValue]},
    {
    'Name': 'instance-state-name',
    'Values': ['running', 'pending']}]

def instance_start(instanceId):
	# Do a dryrun first to verify permissions
	try:
		ec2.start_instances(InstanceIds=[instanceId], DryRun=True)
	except ClientError as e:
		if 'DryRunOperation' not in str(e):
			raise
	# Dry run succeeded, run start_instances without dryrun
	try:
		response = ec2.start_instances(InstanceIds=[instanceId], DryRun=False)
		print(response)
	except ClientError as e:
		print(e)

def instance_stop(instanceId):
	# Do a dryrun first to verify permissions
	try:
		ec2.start_instances(InstanceIds=[instanceId], DryRun=True)
	except ClientError as e:
		if 'DryRunOperation' not in str(e):
			raise
	# Dry run succeeded, run start_instances without dryrun
	try:
		response = ec2.stop_instances(InstanceIds=[instanceId], DryRun=False)
		print(response)
	except ClientError as e:
		print(e)


if action == 'START':
	response = ec2.describe_instances(Filters=custom_filter_start)
	count = len(response['Reservations'])
	for x in range(count):
		instanceId = response['Reservations'][x]['Instances'][0]['InstanceId']
		instance_start(instanceId)
elif action == 'STOP':
	response = ec2.describe_instances(Filters=custom_filter_stop)
	count = len(response['Reservations'])
	for x in range(count):
		instanceId = response['Reservations'][x]['Instances'][0]['InstanceId']
		instance_stop(instanceId)
else:
	print("This script for start/stop AWS EC Instances by tag")
	print("Usage  : python3 " + sys.argv[0] + " [start|stop]")
	print("Example: python3 " + sys.argv[0] + " start")

 

Может потребоваться установка питон пакета boto3

 

pip3 install boto3 

AWS — EBS уменьшение размера

Есть EC2 Instance с именем "Galaxy", и с EBS диском размером 250Gb и файловой системой ext4, нужно его урезать до 100Gb.

1. Создаем временный инстанс (В той же Availability zone, что и существующий инстанс), для копирования данных. Размер его диска нам не важен, к этому инстансу мы будем монтировать существующий EBS, и новый, уменьшенного размера.

 

2. Останавливаем инстанс с EBS  диском, который собираемся уменьшать.

3. Переходим в Volumes, и нужному EBS диску делаем "Detach Volume". Так же после "Detach Volume", желательно сделать снапшот диска.

 

Его статус должен изменится на "available"

 

Читать далее "AWS — EBS уменьшение размера"

Terraform/Terragrunt — Пишем модуль. Часть 1

В данном примере мы создадим Terraform модуль для провайдера AWS, который будет запускаться для 3-х разных окружений при помощи Terragrunt'a.

 

Требования:

 

Читать далее "Terraform/Terragrunt — Пишем модуль. Часть 1"

FIX ERROR — Terraform: Blocks of type "tags" are not expected here.

При попытке сделать terraform plan или terraform apply, terraform возвращает следующую ошибку:

Error: Unsupported block type

Blocks of type "tags" are not expected here. Did you mean to define argument
"tags"? If so, use the equals sign to assign it a value.

 

Решение:

В terraform версиях ниже 12-ой для "tags" использовался следующий синтаксис:

  tags {
    Name = "MY_TAG_NAME"
  }

 

Теперь после "tags" необходимо добавлять "="

  tags = {
    Name = "MY_TAG_NAME"
  }