DEGABB писал(а):
Про бит Setuid я в курсе, но откуда он знает пользователя, его запустившего?
1) Как работает такая техника? (Стало очень интересно - киньте ссылкой, если Вас не сильно затруднит)
Помимо приведённых lavr'ом ссылок см. man setuid, а в двух словах: к процессу привязаны как минимум два идентификатора пользователя - read user ID и effective user ID. real - это кто по факту запустил процесс, effective - это с какими привилегиями он сейчас исполняется. В обычном случае real = effective = пользователь который запустил процесс. В случае suid исполняемого файла effective UID = владельцу файла, т.е., в случае crontab, root.
Код:
$ cat test.c
#include <unistd.h>
#include <stdio.h>
int main() {
printf("real = %d\n", getuid());
printf("effective = %d\n", geteuid());
return 0;
}
$ cc -o test test.c
$ ./test
real = 1001
effective = 1001
$ sudo ./test
real = 0
effective = 0
$ sudo chown root test
$ sudo chmod u+s test
$ ./test
real = 1001
effective = 0
Т.е. в случае suid процесс исполняется с привилегиями root, но "помнит", что его на самом деле запустил uid = 1001, а также в любой момент может сбросить привилегии и стать обычным пользователем. crontab'у достаточно просто посмотреть на real uid чтобы понять какой файл открывать (/var/cron/tabs/<real username>), но делает он это не сбрасывая привилегии, потому что это нужно для доступа в /var/cron/tabs. А вот cron порождает дочерний процесс, который сбрасывает привилегии, становясь тем пользователем от которого нужно выполнять команду (grep setuid /usr/src/usr.sbin/cron/cron/do_command.c). Надо добавить что после этого обратно root'ом процесс стать уже не может, поэтому:
DEGABB писал(а):
2) Получается в таком файле по расписанию можно вызывать команды от имени root'а

, ведь crontab запускается от него?
нет, не получается.