Вопрос или проблема
На одном из моих серверов у моего пользователя существует странная проблема с членством в группах. При использовании id
или groups
без аргументов список групп включает группы пользователя root
, и группы, общие для моего пользователя и root
, дублируются, такие как wheel
, video
, allowssh
. Другие пользователи не затронуты.
mick@xxx ~ $ groups
root bin daemon sys adm disk wheel wheel floppy uucp cron audio cdrom dialout tape video video xfs games cdrw apache usb vboxusers portage allowssh allowssh svn users mick
mick@xxx ~ $ id
uid=1001(mick) gid=1001(mick) группы=1001(mick),0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),14(uucp),16(cron),18(audio),19(cdrom),20(dialout),26(tape),27(video),33(xfs),35(games),80(cdrw),81(apache),85(usb),102(vboxusers),250(portage),800(allowssh),909(svn),1000(users)
Когда запускается с логином, список верен
mick@xxx ~ $ groups mick
wheel cron audio cdrom video xfs games cdrw apache usb vboxusers portage allowssh svn users mick
mick@xxx ~ $ groups root
root bin daemon sys adm disk wheel floppy uucp dialout tape video allowssh
mick@xxx ~ $ id mick
uid=1001(mick) gid=1001(mick) группы=1001(mick),10(wheel),16(cron),18(audio),19(cdrom),27(video),33(xfs),35(games),80(cdrw),81(apache),85(usb),102(vboxusers),250(portage),800(allowssh),909(svn),1000(users)
mick@xxx ~ $ id root
uid=0(root) gid=0(root) группы=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),14(uucp),20(dialout),26(tape),27(video),800(allowssh)
Насколько я могу судить, содержимое /etc/passwd
и /etc/group
тоже корректно.
mick@xxx ~ $ egrep 'mick|root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/bin/bash
mick:x:1001:1001::/home/mick:/bin/bash
mick@xxx ~ $ egrep 'mick|root' /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
disk:x:6:root,adm,haldaemon
wheel:x:10:root,mick,jef,apache,xfs,anne
floppy:x:11:root,haldaemon
uucp:x:14:root
cron:x:16:cron,mick,apache
audio:x:18:famille,mick,jef,juliette,victor,anne,xfs,pulse,sddm
cdrom:x:19:famille,mick,haldaemon,jef,juliette,victor,anne,xfs
dialout:x:20:root
tape:x:26:root
video:x:27:root,famille,mick,jef,juliette,victor,anne,xfs,oracle,sddm
xfs:x:33:xfs,mick,apache
games:x:35:famille,mick,jef,juliette,victor,anne,xfs
cdrw:x:80:famille,mick,haldaemon,xfs
apache:x:81:famille,jef,mick,xfs
usb:x:85:famille,mick,haldaemon,juliette,victor,anne,xfs
vboxusers:x:102:famille,vbox,mick,jef
portage:x:250:portage,famille,mick,jef,xfs,apache
allowssh:x:800:mick,jef,root,anne,juliette,victor
svn:x:909:famille,jef,mick,tracd
users:x:1000:mick,jef,apache,juliette,victor,offlineimap,xfs,anne
mick:x:1001:mick
Что может вызывать такое поведение?
Как я могу это исправить?
Правка
Разница в выводе между id
и id mick
происходит, потому что id
вызывает системный вызов getgroups
в первом случае, но не в другом, как я смог увидеть с помощью strace
mick@xxx $ strace id
[...]
getgroups(0, NULL) = 29
getgroups(29, [0, 1, 2, 3, 4, 6, 10, 10, 11, 14, 16, 18, 19, 20, 26, 27, 27, 33, 35, 80, 81, 85, 102, 250, 800, 800, 909, 1000, 1001]) = 29
[...]
mick@xxx $ strace id mick
[...]
openat(AT_FDCWD, "/var/db/group.db", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/etc/group", O_RDONLY|O_CLOEXEC) = 3
lseek(3, 0, SEEK_CUR) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=1978, ...}) = 0
read(3, "root:x:0:root\nbin:x:1:root,bin,d"..., 4096) = 1978
lseek(3, 0, SEEK_CUR) = 1978
[...повторено]
lseek(3, 0, SEEK_CUR) = 1978
read(3, "", 4096) = 0
close(3) = 0
openat(AT_FDCWD, "/var/db/group.db", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/etc/group", O_RDONLY|O_CLOEXEC) = 3
lseek(3, 0, SEEK_CUR) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=1978, ...}) = 0
read(3, "root:x:0:root\nbin:x:1:root,bin,d"..., 4096) = 1978
lseek(3, 0, SEEK_CUR) = 1978
[...повторено]
lseek(3, 0, SEEK_CUR) = 1978
read(3, "", 4096) = 0
close(3) = 0
[...]
Также я наблюдал, что список групп неверен только в сеансе KDE, как в Konsole, так и в xterm, но список групп верен в других типах сеансов, таких как TTY или через SSH.
Я не могу понять, что может иметь общее KDE с группами пользователей!
Правка 2
Я по-прежнему не знаю причины проблемы, но она исчезла после обновления с ядра 4.14 до 4.19 и перезагрузки.
Я быстро посмотрел в Linux bugzilla, но не нашел очевидных связанных проблем с системным вызовом getgroups
.
Эта проблема является результатом ошибки в SDDM, которая все еще существует в версии 0.21.0.
Я открыл ошибку на GitHub в 2019 году, на версии 0.18.0
https://github.com/sddm/sddm/issues/1159
Поскольку я использую Gentoo, я также открыл ошибку в Gentoo Bugzilla. Они могли бы повлиять на команду SDDM по этому вопросу.
https://bugs.gentoo.org/914629
В настоящее время я применяю ограниченный патч, который скрывает проблему вместо того, чтобы серьезно ее решать:
diff '--color=auto' -Naur a/src/helper/UserSession.cpp b/src/helper/UserSession.cpp
--- a/src/helper/UserSession.cpp 2024-07-23 18:52:27.000000000 +0200
+++ b/src/helper/UserSession.cpp 2024-08-14 15:09:29.467982193 +0200
@@ -291,7 +291,12 @@
// извлечение групп окружения из PAM;
// они устанавливаются такими модулями, как pam_groups.so
- int n_pam_groups = getgroups(0, NULL);
+
+ // Этот вызов получает группы от текущего пользователя, которым является root
+ // Установлено в 0, чтобы избежать их включения для пользователя
+ // int n_pam_groups = getgroups(0, NULL);
+ int n_pam_groups = 0;
+
gid_t *pam_groups = NULL;
if (n_pam_groups > 0) {
pam_groups = new gid_t[n_pam_groups];
Ответ или решение
Проблема, описанная в вашем сообщении, связана с некорректной выдачей информации о членстве в группах для пользователя в среде KDE, особенно при использовании отображения команд id
и groups
. Давайте рассмотрим вопрос более детально.
Основные признаки проблемы
-
Неправильный вывод групп: При выполнении команд
id
иgroups
без аргументов, ваш пользовательmick
видит в списке групп группы, которые принадлежат пользователюroot
, а также дублирование групп, общих для обоих пользователей. -
Корректный вывод при указании имени пользователя: При вызове команд с аргументом
mick
, вывод групп корректен. -
Проблема проявляется только в сессии KDE: In других типах сессий, таких как TTY или SSH, проблема отсутствует.
-
Возможная связь с
SDDM
: Вы вспомнили о том, что проблемы начались сSDDM
(Simple Desktop Display Manager), и у вас есть подозрение, что она может быть источником проблемы.
Возможные причины
На основе предоставленной информации можно выделить несколько возможных причин возникновения проблемы:
-
Некорректная работа SDDM: Как вы уже упомянули, существует известная проблема в
SDDM
, связанная с неверной обработкой групп пользователей. Эта ошибка может приводить к тому, чтоgetgroups()
возвращает некорректные данные для вашего пользователя. Об этом уже сообщалось в различных баг-трекерах. -
Проблемы с кэшированием: В некоторых случаях проблемы с кэшированием пользовательских данных могут вызвать показ неправильных значений. Если пользовательская сессия неправильно инициализировалась или возникли проблемы с обработкой PAM (Pluggable Authentication Modules), это может привести к неверной информации о группах.
-
Некорректные системные вызовы: Ваша заметка о том, что команда
id
без аргументов вызывает системный вызовgetgroups()
, а с аргументом — нет, указывает на возможные различия в механизмах получения информации в зависимости от контекста.
Рекомендации по исправлению
-
Обновление SDDM: Убедитесь, что у вас установлена последняя версия
SDDM
, так как в новых версиях могут быть исправления для таких проблем. -
Проверка настроек PAM: Проанализируйте конфигурацию PAM для SDDM и убедитесь, что нет неправильных настроек, которые могут негативно повлиять на получение информации о группах.
-
Отладка: Используйте
strace
для дальнейшей отладки и проверки, какие именно системные вызовы выполняются в разных контекстах. Это поможет выявить аномалии. -
Патч: Если данные шаги не помогли, временным решением может стать применение патча, который вы ранее упомянули, временно скрывающего проблему.
-
Контакт с разработчиками: Возможно, стоит поддерживать связь с разработчиками SDDM и Gentoo, чтобы они могли быть в курсе ситуации и могли предложить более комплексное решение.
Заключение
Проблема с некорректным выводом групп для пользователя mick
в среде KDE, вероятно, связана с несоответствием в реализации SDDM, что влияет на правильность данных групп. Важно понимать, что модификация системных библиотек и использование патчей могут лишь временно решить проблему, в то время как рабочая версия SDDM и прочие обновления обеспечат должное функционирование в долгосрочной перспективе.