Найти в Дзене
Ошибки 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, т...
10 месяцев назад
Использование 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...
10 месяцев назад
Харденинг кубов
Харденинг кубов 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...
10 месяцев назад
Доставка 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...
10 месяцев назад
API honeypot на FastApi
API honeypot на FastApi Ссылка на проект тут. Хонипот основан на библиотеке baitroute. Суть работы очень простая, из директории rules подгружаются разные как-бы уязвимые endpoints, которые могут обрабатывать GET, POST, HEAD запросы, в зависимости от конфигурации. Запустить и потыкать можно так: poetry install --no-root python -m src...
10 месяцев назад
Как по-быстрому развернуть 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 После этого в директории запуска будут сгенерированы все нужные конфигурационные файлы...
10 месяцев назад
Немного про Gunicorn и Uvicorn
Немного про Gunicorn и Uvicorn Иногда по долгу службы приходится программировать всякое на python, иногда даже какой-то бэкенд. Я обычно использую FastAPI для этого. Кстати, мой сайт devopsoffer написан целиком и полностью на этом фреймворке. Gunicorn — это синхронный сервер приложений WSGI на Python. Напомню, что WSGI — это стандарт интерфейса между веб-серверами и Python веб-приложениями, созданный для синхронных приложений. Uvicorn, в свою очередь, — это асинхронный сервер ASGI, который поддерживает приложения на FastAPI и Starlette и позволяет использовать асинхронное выполнение запросов...
10 месяцев назад
Экстренное удаление 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-у для корректного завершения перед его остановкой. Обычно оно задается в секундах и позволяет запущенным процессам...
10 месяцев назад
Нагрузочное тестирование с 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,...
10 месяцев назад
ELK для локальных утех
ELK для локальных утех Небольшая моя реализация стека ELK для локальных экспериментов. Внутри vagrant и init.sh скрипт, который развернет на одной ноде elasticsearch, kibana, logstash. Конфигов под logstash нет, тут предполагается, что их добавят самостоятельно, если нужно. Также автоматически поставится nginx, который будет работать как обратный прокси к kibana и будет обслуживать домен kibana.lan. Это в свою очередь предполагает наличие локального DNS с соответствующей записью. Установки и настройки DNS внутри репозитория нет. Перед запуском нужно в Vagrantfile отредактировать IP адресс и название bridge интерфейса: Vagrant...
10 месяцев назад
Добавление нового 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...
10 месяцев назад
Тулза для скачивания всех репозиториев в 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...
10 месяцев назад