Bug 46220

Summary: Не переключает на режим podmanonly
Product: Sisyphus Reporter: obidinog <obidinog>
Component: shadow-submapAssignee: Mikhail Efremov <sem>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: bne, burykinne, ldv, sem
Version: unstable   
Hardware: x86_64   
OS: Linux   

Description obidinog@basealt.ru 2023-05-23 17:43:07 MSK
Платформа:
workstation-10.1-x86-64

Пакет:
shadow-submap-4.13-alt5.x86_64

Шаги:
# control newuidmap podmanonly
# control newgidmap podmanonly

Результат:
Ошибка chown: неверная группа: «root:podman»

Дополнительно:
Пакет podman установлен. На остальные режимы переключается корректно.
Comment 1 Mikhail Efremov 2023-05-23 22:27:29 MSK
Отсутствие группы podman - это точно не проблема shadow-utils. Я без понятия кто должен ее создавать. Это вопрос к автору изменения.
Comment 2 Nikolay Burykin 2023-05-24 12:07:14 MSK
Добрый день.

Группа podman создаётся при установке пакета podsec, тем не менее зависимость на этот пакет в shadow-utils будет конечно совершенно излишней.

Согласен, что получилось недостаточно очевидно для пользователя.

Предлагаю дополнить help для podmanonly, привести к виду:

new_help podmanonly "Only \"podman\" group members can execute $BINARY (the group name must exist)"

Если такого дополнения будет достаточно, то я сегодня же внесу изменения.
Comment 3 Alexey Gladkov 2023-05-24 12:18:11 MSK
Не правильнее ли обернуть

new_fmode podmanonly 710 root podman 'cap_setuid+ep'
new_help podmanonly "Only \"podman\" group members can execute $BINARY"

в проверку наличия этой группы ?
Comment 4 Nikolay Burykin 2023-05-24 13:15:31 MSK
(Ответ для Alexey Gladkov на комментарий #3)
> Не правильнее ли обернуть
> 
> new_fmode podmanonly 710 root podman 'cap_setuid+ep'
> new_help podmanonly "Only \"podman\" group members can execute $BINARY"
> 
> в проверку наличия этой группы ?

Правильнее. И намного более удобно для пользователя.
Сделаю проверку.
Comment 5 Nikolay Burykin 2023-05-24 23:47:35 MSK
Сделал и проверку наличия группы, и дополнил help.

Изменения собрал в задании:
https://git.altlinux.org/tasks/321797
Comment 6 Dmitry V. Levin 2023-05-25 01:08:07 MSK
Не лучше ли просто сделать так:

if getent group podman >/dev/null; then
        new_fmode podmanonly 710 root podman 'cap_setgid+ep'
        new_help podmanonly "Only \"podman\" group members can execute $BINARY"
fi
Comment 7 Mikhail Efremov 2023-05-25 01:55:12 MSK
(In reply to Dmitry V. Levin from comment #6)
> Не лучше ли просто сделать так:
> 
> if getent group podman >/dev/null; then
>         new_fmode podmanonly 710 root podman 'cap_setgid+ep'
>         new_help podmanonly "Only \"podman\" group members can execute
> $BINARY"
> fi

Я тоже думаю, что так лучше. Я, собственно, именно так понял предложение Алексея.
Вообще есть ли какой-то смысл в этом режиме, если пакет podsec не установлен?
Comment 8 Nikolay Burykin 2023-05-25 10:54:27 MSK
(Ответ для Mikhail Efremov на комментарий #7)
> (In reply to Dmitry V. Levin from comment #6)
> > Не лучше ли просто сделать так:
> > 
> > if getent group podman >/dev/null; then
> >         new_fmode podmanonly 710 root podman 'cap_setgid+ep'
> >         new_help podmanonly "Only \"podman\" group members can execute
> > $BINARY"
> > fi

Подождите, в таком виде оно будет не правильно обрабатывать help.

Давайте тогда я сделаю по аналогии с ping, обёртку и для help с list .
То есть например для newuidmap так:

#!/bin/sh

. /etc/control.d/functions

BINARY=/usr/bin/newuidmap

_filter_name_list()
{
        local nlist= name=
        for name in $(control_list); do
                case "$name" in
                        podmanonly)
                                if getent group podman >/dev/null; then
                                        nlist="$nlist${nlist:+ }$name"
                                fi;;
                        *) nlist="$nlist${nlist:+ }$name";;
                esac
        done
        printf "%s\n" "$nlist"
}

new_fmode public 711 root root 'cap_setuid+ep'
new_fmode wheelonly 710 root wheel 'cap_setuid+ep'
new_fmode podmanonly 710 root podman 'cap_setgid+ep'
new_fmode restricted 700 root root

new_help public "Any user can execute $BINARY"
new_help wheelonly "Only \"wheel\" group members can execute $BINARY"
new_help podmanonly "Only \"podman\" group members can execute $BINARY"
new_help restricted "Only root can execute $BINARY"

new_summary 'Set the uid mapping of a user namespace'

case "$*" in
podmanonly)
        if getent group podman >/dev/null; then
                control_fmode "$BINARY" "$*" || exit 1
        fi
        ;;
help)
        control_help $(_filter_name_list)
        ;;
