Re: Соотнесение процесса и поля QoS
Доброго времени суток,
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
Reply to: