![使用 NIS 身份验证时 systemd 未为我的会话分配席位](https://linux22.com/image/1627027/%E4%BD%BF%E7%94%A8%20NIS%20%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E6%97%B6%20systemd%20%E6%9C%AA%E4%B8%BA%E6%88%91%E7%9A%84%E4%BC%9A%E8%AF%9D%E5%88%86%E9%85%8D%E5%B8%AD%E4%BD%8D.png)
标题几乎说明了一切。
当我是本地用户时(假设是正常情况),我的会话会被分配一个席位。
jlinkels@donald-pc:~$ loginctl
SESSION UID USER SEAT TTY
3 1000 jlinkels seat0
但是,当我通过 NIS 进行身份验证时(这在我的网络上很正常),这种情况并没有发生:
jlinkels@donald-pc:~$ loginctl
No sessions.
这首先就很糟糕,因为从 Debian 10 开始,udev 中为本地用户添加了对扫描仪和网络摄像头等设备的访问权限。本地用户就是占据座位的用户。
我可以通过将 Debian 10 之前的组权限分配给设备来解决这个问题。但这是不可取的,因为我不想为每次安装编辑 udev 规则。更糟糕的是,如果我没有分配席位,TeamViewer 15(第一个原生 Linux 版本)就无法运行。
我不知道如何调整 systemd、pamd、logind 或 NIS 来为我的会话分配席位。这对我来说完全是新事物。(也许 systemd 又增加了一层复杂性)
内核:4.19.0-9-amd64
Debian 10 Buster
KDE5 Plasma
答案1
最可能的原因是 systemd-logind 无法将您的用户名解析为 UID(反之亦然),因为库nss_nis名称查找模块直接向您的 NIS 服务器发出网络 RPC 调用,而 systemd-logind 则出于安全预防措施而阻止所有网络访问。
(其他姓名查询模块,例如库nss_sss来自 SSSD,以及较新的库nss_ldapnslcd 附带的程序不会出现此问题,因为它们只连接到本地守护进程,该进程集中处理所有网络流量和缓存。)
有两种方法可以解决这个问题:
使用配置了“代理”id_provider 的 SSSD。NIS 名称查找模块只需由 SSSD 本身加载,所有其他进程将通过本地套接字对其进行查询。
用于
systemctl edit --full systemd-logind
禁用 systemd-logind 中的网络限制,方法是删除IP地址拒绝=和RestrictAddressFamilies=选项。(并且可能系統呼叫濾器=也。
(我想将 nscd.service 列为第三种方式,因为它也将查询移出 logind 进程,就像 SSSD 所做的那样,但实际上并非如此意味着为了这个目的 – 它只是一个缓存守护进程,并且不会阻止像以前一样回退到在进程中发出 NIS 请求。)