DeSoft.ru
236 subscribers
116 photos
10 videos
1 file
213 links
Авторский канал: ИТ, разработка, безопасность, администрирование.

Сайт: desoft.ru
Автор: @y_demin
Download Telegram
При разработке программных продуктов мы так или иначе взаимодействуем с различными ресурсами, сервисами, базами данных как внутри ИТ инфраструктуры компании, так и за ее пределами. Для получения доступа к этим ресурсам используются секреты - ключи, токены, логины и пароли и прочее, т.е. разного рода конфиденциальные данные для аутентификации, заполучив которые, злоумышленники откроют для себя возможность беспрепятственного сбора информации.

⚠️ В угоду скорости или удобству, по невнимательности или неопытности, непосредственные участники процесса (разработчики, тестировщики, администраторы) могут оставить секреты в открытом виде прямо в коде или конфигурационных файлах. После публикации такого проекта на платформе для размещения исходного кода, например, github или gitlab, секреты становятся доступными всем желающим. Даже если на очередной итерации вы “прибрали за собой”, то история проекта помнит все. Таким образом, помимо управления секретами, возникает необходимость проверки кода на наличие секретов в открытом виде.

📌 Поиск по ключевым словам
Простой, но действенный способ обнаружить забытые в коде секреты - поиск по ключевым словам. Составляем список слов, например, password, key, private, token и так далее, используем grep по содержимому проекта или поисковую систему на площадке размещения. Чем больше проект и чем больше в нем участников, тем сложнее будет полагаться только на ручную проверку.

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

Поддерживается большинство популярных платформ, включая вариант с использованием docker. Попробовал готовые сборки под Windows и Linux. Долго разбираться не пришлось, параметры запуска описаны в официальном репозитории проекта. Единственное с чем могут возникнуть трудности, так это с формированием собственных правил поиска на основе регулярных выражений, однако в большинстве случаев будет достаточно конфигурационного файла по умолчанию, количество поддерживаемых вариантов секретов накопилось довольно серьезное за время существования проекта.

💻 Несколько примеров работы с программой

Сканируем git репозиторий, включая полную историю
# с выводом всей информации в консоль
gitleaks git -v
# с сохранением отчета в файл
gitleaks git --report-path gitleaks-report.json


Проверяем директорию
gitleaks dir -v path/to/dir


Передаем в gitleaks поток на анализ
# windows
type mysecretkey.pem | gitleaks -v stdin
# linux
cat mysecretkey.pem | gitleaks -v stdin


💡 Автоматизировать процесс можно благодаря хуку на pre-commit, за счет которого на каждый git commit будет выполняться проверка через gitleaks. Процесс настройки описан в README. Очень полезная опция.

📌 gitGrabber
В дополнение к gitleaks упомяну и gitGrabber - отслеживает последние индексируемые github файлы по мере их появления, что позволяет узнать об упоминании о вашем проекте, сервисе, организации, домене и тому подобное. Зачем это нужно? Источником утечек не обязательно являются сотрудники именно вашей команды или компании, ими в точно такой же степени могут оказаться пользователи, поставщики услуг, фрилансеры, с которыми вы работаете или работали, и о существовании публичного профиля которых ничего неизвестно.
Инструмент не анализирует историю репозиториев, работает на регулярных выражениях, умеет слать уведомления о своих находках.

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

#security #leaks
🔥2👍1
‼️ На днях популярная ИИ библиотека ultralytics была скомпрометирована, причем дважды. В версиях 8.3.41 и 8.3.42 pip пакета обнаружили криптомайнер, пропатчили, а после, в версиях 8.3.45 и 8.3.46 злоумышленники снова повторили свою атаку. Судя по комментариям исследователей, целью атаки были машины и серверы на Linux и macOS, Windows же затронут не был.

Вместе с установкой библиотеки загружается и запускается XMRig майнер в /tmp/ultralytics_runner. Заметить подозрительную активность оказалось несложно - резкий скачок загрузки цп после установки тому свидетельство.

Проверяем версию установленного пакета. Если она среди скомпрометированных - удаляем.
pip show ultralytics
pip uninstall ultralytics


Ищем и убиваем вредоносный процесс /tmp/ultralytics_runner (ps -a). Удаляем исполняемый файл.

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

Источники: [1], [2], [3]

#security #leaks
🤯3👍1
Источников контента, новостных сайтов и каналов на сегодняшний день столько, что охватить весь объем становится проблематично, а отыскать что-то действительно ценное еще сложнее. Трудностей в освоении материала добавляет необходимость перепрыгивать с ленты на ленту, из приложения в приложение и по множеству вкладок в браузере в придачу.

📝 Для формирования краткой сводки по новостям давно существуют RSS-ленты, а для автоматического сбора сообщений из них различные специализированные приложения и сервисы. Я приведу вариант размещения подобного агрегатора на собственном сервере, а также способ представления Telegram-каналов в виде RSS-лент с подключением к этому серверу.

⚡️ Tiny Tiny RSS
В качестве RSS сервера будем использовать проект с открытым исходным кодом - Tiny Tiny RSS. В основе лежит минималистичное веб-приложение для сбора и чтения RSS-лент. Поддерживает категоризацию, метки, различные фильтры, варианты представления, кастомные темы и расширения за счет плагинов. Быстро и просто разворачивается с помощью docker.

🔹 Установка
▫️ Имеем виртуальную машину на Debian 12 с предварительно установленным docker.
▫️ Забираем с официального сайта .env и docker-compose.yml файлы.
▫️ Внесем несколько правок в переменные окружения, поскольку планируем использовать только в локальной сети
ADMIN_USER_PASS=admin
ADMIN_USER_PASS_ACCESS_LEVEL=10
HTTP_PORT=8280

▫️ Собираем и запускаем
docker compose up -d


🔹 Проверка
По адресу виртуальной машины идем в приложение через порт 8280. Здесь все интуитивно понятно - создаем новую подписку - добавляем либо адрес rss-ленты (например, https://3dnews.ru/news/rss/), либо просто ссылку на сайт (https://3dnews.ru), а приложение попробует найти его ленту и добавит в список. Настраиваем удобный вид отображения и тему, листаем сотни подгруженных новостей.

⚡️ RSSHub
Для многих авторов Telegram стал чуть ли не основной площадкой публикации собственного контента, однако, не каждый заводит отдельный сайт для дублирования своего творчества, а следовательно и подписаться на сводку новостей напрямую, без подписки на канал через мессенджер, не представляется возможным. В данном случае нам поможет еще один open source инструмент - RSSHub, с помощью которого разного рода площадки, будь то социальные сети, видеохостинги или мессенджеры, могут быть представлены в виде RSS-ленты.

🔹 Установка
▫️ Разворачивается также в контейнерах. Скачиваем docker-compose.yml.
▫️ Поскольку reverse proxy не используем, https нам тоже без надобности, то необходимо выставить внешним 80й порт для основного контейнера вместо проставленного по умолчанию 1200, тогда ранее установленный агрегатор успешно подхватит все формируемые через RSSHub ленты.
services:
rsshub:
image: diygod/rsshub
restart: always
ports:
- "80:1200"
...

▫️ Собираем и запускаем
 docker compose up -d


🔹Проверка
Заходим по адресу виртуальной машины и видим страницу приветствие - сервис успешно запущен. Никаких манипуляций непосредственно с RSSHub больше делать не требуется.

🔹Создание rss-ленты из Telegram-канала
▫️ Возвращаемся в Tiny Tiny RSS. Предположим, что мы хотим добавить в каталог источников Telegram-канал Хабра https://t.me/habr_com.
▫️ Для преобразования канала в RSS-ленту, нам нужно сформировать ссылку, используя роутинг RSSHub.
Выглядит она следующим образом:
http://{host}/telegram/channel/{tg channel name}

, где host - адрес виртуальной машины, на которой развернут RSSHub (192.168.1.134 в моем случае), а tg channel name - имя Telegram-канала (habr_com).
▫️ В итоге получаем ссылку:
http://192.168.1.134/telegram/channel/habr_com

▫️ Добавляем ее в подписки в Tiny Tiny RSS и проверяем выгрузку новостей.

🔎 Как я упомянул ранее, RSSHub дает возможность привязать не только Telegram, но и другие популярные ресурсы как источники публикаций в вашу собственную ленту. Ряд сопутствующих проектов позволяют упростить и автоматизировать эту процедуру. Подробная информация об особенностях системы представлена в официальной документации.

#tools #opensource #selfhosted #rss
👍3🔥3
Запустив на днях одну из тестовых виртуальных машин, заметил, что свободного места практически не осталось, хотя никаких тяжелых данных там никогда не хранилось, пользовался ей лишь для сборки и запуска различных контейнеров, так что принялся очищать накопленное, в первую очередь, docker платформой (см. шпаргалку по командам для инспекции и очистки системы).

В локальном хранилище образов было немало тяжеловесов на основе базовых образов систем, например, python3.10-bookworm размером под 800 Мб или golang:1.22.4-bookworm под 1.2 Гб. По их содержимому даже пробегаться страшно - помимо установленных дополнительно, полный набор пакетов и зависимостей, поставляемых с основной системой, причем давно устаревших, а значит потенциально уязвимых.

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

1️⃣ Выбор специализированных урезанных образов против образов, основанных на полных дистрибутивах систем
▫️ slim - уменьшенная версия стандартного образа системы с удалением ненужных пакетов, компонентов, зависимостей.
▫️ alpine - образ на основе облегченного, минималистичного дистрибутива Alpine Linux. Еще меньше, чем slim, использует специальные версии стандартной библиотеки musl libc и Busybox для пущей миниатюрности.
▫️ scratch - образ-пустышка. Идеальный вариант для запуска приложений, не требующих никакого окружения, внешних зависимостей и т.д.

2️⃣ Многоэтапная сборка
Разделение процесса сборки приложения на отдельные шаги, по завершению которых, на следующий шаг переносится только полученный результат, а не весь комплект сопутствующих программ и зависимостей.

3️⃣ Исключение лишних данных из сборочного процесса с помощью .dockerignore

4️⃣ Использование официальных образов
Официальные образы от разработчиков систем и разного рода инструментария с довольно высокой периодичностью обновляются, долгое время поддерживаются, а также проверены тысячами пользователей, что нельзя сказать о неофициальных сборках от энтузиастов, а вместе с ними и злоумышленников, которые плодят тысячи собственных творений дабы поделиться с окружающими.

⚒️ Пример двухэтапной сборки python приложения с итоговой публикацией в slim
# собираем зависимости
FROM python:3.10 AS builder
COPY requirements.txt .

RUN pip install --user -r requirements.txt

# помещаем исходники и собранные зависимости в итоговый образ
FROM python:3.10-slim

COPY --from=builder /root/.local /root/.local
COPY . /myapp

WORKDIR /myapp

ENV PATH=/root/.local/bin:$PATH

CMD ["python", "-u", "-m", "src"]


💥 В итоге получился образ размером 165 Мб, содержащий 135 установленных пакетов и 814 исполняемых файлов. Не такой уж и чистый, но по сравнению со стандартным образом, значительно меньше.

⚒️ Пример трехэтапной сборки golang приложения с итоговой публикацией в scratch
# кэширование модулей
FROM golang:1.22.4-alpine3.20 AS modules
COPY go.mod go.sum /modules/
WORKDIR /modules
RUN go mod download

# сборка приложения
FROM golang:1.22.4-alpine3.20 AS builder
COPY --from=modules /go/pkg /go/pkg
COPY . /app
WORKDIR /app
RUN go build -o /bin/myapp ./cmd/myapp

# публикация
FROM scratch
COPY --from=builder /app/config /config
COPY --from=builder /bin/myapp /myapp
CMD ["/myapp"]


💥 Размер полученного образа 29 Мб. Содержит 38 модулей проекта и 1 исполняемый файл.

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

#docker
🔥4👍1
Не откладываем в долгий ящик логичное продолжение рассмотренной ранее темы про агрегацию новостей. На этот раз собирать новости с разных источников будем не на отдельном сервере, а прямо в Telegram с возможностью автоматической публикации в свой открытый канал. На сайте будет размещена расширенная версия данной заметки с дополнительными примерами и описаниями.

⚡️ rss2tg_bot
Первый, наиболее быстрый вариант - воспользоваться ботом @rss2tg_bot.
▫️ Стартуем бота rss2tg_bot
▫️ Бот сразу же готов принимать фиды для обработки и публикации. Достаточно отправить ссылку на rss feed, и свежие новости начнут падать в ленту. Отправляем ссылку еще раз - источник перестанет обрабатываться.
Основные команды:
🔹 /list - список подключенных источников.
🔹 /stats - информация об интервале обновления, количестве фидов, чатов и пользователей. По мере роста нагрузки на бота, интервал обновления, естественно, будет увеличиваться. На момент публикации он составляет около 5 минут.
🔹 /settings - небольшой набор параметров для настройки представления публикуемого поста.

🚀 Для автоматического репоста новостей в публичный канал, нужно добавить бота в администраторы канала с разрешением на отправку сообщений.
▫️ Сформированный в личном чате с ботом список не мигрирует в канал автоматически. У канала с привязанным ботом свой список источников.
▫️ @rss2tg_bot https://desoft.ru/feed.xml - команда для добавления нового источника из чата канала.
▫️ /settings@rss2tg_bot - настройки бота для канала.

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

⚡️ RSS to Telegram Bot
Размещение новостного бота на собственном сервере на основе проекта с открытым исходным кодом RSS to Telegram Bot. Лучший вариант с точки зрения детальной настройки и независимости от внешних факторов.

🔖 Предварительно создаем нового бота в @BotFather и получаем token.
🔖 Также необходимо определить user ID будущего администратора. Для этого идем в специального бота @userinfobot, выполняем команду /start, в ответ прилетает id.

🚀 Запуск
Разворачивать бота на сервере будем с помощью docker. Конфигурация машины: 2 CPU, 2 Гб RAM, 20 Гб SSD, ос Debian 12.
✳️ Скачиваем docker-compose.yml из репозитория проекта
wget https://raw.githubusercontent.com/Rongronggg9/RSS-to-Telegram-Bot/dev/docker-compose.yml.sample -O docker-compose.yml

✳️ Настраиваем переменные окружения в docker-compose.yml. Детальное описание каждого параметра здесь. Я же приведу только измененные значения.
▫️ Проставляем в TOKEN и MANAGER полученные ранее значения токена бота и id пользователя соответственно.
▫️ Отправку через Telegraph использовать не планировалось, поэтому комментируем переменную TELEGRAPH_TOKEN со всеми указанными там тестовыми значениями.
▫️ MULTIUSER=0, т.к. многопользовательского доступа к боту не подразумевается.
✳️ Поднимаем
docker compose up -d


🚀 Проверка
Возвращаемся в приватный чат с созданным в @BotFather ботом. Если все было сделано верно, то у бота появится меню с целым списком команд.
🔹 /help - перечень доступных команд и инструкция по использованию.
🔹 /set_option - настройки бота.
🔹 /set_default - параметры по умолчанию для новых подписок (формат представления, период проверки, стиль).
🔹 /test rss-link - проверка возможности подключения rss-ленты с выводом последнего сообщения.
🔹 /sub rss-link - подписка на rss-ленту.

🚀 Публикация в канал
▫️ Добавляем бота в администраторы канала с разрешением на отправку сообщений.
▫️ Создавать подписки на rss-ленты можно прямо из приватного чата с ботом
/sub @my_public_channel rss-link

а также управлять настройками подписок для канала
/set_default @my_public_channel


🔥 Таким образом, мы получаем собственный агрегатор с возможностью детальной настройки и полного контроля, а также неплохими опциями по оформлению, ограниченный лишь выделенными ресурсами оборудования.

#tools #opensource #selfhosted #rss
🔥3👍1
Аналог Trello есть в копилке, альтернатива Notion и Miro также была рассмотрена, на очереди opensource замена Jira.

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

🔖 Особенности

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

▪️ Внутри проекта пользователи оперируют проблемами и задачами, они же issues, обладающие уникальным идентификаторами, а также целым рядом настраиваемых параметров, что добавляет гибкости и удобства в работе и контроле исполнения.

▪️ Отдельный раздел посвящен циклам - организационные объединения задач с планированием по времени (например, спринты), сопровождающиеся всей необходимой аналитической информацией.

▪️ Проекты также содержат модули - каталоги для логического объединения связанного контента в проекте для облегчения навигации, отслеживания и планирования.

▪️ Страницы - место хранения заметок и документации. Заявлена интеграция с искусственным интеллектом для помощи в составлении документов.

💥 Отмечу большое число аналитических разделов и экранов с различными метриками, фильтрами, категоризацией и вариантами представления. Такая проработка внутреннего инструментария пользователя позволяет настроить максимально комфортно под себя и под конкретный проект все необходимые компоненты, разделы и страницы.

💥 Еще год назад у проекта был всего один “тариф” - бесплатный как в облаке так для собственного размещения. Теперь это целый набор предложений, оно и понятно - курс на перехват аудитории Jira предполагает гибкий подход к разной аудитории, но тем самым под нож попадает открытая функциональность.

⚒️ Разработка ведется на nextjs для frontend и django для backend. Инфраструктура сервиса базируется на современных решениях postgresql, redis, rabbitmq, minio.
Заявленные интеграции с github и gitlab на момент публикации еще не добрались до релиза, однако в dev ветках работа ведется, а вот использование webhooks уже доступно. Для внешнего взаимодействия имеется хорошо задокументированный API.

🔖 Установка self-hosted версии

Разработчики позаботились об автоматизации процесса развертывания и управления и подготовили sh скрипт с интерактивным меню.
# скачиваем файл скрипт
curl -fsSL -o setup.sh https://raw.githubusercontent.com/makeplane/plane/master/deploy/selfhost/install.sh

# делаем его исполняемым
chmod +x setup.sh

# запускаем
./setup.sh


Здесь нас встречает набор предопределенных действий.
Select a Action you want to perform:
1) Install
2) Start
3) Stop
4) Restart
5) Upgrade
6) View Logs
7) Backup Data
8) Exit


