TGViewer
Channel Public Channel
Сочный DevOps

Сочный DevOps

@andtree_sec

От CI/CD до SIEM, SOC и безопасности — здесь делюсь опытом, мыслями и полезняшками на стыке DevOps и безопасности. Всё сочное — в «Сочном DevOps».
Subscribers
420
Photos
8
Videos
0
Links
52

Showing posts older than #102 · Back to latest

Older Posts 10 shown
Post #101 27
resource group в gitlab-ci

Данный механизм позволяет контролировать выполнение определенных джобов в пайплайне, у которых собственно данный механизм включен. Например:
deploy:app:
resource_group: "${CI_COMMIT_REF_SLUG}-<name>"


Доступны 3 режима работы:
1. unordered - это дефолтный режим, он просто ограничивает одновременное выполнение и не гарантирует порядок выполнения. Например 3 разных джобы деплоя могут выполнится в случайной последовательности, но не одновременно.

2. oldest_first - Джобы также не будут выполнены одновременно, но в строгом порядке, сначала те, что были старше (запушены первыми). Например мы пушим комиты, которые запускают job-1, job-2, job-3 с промежутков в 5 минут. Сама джоба выполняется 10 минут. Порядок будет job-1 -> job-2 -> job-3.

3. newest_first - противоположность oldest_first. Первым запускается деплой комита, который был запушен последним, то есть был новее других.

Изменить тип через API:
curl -X PUT -d "process_mode=<process_mode>" -H "PRIVATE-TOKEN: <token>" "https://gitlab.example.com/api/v4/projects/<project_id>/resource_groups/<resource_group_name>"


#gitlab
Post #100 22
Обходим случайную потерю бита выполнения на бинарь в Linux

Предположим ситуацию, которая в реальности вряд ли может произойти, но все же, когда мы убрали бит исполнения (x) у утилиты chmod. Например так:
sudo chmod -x /bin/chmod


Команда chmod работать больше не будет, есть разные способы как это исправить, рассмотрим дефолтный для любого Linux и интересный.

Для восстановления бита выполнения можно воспользоваться динамическим линковщиком напрямую.
Для начала выясним путь до него. Для этого можно просто грепнуть открытые файлы например процесса bash или посмотреть через ldd библиотеки в данном случае chmod утитилы.
lsof |grep bash | grep ld
ldd chmod


Запускаем, используя полный путь, полученный ранее:
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /bin/chmod +x /bin/chmod


Бит будет восстановлен. Это возможно, потому что линковщик не зависит от права на исполнения файла программы, которую он запускает, он просто интерпретирует ELF-файл как обычные данные и загружает его в память. Таким образом, запуская программу через линковщик, мы обходим контроль прав на уровне ОС.

ELF (Executable and Linkable Format) - это стандартный формат файлов для исполняемых программ, объектных файлов, общих библиотек и дампов памяти в UNIX системах, включая Linux.

#Linux
Post #99 24
Сброс root пароля в mysql

Если вдруг вы забыли пароль root в mysql, сбросить его можно следующим образом:

Останавливаем текущий инстанс:
sudo systemctl stop mysql


Создаем директорию для сокета. Она не будет создана автоматически дальнейшей командой запуска
sudo mkdir -p /var/run/mysqld
sudo chown mysql:mysql /var/run/mysqld


Запускаем в безопасном режиме
sudo mysqld_safe --skip-grant-tables --skip-networking &


Заходим в mysql под root, пароль не требуется.
mysql -u root


Если включен плагин mysql_native_password, то выполняем:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newPassword';
FLUSH PRIVILEGES;


Для caching_sha2_password:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'newPassword';
FLUSH PRIVILEGES;


Если при выполнении команд на смену пароля, получаете те или иные ошибки и проблему решить не удается, то можно просто удалить пользователя и пересоздать его заново.
DROP USER 'root'@'localhost';
CREATE USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newPassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;


После убиваем запущенный руками процесс
sudo kill pidof mysqld


И запускаем mysql
sudo systemctl start mysql


Теперь можно зайти под рутом с новым паролем
mysql -u root -p


#базы_данных
Post #98 36
Небольшая шпаргалка по Git.

Создать репозиторий:
- git init <project_name> - создать новый локальный репозиторий.
- git clone <url> - создание копии (удаленного) репозитория.
- git clone https://oauth2:<token>@<url> - клонирование репозитория с oauth2 протоколом, например если включена двухфакторка.

Изменения:
- git add <file> - индексировать файл.
- git add . - индексировать все файлы.
- git commit -m "commit message" - зафиксировать индексированные файлы с комментарием.
- git commit -am "commit message" - зафиксировать все отслеживаемые файлы с комментарием.
- git reset <file> - откат изменений до определенного коммита.
- git reset --hard - вернуть дерево проекта и индекс в состояние, соответствующее указанному коммиту, удалив изменения последующих коммитов.

