* [devel] sucap не работает @ 2006-06-13 10:06 Alexey Tourbin 2006-06-13 12:13 ` Dmitry V. Levin 0 siblings, 1 reply; 13+ messages in thread From: Alexey Tourbin @ 2006-06-13 10:06 UTC (permalink / raw) To: devel [-- Attachment #1: Type: text/plain, Size: 435 bytes --] Из cron.daily нужно запускать программу на шелле (примерно как osec), при этом желательно выполнять программу от псевдопользователя и сбросить все права, кроме CAP_DAC_READ_SEARCH (которые должны быть как у рута). Как это сделать с помощью libcap-utils? # sucap at at ls Caps: =ep cap_setpcap-ep Caps: = [debug] uid:500, real uid:500 sucaps: capsetp: Operation not permitted sucap: child did not exit cleanly. # [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [devel] sucap не работает 2006-06-13 10:06 [devel] sucap не работает Alexey Tourbin @ 2006-06-13 12:13 ` Dmitry V. Levin 2006-06-13 12:52 ` [devel] psec O_NOATIME Alexey Tourbin 2006-06-13 15:04 ` [devel] sucap не работает Alexey Tourbin 0 siblings, 2 replies; 13+ messages in thread From: Dmitry V. Levin @ 2006-06-13 12:13 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 456 bytes --] On Tue, Jun 13, 2006 at 02:06:48PM +0400, Alexey Tourbin wrote: > Из cron.daily нужно запускать программу на шелле (примерно как osec), > при этом желательно выполнять программу от псевдопользователя и > сбросить все права, кроме CAP_DAC_READ_SEARCH (которые должны быть как у > рута). Как это сделать с помощью libcap-utils? > > # sucap at at ls > Caps: =ep cap_setpcap-ep Без setpcap с помощью sucap никак не сделать. -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* [devel] psec O_NOATIME 2006-06-13 12:13 ` Dmitry V. Levin @ 2006-06-13 12:52 ` Alexey Tourbin 2006-06-13 15:25 ` Dmitry V. Levin 2006-06-13 15:04 ` [devel] sucap не работает Alexey Tourbin 1 sibling, 1 reply; 13+ messages in thread From: Alexey Tourbin @ 2006-06-13 12:52 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 2285 bytes --] On Tue, Jun 13, 2006 at 04:13:33PM +0400, Dmitry V. Levin wrote: > On Tue, Jun 13, 2006 at 02:06:48PM +0400, Alexey Tourbin wrote: > > Из cron.daily нужно запускать программу на шелле (примерно как osec), > > при этом желательно выполнять программу от псевдопользователя и > > сбросить все права, кроме CAP_DAC_READ_SEARCH (которые должны быть как у > > рута). Как это сделать с помощью libcap-utils? > > > > # sucap at at ls > > Caps: =ep cap_setpcap-ep > > Без setpcap с помощью sucap никак не сделать. В общем написать osec на шелле/перле и завернуть его в qa-robot оказалось очень просто. # entry ::= filename mode uid gid arg # arg ::= md5sum | readlink | "x" psec() { find "$@" -print0 |perl -TMstrict -ln0 /dev/fd/3 3<<'__EOF__' use File::stat qw(lstat); use Fcntl qw(:mode); my $st = lstat($_) or die "psec: lstat: $_: $!\n"; my $arg = "x"; if (S_ISREG($st->mode)) { use Digest::MD5; our $ctx ||= Digest::MD5->new; open my $fh, "<", $_ or do { warn "psec: md5sum: $_: $!\n"; goto end; }; $arg = $ctx->addfile($fh)->hexdigest; } elsif (S_ISLNK($st->mode)) { $arg = readlink($_) or do { warn "psec: readlink: $_: $!\n"; goto end; }; $arg =~ s/[[:cntrl:]]/?/g; } end: s/[[:cntrl:]]/?/g; our (@uid_cache, @gid_cache); my $uid = $uid_cache[$st->uid] ||= getpwuid($st->uid) || $st->uid; my $gid = $gid_cache[$st->gid] ||= getgrgid($st->gid) || $st->gid; printf "%s\t%o\t%s\t%s\t%s\n", $_, $st->mode, $uid, $gid, $arg; __EOF__ } $ psec /lib |head find: /lib/modules: Permission denied /lib 40755 root root x /lib/i686 40755 root root x /lib/i686/tls 40755 root root x /lib/modules 40700 root root x /lib/tls 40755 root root x /lib/ld-linux.so.2 120777 root root ld-2.3.6.so /lib/libnss1_dns.so.1 120777 root root libnss1_dns-2.3.6.so /lib/terminfo 40755 root root x /lib/terminfo/E 40755 root root x /lib/terminfo/E/Eterm 100644 root root 9ba7faf9f179ae44dc488719ae939ba9 $ Теперь осталось только придумать, как правильно сбросить ему права. Ещё хотелось бы использовать O_NOATIME, но это требует слишком больших привилегий (CAP_FOWNER, как я понял из man capabilities). [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [devel] psec O_NOATIME 2006-06-13 12:52 ` [devel] psec O_NOATIME Alexey Tourbin @ 2006-06-13 15:25 ` Dmitry V. Levin 2006-06-13 15:47 ` Alexey Tourbin 0 siblings, 1 reply; 13+ messages in thread From: Dmitry V. Levin @ 2006-06-13 15:25 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 881 bytes --] On Tue, Jun 13, 2006 at 04:52:58PM +0400, Alexey Tourbin wrote: > On Tue, Jun 13, 2006 at 04:13:33PM +0400, Dmitry V. Levin wrote: > > On Tue, Jun 13, 2006 at 02:06:48PM +0400, Alexey Tourbin wrote: > > > Из cron.daily нужно запускать программу на шелле (примерно как osec), > > > при этом желательно выполнять программу от псевдопользователя и > > > сбросить все права, кроме CAP_DAC_READ_SEARCH (которые должны быть как у > > > рута). Как это сделать с помощью libcap-utils? > > > > > > # sucap at at ls > > > Caps: =ep cap_setpcap-ep > > > > Без setpcap с помощью sucap никак не сделать. > > В общем написать osec на шелле/перле и завернуть его в qa-robot А зачем? > Ещё хотелось бы использовать O_NOATIME, но это требует слишком больших > привилегий (CAP_FOWNER, как я понял из man capabilities). Да нет, вроде бы не требует. -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [devel] psec O_NOATIME 2006-06-13 15:25 ` Dmitry V. Levin @ 2006-06-13 15:47 ` Alexey Tourbin 2006-06-13 15:51 ` Dmitry V. Levin 2006-06-13 15:53 ` [devel] O_NOATIME behaviour changed in linux-2.6? Dmitry V. Levin 0 siblings, 2 replies; 13+ messages in thread From: Alexey Tourbin @ 2006-06-13 15:47 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 940 bytes --] On Tue, Jun 13, 2006 at 07:25:28PM +0400, Dmitry V. Levin wrote: > > В общем написать osec на шелле/перле и завернуть его в qa-robot > А зачем? Юниксвейнее. Например, зачем использовать fts(3), если есть find(1)? И зачем использовать cdb(3), если можно писать названия файлов и их md5sum прямо в stdout? А qa-robot сделает diff между двумя выводами. С++ в таком раскладе совсем не нужен. Ну и конечно будет Выбор. :) > > Ещё хотелось бы использовать O_NOATIME, но это требует слишком больших > > привилегий (CAP_FOWNER, как я понял из man capabilities). > Да нет, вроде бы не требует. $ strace -o /dev/stdout -- perl -MFcntl=O_RDONLY,O_NOATIME -e 'sysopen FH, "/etc/passwd", O_RDONLY|O_NOATIME or die $!' |grep 'open(.*passwd' open("/etc/passwd", O_RDONLY|O_LARGEFILE|O_NOATIME) = -1 EPERM (Operation not permitted) Operation not permitted at -e line 1. $ [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [devel] psec O_NOATIME 2006-06-13 15:47 ` Alexey Tourbin @ 2006-06-13 15:51 ` Dmitry V. Levin 2006-06-13 16:25 ` Alexey Tourbin 2006-06-13 15:53 ` [devel] O_NOATIME behaviour changed in linux-2.6? Dmitry V. Levin 1 sibling, 1 reply; 13+ messages in thread From: Dmitry V. Levin @ 2006-06-13 15:51 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 574 bytes --] On Tue, Jun 13, 2006 at 07:47:25PM +0400, Alexey Tourbin wrote: > On Tue, Jun 13, 2006 at 07:25:28PM +0400, Dmitry V. Levin wrote: > > > В общем написать osec на шелле/перле и завернуть его в qa-robot > > А зачем? > > Юниксвейнее. Например, зачем использовать fts(3), если есть find(1)? fts быстрее. > И зачем использовать cdb(3), если можно писать названия файлов и их > md5sum прямо в stdout? cdb быстрее. > А qa-robot сделает diff между двумя выводами. > С++ в таком раскладе совсем не нужен. Другими словами, долой оптимизацию! :) -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [devel] psec O_NOATIME 2006-06-13 15:51 ` Dmitry V. Levin @ 2006-06-13 16:25 ` Alexey Tourbin 0 siblings, 0 replies; 13+ messages in thread From: Alexey Tourbin @ 2006-06-13 16:25 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 2059 bytes --] On Tue, Jun 13, 2006 at 07:51:55PM +0400, Dmitry V. Levin wrote: > On Tue, Jun 13, 2006 at 07:47:25PM +0400, Alexey Tourbin wrote: > > On Tue, Jun 13, 2006 at 07:25:28PM +0400, Dmitry V. Levin wrote: > > > > В общем написать osec на шелле/перле и завернуть его в qa-robot > > > А зачем? > > > > Юниксвейнее. Например, зачем использовать fts(3), если есть find(1)? > fts быстрее. Я профилировал. Есть полтора соображения: 0) профилировать невозможно, потому что буферный кеш вносит свою лепту: результаты последовательных запусков могут отличаться в разы; 1) основное время уходит на чтение файлов с диска, т.к. надо вычислять md5sum. Т.е. bottleneck в данном случае -- это как раз IO, и его никак оптимизировать нельзя. Этот пайп, который 'find /lib /usr/lib |perl ...' -- это всего два процесса на весь psec. Вот если предпринять попытку обойтись без перла, т.е. типа find /lib /usr/lib |while read -r f; do md5sum=$(md5sum "$f") тогда для обработки каждого файла потребуется ещё минимум один fork+exec, что уже может заметно сказаться на скорости. > > И зачем использовать cdb(3), если можно писать названия файлов и их > > md5sum прямо в stdout? > cdb быстрее. Быстрее чего? Писать в stdout всяко быстрее. Потом sort(1) отсортирует по первому полю, и join составит список старых/новых файлов. Без предварительной сортировки main.cc:check_changes() быстрее работать не может, поскольку на каждый ключ нужен отдельный lookup (проход по дереву?), а при слиянии lookup не нужен. Т.е. osec вручную реализует comm/join для двух cdb файлов. > > А qa-robot сделает diff между двумя выводами. > > С++ в таком раскладе совсем не нужен. > Другими словами, долой оптимизацию! :) Оптимизацию чего? Если выяснится, что пайп 'find |perl' откусывает заметное время (во что я не верю), то можно будет и на чистом перле переписать. Во всяком случае у меня сложилось такое представлениие, что t(disk_IO) >> t(system_call) >> t(library_call) где t -- время и ">>" означает "много большое" (минимум на порядок). [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [devel] O_NOATIME behaviour changed in linux-2.6? 2006-06-13 15:47 ` Alexey Tourbin 2006-06-13 15:51 ` Dmitry V. Levin @ 2006-06-13 15:53 ` Dmitry V. Levin 2006-06-13 16:31 ` Sergey Vlasov 1 sibling, 1 reply; 13+ messages in thread From: Dmitry V. Levin @ 2006-06-13 15:53 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 727 bytes --] On Tue, Jun 13, 2006 at 07:47:25PM +0400, Alexey Tourbin wrote: > On Tue, Jun 13, 2006 at 07:25:28PM +0400, Dmitry V. Levin wrote: [...] > > > Ещё хотелось бы использовать O_NOATIME, но это требует слишком больших > > > привилегий (CAP_FOWNER, как я понял из man capabilities). > > Да нет, вроде бы не требует. > > $ strace -o /dev/stdout -- perl -MFcntl=O_RDONLY,O_NOATIME -e 'sysopen FH, "/etc/passwd", O_RDONLY|O_NOATIME or die $!' |grep 'open(.*passwd' > open("/etc/passwd", O_RDONLY|O_LARGEFILE|O_NOATIME) = -1 EPERM (Operation not permitted) > Operation not permitted at -e line 1. А на 2.4.32 работает. Нужен комментарий ядерщиков. -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [devel] O_NOATIME behaviour changed in linux-2.6? 2006-06-13 15:53 ` [devel] O_NOATIME behaviour changed in linux-2.6? Dmitry V. Levin @ 2006-06-13 16:31 ` Sergey Vlasov 0 siblings, 0 replies; 13+ messages in thread From: Sergey Vlasov @ 2006-06-13 16:31 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 905 bytes --] On Tue, Jun 13, 2006 at 07:53:40PM +0400, Dmitry V. Levin wrote: > On Tue, Jun 13, 2006 at 07:47:25PM +0400, Alexey Tourbin wrote: > > On Tue, Jun 13, 2006 at 07:25:28PM +0400, Dmitry V. Levin wrote: > [...] > > > > Ещё хотелось бы использовать O_NOATIME, но это требует слишком больших > > > > привилегий (CAP_FOWNER, как я понял из man capabilities). > > > Да нет, вроде бы не требует. > > > > $ strace -o /dev/stdout -- perl -MFcntl=O_RDONLY,O_NOATIME -e 'sysopen FH, "/etc/passwd", O_RDONLY|O_NOATIME or die $!' |grep 'open(.*passwd' > > open("/etc/passwd", O_RDONLY|O_LARGEFILE|O_NOATIME) = -1 EPERM (Operation not permitted) > > Operation not permitted at -e line 1. > > А на 2.4.32 работает. Нужен комментарий ядерщиков. 2.4 вообще не поддерживает флаг O_NOATIME; похоже, нереализованные флаги там просто игнорируются. [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [devel] sucap не работает 2006-06-13 12:13 ` Dmitry V. Levin 2006-06-13 12:52 ` [devel] psec O_NOATIME Alexey Tourbin @ 2006-06-13 15:04 ` Alexey Tourbin 2006-06-13 15:30 ` [devel] sucap + execcap = Alexey Tourbin 1 sibling, 1 reply; 13+ messages in thread From: Alexey Tourbin @ 2006-06-13 15:04 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 1282 bytes --] On Tue, Jun 13, 2006 at 04:13:33PM +0400, Dmitry V. Levin wrote: > On Tue, Jun 13, 2006 at 02:06:48PM +0400, Alexey Tourbin wrote: > > Из cron.daily нужно запускать программу на шелле (примерно как osec), > > при этом желательно выполнять программу от псевдопользователя и > > сбросить все права, кроме CAP_DAC_READ_SEARCH (которые должны быть как у > > рута). Как это сделать с помощью libcap-utils? > > > > # sucap at at ls > > Caps: =ep cap_setpcap-ep > > Без setpcap с помощью sucap никак не сделать. А как с setpcap сделать? # su -l nobody -s /bin/sh -c 'sleep 999999' & [1] 14437 # /sbin/setpcaps -q cap_dac_read_search=eip $! [caps set to: = cap_dac_read_search+eip ] Failed to set cap's on process `14437': (Operation not permitted) usage: setcap [-q] (-|<caps>) <pid> [ ... (-|<capsN>) <pid> ] This program can be used to set the process capabilities of running processes. In order to work, it needs to be executing with CAP_SETPCAP raised, and the only capabilities that this program can bestow on others are a subset of its effective set. This program is mostly intended as an example -- a safe use of CAP_SETPCAP has yet to be demonstrated! [Copyright (c) 1997-8 Andrew G. Morgan <morgan@linux.kernel.org>] # [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* [devel] sucap + execcap = ... 2006-06-13 15:04 ` [devel] sucap не работает Alexey Tourbin @ 2006-06-13 15:30 ` Alexey Tourbin 2006-06-13 19:22 ` Alexey Tourbin 0 siblings, 1 reply; 13+ messages in thread From: Alexey Tourbin @ 2006-06-13 15:30 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 1481 bytes --] On Tue, Jun 13, 2006 at 07:04:18PM +0400, Alexey Tourbin wrote: > On Tue, Jun 13, 2006 at 04:13:33PM +0400, Dmitry V. Levin wrote: > > On Tue, Jun 13, 2006 at 02:06:48PM +0400, Alexey Tourbin wrote: > > > Из cron.daily нужно запускать программу на шелле (примерно как osec), > > > при этом желательно выполнять программу от псевдопользователя и > > > сбросить все права, кроме CAP_DAC_READ_SEARCH (которые должны быть как у > > > рута). Как это сделать с помощью libcap-utils? > > > > > > # sucap at at ls > > > Caps: =ep cap_setpcap-ep > > > > Без setpcap с помощью sucap никак не сделать. > > А как с setpcap сделать? > > # su -l nobody -s /bin/sh -c 'sleep 999999' & > [1] 14437 > # /sbin/setpcaps -q cap_dac_read_search=eip $! > [caps set to: > = cap_dac_read_search+eip > ] > Failed to set cap's on process `14437': (Operation not permitted) В общем есть типовая задача: рут хочет запускать скрипты с пониженными привилегями (от псевдопользователя), но с некоторыми рутовыми capabilities. At some point, I decided I'd like to run a certain program non-root with certain capabilities only. I looked at the above two programs and stupidly thought they'd actually allow me to do this. http://www.uwsg.iu.edu/hypermail/linux/kernel/0503.1/2540.html Оказывается, что приемлемого решения этой типовой задачи нет. Что нужно, вроде ясно: suexeccap -u $uid -g $gid -c $cap -- qa-robot -m root@localhost psec /lib /usr/lib [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [devel] sucap + execcap = ... 2006-06-13 15:30 ` [devel] sucap + execcap = Alexey Tourbin @ 2006-06-13 19:22 ` Alexey Tourbin 2006-06-14 22:12 ` Dmitry V. Levin 0 siblings, 1 reply; 13+ messages in thread From: Alexey Tourbin @ 2006-06-13 19:22 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1.1: Type: text/plain, Size: 1375 bytes --] On Tue, Jun 13, 2006 at 07:30:11PM +0400, Alexey Tourbin wrote: > В общем есть типовая задача: рут хочет запускать скрипты > с пониженными привилегями (от псевдопользователя), но с некоторыми > рутовыми capabilities. > suexeccap -u $uid -g $gid -c $cap -- qa-robot -m root@localhost psec /lib /usr/lib Нарисовал то, что хотел нарисовать. Странное дело -- не работает! Я кажется плохо понял, как при exec'е наследуются capabilities. Кто-нибудь может объяснить? $ gcc -Wall suexeccap.c -o suexeccap -lcap $ gcc -Wall test_cap.c -o test_cap -lcap $ sudo ./suexeccap -u nobody -g nobody -c cap_dac_read_search=eip ./test_cap = cap_dac_read_search+i $ То есть я прошу у него "eip", а после exec'а остается только "i". Если я правильно понимаю, то именно из-за этого не работает повышение прав на файловую систему: $ sudo ./suexeccap -u nobody -g nobody -c cap_dac_read_search=eip find /lib |head find: /lib/modules: Permission denied find: /lib: Permission denied /lib /lib/i686 /lib/i686/tls /lib/modules /lib/tls /lib/ld-linux.so.2 /lib/libnss1_dns.so.1 /lib/terminfo /lib/terminfo/E /lib/terminfo/E/Eterm $ sudo ./suexeccap -u nobody -g nobody -c cap_dac_read_search=eip id uid=99(nobody) gid=99(nobody) $ И сразу вопрос ребром: типовая задача, описанная в начале этого письма, может быть решена в принципе? [-- Attachment #1.2: suexeccap.c --] [-- Type: text/plain, Size: 2004 bytes --] #include <stdlib.h> #include <unistd.h> #include <string.h> #include <getopt.h> #include <error.h> #include <sys/types.h> #include <pwd.h> #include <grp.h> #include <sys/capability.h> #include <sys/prctl.h> int main(int argc, char *argv[]) { char *user = NULL, *group = NULL, *capstr = NULL; int c; while ((c = getopt(argc, argv, "+u:g:c:")) >= 0) switch (c) { case 'u': user = optarg; break; case 'g': group = optarg; break; case 'c': capstr = optarg; break; default: return 1; } if (!(user && *user)) error(EXIT_FAILURE, 0, "user not specified"); if (!(group && *group)) error(EXIT_FAILURE, 0, "group not specified"); if (!(capstr && *capstr)) error(EXIT_FAILURE, 0, "capabilities not specified"); if (optind >= argc) error(EXIT_FAILURE, 0, "command not specified"); struct passwd *pw = getpwnam(user); if (!pw) error(EXIT_FAILURE, 0, "getpwnam: user \"%s\" unknown", user); uid_t uid = pw->pw_uid; struct group *gr = getgrnam(group); if (!gr) error(EXIT_FAILURE, 0, "getgrnam: group \"%s\" unknown", group); gid_t gid = gr->gr_gid; cap_t caps = cap_from_text(capstr); if (!caps) error(EXIT_FAILURE, 1, "cap_from_text: \"%s\"", capstr); char suidcapstr[strlen(capstr) + sizeof "cap_setuid,"]; strcpy(suidcapstr, "cap_setuid,"); strcat(suidcapstr, capstr); cap_t suidcaps = cap_from_text(suidcapstr); if (!suidcaps) error(EXIT_FAILURE, 1, "cap_from_text: \"%s\"", suidcapstr); if (setgroups(0, NULL) < 0) error(EXIT_FAILURE, 1, "setgroups"); if (setregid(gid, gid) < 0) error(EXIT_FAILURE, 1, "setregid"); if (prctl(PR_SET_KEEPCAPS, 1) < 0) error(EXIT_FAILURE, 1, "prctl"); if (cap_set_proc(suidcaps) < 0) error(EXIT_FAILURE, 1, "cap_set_proc"); if (setreuid(uid, uid) < 0) error(EXIT_FAILURE, 1, "setreuid"); if (cap_set_proc(caps) < 0) error(EXIT_FAILURE, 1, "cap_set_proc"); execvp(argv[optind], argv + optind); error(EXIT_FAILURE, 1, "execvp: %s", argv[optind]); return EXIT_FAILURE; } [-- Attachment #1.3: test_cap.c --] [-- Type: text/plain, Size: 145 bytes --] #include <stdio.h> #include <sys/capability.h> int main() { cap_t caps = cap_get_proc(); printf("%s\n", cap_to_text(caps, NULL)); return 0; } [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [devel] sucap + execcap = ... 2006-06-13 19:22 ` Alexey Tourbin @ 2006-06-14 22:12 ` Dmitry V. Levin 0 siblings, 0 replies; 13+ messages in thread From: Dmitry V. Levin @ 2006-06-14 22:12 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 1448 bytes --] On Tue, Jun 13, 2006 at 11:22:53PM +0400, Alexey Tourbin wrote: > On Tue, Jun 13, 2006 at 07:30:11PM +0400, Alexey Tourbin wrote: > > В общем есть типовая задача: рут хочет запускать скрипты > > с пониженными привилегями (от псевдопользователя), но с некоторыми > > рутовыми capabilities. > > > suexeccap -u $uid -g $gid -c $cap -- qa-robot -m root@localhost psec /lib /usr/lib > > Нарисовал то, что хотел нарисовать. Странное дело -- не работает! > Я кажется плохо понял, как при exec'е наследуются capabilities. > Кто-нибудь может объяснить? Я могу объяснить, хотя проще RTFS. > > if (setgroups(0, NULL) < 0) error(EXIT_FAILURE, 1, "setgroups"); > if (setregid(gid, gid) < 0) error(EXIT_FAILURE, 1, "setregid"); > if (prctl(PR_SET_KEEPCAPS, 1) < 0) error(EXIT_FAILURE, 1, "prctl"); PR_SET_KEEPCAPS используется для того, чтобы ... > if (cap_set_proc(suidcaps) < 0) error(EXIT_FAILURE, 1, "cap_set_proc"); > if (setreuid(uid, uid) < 0) error(EXIT_FAILURE, 1, "setreuid"); ... после setreuid capabilities не были выставлены согласно *uid, см. cap_emulate_setxuid(). > if (cap_set_proc(caps) < 0) error(EXIT_FAILURE, 1, "cap_set_proc"); > > execvp(argv[optind], argv + optind); При выполнении exeс все capabilities выставляются заново согласно *uid, см. cap_bprm_set_security(), и раньше на это повлиять было нельзя. Пусть ядерщики меня поправят, если в этой сфере что-то изменилось. -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 191 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2006-06-14 22:12 UTC | newest] Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2006-06-13 10:06 [devel] sucap не работает Alexey Tourbin 2006-06-13 12:13 ` Dmitry V. Levin 2006-06-13 12:52 ` [devel] psec O_NOATIME Alexey Tourbin 2006-06-13 15:25 ` Dmitry V. Levin 2006-06-13 15:47 ` Alexey Tourbin 2006-06-13 15:51 ` Dmitry V. Levin 2006-06-13 16:25 ` Alexey Tourbin 2006-06-13 15:53 ` [devel] O_NOATIME behaviour changed in linux-2.6? Dmitry V. Levin 2006-06-13 16:31 ` Sergey Vlasov 2006-06-13 15:04 ` [devel] sucap не работает Alexey Tourbin 2006-06-13 15:30 ` [devel] sucap + execcap = Alexey Tourbin 2006-06-13 19:22 ` Alexey Tourbin 2006-06-14 22:12 ` Dmitry V. Levin
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git