Доброго времени суток, On Sun, Sep 15, 2019 at 12:12:10PM +0300, Pavel Volkov wrote: > Я налуркал, что в iptables есть таблица owner, где можно матчить по UID, > GID, PID. > Я использую nftables, там есть матчинг по UID, GID. > Может быть при запуске этих процессов как-то менять им GID?
У меня для аналогичного эффекта (ограничение доступа к сети для некой проприетарщины) много лет используется вот такой простенький setgid wrapper в комбинации c owner GID match в OUTPUT chain: /***************** 8< ********************/ #define _GNU_SOURCE #include <sys/types.h> #include <unistd.h> extern char **environ; int main(int argc, char *argv[]) { gid_t rgid, egid, sgid; /* needs at least one argument (an executable file to run) */ if (argc < 2) return 1; /* get the process GIDs */ if (getresgid(&rgid, &egid, &sgid) < 0) return 2; /* set all GIDs to EGID, so that no further change is possible */ if (setresgid(egid, egid, egid) < 0) return 3; /* execute argv[1] with the rest of args, in the same evironment */ return execve(argv[1], &argv[1], environ); } /***************** >8 ********************/ Компилируется, кладётся в /sbin или ещё куда. # chgrp <нужная_группа> /sbin/grpwrapper # chmod g+s /sbin/grpwrapper > Но я бы хотел, чтобы создаваемые ими файлы всё-таки имели исходный GID. С wrapper-ом типа вышеприведённого этого можно добиться, если GID != EGID. Например, заменив соответствующую строчку в коде на setresgid(egid, rgid, egid) Но, как я понимаю, в такой постановке, запущенная через execve() программа сможет поменять свой GID (исходный egid родителя) на свой же EGID (исходный rgid родителя), что может оказаться дырой в защите, или же, приравняв EGID к GID, поломать нужное поведение с файлами. И CAPABILITIES тут не помогут (поправьте, если вру)... -- Stanislav