Admin Future
239 subscribers
50 photos
1 video
4 files
87 links
Превращаем эникейщиков в System Architects.
🚀 Твой навигатор в мире IT-инфраструктуры:

▪️ Hard Skills: Linux, Windows, Network, Security
▪️ Tools: Лучший софт и скрытые фишки
▪️ Mindset: Как думать, чтобы платили много


Админ - @maksimshap
Download Telegram
«Дрейф конфигурации»: Тихий убийца вашей инфраструктуры

Вечер понедельника — идеальное время, чтобы поговорить о невидимом враге, с которым сталкивается каждый админ, — дрейфе конфигурации (configuration drift).

Что это такое?
Это постепенное и незаметное расхождение реального состояния сервера от его эталонной, задокументированной конфигурации.

Как это происходит?

«Срочный фикс»: Вы вручную правите конфиг на prod-server-01 в 2 часа ночи, чтобы поднять упавший сервис. Вы обещаете себе задокументировать это утром, но... утром появляются новые задачи.

Ручные обновления: Один сервер обновили через apt upgrade, а про второй забыли.

Неконсистентные деплои: Разработчики попросили «быстренько поставить вот эту библиотеку» на одном из веб-серверов.

Через полгода ваши серверы, которые должны быть идентичными близнецами, превращаются в уникальные, капризные «снежинки».

Почему это так опасно?

Непредсказуемые сбои: Новый релиз приложения идеально встает на server-01, но падает на server-02, потому что там другая версия glibc. Вы тратите часы на поиск проблемы.

Дыры в безопасности: На одном сервере вы закрыли уязвимый порт, а на другом — нет.

Невозможность масштабирования: Вы не можете быть уверены, что новый, автоматически развернутый сервер будет вести себя так же, как старые.

«Эффект домино»: Сбой на одной «снежинке» может вызвать каскадный отказ всей системы.

Лекарство: Infrastructure as Code (IaC)
Единственный надежный способ борьбы с дрейфом — это декларативный подход. Инструменты вроде Ansible, PowerShell DSC или Terraform позволяют описать желаемое состояние в коде.

Вы не «чините» сервер. Вы запускаете плейбук, который гарантированно приводит ВСЕ серверы к единому, эталонному состоянию. Любое ручное изменение будет автоматически исправлено при следующем запуске. Ваша инфраструктура становится предсказуемой, безопасной и документированной самим кодом.

Перестаньте бороться с симптомами. Начните лечить причину.

#IaC #Ansible #DevOps #Архитектура #ConfigurationManagement
Сетевой швейцарский нож: 3 нетривиальных применения netcat

Каждый админ знает ping и traceroute. Но в арсенале настоящего профессионала есть инструмент куда мощнее — netcat (или nc). Это универсальный солдат для любых сетевых задач.

Вот 3 сценария, где nc сэкономит вам кучу времени.

1. Быстрая проверка открытого порта
Забудьте про telnet. nc делает это лучше и быстрее.

Bash

# Проверяем, доступен ли веб-сервер на 80 порту
# -z: сканировать, не отправляя данные
# -v: подробный вывод
nc -zv web-server.com 80
# Connection to web-server.com 80 port [tcp/http] succeeded!

# Проверяем, слушает ли база данных на порту 5432
nc -zv db-server.com 5432
# nc: connect to db-server.com port 5432 (tcp) failed: Connection refused

Это самый быстрый способ понять, блокирует ли файрвол соединение или сервис просто не запущен.

2. «Беспарольный» трансфер файлов
Нужно срочно скопировать большой лог-файл с сервера, а scp не настроен или заблокирован? nc спешит на помощь.

На принимающей машине (куда копируем):

Bash

nc -l -p 12345 > received_log.log

-l -p 12345: Слушать на порту 12345.

На отправляющей машине (откуда копируем):

Bash

nc receiving_machine_ip 12345 < source_log.log

nc передаст содержимое файла по указанному адресу и порту. Внимание: Этот метод не шифрует трафик, используйте его только в доверенных сетях.

3. Ручной «диалог» с сервисом (Banner Grabbing)
Иногда нужно понять, что отвечает сервис до того, как с ним начнет работать приложение. Например, проверить, какой SMTP-сервер отвечает на порту.

Bash

# Подключаемся к почтовому серверу Google
nc -v smtp.gmail.com 587

В ответ вы можете получить что-то вроде:
220 smtp.gmail.com ESMTP ...
Так можно вручную отправлять HTTP-запросы, общаться с Redis или любым другим текстовым протоколом для отладки.

netcat — это пример того, как простой, но мощный инструмент в умелых руках решает сложные задачи.

#Linux #Networking #Netcat #SysAdmin #Команды #Security
Windows: Поиск и архивация старых файлов с помощью PowerShell

«На диске C заканчивается место» — вечная головная боль админа, особенно на файловых серверах. Искать большие и старые файлы вручную через Проводник — неэффективно. PowerShell позволяет автоматизировать этот процесс, сделав его быстрым и безопасным.

Этот скрипт находит файлы больше определенного размера и старше заданного количества дней, а затем предлагает архивировать их с сохранением структуры папок.

▪️ Скрипт (Archive-OldFiles.ps1):

PowerShell

[CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact='High')]
param(
[Parameter(Mandatory=$true)]
[string]$SourcePath,

[Parameter(Mandatory=$true)]
[string]$ArchivePath,

[int]$DaysOld = 365,

[long]$MinSizeGB = 1
)