Выполнив пункт 1) Install будет подготовлен рабочий каталог plane-app с docker-compose.yml и переменными окружения plane.env.
Перед запуском рекомендуется заглянуть в переменные окружения и прописать ip адрес своего хоста в APP_DOMAIN, а также указать порт NGINX_PORT, этого будет достаточно для локального запуска. Остальные параметры на усмотрение администратора.

Запускаем
./setup.sh

# выбираем пункт 2) Start
2


После запуска всех контейнеров, становятся доступными панель администратора http(s)://<ip/domain>/god-mode и основное приложение http(s)://<ip/domain>:PORT.

#management #opensource #selfhosted
1👍2🔥2
‼️ Совсем недавно Microsoft выпустила целый ворох патчей безопасности в декабрьском обновлении, а сразу после пошла информация о повышенной активности злоумышленников, сканирующих службы RDP с особым вниманием к порту 1098.

Исправления затронули критические уязвимости RDP, такие как CVE-2024-49106, CVE-2024-49108, CVE-2024-49115, CVE-2024-49116 и другие, позволяющие реализовать удаленное выполнение кода на уязвимых машинах.

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

Источники: [1], [2]

#security #leaks
😱2👍1
Приведу ряд полезных инструментов для работы с образами Docker как на этапе подготовки, так и после сборки.