list)
        _filter_name_list
        ;;
*)
        control_fmode "$BINARY" "$*" || exit 1

Иными словами. Если группы не существует, то пользователь об этом режиме и не узнает.


> Вообще есть ли какой-то смысл в этом режиме, если пакет podsec не установлен?

Задача пакета podsec - автоматизация рутиных действий. 
Далеко не в каждом случае нужны все его возможности. Поэтому чтобы не устанавливать довольно большой пакет ради создания только одной группы, в некоторых случаях намного проще создать группу вручную. 
В остальном podmanonly никому не мешает, ничему не противоречит, и сам по себе в отрыве от требований регуляторов может быть полезен как компромисс между public и wheelonly.
Comment 9 Alexey Gladkov 2023-05-25 11:42:01 MSK
(Ответ для Mikhail Efremov на комментарий #7)
> (In reply to Dmitry V. Levin from comment #6)
> > Не лучше ли просто сделать так:
> > 
> > if getent group podman >/dev/null; then
> >         new_fmode podmanonly 710 root podman 'cap_setgid+ep'
> >         new_help podmanonly "Only \"podman\" group members can execute
> > $BINARY"
> > fi
> 
> Я тоже думаю, что так лучше. Я, собственно, именно так понял предложение
> Алексея.

Да. Я это и имел в виду. Буквально.

(Ответ для Nikolay Burykin на комментарий #5)
> Сделал и проверку наличия группы, и дополнил help.
> 
> Изменения собрал в задании:
> https://git.altlinux.org/tasks/321797

Николай, ваши изменения не верны, потому что когда группы нет control напишет сообщение и завершится успешно. В вашем новом варианте из коммента #8 та же проблема. control не должен завершаться успешно, когда он не выполнил то о чём его просили.

Код, который показал Дима во-первых короче, во-вторых если группы нет пользователь получит ошибку:

newuidmap: Invalid mode: podmanonly
Comment 10 Nikolay Burykin 2023-05-25 12:07:33 MSK
> Код, который показал Дима во-первых короче, во-вторых если группы нет
> пользователь получит ошибку:
> 
> newuidmap: Invalid mode: podmanonly

Мне не до конца понятно как должен выглядеть итоговый код:

В моем случае например код вида:
#!/bin/sh

. /etc/control.d/functions

BINARY=/usr/bin/newuidmap

new_fmode public 711 root root 'cap_setuid+ep'
new_fmode wheelonly 710 root wheel 'cap_setuid+ep'
new_fmode podmanonly 710 root podman 'cap_setuid+ep'
new_fmode restricted 700 root root

new_help public "Any user can execute $BINARY"
new_help wheelonly "Only \"wheel\" group members can execute $BINARY"
new_help podmanonly "Only \"podman\" group members can execute $BINARY"
new_help restricted "Only root can execute $BINARY"

new_summary 'Set the uid mapping of a user namespace'

case "$*" in
podmanonly)
        if getent group podman >/dev/null; then
                new_fmode podmanonly 710 root podman 'cap_setuid+ep'
                new_help podmanonly "Only \"podman\" group members can execute $BINARY"
        fi
        ;;
*)
        control_fmode "$BINARY" "$*" || exit 1
        ;;
esac

выдаёт 
control: newuidmap: Requested podmanonly, got public при отсутствии группы.

> В вашем новом варианте из коммента #8 та же проблема. control не должен завершаться успешно, когда он не выполнил то о чём его просили.

Так он вроде и не завершается успешно. Или я что-то не так понимаю?
Ниже привел пример как у меня мой код работает без группы podman

[root@host-46 ~]# control newuidmap help
public: Any user can execute /usr/bin/newuidmap
wheelonly: Only "wheel" group members can execute /usr/bin/newuidmap
restricted: Only root can execute /usr/bin/newuidmap
[root@host-46 ~]# control newuidmap list
public wheelonly restricted
[root@host-46 ~]# control newuidmap podmanonly
control: newuidmap: Requested podmanonly, got public
[root@host-46 ~]# echo $?
1

А теперь с группой:

[root@host-46 ~]# control newuidmap help
public: Any user can execute /usr/bin/newuidmap
wheelonly: Only "wheel" group members can execute /usr/bin/newuidmap
podmanonly: Only "podman" group members can execute /usr/bin/newuidmap
restricted: Only root can execute /usr/bin/newuidmap
[root@host-46 ~]# control newuidmap podmanonly
[root@host-46 ~]# echo $?
0
Comment 11 Nikolay Burykin 2023-05-25 12:17:23 MSK
Кажется я понял, как должен выглядеть итоговый код:

#!/bin/sh

. /etc/control.d/functions

BINARY=/usr/bin/newuidmap

new_fmode public 711 root root 'cap_setuid+ep'
new_fmode wheelonly 710 root wheel 'cap_setuid+ep'
new_fmode restricted 700 root root

new_help public "Any user can execute $BINARY"
new_help wheelonly "Only \"wheel\" group members can execute $BINARY"
new_help restricted "Only root can execute $BINARY"

if getent group podman >/dev/null; then
        new_fmode podmanonly 710 root podman 'cap_setuid+ep'
        new_help podmanonly "Only \"podman\" group members can execute $BINARY"
fi

control_fmode "$BINARY" "$*" || exit 1

Всё верно?
Comment 12 Dmitry V. Levin 2023-05-25 14:46:22 MSK
Если хочется сохранить последовательность в list/help, то лучше так:

#!/bin/sh

. /etc/control.d/functions

BINARY=/usr/bin/newgidmap

new_fmode public 711 root root 'cap_setgid+ep'
new_help public "Any user can execute $BINARY"

new_fmode wheelonly 710 root wheel 'cap_setgid+ep'
new_help wheelonly "Only \"wheel\" group members can execute $BINARY"

if getent group podman >/dev/null; then
	new_fmode podmanonly 710 root podman 'cap_setgid+ep'
	new_help podmanonly "Only \"podman\" group members can execute $BINARY"
fi

new_fmode restricted 700 root root
new_help restricted "Only root can execute $BINARY"

new_summary 'Set the gid mapping of a user namespace'

control_fmode "$BINARY" "$*" || exit 1
Comment 13 Alexey Gladkov 2023-05-25 14:49:15 MSK
(Ответ для Dmitry V. Levin на комментарий #12)
> Если хочется сохранить последовательность в list/help, то лучше так:
> 
> #!/bin/sh
> 
> . /etc/control.d/functions
> 
> BINARY=/usr/bin/newgidmap
> 
> new_fmode public 711 root root 'cap_setgid+ep'
> new_help public "Any user can execute $BINARY"
> 
> new_fmode wheelonly 710 root wheel 'cap_setgid+ep'
> new_help wheelonly "Only \"wheel\" group members can execute $BINARY"
> 
> if getent group podman >/dev/null; then
> 	new_fmode podmanonly 710 root podman 'cap_setgid+ep'
> 	new_help podmanonly "Only \"podman\" group members can execute $BINARY"
> fi
> 
> new_fmode restricted 700 root root
> new_help restricted "Only root can execute $BINARY"
> 
> new_summary 'Set the gid mapping of a user namespace'
> 
> control_fmode "$BINARY" "$*" || exit 1

Да.
Comment 14 Nikolay Burykin 2023-05-25 18:15:34 MSK
Оформил и собрал обсуждаемые изменения в 
https://git.altlinux.org/tasks/321847/
Comment 15 Repository Robot 2023-05-25 20:36:11 MSK
shadow-1:4.13-alt6 -> sisyphus:

 Thu May 25 2023 Nikolay Burykin <bne@altlinux> 1:4.13-alt6
 - newuidmap/newgidmap: Added check for podmanonly mode (ALT #46220).