LINUX.ORG.RU

Как отловить приложение и заблокировать изменение группы для директории

 , ,


0

1

Не могу отловить приложение, котрое меняет группу на директории на примонтированном хдд. Стабильно 5-6 раз в день получаю другую группу. Натравил в цикле lsof с минимальным таймаутом, за 3 с половиной дня никого не поймал. Уже пробовал g+s выдавать, но это не спасает, потому что что-то меняет целенаправленно только одну директорию, а созданные в ней файлы не трогает. Гугл меня оставил без идей. Мне надо чтобы в директорию могли писать, с нее могли читать, но группа должна быть строго определенная. В chattr вроде полезных опций для моего случая нет. SELinux/apparmor ставить не хотелось бы (не стоит оно того).

Из полезного, что выяснил, меняющее приложение или из под рута работает, или из под моего юзера, потому что у других прав менять директорию нет. Читаю сейчас доки про acl, пока не понятно, есть там что-то полезное или нет.

Как запретить менять группу и отловить джо?

P.S. В ro отправить не вариант, туда нужно писать.

Причём тут lsof? Он тут совершенно ни при чём. Если хочешь отследить - strace надо.

В chattr вроде полезных опций для моего случая нет. SELinux/apparmor ставить не хотелось бы (не стоит оно того).
Читаю сейчас доки про acl, пока не понятно, есть там что-то полезное или нет.

Это ещё что за костыли?

Из полезного, что выяснил, меняющее приложение или из под рута работает, или из под моего юзера

Не хватает данных. Какая группа была, какая стала, какие права стоят на директории, в каких группах состоит юзер-владелец директории?

firkax ★★★★★
()
Ответ на: комментарий от firkax

Не хватает данных. Какая группа была, какая стала, какие права стоят на директории, в каких группах состоит юзер-владелец директории?

Как должно быть

drwsr-x---  5 user smbgrouplim 4.0K Aug 17 19:00 data

Как выходит

drwsr-x---  5 user users 4.0K Aug 17 19:00 data
id user
uid=1000(user) gid=100(users) groups=100(users),10(wheel),86(netdev),281(docker),1001(smbgroup),1005(kvm),1006(smbgrouplim)

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

Entmatix
() автор топика
Ответ на: комментарий от firkax
root # strace -e trace=file ./data       
execve("./data", ["./data"], 0x7ffcce2e7c30 /* 32 vars */) = -1 EACCES (Permission denied)
strace: exec: Permission denied                                  
+++ exited with 1 +++

Еще одна проблема 😆. Стрейс на любую команду отвечает PD.

root # strace ~/.bashrc
execve("/root/.bashrc", ["/root/.bashrc"], 0x7ffd93174dc0 /* 32 vars */) = -1 EACCES (Permission denied)
strace: exec: Permission denied
+++ exited with 1 +++
Entmatix
() автор топика
Ответ на: комментарий от Entmatix

Такие вещи лучше на «полигоне» отрабатывать.

Я предполагаю тебе надо «отловить» строчку вроде этой fchownat(AT_FDCWD, "twoya_directory", ID_USER, ID_GROUP, 0) = 0

  • вызов fchownat() меняет пользователя группу для директории
  • ID_USER, ID_GROUP числа обозначающие юзера, группу

Смотри секцию мана про -p pid --attach=pid

Что касается, собственно «запретить» с теми ограничениями… (самому интересно)

next-anonymous
()
Ответ на: комментарий от Entmatix

strace не следит за файлом, он следит за программой, то есть запускай всё подозрительное под ним, настрой на перехват нужных системных вызовов (всё где есть chown в названии), ну и смотри в логе какой процесс сделал то что тебя интересует, но учти что chown может и на другие файлы делаться - надо будет смотреть на его аргументы.

firkax ★★★★★
()
Ответ на: комментарий от firkax

то есть запускай всё подозрительное под ним