⚒️ Hadolint
Hadolint - статический анализатор или линтер для Dockerfile. Поможет следовать best practices при построении докер файлов. Содержит множество правил и рекомендаций во избежание распространенных ошибок, представляя их в виде предупреждений.
Можно собрать самостоятельно или воспользоваться релизными сборками под разные платформы в виде исполняемого файла. Также существует одноименное расширение для vscode, позволяющее в реальном времени контролировать правильность написания Dockerfile с выводом подсказок.

В качестве примера прогоним через hadolint представленный в предыдущей заметке файл сборки python сервиса.
hadolint Dockerfile

Dockerfile:2 DL3045 warning: `COPY` to a relative destination without `WORKDIR` set.
Dockerfile:4 DL3042 warning: Avoid use of cache directory with pip. Use `pip install --no-cache-dir <package>`


⚒️ Syft
Syft - утилита для генерации SBOMs (Software Bill of Materials) - составляет перечень зависимостей, библиотек и исполняемых файлов с детализацией путей, типов, версий и принадлежности к слою сформированного образа. Полезный источник информации как для первоначальной оценки наполнения полученного образа, так и для последующего аудита в том числе с точки зрения безопасности.

Собираем самостоятельно или забираем актуальный исполняемый файл под целевую платформу.
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin


Формат представления и уровень детализации задаются параметрами запуска. Применим на все том же образе python сервиса с параметрами по умолчанию.
# syft <image id>
syft f47f0179743e
...
├── ✔️ Packages [135 packages]
├── ✔️ File digests [3,283 files]
├── ✔️ File metadata [3,283 locations]
└── ✔️ Executables [814 executables]
apt 2.6.1 deb
base-passwd 3.6.1 deb
bash 5.2.15-2+b7 deb
certifi 2024.6.2 python
cryptg 0.4.0 python
dpkg 1.21.22 deb
grep 3.8-5 deb
...


⚒️ Dive
Популярное приложение для анализа образов docker - dive. Незаменимая утилита для отладки и проверки корректности наполнения и сборки образов по слоям с детальным отображением происходящего на каждом этапе, исполняемых команд и формируемого контента, а также для оценки эффективности используемого дискового пространства получаемым результатом.

Достаточно воспользоваться подготовленным исполняемым файлом из релизов и заглянуть в парочку образов дабы понять глубину детализации и удобство представления.
dive <image id>


⚒️ SecretScanner
Аналог уже опробованного поисковика утечек секретов в глубинах репозитория Gitleaks в контексте образов - SecretScanner. Ищет, структурирует и записывает забытые конфиденциальные данные в собранном docker образе по более чем 140 заготовленным правилам и типам.

Варианты конфигураций можно посмотреть в документации. Запускается прямо из docker, поэтому сразу пробуем:
docker run -it --rm --name=deepfence-secretscanner -v $(pwd):/home/deepfence/output -v /var/run/docker.sock:/var/run/docker.sock deepfenceio/deepfence_secret_scanner:latest -image-name <target image name> --output json

summary:
total=15 high=3 medium=3 low=9
{
"Image Layer ID": "blobs/sha256/e5d8b619f2cea803c9ccd7dcd6bba9c613f44c1d3c2750e1c21fc92884382fe2",
"Matched Rule Name": "Username and password in URI",
"Severity": "high",
"Severity Score": 7.56,
"Full File Name": "usr/local/lib/python3.10/site-packages/pip/_vendor/urllib3/util/url.py",
"Matched Contents": "'http://username:password@host.com:80/path?query#fragment'"
},
...


#docker
🔥1
⚠️ Еще раз акцентирую внимание на забытых секретах в репозиториях проектов. Пролистывая новостные заголовки, любезно подготовленные агрегаторами из предыдущих заметок, снова попались довольно свежие, месячной давности, новости о крупных утечках.

🥷 В начале октября 2024 года шумела новость о взломе небезызвестного интернет архива. Однако вскоре, во второй половине октября, ресурс подвергся атаке повторно по причине того, что были раскрыты токены аутентификации закрытого GitLab репозитория.

В git репозитории могут находиться файлы конфигураций, такие как .git/config, .gitlab-ci.yml, .env и так далее, в которых разработчики, опять же ради удобства, оставляют секреты. Если репозиторий закрытый, т.е. изолирован от публичного доступа, то еще как-то можно простить такую оплошность (нет), но выставленный каталог .git в открытый доступ на сайте становится легкой добычей для сканеров.

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

🥷 По схожей схеме была произведена очередная атака в конце октября 2024 года, но уже куда более масштабная - на тысячи частных репозиториев.

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

#security #leaks
1😱2
Для тех, кто имеет дело с «бесплатными», нелицензионными копиями программного обеспечения, будь то игры или специализированный коммерческий софт, приведу краткое описание того, как распространяется и работает Redline Stealer - один из самых популярных инструментов для кражи конфиденциальных данных с Windows машин на сегодняшний день.

🔎 Распространение

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

📨 Несколько примеров:
▪️ Спам-рассылка в почте с вложенным документом формата .doc или ссылкой на скачивание инсталлятора, замаскированного под нечто "важное".
▪️ Фишинговый сайт конвертера файлов из одного формата в другой. После выполнения конвертации пользователю предлагается скачать результат, однако по ссылке скачивается вовсе не то, что ожидается.
▪️ Фейковый vpn сервис. Предлагается к скачиванию обычный установочный файл, за которым и скрывается программа-стилер.
▪️ Взломанные игры с вшитой "таблеткой" или отдельно поставляемым кряком, опубликованные на запрещенных хранилищах, форумах, торрент-трекерах.
▪️ В 2022 году имел место пример поддельного сайта системы удаленного доступа AnyDesk, точь-в-точь оригинал за исключением ссылки на скачивание.
▪️ В качестве еще одного канала распространения стилера злоумышленники использовали YouTube, загружая короткие видео определенной тематики с прямой ссылкой на инсталлятор.

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

⚒️ Основные возможности

✖️ Сбор системной информации о зараженном хосте, включая IP, страну, имя пользователя, раскладку клавиатуры, снимок экрана, операционную систему, список установленного программного обеспечения и активных процессов.
✖️ Извлечение файлов cookie, данных автозаполнения, банковских карт, логинов и паролей из браузеров на базе Chromium, в том числе Google Chrome, а также на базе Gecko, включая Mozilla Firefox.
✖️ Сбор паролей FTP клиентов.
✖️ Извлечение данных Steam, Discord, Telegram.
✖️ Сбор учетных данных VPN сервисов.
✖️ Извлечение конфиденциальной информации из крипто кошельков.

📝 Общие рекомендации

Повышенное внимание при посещении любых ресурсов в сети, будь то популярный сервис с большой аудиторией или сайты сомнительного происхождения. Дизайн и даже функциональность может быть идентична ожидаемой площадке, а подмену в один символ заметить непросто.
Не переходить по ссылкам и не открывать документы в рекламных сообщениях от неизвестных отправителей.
Избегать стороннего ПО для обхода защиты, взлома или активации некоего программного продукта.
Не хранить пароли в браузерах, а пользоваться менеджерами паролей.
Применять современные средства защиты.

#security #leaks
👍3🔥2
В качестве первого шага цикла разработки системы оценки и фильтрации комментариев в Telegram-каналах опробую несколько готовых моделей для определения токсичности текста, эмоциональной окраски и принадлежности к спаму с площадки Hugging Face.

🌐 Полную версию статьи смотри на сайте, а исходники и тестовые комментарии в репозитории на gitverse.

⚒️ Подготовка
🔹 Для упрощения взаимодействия с моделями была разработана библиотека Transformers с поддержкой Torch. Устанавливаем
pip install transformers torch pandas

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

🚀 Применение
Заявленные критерии оценки относятся к задаче классификации текста. Из этого подраздела на Hugging Face и будем выбирать соответствующие модели.

1️⃣ Эмоциональная окраска текста
Используем модель rubert-base-cased-russian-sentiment от частного исследователя
Вячеслава Литвинова. Модель обучена различать 3 класса тональности: нейтральный, позитивный, негативный.
from transformers import pipeline
# объявляем pipeline (высокоуровневая обертка для работы с моделями)
# с указанием задачи text-classification
pipe = pipeline("text-classification", model="seara/rubert-base-cased-russian-sentiment")
# читаем файл с комментариями
with open("comments.txt", mode="r", encoding="utf-8") as f:
comments = [line.rstrip() for line in f.readlines()]
# определяем тональность текста и выводим результат
for comment in comments:
print(f"\nComment: {comment}\nResult: {pipe(comment)}")


Результаты:
Comment: уродина, его так подвесить.
Result: [{'label': 'neutral', 'score': 0.5076143741607666}]
Comment: спасибо что приняли меня
Result: [{'label': 'positive', 'score': 0.69575035572052}]
Comment: твари, живут же такие подленькие людишки
Result: [{'label': 'negative', 'score': 0.5077788233757019}]
Comment: ты как футболный мяч
Result: [{'label': 'neutral', 'score': 0.8442604541778564}]

Стоит отметить наличие сомнений (низкой вероятности) в некоторых результатах из-за неоднозначности интерпретации текста.

2️⃣ Определение токсичности
Применим модель russian_toxicity_classifier от группы s-nlp.
Принцип тот же самый, что и в предыдущем подходе, только указываем другую модель при создании pipeline
pipe = pipeline("text-classification", model="s-nlp/russian_toxicity_classifier")


Результаты:
Comment: уродина, его так подвесить.
Result: [{'label': 'toxic', 'score': 0.9966415166854858}]
Comment: спасибо что приняли меня
Result: [{'label': 'neutral', 'score': 0.999728262424469}]
Comment: твари, живут же такие подленькие людишки
Result: [{'label': 'toxic', 'score': 0.9866997003555298}]
Comment: ты как футболный мяч
Result: [{'label': 'neutral', 'score': 0.9938940405845642}]

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

3️⃣ Определение спама
Для данного раздела возьмем модель spam_deberta_v4 от группы исследователей RUSpam.
Можно пойти уже проверенным путем и использовать pipeline или загрузить модель напрямую, настроить токенизатор (предобработка текста перед отправкой на модель для классификации) и обработчик результата. Разработчики предлагают второй вариант, воспользуемся.

Результаты:
Comment: быдло оно и в африке быдло!
Result: Не спам
Comment: Уважаемый победитель, вы получили приз в нашей лотерее!
Result: Спам
Comment: Вы стали участником розыгрыша призов: проверьте свою удачу!
Result: Спам
Comment: Привет, как дела? Яблоко
Result: Не спам


Результаты применения одиночных моделей оказались на удивление информативными с учетом того, что предварительно никаких исследований не выполнялось. Не лишним будет провести эксперименты анализа текста по совокупности признаков, формируемых несколькими оценочными моделями, более точно сформулировав задачу и расширив тестовую выборку. Опробованные классификаторы найдут дальнейшее применение в системе фильтрации комментариев в Telegram.

#python #nlp #ml
🔥3
Уже несколько заметок были посвящены теме утечек секретов ([1], [2]). На этот раз рассмотрим один из вариантов, как все-таки можно ими управлять, чтобы не пришлось рвать волосы на голове и вырезать коммиты из репозитория.

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

📝 Некоторые особенности системы
▪️ Формирование структуры управления с разделением по организациям и проектам.
▪️ Версионирование, откаты и ротация секретов.
▪️ Динамические секреты.
▪️ Синхронизация секретов с другими инструментами, решающими подобную задачу.
▪️ Внутренний центр сертификации (PKI) и управление ключами (KMS).
▪️ Поддержка разнообразных методов аутентификации пользователей.
▪️ Богатый api и наличие sdk для быстрого встраивания в код.

🔨 Установка
▫️ Разворачивать будем self-hosted версию, используя docker.
# забираем compose и .env файлы
wget -O docker-compose.yml https://raw.githubusercontent.com/Infisical/infisical/main/docker-compose.prod.yml
wget -O .env https://raw.githubusercontent.com/Infisical/infisical/main/.env.example

▫️ При публикации в прод нужно сгенерировать собственные ключи доступа, задать пароли и настроить требуемые интеграции со сторонними сервисами. Описание переменных окружения здесь. Для тестового стенда оставим все по умолчанию.
# запускаем
docker compose up -d

