SELinux и AppArmor: два подхода к mandatory access control

Root есть root. Обычные unix-права не останавливают взломанный процесс, если он и так владелец файла. MAC (mandatory access control) добавляет независимый от DAC слой поверх — SELinux и AppArmor решают это по-разному. getenforce # SELinux: Enforcing / Permissive / Disabled ausearch -m avc -ts recent # что заблокировано за последнее время audit2allow -a -M mymodule # черновик модуля из накопленных отказов aa-status # AppArmor: профили и их режим aa-complain /etc/apparmor.d/usr.sbin.nginx # profile → complain вместо enforce SELinux метит файлы и процессы контекстами — гибко, но отлаживать сложнее. AppArmor привязан к пути файла, профиль читается проще. RED OS и RHEL — SELinux по умолчанию, Debian и Ubuntu — AppArmor. ...

2 сентября 2026 г. · llexa

SELinux и AppArmor: два подхода к mandatory access control

Root есть root. Обычные unix-права не останавливают взломанный процесс, если он и так владелец файла. MAC (mandatory access control) добавляет независимый от DAC слой поверх — SELinux и AppArmor решают это по-разному. getenforce # SELinux: Enforcing / Permissive / Disabled ausearch -m avc -ts recent # что заблокировано за последнее время audit2allow -a -M mymodule # черновик модуля из накопленных отказов aa-status # AppArmor: профили и их режим aa-complain /etc/apparmor.d/usr.sbin.nginx # profile → complain вместо enforce SELinux метит файлы и процессы контекстами — гибко, но отлаживать сложнее. AppArmor привязан к пути файла, профиль читается проще. RED OS и RHEL — SELinux по умолчанию, Debian и Ubuntu — AppArmor. ...

4 августа 2026 г. · llexa

Proxmox #8: pvesr — репликация VM между нодами без shared storage

Shared storage (Ceph, NFS, iSCSI) — не всегда вариант, не каждая инсталляция тянет отдельный кластер хранения. pvesr реплицирует VM между нодами ZFS-снапшотами по расписанию — дешёвая замена shared storage для не самых критичных нагрузок. pvesr create-local-job 100-0 pve2 --schedule '*/15' # реплика VM 100 на pve2 каждые 15 минут pvesr status # последний снапшот, задержка pvesr disable 100-0 # остановить job, не удаляя Разница с HA-кластером на shared storage — окно потери данных равно интервалу репликации: упала нода между снапшотами — потеряны изменения за этот промежуток. pvesr не переключает нагрузку сам, после сбоя старт на целевой ноде — qm start 100 вручную. ...

3 августа 2026 г. · llexa

Архиваторы #6: xz и lzma — максимум сжатия ценой времени

xz (формат LZMA2) даёт лучшую степень сжатия среди классических архиваторов — ценой времени и однопоточности из коробки. xz -9e file.bin # максимальное сжатие (extreme) → file.bin.xz xz -T0 -9 file.bin # многопоточно блоками, степень чуть хуже -9e unxz file.bin.xz # распаковать Сравнение на тех же 1 ГБ логов, что и в выпуске про bzip2: gzip -9 12с 380МБ bzip2 -9 34с 290МБ xz -9e 58с 275МБ zstd -19 18с 310МБ Лучший результат по размеру, но почти вдвое медленнее bzip2 и в разы медленнее zstd. Оправдан для холодных архивов и дистрибутивов — ядро Linux, исходники, релизные тарболы: там жмут один раз, распаковывают часто. ...

3 августа 2026 г. · llexa

dnsmasq: локальный DNS и DHCP в одном конфиге

Для полноценного BIND в домашней или маленькой офисной сети — оверкилл. dnsmasq закрывает DNS-кэш и DHCP одним лёгким демоном и одним конфигом. # /etc/dnsmasq.conf interface=eth0 dhcp-range=192.168.1.50,192.168.1.150,12h address=/nas.local/192.168.1.10 server=1.1.1.1 no-resolv dhcp-range включает DHCP-сервер на интерфейсе с указанным пулом и временем аренды. address=/domain/ip — локальная запись без правки /etc/hosts на каждой машине сети. server=1.1.1.1 + no-resolv — форвардить внешние запросы на конкретный DNS, игнорируя системный /etc/resolv.conf. Проверка конфига без перезапуска — dnsmasq --test, применение — systemctl reload dnsmasq. ...

