Bug 48060 - Невозможно создать пользователя через useradd из-за tcb после tcb_convert
Summary: Невозможно создать пользователя через useradd из-за tcb после tcb_convert
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: tcb-utils (show other bugs)
Version: unstable
Hardware: all Linux
: P5 normal
Assignee: Dmitry V. Levin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-10-19 06:52 MSK by makise-homura
Modified: 2023-11-07 17:57 MSK (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description makise-homura 2023-10-19 06:52:10 MSK
При попытке создать пользователя через useradd (с ключами -d, -m, -g, -u и -s, с предварительно созданным home-каталогом и группой, и без конфликтов uid, имени пользователя или записей в passwd, shadow или /etc/tcb) useradd возвращает ошибку:
```
mamizou ~ # cat /etc/os-release
NAME="ALT Server"
VERSION="10.2"
ID=altlinux
VERSION_ID=10.2
PRETTY_NAME="ALT Server 10.2 (Mendelevium)"
ANSI_COLOR="1;33"
CPE_NAME="cpe:/o:alt:server:10.2"
BUILD_ID="ALT Server 10.0"
HOME_URL="https://basealt.ru/"
BUG_REPORT_URL="https://bugs.altlinux.org/"
mamizou ~ # control | grep tcb
passwd          traditional     (tcb traditional restricted)
tcb_chkpwd      traditional     (traditional tcb restricted)
mamizou ~ # ls -lad /export/home/ger
drwxr-x--- 11 5083 ger 4096 окт 18 09:09 /export/home/ger
mamizou ~ # which bash
/bin/bash
mamizou ~ # grep 5083 /etc/group
ger:x:5083:
mamizou ~ # id 5083
id: «5083»: такого пользователя нет
mamizou ~ # id ger
id: «ger»: такого пользователя нет
mamizou ~ # grep ^ger /etc/shadow
mamizou ~ # grep ^ger /etc/passwd
mamizou ~ # ls /etc/tcb/ger
ls: невозможно получить доступ к '/etc/tcb/ger': Нет такого файла или каталога
mamizou ~ # useradd -d /export/home/ger -m -g 5083 -u 5083 -s /bin/bash ger
useradd: не удалось заблокировать /etc/tcb/ger/shadow; попробуйте ещё раз позже.
Cannot remove tcb files for ger: Отказано в доступе
mamizou ~ #
```
P.S. Если сделать
```
mamizou ~ # control passwd tcb
mamizou ~ # control tcb_chkpwd tcb
```
то это тоже ничего не меняет.
Comment 1 Michael Shigorin 2023-10-19 09:37:53 MSK
(Ответ для makise-homura на комментарий #0)
> P.S. Если сделать
> mamizou ~ # control passwd tcb
> mamizou ~ # control tcb_chkpwd tcb
> то это тоже ничего не меняет.
Именно в случае добавления пользователя, для которого на других машинах твоего кластера всё уже существует (и частично доступно и здесь по NFS)?

Может понадобиться более полное описание, поскольку на tcb-альте который не ломали -- useradd, как ни странно, работает.
Comment 2 makise-homura 2023-10-19 16:51:58 MSK
(Ответ для Michael Shigorin на комментарий #1)
> Именно в случае добавления пользователя, для которого на других машинах
> твоего кластера всё уже существует (и частично доступно и здесь по NFS)?
Ну, home-каталог да, создан заранее и доступен по NFS.
> Может понадобиться более полное описание
А что именно ещё описать надо?
Comment 3 Mikhail Efremov 2023-10-19 18:09:53 MSK
У меня не получается это воспроизвести.
Просто useradd user работает?
Comment 4 makise-homura 2023-10-19 20:09:22 MSK
(Ответ для Mikhail Efremov на комментарий #3)
> Просто useradd user работает?
Нет, тоже не работает.
Попытался сделать strace, кажется, вот проблемный кусок:
```
mkdir("/etc/tcb/delme", 0700)           = 0
open("/etc/tcb/delme/shadow", O_RDWR|O_CREAT|O_TRUNC, 0600) = 10
close(10)                               = 0
chown("/etc/tcb/delme/shadow", 0, 27)   = 0
chmod("/etc/tcb/delme/shadow", 0640)    = 0
chown("/etc/tcb/delme", 0, 27)          = 0
chmod("/etc/tcb/delme", 02710)          = 0
stat("/etc/tcb/delme", {st_mode=S_IFDIR|S_ISGID|0710, st_size=4096, ...}) = 0
lstat("/etc/tcb/delme", {st_mode=S_IFDIR|S_ISGID|0710, st_size=4096, ...}) = 0
stat("/etc/tcb/delme", {st_mode=S_IFDIR|S_ISGID|0710, st_size=4096, ...}) = 0
chown("/etc/tcb/delme", 0, 0)           = 0
chmod("/etc/tcb/delme", 0700)           = 0
lstat("/etc/tcb/delme/shadow", {st_mode=S_IFREG|0640, st_size=0, ...}) = 0
chown("/etc/tcb/delme/shadow", 5581, 27) = 0
chmod("/etc/tcb/delme/shadow", 0640)    = 0
unlink("/etc/tcb/delme/shadow+")        = -1 ENOENT (No such file or directory)
unlink("/etc/tcb/delme/shadow-")        = -1 ENOENT (No such file or directory)
unlink("/etc/tcb/delme/shadow.lock")    = -1 ENOENT (No such file or directory)
chown("/etc/tcb/delme", 5581, 27)       = 0
chmod("/etc/tcb/delme", 02710)          = 0
geteuid()                               = 0
stat("/etc/tcb", {st_mode=S_IFDIR|000, st_size=4096, ...}) = 0
stat("/etc/tcb/delme", {st_mode=S_IFDIR|S_ISGID|0710, st_size=4096, ...}) = 0
getgroups(1024, [0, 0, 1, 0, 2, 0, 3, 0]) = 8
setgroups(0, NULL)                      = 0
setfsgid(0)                             = 0
setfsgid(0)                             = 0
setfsuid(5581)                          = 0
setfsuid(5581)                          = 5581
open("/etc/tcb/delme/shadow.lock", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW, 0600) = -1 EACCES (Permission denied)
```
Comment 5 Michael Shigorin 2023-10-20 09:28:01 MSK
(Ответ для makise-homura на комментарий #4)
> open("/etc/tcb/delme/shadow.lock",
> O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW, 0600) = -1 EACCES
> (Permission denied)
ls -ld /etc/tcb/{delme/{shadow.lock,},}
?

У меня так:
# ls -ld /etc/tcb/{mike/{shadow.lock,},}
drwx--x--- 71 root shadow 4096 июл  8 09:04 /etc/tcb/
drwx--s---  2 mike auth   4096 сен 28  2022 /etc/tcb/mike/
-rw-------  1 mike auth      0 сен 28  2022 /etc/tcb/mike/shadow.lock

Если менял руками права на утилиты -- проверь/переустанови пакет:
# rpm -V shadow-utils
# apt-get reinstall shadow-utils
Comment 6 makise-homura 2023-10-23 01:08:49 MSK
(Ответ для Michael Shigorin на комментарий #5)
> У меня так:
> # ls -ld /etc/tcb/{mike/{shadow.lock,},}
> drwx--x--- 71 root shadow 4096 июл  8 09:04 /etc/tcb/
> drwx--s---  2 mike auth   4096 сен 28  2022 /etc/tcb/mike/
> -rw-------  1 mike auth      0 сен 28  2022 /etc/tcb/mike/shadow.lock

mamizou ~ # ls -ld /etc/tcb/{delme/{shadow.lock,},}
ls: невозможно получить доступ к '/etc/tcb/delme/shadow.lock': Нет такого файла или каталога
d--------- 98 root root 4096 окт 23 00:53 /etc/tcb/
drwx--s---  2 5581 auth 4096 окт 23 00:53 /etc/tcb/delme/

Хм, интересно, кто мог сделать на /etc/tcb права 000? Возможно, кто-то из tcb_convert/tcb_unconvert в процессе моих (безуспешных) попыток использовать традиционную схему с shadow вместо tcb?..

UPD: А, понял, кто:

```
mamizou / # mv /etc/tcb tcb.bak
mamizou / # tcb_convert
getpwnam: User bacula not found
mamizou / # ls -lad /etc/tcb
d--------- 177 root root 4096 окт 23 01:08 /etc/tcb
mamizou / #
```

Поскольку в man tcb_convert нет ничего про права на /etc/tcb, надо бы как-то обрабатывать этот случай, кажется мне (tcb_convert отказывается работать, если /etc/tcb уже есть, т.е. логично, что юзер его удалит перед тем, как вызывать tcb_convert, а тот уже создаст каталог с правами 000, после чего ничего работать не будет).

В общем, шаги по воспроизведению:

0) опционально: куда-нибудь бэкапим /etc/tcb или делаем tcb_unconvert
1) удаляем /etc/tcb
2) делаем tcb_convert
3) пытаемся сделать useradd someuser - получаем ошибку

На других машинах проверить не могу - у меня все остальные дистрибутивы, включая даже древний RHEL с репами centos, не знают вообще ничего о tcb (это вообще где-то, кроме альта, используется?)
Comment 7 Mikhail Efremov 2023-10-24 22:13:29 MSK
(In reply to makise-homura from comment #6)
> В общем, шаги по воспроизведению:
> 
> 0) опционально: куда-нибудь бэкапим /etc/tcb или делаем tcb_unconvert
> 1) удаляем /etc/tcb
> 2) делаем tcb_convert
> 3) пытаемся сделать useradd someuser - получаем ошибку