# Проверяем, существуют ли пути
if (-not (Test-Path $SourcePath)) {
Write-Error "Исходный путь не найден: $SourcePath"
return
}
if (-not (Test-Path $ArchivePath)) {
Write-Warning "Путь для архива не найден. Создаем: $ArchivePath"
New-Item -Path $ArchivePath -ItemType Directory | Out-Null
}

$thresholdDate = (Get-Date).AddDays(-$DaysOld)
$minSizeBytes = $MinSizeGB * 1GB

Write-Host "Ищем файлы в '$SourcePath' старше $($thresholdDate.ToString('yyyy-MM-dd')) и больше $MinSizeGB GB..."

$filesToArchive = Get-ChildItem -Path $SourcePath -Recurse -File | Where-Object {
$_.LastWriteTime -lt $thresholdDate -and $_.Length -gt $minSizeBytes
}

if ($null -eq $filesToArchive) {
Write-Host "Файлы для архивации не найдены."
return
}

Write-Host "Найдено $($filesToArchive.Count) файлов для архивации."

foreach ($file in $filesToArchive) {
# Сохраняем относительную структуру папок
$relativePath = $file.FullName.Substring($SourcePath.Length)
$destinationPath = Join-Path -Path $ArchivePath -ChildPath $relativePath
$destinationDir = Split-Path -Path $destinationPath -Parent

# Создаем директорию в архиве, если ее нет
if (-not (Test-Path $destinationDir)) {
New-Item -Path $destinationDir -ItemType Directory | Out-Null
}

Write-Host "Перемещение: $($file.FullName) -> $destinationPath"

# Ключевая команда с поддержкой -WhatIf
if ($pscmdlet.ShouldProcess($file.FullName, "Move to $destinationPath")) {
Move-Item -Path $file.FullName -Destination $destinationPath
}
}

Write-Host "Архивация завершена."

▪️ Как использовать:

Тестовый запуск (безопасный режим):
Сначала запустите скрипт с параметром -WhatIf. Он покажет, что он собирается сделать, но ничего не переместит.

PowerShell

.\Archive-OldFiles.ps1 -SourcePath "D:\Shares" -ArchivePath "E:\Archive" -DaysOld 365 -MinSizeGB 1 -WhatIf

Рабочий запуск:
Если вас устраивает результат тестового запуска, уберите -WhatIf для реального перемещения файлов.

PowerShell

.\Archive-OldFiles.ps1 -SourcePath "D:\Shares" -ArchivePath "E:\Archive"

Это не просто скрипт, а безопасный инструмент, который сначала позволяет проверить свои действия.

#PowerShell #WindowsServer #Automation #Скрипты #SysAdmin
Vault: Перестаньте хранить пароли в Ansible-плейбуках

Мы уже говорили про IaC и автоматизацию с помощью Ansible. Но где вы храните пароли от баз данных, API-токены и SSH-ключи, которые используют ваши плейбуки? Если ответ «в ansible-vault» или, что хуже, в зашифрованных файлах в Git, — есть способ лучше.

Знакомьтесь с HashiCorp Vault — это «швейцарский сейф» для всей вашей инфраструктуры.

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

▪️ Как Vault меняет игру?
Vault — это централизованный сервис, который:

Надежно хранит секреты: Все данные шифруются как при передаче, так и при хранении.

Выдает секреты «на лету»: Vault может генерировать временные, короткоживущие учетные данные для баз данных (PostgreSQL, MySQL) или облаков (AWS). Ваше приложение получает доступ к базе не с постоянным паролем, а с временным, который действует, например, 5 минут. Даже если его украдут, он быстро станет бесполезным.

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

Ведет подробный аудит: Каждый запрос к любому секрету записывается в журнал. Вы всегда знаете, кто, что и когда запрашивал.

🧠 Взгляд архитектора:
Внедрение Vault — это переход от статичного управления секретами (пароль, который лежит в файле годами) к динамическому. Вы больше не защищаете сами пароли, вы защищаете доступ к Vault. Это фундаментальный сдвиг в сторону модели Zero Trust, где ни один компонент системы не доверяет другому по умолчанию.

Изучение Vault — это следующий логический шаг после освоения Ansible или Terraform, который выводит ваши навыки безопасности и автоматизации на новый уровень.

#Vault #Security #DevSecOps #IaC #Ansible #Архитектура
Podman: Запускаем контейнеры без Docker. Быстро, безопасно и без демонов.

Многие привыкли, что контейнеры = Docker. Но в мире Linux набирает популярность Podman — инструмент, который делает то же самое, но с несколькими ключевыми улучшениями, особенно важными для безопасности и системной интеграции.

▪️ Главные отличия от Docker:

Нет демона: Podman работает без постоянного фонового процесса (dockerd), который требует прав root. Каждый контейнер запускается как дочерний процесс пользователя. Это снижает поверхность атаки.

Rootless-режим: Вы можете запускать контейнеры от имени обычного пользователя, без sudo. Изоляция на уровне ядра не позволит такому контейнеру получить права администратора на хосте.

Интеграция с systemd: Podman умеет генерировать systemd-юниты для ваших контейнеров, позволяя управлять ими как обычными системными службами.

▪️ Quick Start: Попробуем прямо сейчас
Команды практически на 100% совпадают с Docker, поэтому переучиваться не придется.