1 августа 2026 г. · llexa

Vim с нуля #7: quickfix и ctags — навигация без LSP

LSP в vim — это coc.nvim и полноценный language server на каждый язык, но для быстрой навигации по проекту часто хватает связки попроще: quickfix list и ctags работают в любом окружении, без установки сервера. :grep -r "pattern" . заполняет quickfix через внешний grep; :copen открывает список, :cn / :cp — прыжок по совпадениям :make гоняет компилятор или линтер (задаётся через makeprg), ошибки попадают туда же ctags -R . строит файл тегов по всему проекту; Ctrl-] на имени функции — переход к определению, Ctrl-t — назад по стеку :tselect — если тег неоднозначен (несколько функций с одним именем), выбор вручную из списка #vim #linux

1 августа 2026 г. · llexa

diff: не только -u — сравнение файлов и директорий

Голый diff old new выводит формат, неудобный для чтения и не применимый обратно. На практике почти всегда нужны конкретные флаги. diff -u old.conf new.conf > fix.patch # unified — как git diff patch < fix.patch # применить патч diff -rq /etc/nginx/sites-available /backup/sites-available # только имена разных файлов diff -w old.conf new.conf # игнор пробелов -u — unified diff, тот же формат, что и git diff, единственный, который patch применяет без путаницы со смещением строк. -r рекурсивно по директориям, -q — не печатать содержимое, только “differ”/“only in”. -w спасает, когда разница только в отступах после автоформатера. ...

31 июля 2026 г. · llexa

FUSE с нуля #1: файловая система без правки ядра

FUSE позволяет писать файловую систему обычной программой в userspace — ядро только проксирует VFS-вызовы демону через /dev/fuse, без строчки кода в ядре. Практичный пример — sshfs, который уже реализует это за тебя. sshfs user@host:/remote/path /local/mnt -o reconnect,ServerAliveInterval=15 ls /local/mnt # трафик идёт через ssh fusermount -u /local/mnt # отмонтировать — не umount sshfs user@host:/path /local/mnt -o allow_other # доступ другим локальным юзерам По умолчанию FUSE-ФС видна только тому, кто её примонтировал — allow_other (плюс user_allow_other в /etc/fuse.conf) открывает доступ остальным. Отключать — fusermount -u, не umount: демон живёт в userspace, обычный umount про него не знает. ...

31 июля 2026 г. · llexa

auditd: кто прочитал файл и кто запустил команду

Обычные логи покажут, что сервис что-то сделал с файлом — но не покажут, какой процесс и пользователь его открыл. В ядре есть audit-подсистема, auditd — её демон-приёмник. auditctl -w /etc/passwd -p wa -k passwd_watch # следить за записью/атрибутами файла auditctl -a always,exit -F arch=b64 -S execve -k exec_track # логировать все exec ausearch -k passwd_watch # события по ключу aureport --file --summary # сводка по файловым событиям -p wa — какие операции отслеживать (write, attribute change; есть ещё r/x). Ключ (-k) — метка для поиска через ausearch, без неё фильтруй по PID вручную. Правила из auditctl живут до перезагрузки — постоянные пишутся в /etc/audit/rules.d/*.rules. ...

30 июля 2026 г. · llexa

systemd-nspawn: контейнер без Docker за одну команду

Когда нужен один изолированный Linux, а поднимать Docker ради этого избыточно — есть systemd-nspawn, встроенный в systemd, без демона и без отдельного рантайма. debootstrap bookworm /var/lib/machines/mybox # подготовить rootfs systemd-nspawn -D /var/lib/machines/mybox --network-veth -b # запустить как систему (boot) machinectl list # список запущенных контейнеров machinectl shell mybox # зайти внутрь machinectl poweroff mybox -b запускает полноценный init внутри, а не одну команду — контейнер ведёт себя как отдельная машина. --network-veth поднимает veth-пару с NAT на хосте, без него контейнер живёт в сетевом namespace хоста. Для постоянных контейнеров — machinectl enable mybox, автозапуск через systemd. ...

30 июля 2026 г. · llexa