При попытке создать пользователя через 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 ``` то это тоже ничего не меняет.
(Ответ для makise-homura на комментарий #0) > P.S. Если сделать > mamizou ~ # control passwd tcb > mamizou ~ # control tcb_chkpwd tcb > то это тоже ничего не меняет. Именно в случае добавления пользователя, для которого на других машинах твоего кластера всё уже существует (и частично доступно и здесь по NFS)? Может понадобиться более полное описание, поскольку на tcb-альте который не ломали -- useradd, как ни странно, работает.
(Ответ для Michael Shigorin на комментарий #1) > Именно в случае добавления пользователя, для которого на других машинах > твоего кластера всё уже существует (и частично доступно и здесь по NFS)? Ну, home-каталог да, создан заранее и доступен по NFS. > Может понадобиться более полное описание А что именно ещё описать надо?
У меня не получается это воспроизвести. Просто useradd user работает?
(Ответ для 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) ```
(Ответ для 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
(Ответ для 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 (это вообще где-то, кроме альта, используется?)
(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 если что-то пошло не так.
(In reply to Mikhail Efremov from comment #7) > 2ldv@: Возможно стоит удалять /etc/tcb в tcb_convert если что-то пошло не > так. Если tcb_convert завершился с ошибкой, значит, ошибка была ещё до запуска tcb_convert, система находится в неконсистентном состоянии, и не стоит пытаться её чинить.
(Ответ для 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 - это не останавливаться на первом проблемном пользователе, а либо доводить конверсию до конца с пропуском таких пользователей, либо говорить об этом как об ошибке.
(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" было диагностикой причины этой ошибки.
(Ответ для makise-homura на комментарий #9) > (Ответ для Mikhail Efremov на комментарий #7) > > 2ldv@: Возможно стоит удалять /etc/tcb в tcb_convert если что-то пошло не так. > Да, стоит, а ещё в идеале стоит яснее говорить о том, что выполнение > прервано. Потому что очевидное ожидаемое поведение от tcb_convert - это не > останавливаться на первом проблемном пользователе, а либо доводить конверсию > до конца с пропуском таких пользователей, либо говорить об этом как об > ошибке.