Установка:

sudo apt install podman или sudo dnf install podman

Запуск первого контейнера (Nginx):

Bash

# Обратите внимание, никакого 'sudo'
podman run -d --name my_nginx -p 8080:80 docker.io/library/nginx

-d: запуск в фоновом режиме.
--name: имя контейнера.
-p: проброс порта.

Просмотр запущенных контейнеров:

Bash

podman ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# a1b2c3d4e5f6 docker.io/library/nginx:latest nginx -g 'daemon o... 2 minutes ago Up 2 minutes ago 0.0.0.0:8080->80/tcp my_nginx

Управление контейнером как systemd-сервисом:
Это киллер-фича. Создадим systemd-юнит для нашего Nginx.

Bash

# Генерируем .service файл
podman generate systemd --name my_nginx > ~/.config/systemd/user/nginx.service

# Перезагружаем демона systemd для user-сессии
systemctl --user daemon-reload

# Запускаем и включаем автозагрузку сервиса
systemctl --user start nginx.service
systemctl --user enable nginx.service

Теперь ваш контейнер будет стартовать вместе с вашей пользовательской сессией и управляться как обычная служба!

Вывод: Podman — это отличная, более безопасная и системно-интегрированная альтернатива Docker для запуска одиночных контейнеров на Linux-серверах.

#Podman #Containers #Linux #DevOps #Security #Systemd
Идемпотентность: Почему ваш скрипт не должен бояться повторного запуска

Что отличает скрипт новичка от скрипта профессионала? Профессионал стремится к идемпотентности.

Идемпотентность — это свойство операции, при котором её повторное применение к объекту даёт тот же результат, что и первое. Проще говоря, ваш скрипт можно запускать 100 раз подряд, и он не сломает систему. После первого запуска все последующие просто сообщат, что «всё уже в нужном состоянии».

▪️ Зачем это нужно?
Представьте скрипт, который добавляет строку в /etc/hosts. Если запустить его 5 раз, он добавит 5 одинаковых строк. Это не идемпотентно. Идемпотентный скрипт сначала проверит, есть ли такая строка, и добавит её, только если её нет.

Это критически важно для:

Надёжности автоматизации (Ansible, DSC): Все эти системы построены на принципе идемпотентности.

Безопасности: Вы можете быть уверены, что повторный запуск скрипта исправит конфигурацию, а не усугубит проблему.

Предотвращения ошибок: Снижает риск случайного дублирования данных или настроек.

▪️ Как достичь идемпотентности?

Пример в Bash (добавить строку в файл):
Не идемпотентно:

echo "10.0.0.5 web-server" >> /etc/hosts

Идемпотентно (с проверкой):

Bash

HOSTS_LINE="10.0.0.5 web-server"
if ! grep -qF -- "${HOSTS_LINE}" /etc/hosts; then
echo "${HOSTS_LINE}" >> /etc/hosts
echo "Строка добавлена."
else
echo "Строка уже существует."
fi

Пример в PowerShell (создать папку):
PowerShell часто помогает "из коробки".

Не идемпотентно (выдаст ошибку при втором запуске):

New-Item -Path C:\Temp\MyApp -ItemType Directory

Идемпотентно (с проверкой):

PowerShell

$path = "C:\Temp\MyApp"
if (-not (Test-Path $path)) {
New-Item -Path $path -ItemType Directory
}

Или ещё проще, используя -Force, который подавляет ошибку, если папка существует:
New-Item -Path C:\Temp\MyApp -ItemType Directory -Force

🧠 Взгляд архитектора:
Когда вы пишете скрипт, всегда задавайте себе вопрос: «Что случится, если я запущу его снова через час? А через год?». Мышление в терминах состояний, а не действий — это основа надёжной и масштабируемой автоматизации.

#Automation #Bash #PowerShell #DevOps #BestPractices #Архитектура
🔥2
SSH на максималках: Ускоряем повторные подключения с помощью ControlMaster

Каждый Linux-админ использует ssh десятки раз в день. Мы привыкли к небольшой задержке при каждом подключении: рукопожатие, обмен ключами, аутентификация. Но что, если я скажу, что ждать нужно только один раз?

Знакомьтесь с SSH Multiplexing (мультиплексированием) — встроенной функцией OpenSSH, которая делает повторные подключения к одному и тому же хосту практически мгновенными.

▪️ Как это работает?
При первом подключении ssh создает управляющий сокет — постоянное «мастер-соединение». Все последующие сессии (ssh, scp, sftp) к этому же хосту просто переиспользуют этот уже установленный и аутентифицированный канал, пропуская всю рутину.

▪️ Как включить?
Добавьте эти строки в ваш файл ~/.ssh/config:

Ini, TOML

Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 10m

ControlMaster auto: Автоматически создавать и использовать мастер-соединение.

ControlPath ...: Шаблон для именования файлов сокетов (создаст уникальный сокет для каждой сессии).

ControlPersist 10m: Оставлять мастер-соединение активным в фоне 10 минут после закрытия последней сессии.

▪️ Проверьте сами:

Откройте терминал и подключитесь к серверу: ssh user@your-server. Вы заметите обычную задержку.

Не закрывая первое соединение, откройте второй терминал и выполните ту же команду.

Вы подключитесь мгновенно.

🧠 Взгляд архитектора:
Это не просто личный лайфхак. Для систем автоматизации вроде Ansible эта функция — настоящее золото. Она может кардинально ускорить выполнение плейбуков на множестве хостов, так как Ansible не тратит время на установку нового SSH-соединения для каждой задачи. Это напрямую влияет на скорость и эффективность деплоя.

#SSH #Linux #DevOps #Performance #LifeHack #SysAdmin
🔥2
Как безопасно хранить секреты в Git? Знакомьтесь с git-crypt

Главное правило Infrastructure as Code (IaC) — всё должно быть в Git. Но что делать с секретами: паролями, токенами, приватными ключами? Добавлять их в .gitignore — безопасно, но неудобно для команды. Хранить в открытом виде — катастрофа.

git-crypt предлагает элегантное решение этой проблемы, интегрируя шифрование прямо в ваш Git-workflow.

▪️ Философия git-crypt:
Это прозрачный файловый фильтр. Вы один раз указываете, какие файлы или папки должны быть зашифрованы.

Когда вы делаете git push, эти файлы автоматически шифруются перед отправкой на удаленный репозиторий.

Когда ваш коллега (у которого есть доступ) делает git pull, эти файлы автоматически расшифровываются на его машине.

В удаленном репозитории (на GitHub/GitLab) секреты всегда хранятся в виде зашифрованной абракадабры. В вашей рабочей копии вы видите их как обычные текстовые файлы.

▪️ Быстрый старт:

Установка: sudo apt install git-crypt или brew install git-crypt.

Инициализация в репозитории: git-crypt init.

Указание файлов для шифрования: Создайте файл .gitattributes и добавьте в него строку:
secret.yaml filter=git-crypt diff=git-crypt

Добавление доверенных пользователей: Чтобы ваши коллеги могли расшифровывать файлы, добавьте их GPG-ключи:
git-crypt add-gpg-user "email@colleague.com"

Работайте как обычно: git add ., git commit, git push. git-crypt сделает всю магию в фоне.

🧠 Взгляд DevSecOps:
git-crypt — это яркий пример практики «сдвига влево» (Shift Left Security). Вы не думаете о безопасности в последнюю очередь, а встраиваете ее в самый базовый инструмент разработки и администрирования — Git. Это делает безопасный способ работы одновременно и самым простым, устраняя человеческий фактор.

#Git #Security #DevSecOps #SecretsManagement #Automation #IaC
Чистим Linux-сервер перед выходными: Чек-лист по освобождению места на диске

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

▪️ 1. Удаляем ненужные пакеты и кэш apt/dnf
Начните с чистки пакетного менеджера.

Bash

# Для Debian/Ubuntu: удаляем устаревшие пакеты
sudo apt autoremove -y

# Очищаем кэш пакетов
sudo apt clean

# Для RHEL/CentOS/Fedora:
sudo dnf autoremove -y
sudo dnf clean all

▪️ 2. Удаляем старые версии ядер Linux
Со временем может накопиться несколько старых ядер, занимающих сотни мегабайт.

Bash

# Для Debian/Ubuntu:
# Показать установленные ядра, кроме текущего
dpkg -l | grep linux-image | awk '{print $2}' | grep -v "$(uname -r)"

# Удалить ненужное ядро (замените <package_name> на имя из вывода выше)
sudo apt remove <package_name>

# Для RHEL/CentOS/Fedora:
# Показать установленные ядра
sudo dnf list installed kernel

# Удалить старые ядра (обычно сохраняется 2-3 последних)
# dnf remove -y $(dnf repoquery --installonly --latest-limit=-2 -q)
# или вручную: sudo dnf remove kernel-<version>

▪️ 3. Чистим логи
Логи могут быстро разрастаться, особенно если есть проблемы.

Bash

# Очищаем journald (оставляем только последние 7 дней или 500Мб)
sudo journalctl --vacuum-time=7d
# или
sudo journalctl --vacuum-size=500M

# Проверяем размер логов в /var/log/ (ищем самые большие файлы)
sudo du -sh /var/log/* | sort -rh | head -n 10

При необходимости вручную удалите или архивируйте старые, большие файлы, которые не ротируются.

▪️ 4. Временные файлы (/tmp, /var/tmp)
Эти директории обычно очищаются автоматически при перезагрузке, но если сервер не перезагружался давно, там может скопиться мусор.

Bash

sudo rm -rf /tmp/* /var/tmp/*

Используйте с осторожностью, убедившись, что в /tmp нет активных файлов.

▪️ 5. Проверяем Docker (если используете)
Docker может оставлять много «мусора»: неиспользуемые образы, контейнеры, тома.

Bash

# Удалить неиспользуемые объекты (контейнеры, сети, образы, кэш)
docker system prune -a

📌 Резюме: Эти простые шаги помогут вам держать дисковое пространство под контролем. Теперь можно спокойно идти на выходные!

#Linux #SysAdmin #DiskSpace #Maintenance #Чеклисты
Linux: Cgroups — Как контейнеры держат свои обещания (и как вы можете)

Вы когда-нибудь задумывались, как Docker или Kubernetes могут гарантировать, что один контейнер не "съест" все ресурсы сервера, оставив остальные голодать? Ответ — cgroups (Control Groups).

Что такое cgroups?
Это механизм ядра Linux, который позволяет организовывать процессы в иерархические группы и управлять их доступом к системным ресурсам:

CPU: Сколько процессорного времени может использовать группа.

Memory: Максимальный объем оперативной памяти.

Disk I/O: Приоритет и скорость чтения/записи на диск.

Network: Ограничения на сетевой трафик.

▪️ Почему это важно для админа?

Контейнеры (Docker, Podman, LXC): Они используют cgroups как основу для изоляции ресурсов. Когда вы задаете -m 512M для Docker-контейнера, это cgroups устанавливает лимит памяти.

Защита от "шумных соседей": Если у вас несколько сервисов на одном VDS/сервере, вы можете создать cgroup для каждого и гарантировать, что один прожорливый процесс не подвесит всю систему.

Обеспечение SLA: Для критически важных сервисов можно выделить гарантированный минимум ресурсов.

Тюнинг производительности: Можно приоритезировать ресурсы для одних процессов и ограничить для других.

▪️ Простой пример: Ограничиваем CPU для "прожорливого" процесса
Представьте, что у вас есть скрипт heavy_calc.sh, который грузит одно ядро на 100%.

Создаем cgroup (например, cpulimit):

Bash

sudo mkdir /sys/fs/cgroup/cpu/cpulimit

Путь может немного отличаться в зависимости от версии Linux и наличия systemd.

Устанавливаем лимит CPU (например, 50% одного ядра):

Bash

# Для systemd cgroups v2:
# cd /sys/fs/cgroup/user.slice/user-1000.slice/
# sudo echo "cpu.max 50000 100000" > cpu.max
# Или более универсально для cgroups v1:
sudo bash -c "echo 50000 > /sys/fs/cgroup/cpu/cpulimit/cpu.cfs_quota_us"
sudo bash -c "echo 100000 > /sys/fs/cgroup/cpu/cpulimit/cpu.cfs_period_us"

cpu.cfs_period_us - общий период (100мс = 100000мкс)
cpu.cfs_quota_us - сколько микросекунд можно использовать за период. 50% = 50000мкс

Добавляем процесс в cgroup:
Сначала запустите ваш "прожорливый" процесс в фоновом режиме, получите его PID.

Bash

./heavy_calc.sh &
PID=$! # Запоминаем PID
sudo bash -c "echo $PID > /sys/fs/cgroup/cpu/cpulimit/tasks"

Теперь этот процесс не сможет использовать более 50% одного ядра, даже если сервер свободен.

🧠 Взгляд архитектора:
Понимание cgroups — это фундамент для работы с контейнерными технологиями и тонкой настройки производительности Linux-систем. Это тот уровень контроля, который позволяет строить по-настоящему стабильную и предсказуемую инфраструктуру, где ресурсы распределяются не случайным образом, а согласно вашим четким правилам.

#Linux #Cgroups #Containers #Performance #Systemd #DevOps
🔥2
Невидимые символы: Чем нулевой байт опасен для системы (и почему с ним борются)

В мире текстовых файлов и строк мы привыкли видеть буквы, цифры и пробелы. Но есть один символ, который невидим, не печатается, но может вызывать огромные проблемы в программах и системах: нулевой байт (NULL character, \0).

▪️ В чем его магия (и опасность)?
В языках программирования C и C++ (на которых написано ядро Linux, множество утилит и системных библиотек) строки традиционно заканчиваются первым встреченным нулевым байтом. Это фундаментальное правило.

▪️ Что происходит, если кто-то подсунет его не туда?
Если программа ожидает строку, а в середине получает \0, она просто обрежет строку в этом месте. Это может привести к:

Обходу безопасности:

Представьте, что вы проверяете путь к файлу: /var/www/site/index.php.

Злоумышленник посылает: /var/www/site/index.php%00.jpg (где %00 — это нулевой байт).

Программа видит только /var/www/site/index.php (из-за нулевого байта), думает, что это безопасно, и выполняет файл как PHP-скрипт, хотя по расширению он выглядит как изображение.

Неожиданному поведению:

Система генерирует имя пользователя admin%00user.

В одной части системы оно распознается как admin, в другой — как admin%00user. Это может открыть лазейки для повышения привилегий.

Ошибкам и сбоям:

Некоторые функции могут просто «зависнуть», если получат неожиданный \0, поскольку ожидают конец строки в другом месте.

▪️ Где его ищут?
Современные языки программирования (Python, Go, Rust, Java) активно борются с проблемами нулевого байта, часто явно запрещая его в середине строк или обрабатывая иначе. Но системные утилиты и низкоуровневые API все еще могут быть уязвимы.

🧠 Для админа: Знание о нулевом байте помогает понимать, почему некоторые фильтры ввода так важны, и почему «непечатаемые символы» в именах файлов или полях форм могут быть не просто ошибкой, а попыткой атаки.

#Security #Linux #Programming #Exploit #SysAdmin #FunFact
IPv6: Когда выключат IPv4, и почему это уже не страшно

Кажется, IPv6 — это та «технология будущего», которая всегда будет «будущим». Каждый админ знает, что IPv4-адреса давно закончились. Но мы все еще на них сидим. Почему? И когда уже переходить?

▪️ Почему так долго?
Причин несколько:

NAT: Network Address Translation спас IPv4, позволив десяткам (или сотням) устройств скрываться за одним публичным IP.

Инерция: Переход на новую версию протокола — это изменение фундаментальных принципов сети. Это дорого, сложно и требует перенастройки всего.

Незнание: Многие боятся IPv6 из-за кажущейся сложности его адресов и настроек.

▪️ Почему это уже не страшно (а даже круто!)
На самом деле, IPv6 уже активно работает на большинстве наших устройств.

Ваш телефон/компьютер: Если ваш провайдер поддерживает IPv6 (а большинство современных провайдеров уже поддерживают), ваши устройства уже получают IPv6-адреса и используют их для доступа к сайтам, которые тоже доступны по IPv6 (например, Google, Facebook, Netflix).

Облака: Все крупные облачные провайдеры полностью поддерживают IPv6. Создавать ресурсы только с IPv6-адресами — это уже реальность.

Простота (для админа):

Нет NAT: Каждое устройство в вашей сети получает свой уникальный публичный IPv6-адрес. Ура, больше никаких проблем с пробросом портов!

Автоконфигурация (SLAAC): Большинство устройств просто сами получают IPv6-адрес от роутера, без DHCP.

Огромное адресное пространство: Выдавайте по 65 тысяч адресов каждому сотруднику, и адреса не кончатся. Никогда.

▪️ Когда выключат IPv4?
Скорее всего, никогда. Или очень, очень нескоро. IPv4 будет существовать как «наследие» еще десятилетия. Но всё больше трафика будет уходить в IPv6.

🧠 Для админа: Изучать IPv6 сейчас — это не заглядывать в далекое будущее, это готовиться к неизбежному настоящему. Это упрощает многие сетевые задачи, повышает безопасность (нет скрытых NAT-правил) и открывает дорогу для новых сервисов. Начните с включения IPv6 на вашем роутере и домашнем сервере.

#IPv6 #Networking #FutureTech #SysAdmin #Internet #TechTrends
Windows: Запуск скриптов с правами администратора

Каждый Windows-админ сталкивался с ситуацией: нужен скрипт, который должен работать с правами администратора. Настроить службы, поправить реестр или перезапустить системный процесс без UAC-подтверждения? Можно автоматизировать.

▪️ Проблема
По умолчанию Python-скрипты запускаются от имени обычного пользователя. Это ограничивает работу с системными настройками и требует «ручного» запуска через правый клик.

▪️ Решение — библиотека pyuac
Пример кода:

from pyuac import isUserAdmin, runAsAdmin

def main():
print("Я запущен как админ!")

if __name__ == "__main__":
if not isUserAdmin():
runAsAdmin()
else:
main()

▪️ Как это помогает
Скрипт сам проверяет уровень прав. Если они недостаточные — перезапускает себя с UAC-запросом. Минимум действий от пользователя, максимум автоматизации.

🧠 Для админа: такой приём пригодится для сервисных скриптов и утилит, которые должны работать «бесшовно».

#Windows #Python #SysAdmin #Automation
Linux: История команд как инструмент скорости

Каждый Linux-админ знает: половина времени в консоли уходит на повторение команд. Но shell уже умеет экономить ваши минуты.

▪️ Базовые приёмы

!! — выполнить предыдущую команду.

!n — выполнить команду из истории по номеру.

history | grep <ключ> — поиск по истории.

▪️ Горячие клавиши

Ctrl+R — поиск по истории в реальном времени.

Ctrl+P и Ctrl+N — навигация по истории (вперёд/назад).

▪️ Зачем это нужно
Вместо того чтобы печатать длинные docker run ... или systemctl restart ..., достаточно пары клавиш.

🧠 Для админа: чем меньше вы печатаете руками, тем меньше вероятность ошибки. А скорость работы в консоли напрямую повышает вашу продуктивность.

#Linux #Bash #Zsh #SysAdmin #Productivity
macOS: macOS глазами Linux-админа

Многие админы воспринимают macOS как «чисто пользовательскую» систему. На деле это полноценный Unix, а значит — большинство навыков из Linux работают здесь «из коробки».

▪️ Архитектура
Под капотом macOS: Darwin + BSD + ядро XNU. Это тот же Unix-мир, только в графической обёртке.

▪️ Отличия от Linux

Домашние директории в /Users, а не в /home.

По умолчанию shell — zsh (но можно вернуть bash).

Управление системой через launchctl, diskutil, defaults.

▪️ Зачем это важно
Если вы админ и привыкли к Linux, то macOS не придётся «переучивать». Большинство привычных команд работают, а специфические утилиты быстро осваиваются.

🧠 Для админа: если вы поддерживаете команду с Mac-устройствами — изучите эти особенности. Они экономят часы на настройке и интеграции.

#macOS #Unix #LinuxAdmins #SysAdmin
Windows: Хватит кликать! Управляем состоянием сервера с PowerShell DSC

Классический подход к настройке Windows Server — это чек-лист на 20 страниц и часы ручной работы в GUI. Архитектор так не делает. Он описывает желаемое состояние системы в коде.

PowerShell Desired State Configuration (DSC) — это фреймворк Infrastructure as Code (IaC) от Microsoft. Вы не пишете скрипт "как сделать", вы пишете декларативный конфиг "каким должен быть сервер".

Задача: Убедиться, что на всех веб-серверах установлена роль IIS и отключен Telnet-клиент.

1. Создаём конфигурацию (файл IIS_Config.ps1):

PowerShell

# Конфигурация описывает желаемое состояние узла (сервера)
Configuration WebServerState {

# Импортируем необходимые ресурсы DSC
Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

# Применяем конфигурацию к любому узлу с именем 'localhost'
# (в реальной среде здесь будут имена серверов)
Node "localhost" {

# Ресурс WindowsFeature обеспечивает наличие роли или компонента
WindowsFeature "IIS" {
Ensure = "Present" # Убедиться, что он УСТАНОВЛЕН
Name = "Web-Server" # Техническое имя роли IIS
}

WindowsFeature "TelnetClient" {
Ensure = "Absent" # Убедиться, что он ОТСУТСТВУЕТ
Name = "Telnet-Client"
}
}
}

# Вызываем конфигурацию, чтобы сгенерировать MOF-файл
WebServerState

2. Применяем конфигурацию:
Сначала запускаем скрипт выше, он создаст .mof файл в новой папке. Затем выполняем команду:

PowerShell

Start-DscConfiguration -Path ./WebServerState -Wait -Verbose

Что произойдёт?

DSC проверит состояние IIS и Telnet.

Если IIS не установлен — он его установит.

Если Telnet-клиент установлен — он его удалит.

Если всё уже в порядке — ничего не произойдёт.

Почему это взгляд архитектора?
Декларативность: Вы описываете ЧТО, а не КАК. Система сама приходит в нужное состояние.
Идемпотентность: Конфигурацию можно применять сотни раз, результат всегда будет одинаков и предсказуем.
Масштабирование и аудит: Один и тот же MOF-файл можно применить к тысяче машин. А команда Test-DscConfiguration мгновенно покажет, соответствует ли сервер заданной конфигурации (drift detection).

Это первый шаг к таким инструментам, как Ansible и Puppet, но прямо в вашей Windows-среде.

#windows #powershell #dsc #iac #automation #architect
macOS: Профессиональные диалоги в скриптах с swiftDialog

Когда вы автоматизируете настройку Mac для нового сотрудника с помощью MDM и скриптов, как сообщить ему о процессе? Чёрное окно терминала пугает. Простое уведомление — неинформативно.

swiftDialog — это утилита, которая позволяет выводить красивые, настраиваемые диалоговые окна из любого скрипта (bash, Python). Это поднимает вашу автоматизацию на новый уровень.

Пример: Показываем пользователю этапы настройки его нового Mac.

Установка (в скрипте через brew):

Bash

# Проверяем, установлен ли swiftDialog, и если нет - ставим
if ! command -v dialog &> /dev/null; then
echo "swiftDialog не найден. Устанавливаем..."
/usr/local/bin/brew install swiftDialog
fi

Скрипт для отображения прогресса:

Bash

#!/bin/bash

DIALOG_CMD="/usr/local/bin/dialog"
LOG_FILE="/var/tmp/setup.log"

# Настройки окна
TITLE="Настройка вашего нового Mac"
MESSAGE="Пожалуйста, подождите, мы готовим ваш компьютер к работе. Это может занять 15-20 минут."
ICON="https://corp.example.com/logo.png" # Иконка вашей компании

# Запускаем диалог в фоновом режиме
$DIALOG_CMD --title "$TITLE" --message "$MESSAGE" --icon "$ICON" --progress 5 --commandfile "$LOG_FILE" &

# --- Эмуляция длительных операций ---
echo "progress: 1" > "$LOG_FILE"
echo "listitem: Установка Rosetta 2..." > "$LOG_FILE"
# softwareupdate --install-rosetta --agree-to-license
sleep 5

echo "progress: 2" > "$LOG_FILE"
echo "listitem: Установка Homebrew..." > "$LOG_FILE"
# /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
sleep 5

echo "progress: 3" > "$LOG_FILE"
echo "listitem: Установка корпоративного ПО (Slack, Zoom)..." > "$LOG_FILE"
# brew install slack zoom
sleep 5

echo "progress: 4" > "$LOG_FILE"
echo "listitem: Настройка параметров безопасности..." > "$LOG_FILE"
# scutil --set HostName "new-mac"
sleep 5

echo "progress: 5" > "$LOG_FILE"
echo "listitem: Завершение настройки. Готово!" > "$LOG_FILE"
sleep 3

# Закрываем диалоговое окно
echo "quit:" > "$LOG_FILE"

exit 0

Что это даёт?

User Experience: Пользователь видит понятный интерфейс, а не пугающие строки кода.

Информативность: В окно можно выводить статус, иконки, этапы выполнения.

Профессионализм: Это показывает высокий уровень зрелоosti IT-процессов в компании.

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

#macos #bash #automation #ux #скрипты
Гайд: Собери свой Home Lab. От админа к архитектору через практику

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

Зачем она нужна?
Чтобы набить руку с технологиями, которые вы не можете трогать на работе: Kubernetes, Ansible, Terraform, Proxmox, Active Directory с нуля. Это ваш путь к архитектурному мышлению.

Минимальный набор (на старом ПК или NUC):

Гипервизор: Proxmox VE. Бесплатный, мощный, с веб-интерфейсом. Позволяет создавать и VM, и LXC-контейнеры. Альтернатива: VMware ESXi Free.

Сеть: Настройте виртуальный свитч. Для старта хватит NAT, но цель — разобраться с VLAN и маршрутизацией (pfSense/OPNsense в отдельной VM).

Хранилище: ZFS (если позволяет Proxmox) или просто директория на диске.

Что развернуть в первую очередь (Ваш архитектурный проект):

Контроллер домена: Поднимите AD на Windows Server или Samba/FreeIPA на Linux. Научитесь работать с GPO, пользователями, DNS.

Reverse Proxy: Поставьте Nginx Proxy Manager (в Docker). Публикуйте свои внутренние сервисы наружу через один IP. Разберитесь с SSL-сертификатами от Let's Encrypt.

Мониторинг: Разверните связку Grafana + Prometheus. Настройте сбор метрик с ваших VM. Поймите, что такое node_exporter и дашборды.

IaC-сервер: VM с Ansible. Напишите плейбуки для автоматической настройки других машин в вашей лабе.

Главное правило лабы: она должна работать. Сделайте её полезной — поднимите там свой VPN (WireGuard), медиасервер (Jellyfin) или блокировщик рекламы (Pi-hole). Так у вас будет мотивация её поддерживать и развивать.

#homelab #proxmox #devops #architect #education #гайд
3👍2
Git & Security: Перестань хранить пароли в plaintext. Знакомство с SOPS

Каждый админ хоть раз писал в скрипте PASSWORD="MySecretPassword123". Это прямая дорога к утечке данных, особенно если скрипт попадёт в Git. Архитектурный подход — хранить конфигурацию и код в Git, а секреты — шифровать.

SOPS (Secrets OPerationS) от Mozilla — элегантное решение этой проблемы. Он не шифрует весь файл, а только значения в нём, оставляя ключи в открытом виде. Это идеально для YAML, JSON, .env и .ini файлов.

Как это работает:
Вы создаёте обычный конфиг, а SOPS шифрует его с помощью PGP, age или облачных KMS (AWS, Azure, GCP). Зашифрованный файл можно смело коммитить в Git.

Практический пример с age (простой и современный инструмент шифрования):

Установка инструментов:

Bash

# macOS или Linux с Homebrew
brew install sops age

Генерация ключа:

Bash

age-keygen -o key.txt
# public key: age1...
# private key: AGE-SECRET-KEY-1...

Публичный ключ мы будем использовать для шифрования, приватный — для расшифровки.

Создаём файл с секретами config.yaml:

YAML

db_user: "postgres"
db_password: "SuperSecretPassword" # ЭТО БУДЕМ ШИФРОВАТЬ

Шифруем и редактируем:
Создаём в корне проекта файл .sops.yaml с правилами шифрования:

YAML

creation_rules:
- path_regex: .*.yaml$
age: age1... # Ваш публичный ключ

Теперь команда sops config.yaml откроет файл в вашем $EDITOR, а при сохранении автоматически зашифрует значения.

Результат в config.yaml:

YAML

db_user: "postgres"
db_password: "ENC[AES256_GCM,data:...,iv:...,tag:...]"
sops:
# ... метаданные sops

Файл можно безопасно коммитить в Git.

Как использовать в скрипте?

Bash

# Расшифровываем "на лету" и передаём в переменную
DB_CONFIG=$(sops -d config.yaml)
DB_PASSWORD=$(echo "$DB_CONFIG" | yq .db_password) # yq - парсер для yaml

Взгляд архитектора:
Это основа GitOps. Конфигурация, включая зашифрованные секреты, является «единственным источником правды». Изменения отслеживаются, а доступ к расшифровке имеют только те, у кого есть приватный ключ (люди или CI/CD системы).

#linux #security #gitops #devops #sops #architect
👍2
Windows: Настрой рабочее место за 10 минут с помощью Winget

Установка софта на новый Windows-компьютер — это боль: найти сайты, скачать десяток .exe и .msi, прокликать инсталляторы. Современный админ автоматизирует это, управляя софтом как пакетами в Linux.

Winget — это официальный менеджер пакетов от Microsoft, встроенный в современные Windows 10/11.

Базовые команды (откройте PowerShell или Terminal):

Найти приложение: winget search PowerToys

Установить приложение: winget install Microsoft.PowerToys (можно использовать ID из поиска)

Обновить всё: winget upgrade --all (команда, меняющая жизнь)

Создать список установленного ПО: winget export -o C:\temp\my_apps.json

Установить всё из списка: winget import -i C:\temp\my_apps.json (ключевая команда для клонирования окружения!)

Готовый скрипт для быстрой настройки:
Сохраните как setup_workstation.ps1 и запустите.

PowerShell

# Список обязательного ПО (используйте ID из `winget search`)
$packages = @(
"Microsoft.PowerToys",
"Microsoft.VisualStudioCode",
"7zip.7zip",
"VideoLAN.VLC",
"Google.Chrome",
"Notepad++.Notepad++",
"Docker.DockerDesktop",
"Git.Git"
)

Write-Host "--- Начинаю установку обязательного ПО ---" -ForegroundColor Green

foreach ($pkg in $packages) {
Write-Host "Устанавливаю: $pkg"
# -e требует точного совпадения ID, --accept-source-agreements принимает соглашения
winget install -e --id $pkg --silent --accept-source-agreements
}

Write-Host "--- Обновляю оставшиеся пакеты ---" -ForegroundColor Green
winget upgrade --all --silent --accept-source-agreements

Write-Host "--- Настройка завершена! ---" -ForegroundColor Cyan

Взгляд архитектора:
Эта методология обеспечивает идентичность и воспроизводимость окружений. Новый сотрудник получает настроенный ПК за минуты, а не за полдня. Конфигурационные файлы (my_apps.json или скрипты) можно хранить в репозитории, версионировать и применять централизованно.

#windows #winget #automation #powershell #чеклисты
👍2