ClamAV: сканировать файлы, а не лечить Linux

ClamAV не ловит руткиты и не следит за системными процессами — для Linux-сервера это не нужно так, как для десктопа под Windows. Реальная польза — сканировать файлы, которые сервер принимает от посторонних: вложения на почтовом шлюзе, архивы в пользовательских загрузках, что угодно, что потом открывает кто-то другой. База сигнатур обновляется отдельно от самого сканера: freshclam # разовое обновление вручную systemctl enable --now clamav-freshclam.service # демон, тянущий обновления по расписанию Без свежей базы clamscan и clamdscan находят всё меньше — вирусные сигнатуры добавляются постоянно, а старый .cvd-файл просто не знает о новых угрозах. ...

October 27, 2026 · llexa

POSIX capabilities: root по частям

В классической unix-модели root — это всё или ничего: либо процесс может абсолютно всё, либо ограничен правами обычного пользователя. POSIX capabilities (capabilities(7)) дробят этот монолит на отдельные биты — около сорока штук, от CAP_NET_BIND_SERVICE до CAP_SYS_TIME, каждый можно выдать процессу по отдельности, не трогая остальные. Посмотреть, что уже есть у текущей сессии: capsh --print Покажет текущие capability sets процесса — Permitted, Effective, Inheritable и так далее; для большинства обычных пользовательских процессов список пустой. ...

October 27, 2026 · llexa

osquery: система как SQL-база

auditd из выпуска о syscall-логах пишет непрерывный поток событий ядра — кто, когда и что вызвал. osquery устроен принципиально иначе: это не лог, а движок, который превращает текущее состояние системы в набор SQL-таблиц. Вместо ps, netstat, lsof и dpkg -l по отдельности — один SELECT с JOIN между ними. ...

October 23, 2026 · llexa

seccomp: белый список системных вызовов для процесса

seccomp (secure computing mode) — механизм ядра Linux, который ограничивает процесс конкретным набором системных вызовов: всё, чего нет в профиле, ядро обрывает ещё до выполнения, обычно возвращая EPERM вместо реального эффекта вызова. В отличие от прав доступа к файлам или capabilities, это фильтр на уровне самого интерфейса ядро-процесс — даже если процесс получил root внутри контейнера, вызов, которого нет в whitelist (например, ptrace или mount), просто не сработает. Docker вешает дефолтный seccomp-профиль на каждый контейнер автоматически, если не указано иное — из ~300+ syscall’ов он блокирует около 44, в основном связанных с управлением ядром и отладкой (ptrace, add_key, request_key, большая часть mount). Podman и другие рантаймы на базе crun/runc используют концептуально тот же подход с собственным JSON-профилем. Отключить фильтрацию или подставить свой профиль — один флаг: ...

October 20, 2026 · llexa

WireGuard: несколько пиров и живой NAT

В конфиге WireGuard с одним пиром AllowedIPs легко принять за обычный allow-list — какие адреса пустить через туннель. Как только пиров становится несколько, выясняется, что это ещё и таблица маршрутизации: ядро смотрит на AllowedIPs каждого пира и решает, какому из них отправить исходящий пакет, по той же логике longest-prefix-match, что и обычный роутинг. [Interface] PrivateKey = <приватный ключ сервера> ListenPort = 51820 [Peer] PublicKey = <публичный ключ клиента1> AllowedIPs = 10.192.122.3/32, 10.192.124.0/24 [Peer] PublicKey = <публичный ключ клиента2> AllowedIPs = 10.192.122.4/32, 192.168.0.0/16 Если диапазоны двух пиров пересекаются, сервер отдаст пакет тому, у кого совпадение точнее (более узкая маска), а не тому, кто добавлен раньше в конфиг. На практике это всплывает, когда забыли сузить AllowedIPs второго клиента, и его широкий 192.168.0.0/16 неожиданно перетягивает трафик, который должен был уйти по более специфичному маршруту первого. ...

October 13, 2026 · llexa

acme.sh: ACME-клиент без единой строчки на Python

certbot тянет за собой интерпретатор Python и набор pip-пакетов — на обычном сервере это не проблема, но на урезанном образе, роутере с OpenWRT или в минимальном Docker-контейнере без python3 установка такого клиента превращается в отдельный квест. acme.sh написан целиком на POSIX shell — работает под bash, dash, busybox ash, не требует ничего, кроме curl или wget и стандартных утилит, которые есть почти в любом дистрибутиве по умолчанию. Устанавливается сам в ~/.acme.sh одной командой и не требует root: ...

October 9, 2026 · llexa

auditd: кто и что делал в системе

SELinux/AppArmor решают, что процессу можно, а что нельзя — auditd ничего не запрещает, он только записывает: кто, когда и какой файл открыл, какой syscall вызвал. Для разбора инцидента постфактум это то, чего не даст ни один MAC-модуль. ...

September 29, 2026 · llexa

OpenVPN: свой VPN-сервер без облачных сервисов

OpenVPN строится на собственном PKI — сертификаты сервера и клиентов подписаны одним CA, который выпускается через easy-rsa, идущий в комплекте. ./easyrsa init-pki ./easyrsa build-ca ./easyrsa build-server-full server nopass ./easyrsa build-client-full client1 nopass Минимальный server.conf: port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh.pem tls-auth ta.key 0 tls-auth добавляет HMAC-подпись поверх TLS-хендшейка — защита от DoS через невалидные пакеты и от сканирования порта: сервер не отвечает вообще, если пакет не подписан правильным ta.key. ...

September 19, 2026 · llexa

FUSE с нуля #4: gocryptfs — шифрованный маунт поверх обычной ФС

encfs долгое время был стандартным выбором для шифрованного FUSE-маунта, пока в нём не нашли структурные уязвимости (утечка метаданных, уязвимость к атакам по объёму файла). gocryptfs написан позже с учётом этих проблем — тоже FUSE, тоже пофайловое шифрование, но с современной криптографией (AES-256-GCM) и явным аудитом на старте проекта. mkdir cipher plain gocryptfs -init cipher gocryptfs cipher plain После -init в cipher/ создаётся мастер-ключ, зашифрованный паролем; gocryptfs cipher plain монтирует расшифрованное представление в plain/ — файлы внутри лежат как обычно, а в cipher/ физически видны только зашифрованные блобы с именами тоже зашифрованными. ...

September 18, 2026 · llexa

pgAudit: детальный аудит-лог для PostgreSQL

Штатный log_statement = all пишет все запросы плоским текстом без структуры — для аудита по требованиям безопасности (кто читал таблицу с ПДн, кто менял схему) этого недостаточно. pgAudit добавляет классифицированный лог, который проще парсить и фильтровать. Подключение: shared_preload_libraries = 'pgaudit' (требует перезапуска инстанса, не reload). Дальше в postgresql.conf или на уровне роли: ALTER SYSTEM SET pgaudit.log = 'read, write, ddl'; SELECT pg_reload_conf(); Классы read/write логируют SELECT и модифицирующие запросы отдельно от ddl (CREATE/ALTER/DROP) — можно включить только то, что реально нужно для аудита, не заливая лог избыточным SELECT-шумом на нагруженной базе. ...

September 16, 2026 · llexa