Отслеживание репозитория:
- git status - список новых или измененных файлов, которые еще не закоммитены.
- git diff - показать изменения, не внесенные в индекс.
- git diff --cached - изменения, внесенные в индекс.
- git diff HEAD - показать все индексированные и неиндексированные изменения файлов.
- git diff commit1 commit2 - показать различия между двумя коммитами.
- git blame <file> - показать дату изменения и автора для данного файла.
- git show <commit>:<file> - показать изменения для определенного коммита или файла.
- git log - показать полную историю изменений.
- git log -p <file/directory> - показать историю изменений для файла/папки, включая различия (diffs).

Работа с ветками:
- git branch - показать все локальные ветки.
- git branch -av - показать все локальные и удаленные ветки.
- git checkout my_branch - переключиться на ветку my_branch.
- git branch new_branch / git checkout -b new_branch - создание новой ветки new_branch.
- git branch -d my_branch - удалить ветку my_branch.
- git checkout branch_b / git merge branch_a - объединить branch_b и branch_a.
- git tag my_tag - добавить тег к текущему коммиту.
- git tag -a my_tag -m "commit" - создать тег с комментарием.

Синхронизация:
- git fetch - получить последние изменения с удаленного сервера без слияния.
- git pull - получить последние изменения с удаленного сервера и выполнить слияние.
- git pull --rebase - получить последние изменения с удаленного сервера и перебазировать.
- git push - применить локальные изменения на удаленный сервер.
- git help - показать справочную информацию о Git.

#git
Post #97 31
tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead

Иногда можно встретить такую ошибку при использовании само подписанных SSL сертификатов. Дело в том, что некоторые утилиты и/или библиотеки используют поле SANs для проверки сертификата. Чтобы избежать подобных проблем, нужно создать сертификат с этим полем.
Из консоли его можно создать, если установлена версия openssl 1.1.1 и выше.
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \                         
-keyout example.key -out example.crt \
-subj "/C=RU/ST=Some-State/L=Some-City/O=Your Organization/CN=example.com" \
-addext "subjectAltName=DNS:example.com"


Проверяем наличие поля SAN
openssl x509 -in example.crt -text -noout | grep -A1 "Subject Alternative Name"


В выводе будет что-то вроде этого:
X509v3 Subject Alternative Name:
DNS:example.com


Если версия openssl ниже чем 1.1.1, нужно использовать конфигурационный файл.
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = RU
ST = Some-State
L = Some-City
O = Your Organization
CN = example.com

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = example.com


И создаем сертификат:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout example.key -out example.crt \
-config <path_to_config.conf>
Post #96 30
Зомби-процессы это "трудовые будни" любого процесса в Linux.
Когда мы запускаем какую-либо команду, ядро создает процесс, который делает системный вызов fork и создает тем самым дочерний процесс.
В дочернем процессе вызывается системный вызов exec, который заменяет его код на код программы. Когда программа завершается, она посылает exit, после чего освобождает ресурсы, а именно память и файловые дескрипторы, но запись остается в таблице процессов. В свою очередь родительский процесс должен послать системный вызов wait, считать код завершение программы и удалить pid из таблицы процессов.

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

Как завершить процесс руками? (без kill -9)

Находим pid процесса зомби
ps aux | grep <process_name>


Подключаемся с помощью gdb
gdb -p <pid>


Вызываем wait
(gdb) call wait()


Отключаемся
(gdb) detach
(gdb) quit
Post #95 32
Читаем вывод top по CPU в Linux.

Load average (LA) - отображает значения средней загрузки CPU за 1, 5 и 15 минут. Учитываются не только процессы, ждущие выполнения на процессоре но и процессы, которые ожидают IO (процессы со статусом D). Для машины с 1 ядром, LA равный 1 означает плотно загружен, для 2 ядер, только наполовину и так далее.

us (user) - процент времени, потраченного на выполнение процессов в user space.

sy (system) - процент времени, потраченного на выполнение процессов в kernel space.

ni (nice) - процент времени, потраченного на выполнение процессов с измененным приоритетом.

id (idle) - процент времени, когда CPU простаивает.

wa (iowait) - процент времени, которое процессор ждет IO.

hi (hardware interrupts) - процент времени, потраченного на обработку аппаратных прерываний.

si (software interrupts) - процент времени, потраченного на обработку программных прерываний.

st (steal) - процент времени, которое гипервизор "украл" у ВМ. Может быть выше 0 только у ВМ.
Post #94 34
Отличный инструмент для форматирования python кода. Уже интегрирован в PyCharm.
Найти и включить в IDE можно в Settings -> Tools -> Black. Далее выбрать откуда получить black, глобально или из текущего проекта.
Нужно прожать обе галки в настройках
1. On code reformat
2. On save.

При сохранении код автоматически будет форматироваться так, как принято в python сообществе.

Установить через pip
pip install black


Установить через poetry
poetry add black --group dev


Страничка на github.
Post #2
Channel photo updated
Post #1
Channel created
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →