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).