Аудит прав доступа файлов Linux: find, stat, ACL — АйТи Фреш

Аудит прав доступа файлов Linux: find, stat, ACL

Аудит прав доступа файлов Linux: find, stat, ACL

Зачем проводить аудит прав доступа

Права доступа в Linux имеют свойство накапливать ошибки. Разработчик поставил 777 «чтобы быстро проверить» — и забыл. Пакетный менеджер создал файл с root-правами, который читает www-data. Кто-то дал write группе на конфигурационный файл nginx.

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

Что ищем при аудите прав доступа Linux:

  • Файлы с правами 777 или 666 — запись для всех
  • SUID и SGID файлы — выполнение с правами владельца
  • World-writable каталоги без sticky bit
  • Файлы без владельца (nouser) или без группы (nogroup)
  • Конфигурационные файлы, доступные для чтения всем
  • SSH-ключи с неверными правами

Базовый аудит с помощью find

Команда find — основной инструмент аудита прав. Умеет фильтровать по правам, владельцу, типу файла и времени изменения.

Поиск опасных прав

Набор команд, которые запускаем при аудите нового сервера:

# Файлы с правами 777 (самое опасное)
find / -type f -perm 0777 2>/dev/null | grep -v '/proc\|/sys\|/dev'

# Каталоги с правами 777
find / -type d -perm 0777 2>/dev/null | grep -v '/proc\|/sys\|/tmp\|/var/tmp'

# World-writable файлы (любые права с w у others)
find / -type f -perm -o+w 2>/dev/null | grep -v '/proc\|/sys'

# World-writable каталоги без sticky bit (уязвимость)
find / -type d -perm -o+w ! -perm -1000 2>/dev/null | grep -v '/proc\|/sys'

# SUID файлы (исполняются от имени владельца)
find / -type f -perm -4000 -ls 2>/dev/null

# SGID файлы
find / -type f -perm -2000 -ls 2>/dev/null

# Файлы без владельца
find / -nouser 2>/dev/null | grep -v '/proc\|/sys'

# Файлы без группы
find / -nogroup 2>/dev/null | grep -v '/proc\|/sys'

На свежеустановленной Ubuntu 22.04 список SUID-файлов включает около 20 позиций — это нормально. Если вы видите незнакомые исполняемые файлы с SUID root, это серьёзный повод для расследования.

Аудит конкретных каталогов

Для веб-серверов проверяем права в /var/www и конфигурационных каталогах:

# Все файлы в веб-корне с развёрнутым выводом прав
find /var/www -ls 2>/dev/null | awk '{print $3, $5, $6, $NF}' | sort

# Файлы, изменённые за последние 24 часа (подозрительно на взломанном сервере)
find /var/www -mtime -1 -type f -ls 2>/dev/null

# PHP-файлы, доступные для записи всем
find /var/www -name "*.php" -perm -o+w -ls 2>/dev/null

# Проверка конфигов nginx/apache
find /etc/nginx /etc/apache2 -type f -perm -o+r -ls 2>/dev/null
# Конфиг не должен читаться www-data напрямую через others

