ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [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] 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

* 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

* [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] 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] 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] 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: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 + 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