Найти в Дзене
Ошибки sudoers приводящие к получению root shell
Ошибки sudoers приводящие к получению root shell Предположим пользователю нужно мочь редактировать конфиг. Пусть это будет sshd. Казалось бы в sudoers вот такой записи будет достаточно: user ALL=(ALL) /bin/vim /etc/ssh/sshd_config Проблема в том, что редакторы и просмотрщики vim,emacs,less,more... предоставляют возможность выхода в shell. Открываем через sudo разрешенный нам редактировать конфиг и вводим: :shell После чего видим как мы получили root на машине. Команды :shell в зависимости от дистрибутива может отличаться. Чтобы избежать подобного, нужно давать использовать не vim а редактор sudoedit, т...
8 месяцев назад
Использование kubespray как ansible collection
Использование kubespray как ansible collection kubespray огромен и тащить его весь к себе в репозиторий смысла нет. Достаточно использовать его как ansible collection и переопределить в inventory только то, что нужно. Пример структуры inventory: ├── k8s.cluster.1 │   ├── group_vars │   │   ├── all │   │   │   ├── all.yml │   │   │   └── containerd.yml │   │   ├── k8s_cluster │   │   │   ├── addons.yml │   │   │   ├── k8s-cluster.yml │   │   │   └── kube_control_plane.yml │   │   └── k8s_load_balancers.yml │   └── hosts.yml ├── k8s.cluster.2 │   ├── group_vars │   │   ├── all │   │   │   ├── all...
8 месяцев назад
Харденинг кубов
Харденинг кубов 1. Мы запускаем kube-apiserver со следующим набором аргументов: --kubelet-client-certificate=<path> --kubelet-client-key=<path> --authorization-mode=Node,RBAC --enable-admission-plugins=EventRateLimit --secure-port =6443 --audit-log-path=/var/log/audit/kube-apiserver-audit.log --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --service-account-lookup=true --service-account-key-file=<path> --etcd-certfile=<path> --etcd-keyfile=<path> --tls-cert-file=<path> --tls-private-key-file=<path> --client-ca-file=<path> --etcd-cafile=<path> --audit-policy-file=/etc/kubernetes/audit-policy/apiserver-audit-policy...
8 месяцев назад
Доставка syslog в elastic
Доставка syslog в elastic Простой пример, как можно доставлять syslog с linux машин в elasticsearch. Для сбора логов на целевой машине я буду использовать вектор. У меня ubuntu 22.04, установить vector можно так: bash -c "$(curl -L https://setup.vector.dev)" sudo apt-get install vector Далее приведем его конфигурационный файл /etc/vector/vector.yaml к следующему виду: sources: syslog: type: file include: - /var/log/syslog ignore_older: 86400 sinks: logstash: inputs: - syslog type: socket address: "<logstash_ip>:<logstash_port>" mode: tcp encoding: codec: text И запустим vector: sudo systemctl...
8 месяцев назад
API honeypot на FastApi
API honeypot на FastApi Ссылка на проект тут. Хонипот основан на библиотеке baitroute. Суть работы очень простая, из директории rules подгружаются разные как-бы уязвимые endpoints, которые могут обрабатывать GET, POST, HEAD запросы, в зависимости от конфигурации. Запустить и потыкать можно так: poetry install --no-root python -m src...
8 месяцев назад
Как по-быстрому развернуть VPN
Как по-быстрому развернуть VPN Пример с wireguard. Само собой понадобится зарубежный VPS с публичным IP адресом на интерфейсе. У меня Ubuntu 22.04. Ставим нужные пакеты: apt-get update && apt-get install wireguard wireguard-tools mawk iproute2 qrencode Включаем ip forwarding в /etc/sysctl.conf: net.ipv4.ip_forward=1 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1 Сохраняем: sysctl -p Для простоты настройки, можно скачать скрипт: wget https://raw.githubusercontent.com/burghardt/easy-wg-quick/master/easy-wg-quick Даем бит выполнения и запускаем: chmod +x easy-wg-quick ./easy-wg-quick После этого в директории запуска будут сгенерированы все нужные конфигурационные файлы...
8 месяцев назад
Немного про Gunicorn и Uvicorn
Немного про Gunicorn и Uvicorn Иногда по долгу службы приходится программировать всякое на python, иногда даже какой-то бэкенд. Я обычно использую FastAPI для этого. Кстати, мой сайт devopsoffer написан целиком и полностью на этом фреймворке. Gunicorn — это синхронный сервер приложений WSGI на Python. Напомню, что WSGI — это стандарт интерфейса между веб-серверами и Python веб-приложениями, созданный для синхронных приложений. Uvicorn, в свою очередь, — это асинхронный сервер ASGI, который поддерживает приложения на FastAPI и Starlette и позволяет использовать асинхронное выполнение запросов...
8 месяцев назад
Экстренное удаление pod в kubernetes
Экстренное удаление pod в kubernetes Когда Pod не хочет завершаться обычными способами, можно воспользоваться следующей командой для принудительного удаления: kubectl delete pod <pod_name> --force --grace-period=0 -n <ns_name> Параметры, которые тут используем: --force - принудительное удаление пода. --grace-period=0 - устанавливает период ожидание перед завершением в 0 секунд, что мгновенно убивает процесс. Немного про grace-period: grace-period — это время, предоставленное Pod-у для корректного завершения перед его остановкой. Обычно оно задается в секундах и позволяет запущенным процессам...
8 месяцев назад
Нагрузочное тестирование с k6
Нагрузочное тестирование с k6 Пример скрипта на js для k6: import http, { head } from 'k6/http'; import { check, sleep } from 'k6'; const BASE_URL = "" const headers = { 'Header': 'value', 'Header': 'value' } export let options = { vus: 2, // пользователи duration: '1m', // время выполнения thresholds: { 'http_reqs': ['rate>=1000'], // RPS }, }; function checkResponseStatus(response, expectedStatus) { check(response, { [`is status ${expectedStatus}`]: (r) => r.status === expectedStatus, }); } function one() { let url = `${BASE_URL}/ep1` let response = http.get(url, { headers: headers}); checkResponseStatus(response,...
8 месяцев назад
ELK для локальных утех
ELK для локальных утех Небольшая моя реализация стека ELK для локальных экспериментов. Внутри vagrant и init.sh скрипт, который развернет на одной ноде elasticsearch, kibana, logstash. Конфигов под logstash нет, тут предполагается, что их добавят самостоятельно, если нужно. Также автоматически поставится nginx, который будет работать как обратный прокси к kibana и будет обслуживать домен kibana.lan. Это в свою очередь предполагает наличие локального DNS с соответствующей записью. Установки и настройки DNS внутри репозитория нет. Перед запуском нужно в Vagrantfile отредактировать IP адресс и название bridge интерфейса: Vagrant...
8 месяцев назад
Добавление нового listener в kafka
Добавление нового listener в kafka Допустим есть кластер кафки, который использует в качестве механизма аутентификации SCRAM-SHA-256. Но тут понадобилось добавить одного listener под SASL_PLAINTEXT. Сделать это можно довольно просто. Добавляем нового listener в listeners: listeners=NEW://<ip>:<new_port> Затем в advertised.listeners: advertised.listeners=NEW://<ip>:<new_port> И указываем маппинг: listener.security.protocol.map=NEW:SASL_PLAINTEXT Клиенту говорим следующие параметры: 1...
8 месяцев назад
Тулза для скачивания всех репозиториев в gitlab
Тулза для скачивания всех репозиториев в gitlab Небольшая CLI утилита, которая позволяет скачать все доступные репозитории в gitlab. Если репозиторий уже скачан, то он будет просто обновлен. Бывает полезно, когда на работе у вас на поддержке целая куча реп. Использование с ssh: gitlab_grabber -t <token> -u <domain> -k -d /<dir> -i <path_to_ssh_private_key> Использование с http. Тут предполагается, что у вас oauth, то есть включена двухфакторка. gitlab_grabber -t <token> -u <domain> -k -d /<dir> --auth http Поставить можно через pip pip install gitlab-grabber Для работы нужен python3...
8 месяцев назад