Такое может быть только если tcb_convert завершился неуспешно.
Сообщения об ошибках он выдавал?
2ldv@: Возможно стоит удалять /etc/tcb в tcb_convert если что-то пошло не так.
Comment 8 Dmitry V. Levin 2023-10-24 22:26:44 MSK
(In reply to Mikhail Efremov from comment #7)
> 2ldv@: Возможно стоит удалять /etc/tcb в tcb_convert если что-то пошло не
> так.

Если tcb_convert завершился с ошибкой, значит, ошибка была ещё до запуска tcb_convert, система находится в неконсистентном состоянии, и не стоит пытаться её чинить.
Comment 9 makise-homura 2023-10-25 02:41:08 MSK
(Ответ для Mikhail Efremov на комментарий #7)
> Такое может быть только если tcb_convert завершился неуспешно.
> Сообщения об ошибках он выдавал?
Ого, вон оно что. То есть его сообщение `getpwnam: User bacula not found` (поскольку shadow стащен с прошлой операционки, где такой пользователь был, а на альте его в данный момент нет) - было не предупреждением, а фатальной ошибкой? Это __крайне__ неочевидно.
И правда, проверил - каталоги пользователей, что были в /etc/shadow, он создал не все, хотя часть всё-таки создал. Похоже, он отвалился посередине конвертирования и оставил всё сделанным наполовину.

Попробовал поудалять из исходного файла shadow пользователей, которых нет на альте, так, чтобы конвертирование завершилось вообще безо всяких сообщений (там была ещё парочка таких пользователей, типа amanda и zabbix) - и правда, права на /etc/tcb в итоге прописались drwx--x--- root:shadow. 

> 2ldv@: Возможно стоит удалять /etc/tcb в tcb_convert если что-то пошло не так.
Да, стоит, а ещё в идеале стоит яснее говорить о том, что выполнение прервано. Потому что очевидное ожидаемое поведение от tcb_convert - это не останавливаться на первом проблемном пользователе, а либо доводить конверсию до конца с пропуском таких пользователей, либо говорить об этом как об ошибке.
Comment 10 Dmitry V. Levin 2023-10-25 09:23:04 MSK
(In reply to makise-homura from comment #9)
> (Ответ для Mikhail Efremov на комментарий #7)
> > Такое может быть только если tcb_convert завершился неуспешно.
> > Сообщения об ошибках он выдавал?
> Ого, вон оно что. То есть его сообщение `getpwnam: User bacula not found`
> (поскольку shadow стащен с прошлой операционки, где такой пользователь был,
> а на альте его в данный момент нет) - было не предупреждением, а фатальной
> ошибкой? Это __крайне__ неочевидно.

Индикатором фатальной ошибки был nonzero exit status, а сообщение "getpwnam: User bacula not found" было диагностикой причины этой ошибки.
Comment 11 Alexander Makeenkov 2023-11-07 17:57:08 MSK
(Ответ для makise-homura на комментарий #9)
> (Ответ для Mikhail Efremov на комментарий #7)
> > 2ldv@: Возможно стоит удалять /etc/tcb в tcb_convert если что-то пошло не так.
> Да, стоит, а ещё в идеале стоит яснее говорить о том, что выполнение
> прервано. Потому что очевидное ожидаемое поведение от tcb_convert - это не
> останавливаться на первом проблемном пользователе, а либо доводить конверсию
> до конца с пропуском таких пользователей, либо говорить об этом как об
> ошибке.