▫️ Идем в приложение на 80 порт (http://localhost), создаем аккаунт администратора и попадаем в панель управления.

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

🚀 Получение доступа к секретам с использованием python sdk
▫️ Устанавливаем sdk
pip install infisicalsdk

▫️ Записываем в переменные окружения системы полученные Client ID, Client Secret, Project ID
export CLIENT_ID=<my client id>
export CLIENT_SECRET=<my client secret>
export PROJECT_ID=<my project id>

▫️ Обращаемся к Infisical из python скрипта и получаем секреты
import os
from infisical_sdk import InfisicalSDKClient
# забираем переменные окружения
client_id = os.getenv("CLIENT_ID")
client_secret = os.getenv("CLIENT_SECRET")
project_id = os.getenv("PROJECT_ID")
# инициализация клиента и авторизация
client = InfisicalSDKClient(host="http://localhost")
client.auth.universal_auth.login(client_id=client_id, client_secret=client_secret)
# получаем список всех секретов в dev окружении
secrets = client.secrets.list_secrets(project_id=project_id, environment_slug="dev", secret_path="/")
print(secrets)
# получаем секрет MYAPI_KEY из окружения prod по имени
mysecret = client.secrets.get_secret_by_name(
secret_name="MYAPI_KEY",
project_id=project_id,
environment_slug="prod",
secret_path="/",
)
print(mysecret)


💡 Дополнительно стоит отметить, что система поставляется в том числе в виде cli инструмента, с помощью которого можно как получать и проверять секреты с центрального сервера, генерируя из них переменные окружения или файлы конфигураций, так и анализировать репозитории на утечки секретов по аналогии с уже рассмотренным GitLeaks. Еще одним полезным применением Infisical cli является возможность добавления утилиты прямо в Dockerfile для формирования переменных окружения контейнера в реальном времени, что исключает необходимость прямой передачи секретов.

📌 Решение несложно настраивается, предоставляет широкий набор вариантов интеграции, а в совокупности с целым комплексом решаемых задач станет неплохим подспорьем как для небольшой команды, так и для крупной организации с множеством проектов, где требования контроля и безопасности очень высоки. В качестве примера была рассмотрена одна из наиболее важных функций платформы, отдельного внимания стоят реализации центра сертификации и системы управления ключами.

#management #opensource #selfhosted #security
👍4🔥1
Не успел начать, а уже итоги подводить пора 😄🤩🎉
Please open Telegram to view this post
VIEW IN TELEGRAM
👏6👍4
⚠️ В преддверии праздников мошенники начинают проявлять особую активность. Число фейковых сайтов, Telegram-аккаунтов, чатов и каналов растет кратно. Способы все те же - сыграть на новогодней суете, поймать наиболее невнимательных пользователей, заманить их очередной распродажей, обвалом цен, супер скидками и тому подобное.

Для получения этой "невероятной выгоды" достаточно лишь скачать приложение, ввести данные карты или аккаунта на поддельной странице, которая будет оформлена вполне аккуратно и даже с соблюдением фирстиля оригинала.

❗️ Из недавних новостей: [Снова фейковый Wildberries], [Банкер в приложении для текинга посылок]

👮🏻‍♂️ Будьте бдительны, не попадайтесь на уловки мошенников!
👍2😱2
Начнем новый год с вечно актуальной темы про бэкапы (см. полную версию на сайте).

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

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

Учтем отмеченную выше особенность и рассмотрим пример организации файловых бэкапов с использованием программы с открытым исходным кодом restic.

📝 Вводные данные

🔹 Рабочие станции
Две виртуальные машины на Linux и облачный сервер с большим диском для хранения.

🔹 Инструменты
1. Мультиплатформенная программа для создания резервных копий restic.
- Репозиторий на GitHub
- Документация
2. Автоматизация для restic - resticker.
3. REST API сервер для удаленных бэкапов на restic - rest server.

⚡️ Разворачиваем rest-server

🔹 Готовим
▪️ .htpasswd файл для двух тестовых пользователей
▪️ docker-compose.yml для запуска сервера
--append-only - включает режим только на создание резервных копий без возможности удаления или изменения ранее добавленных.
--private-repos - доступ пользователей только к их личному репозиторию (включая вложенные репозитории) на сервере по имени, т.е. http://host:8000/user1/ для user1 и http://host:8000/user2/ для user2 соответственно.

🔹 Стартуем
docker compose up -d


⁉️ На момент публикации rest-server еще не поддерживает ротацию бэкапов. Временное решение для контроля за устаревшими резервными копиями - прямо на сервере настраивать отдельный restic клиент, который смотрит на репозитории и отрабатывает очистку по заданным правилам.

📌 Устанавливаем и настраиваем restic на первой целевой машине

# установка
sudo apt install restic
# создание удаленного репозитория
restic -r rest:http://user1:password1@host:8000/user1/ init
# бэкап каталога tmp
restic -r rest:http://user1:password1@host:8000/ backup /path/to/tmp
# проверка созданной копии
restic -r rest:http://user1:password1@host:8000/ snapshots


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

💡 Как автоматизировать данный процесс? Заполняем переменные окружения и прописываем задание в cron для запуска restic. Все тоже самое, только завернутое в docker контейнер, позволяет сделать упомянутый выше resticker. Им и воспользуемся при работе со второй машиной.

📌 Запускаем resticker на второй целевой машине

🔸 Готовим
▪️ .env файл с переменными окружения
▪️ docker-compose.yml для запуска resticker
- RUN_ON_STARTUP - выполнить бэкап при старте контейнера.
- RESTIC_BACKUP_SOURCES - примонтированный в /data контейнера тольно на чтение каталог tmp.
- BACKUP_CRON: "0 15 1 * * *" - задание cron для бэкапа указанного источника ежедневно в 01:15 ночи. Информация о формате в описании go-cron.

🔸 Стартуем
docker compose up -d


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

🔥 Таким образом, используя связку rest-server, restic и resticker можно организовать централизованный сбор и хранение файловых бэкапов с автоматической обработкой заданий по расписанию. Наличие приватных репозиториев и режима только на запись обеспечивают защиту от случайного или преднамеренного удаления данных.

#backup #opensource #selfhosted #tools #restic
👍3👏2🔥1
🔥 Подборка инструментов для аудита безопасности UNIX серверов. Проверка корректности выполненных настроек, рекомендации, отчеты, оценка соответствия международным стандартам в области информационной безопасности.

1️⃣ Lynis (самый богатый по функциональности инструмент из представленных)

2️⃣ VPS Security Audit Script (простое, интуитивно понятное решение - более чем достаточно для базовой настройки арендованной виртуальной машины)

3️⃣ Lunar

4️⃣ Linux Security Auditing Tool (LSAT)

5️⃣ Linux Basic Security Audit script (LBSA)

6️⃣ Nix Auditor

📚 Дополнительно
How-To-Secure-A-Linux-Server - детальное руководство по настройке и контролю за обеспечением безопасности Linux.

#security #tools #unix #linux #полезное
🔥5👏1
На этот раз взглянем на образы Docker с точки зрения оценки безопасности, способах обнаружения проблем и уменьшения поверхности возможной деятельности злоумышленников (см. расширенную версию на сайте).

🔨 Сканер безопасности Trivy
Комплексное решение для сбора информации об образе, поиска известных уязвимостей (CVE), секретов и ошибок конфигураций.

🔸 Актуальную версию берем из релизов репозитория.

🔸 Пример запуска инструмента с выводом результатов в табличном виде в консоль. Параметр --ignore-unfixed позволяет отфильтровать результаты, которые, по мнению trivy, нельзя исправить.
trivy image testapp-image-name --ignore-unfixed


🔸 Для получения более детальной информации по каждому найденному случаю сохраняем результат в json.
trivy image testapp-image-name -f json -o trivy_testapp.json


🔸 По умолчанию ищет секреты и уязвимости. Дополнительно можно включить режим поиска ошибок конфигурации и лицензий.

🔨 Программа для проверки образов Dockle
Dockle - линтер и аудитор образов. Проверяет соответствие лучшим практикам по аналогии с Hadolint и рекомендациям или показателям CIS Benchmark for Docker Центра интернет-безопаcности (CIS). Полный перечень метрик, их описание и способы достижения в документации к dockle.

🔸 Устанавливаем

🔸 Пример вызова
# с сохранением в json
dockle -f json -o dockle_testapp.json testapp-image-name
# с выводом в консоль
dockle testapp-image-name


⁉️ Несколько важных моментов касательно рассмотренных выше утилит были отмечены в докладе Анатолия Карпенко из Luntry.

➡️ trivy имеет список исключений при сканировании секретов, согласно которому файлы, содержащие в имени test, example и другие будут проигнорированы, о чем следует помнить во время использования программы.
➡️ dockle проверяет фиксированный список имен файлов при поиске чувствительной информации, что также снижает эффективность инструмента в этой конкретной задаче.

⚒️ Syft и Grype
Про утилиту syft я уже рассказывал в предыдущей заметке цикла. Результаты ее работы использует сканер уязвимостей grype. Принцип аналогичен работе trivy - сканируем, формируем детальный отчет для дальнейшего анализа.

🔸 Собираем SBOMs с помощью syft
syft testapp-image-id -o syft-json=syft.json


🔸 Устанавливаем grype

🔸 Запускаем с сохранением отчета в json
grype sbom:syft.json --output json --file grype.json
✔️ Scanned for vulnerabilities [93 vulnerability matches]
├── by severity: 1 critical, 3 high, 17 medium, 6 low, 60 negligible (6 unknown)
└── by status: 6 fixed, 87 not-fixed, 0 ignored


⚡️ Способы устранения
trivy и grype на выходе предоставили нам отчеты в формате json, в которых описаны разной степени важности уязвимости в исследуемом образе. Часть из них может быть исправлена в автоматическом режиме и имеет соответствующую метку fixed, другая же часть не поддерживает исправление или вовсе неизвестна.

🔹 Как починить образ?
Используем программу для модификации слоев copa.
▪️ Добавляет патч слой к целевому образу и формирует новый, расширенный образ.
▪️ Работает на основе результатов сканнеров уязвимостей.
▪️ По умолчанию принимает результаты от trivi, однако, за счет возможности подключения плагинов, появилась и поддержка grype.

🔹 Что еще можно сделать?
fixed уязвимости поправили, но остался целый пласт незатронутых проблем.
▪️ Заменить полный базовый образ системы на минималистичный (distroless, alpine) по возможности.
▪️ Поддерживать актуальные версии используемых библиотек и утилит.
▪️ Очистить образ от неиспользуемых ресурсов с помощью программы mint.
▫️ Убирает "ненужные" исполняемые файлы.
▫️ Отслеживает работу через временный контейнер, собираем детальную информацию об обращениях и вызовах приложения, генерирует новый, облегченный образ.
▪️ Удалить промежуточные слои со временными или чувствительными данными с помощью docker-squash.

#docker
👍2🔥2
📝 Подборка инструментов с открытым исходным кодом для выгрузки информации с сайтов частично или полностью. У каждого своя специфика, выходной формат и качество сбора данных, так что в зависимости от задачи пригодиться могут разные решения.

◼️ website-scrapper - загрузчик статических сайтов на nodejs,
website-scraper-puppeteer - динамических сайтов.

◼️ goclone - утилита на go для клонирования сайта.

◼️ PyWebCopy - аналогичного назначения утилита на python.

◼️ SiteMirror - еще одно простое решение на python.

◼️ WebsiteToGPT - преобразовывает контент сайта в текстовые файлы.

◼️ Univer Clipsheet - расширение для Chrome для веб-скрапинга. Удобная и гибкая работа с данными как статического так и динамического ресурса.

◼️ Gowitness - программа для создания скриншотов веб-сайтов со встроенным граббером и веб-интерфейсом для просмотра результатов.

🔥 Дополнительно

◼️ Wappix - ридер экспортированных чатов WhatsApp.

◼️ tg-archive - архиватор каналов и чатов Telegram c представлением их в виде статического сайта.

#tools #полезное
👍3🔥1
Рассмотрим поднятие кластера базы данных PostgreSQL (см. заметку на сайте).

Autobase - платформа или лучше назвать инструмент автоматизации для простого и быстрого поднятия кластера PostgreSQL.

🏠 Архитектура согласно документации.

📌 Основные компоненты

▪️ python приложение для управления кластерами PostgreSQL - patroni.
▪️ key-value хранилище конфигураций - etcd.
▪️ сервис плавающего приоритета для предоставления единой точки доступа к кластеру - vip-manager.
▪️ система управления подключениями или пулер соединений - PgBouncer.
▪️ балансировщик нагрузки - HAProxy.

Для тех, кто не жаждет разбираться в тонкостях построения отказоустойчивого кластера, разработчиками системы были подготовлены ряд скриптов, Ansible конфигураций и сервисов, в том числе UI, благодаря которым процесс запуска свелся к нескольким несложным шагам.

🔨 Подготовка

➡️ 3 виртуальные машины (2 CPU, 2 Gb RAM) на Debian 12 под ноды
▪️ ставим ssh сервер
▪️ пользователя добавляем в sudo
▪️ на проде организовываем доступ через ключи (на тестовых можно обойтись и паролем)

➡️ 1 виртуальная машина для консоли управления также на Debian 12
▪️ ставим Docker

➡️ все машины в одной сети (рекомендация разработчиков для поддержки функции мониторинга кластера)

🚀 Запускаем консоль управления
docker run -d --name autobase-console \
  --publish 80:80 \
  --publish 8080:8080 \
  --env PG_CONSOLE_API_URL=http://192.168.1.135:8080/api/v1 \
  --env PG_CONSOLE_AUTHORIZATION_TOKEN=secret_token \
  --env PG_CONSOLE_DOCKER_IMAGE=autobase/automation:latest \
  --volume console_postgres:/var/lib/postgresql \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --volume /tmp/ansible:/tmp/ansible \
  --restart=unless-stopped \
  autobase/console:latest

▫️ 192.168.1.135 - адрес виртуальной машины консоли (api сервис стартует рядом с ui и бд консоли, поэтому адрес один и тот же)
▫️ 80 - порт ui
▫️ 8080 - порт api сервиса

🔥 Создаем кластер
Идем в консоль по адресу машины на 80 порт.

▫️ Для входа используем заданный при старте контейнера PG_CONSOLE_AUTHORIZATION_TOKEN.
▫️ Create cluster - Your Own Machines.
▫️ По умолчанию предлагается использовать 3 ноды. Их и заполняем информацией о созданных ранее виртуальных машинах.
▫️ Выбираем метод авторизации и заполняем учетные данные.
▫️ В поле Cluster VIP address указываем незанятый (!) адрес в сети, который будет использован как единая точка входа для кластера.
▫️ Включаем балансировщик HAProxy load balancer
▫️ Выбираем версию PostgreSQL
▫️ Стартуем

✔️ В разделе Operations можно отслеживать процесс исполнения через логи системы.
✔️ В случае успешного запуска в разделе Clusters появится развернутый экземпляр с расширенной информацией и мониторингом состояния.

⁉️ Резервное копирование и восстановление кластеров реализовано с помощью инструментов pgBackRest и WAL-G, однако управление из ui пока недоступно - в скором времени планируется внедрить, судя по планам и комментариям разработчиков.

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

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

#db #tools #selfhosted
👍3🔥2