# Проверка SSH-ключей
find /root/.ssh /home/*/.ssh -type f -ls 2>/dev/null
# Правильно: id_rsa = 600, authorized_keys = 600, .ssh/ = 700
Анализ конкретных файлов: stat и getfacl

Анализ конкретных файлов: stat и getfacl

Когда нужна полная картина по конкретному файлу — stat и getfacl.

stat: полная информация о файле

stat показывает права в числовом и символьном формате, владельца, время доступа:

$ stat /etc/passwd
  File: /etc/passwd
  Size: 2847
Device: 8,1     Inode: 524293
Access: (0644/-rw-r--r--)  Uid: (0/root)  Gid: (0/root)
Access: 2026-03-10 09:15:22
Modify: 2026-03-01 14:30:11
Change: 2026-03-01 14:30:11

$ stat /etc/shadow
  Access: (0640/-rw-r-----)  Uid: (0/root)   Gid: (42/shadow)
# 640 = root читает и пишет, группа shadow только читает, остальные ничего

# Проверка конкретного права в числах
stat -c "%a %n" /etc/passwd /etc/shadow /etc/sudoers
# 644 /etc/passwd
# 640 /etc/shadow
# 440 /etc/sudoers

getfacl: расширенные права ACL

Если на файле есть ACL — стандартный ls -la покажет только +, getfacl раскроет детали:

# Проверяем наличие ACL (+ в конце прав)
ls -la /shared/project/
# drwxrwxr-x+ 3 root developers ...  project

# Смотрим полный ACL
getfacl /shared/project/
# file: shared/project/
# owner: root
# group: developers
# user::rwx
# user:john:rwx       <-- явный ACL для john
# user:alice:r-x
# group::rwx
# mask::rwx
# other::r-x

# Рекурсивный аудит ACL в каталоге
getfacl -R /shared/ 2>/dev/null | grep -v "^#\|^$" | sort | uniq -d
# Показывает дублирующиеся ACL-записи

# Найти все файлы с нестандартными ACL
find /var/www -exec getfacl {} \; 2>/dev/null | grep "^user:[^:]*:" | sort | uniq

Скрипт комплексного аудита прав

Собираем всё в один скрипт, который запускается по cron или перед плановым аудитом безопасности:

Скрипт permissions-audit.sh

Комплексный скрипт аудита прав доступа:

#!/bin/bash
# /usr/local/bin/permissions-audit.sh
# Аудит прав доступа Linux

REPORT="/tmp/permissions-audit-$(date +%Y%m%d).txt"
EXCLUDE="-not -path '/proc/*' -not -path '/sys/*' -not -path '/dev/*'"

echo "=== PERMISSIONS AUDIT: $(date) ===" > "$REPORT"
echo "Host: $(hostname)" >> "$REPORT"

echo -e "\n[1] SUID files:" >> "$REPORT"
find / $EXCLUDE -type f -perm -4000 -ls 2>/dev/null >> "$REPORT"

echo -e "\n[2] SGID files:" >> "$REPORT"
find / $EXCLUDE -type f -perm -2000 -ls 2>/dev/null >> "$REPORT"

echo -e "\n[3] World-writable files:" >> "$REPORT"
find / $EXCLUDE -type f -perm -o+w -ls 2>/dev/null | \
  grep -v '/tmp\|/var/tmp' >> "$REPORT"

echo -e "\n[4] World-writable dirs (no sticky):" >> "$REPORT"
find / $EXCLUDE -type d -perm -o+w ! -perm -1000 2>/dev/null >> "$REPORT"

echo -e "\n[5] Files without owner:" >> "$REPORT"
find / $EXCLUDE -nouser -ls 2>/dev/null >> "$REPORT"

echo -e "\n[6] Dangerous permissions in /etc:" >> "$REPORT"
find /etc -type f -perm -o+w -ls 2>/dev/null >> "$REPORT"
find /etc -type f -perm -o+r -name "*.key" -o -name "*.pem" 2>/dev/null >> "$REPORT"

echo -e "\n[7] SSH key permissions:" >> "$REPORT"
find /root/.ssh /home -name "*.pub" -o -name "authorized_keys" \
  -o -name "id_*" 2>/dev/null | xargs -I{} stat -c "%a %U %G %n" {} >> "$REPORT"

echo "=== AUDIT COMPLETE ===" >> "$REPORT"
cat "$REPORT"

Запуск через cron еженедельно и отправка на почту — стандартная практика на серверах клиентов, где требуется compliance.

Исправление найденных проблем

Исправление найденных проблем

Нашли проблему — исправляем. Вот типовые сценарии с командами.

Массовое исправление прав в веб-корне

Стандартный набор команд для приведения веб-сервера в порядок:

# Правильные права для веб-сервера
chown -R www-data:www-data /var/www/site.ru
find /var/www/site.ru -type d -exec chmod 755 {} \;
find /var/www/site.ru -type f -exec chmod 644 {} \;

# Каталог загрузок — запись для www-data
chmod 755 /var/www/site.ru/uploads/
chown www-data:www-data /var/www/site.ru/uploads/

# Конфигурационные файлы — только чтение для владельца
chmod 600 /var/www/site.ru/.env
chmod 600 /var/www/site.ru/config/database.php

# SSH-ключи
chmod 700 /root/.ssh
chmod 600 /root/.ssh/id_rsa
chmod 644 /root/.ssh/id_rsa.pub
chmod 600 /root/.ssh/authorized_keys

# Убрать SUID с ненужного файла
chmod u-s /path/to/suspicious/file

# Добавить sticky bit на /tmp
chmod +t /tmp
chmod 1777 /tmp

Часто задаваемые вопросы

777 на любых файлах и каталогах — критическая уязвимость. 666 на конфигурационных файлах — запись для всех. SUID/SGID на нестандартных бинарниках. Файлы без владельца (nouser). Каталог /tmp без sticky bit (1777).

find /var/www -mtime -1 -type f -ls. Параметр -mtime -1 означает изменённые менее чем 1 день назад. Для более точного контроля: find /var/www -newer /tmp/checkpoint -type f -ls.

Создайте baseline снимок прав: find / -not -path '/proc/*' -printf '%p %m %U %G\n' > /root/permissions_baseline.txt. Еженедельно сравнивайте через diff. Или используйте AIDE/Tripwire.

Sticky bit на каталоге (mode 1777) означает, что пользователь может удалять только свои файлы. Обязателен для /tmp, /var/tmp, /var/spool. Для shared-каталогов sticky bit предотвращает удаление чужих файлов.

find / -nouser -o -nogroup 2>/dev/null | grep -v '/proc\|/sys'. Такие файлы появляются после удаления пользователей без флага -r. Их нужно переназначить или удалить.

#аудит прав доступа linux #find suid linux #linux security check

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 💬 MAX: +7 903 729-62-41 ✈️ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Подпишитесь на рассылку ITfresh

Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.

Письмо придёт в течение минутыНе нашли его во «Входящих» — загляните в папку «Спам» или «Промоакции» и нажмите «Не спам». Так все следующие выпуски будут приходить прямо в основную почту.
Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.