[devel] psec O_NOATIME

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вт Июн 13 16:52:58 MSD 2006


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).
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 191 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20060613/06db6643/attachment-0001.bin>


Подробная информация о списке рассылки Devel