Какой-то странный дебаг. У меня на сервере полторы тысячи процессов, из них где-то 50 только от установленных дополнительно сервисов. Сколько же я буду каждую программу запускать со strace, чтобы что-то получить. Не, такой дебаг мне не подходит. Потому я lsof и использовал. Его натравливаешь на файл, а он ловит виновника.

Entmatix
() автор топика
Ответ на: комментарий от Entmatix

Про strace почитаю, но мне в любом случае надо понять, как заблокировать изменение,

Если можно поменять немного структуру директорий, то так:

mkdir -m 750 data0
chown root:smbgrouplim data0
mv data data0/data
chown root:XXXX data0/data
chmod 770 data0/data
группа XXXX будет иметь туда доступ на запись, то есть видимо надо её создать и добавить туда пользователя user - тогда доступ на запись будет только у него.

А зачем у тебя setuid на директории? Он в линуксе никак не используется же.

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

Сложно представить, чем могли руководствоваться авторы программы, закладывая в неё такой фукционал. Скорее всего ты всё-таки где-то что-то не учёл и это легко исправить без блокировок.

firkax ★★★★★
()
Ответ на: комментарий от Entmatix

Запускай ту, которую подозреваешь в порче группы.

lsof тут ни причём, повторю ещё раз. Он ищет открытые файлы, а чтоб сменить группу открывать ничего не надо. А даже если б надо было - это делалось бы за мгновение (открыл-сменил-закрыл) и ты б ничего не поймал всё равно. Надо именно логировать что делают процессы.

Если тебе лень перезапускать сервисы с альтернативной командной строкой (в которой strace добавлен в начало) - то можешь пересобрать ядро, дописав в обработчик chown с аргументом gid=100 отладочный вывод в dmesg pid'а виновника.

firkax ★★★★★
()
Ответ на: комментарий от Entmatix

Какой-то странный дебаг.

Дебаг нормальный. Ты желаешь мониторинг события в ФС.

Сколько же я буду каждую программу запускать со strace

А я говорил

Потому я lsof и использовал. Его натравливаешь на файл, а он ловит виновника.

«Как улов?»

next-anonymous
()
Ответ на: комментарий от firkax

Понятно. Для меня странно, что нет никакого удобного инструмента для таких вещей.

Запускай ту, которую подозреваешь в порче группы

Так в том и дело, что подозреваемых вагон и маленькая тележка. Выделить кого-то одного не могу, нужно будет просто по алфавиту идти и проверять.

Поставил audit, вроде он ловит.

type=SYSCALL msg=audit(1661699244.866:7): arch=c000003e syscall=260 success=yes exit=0 a0=ffffff9c a1=f160a0 a2=3e8 a3=3ee items=1 ppid=16066 pid=26870 auid=1000 uid=1000 gid=100 euid=1000 suid=1000 fsuid=1000 egid=100 sgid=100 fsgid=100 tty=pts6 ses=2 comm="chown" exe="/bin/chown" key="monitor-hosts"ARCH=x86_64 SYSCALL=fchownat AUID="user" UID="user" GID="users" EUID="user" SUID="user" FSUID="user" EGID="users" SGID="users" FSGID="users"
type=CWD msg=audit(1661699244.866:7): cwd="/mnt/common"
type=PATH msg=audit(1661699244.866:7): item=0 name="data/" inode=13631489 dev=fd:02 mode=046755 ouid=1000 ogid=100 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0OUID="user" OGID="users"
type=PROCTITLE msg=audit(1661699244.866:7): proctitle=63686F776E00757365723A736D6267726F75706C696D00746F7272656E74732F

Подожду, когда поменяется группа. Вопрос по поводу того, как заблокировать изменение группы, остается открытым.

Entmatix
() автор топика
Последнее исправление: Entmatix (всего исправлений: 1)

Нашёл проблему. Дело было в докер контейнере с трансмишеном. Я ставил для проверки разворачивания всех докер контейнеров, которые у меня установлены, а он так и остался в докере. Как только начиналась загрузка нового образа Линукс дистрибутива из папки с авто добавлением торрентов, трансмишен менял группу.

Entmatix
() автор топика