我倾向于使用一些运行 Ubuntu Linux 的计算机。我想要一个中央服务来对控制台用户进行身份验证。所有用户文件(主目录)应位于一个位置。我知道对此有许多明智的解决方案,包括(但不限于)通过 NFS 和 LDAP 或 Kerberos 甚至 Microsoft Active Directory 导出共享的文件服务器。然而,由于预算削减,我没有获得任何这些。我唯一拥有的就是一个带有 samba 共享的文件服务器。在单个共享上,每个用户都有一个只能由他们写入的目标目录。我可以根据 samba 共享对控制台用户进行身份验证吗?
答案1
注意事项
这有不同的部分:
- 身份验证本身(“该用户可以使用该计算机吗?”)。
- 账户数据包括用户信息、ID映射、组成员身份……(例如的数据
getent passwd
)。
验证
根据 samba 共享检查凭据(用户和密码)相对容易。您可以使用smbclient
:
smbclient --user="$PAM_USER" --password="$password" --directory "$PAM_USER" --command="quit" "\\\\fileserver.example.com\\homes"
如果凭据正确,此命令将成功;如果服务器拒绝它们,此命令将失败。你可以使用它pam_exec。 pam_exec 将设置$PAM_USER
并帮助获取$password
.请参阅本答案末尾的完整示例。这问题有类似的意图。
将其添加到 PAM授权stage 将处理身份验证,但它本身不会使登录工作。
帐户
为了实际使用系统,系统必须了解用户。这是由名称服务交换机 (nss) 处理的。不过,我不知道有任何特定于 samba 的模块。此外,我们并不真正需要一个。由于我们已经知道用户提供的凭据已由 samba 服务器验证,因此我们可以简单地动态创建一个本地用户并为其提供完全相同的密码。另外,我想将用户添加到特殊组中sambahome
,以便我可以轻松区分普通本地用户(例如 root)和其主页位于共享上的用户。
adduser "$PAM_USER" --quiet --gecos "" --home "/home/$PAM_USER" --no-create-home --add_extra_groups --disabled-password &&
echo "$PAM_USER:$passwd" | chpasswd &&
adduser "$PAM_USER" "sambahome"
贮存
由于用户的主目录驻留在 samba 共享上,我们可以使用pam_mount在登录期间自动安装共享。
执行
验证
这是我的默认值/etc/pam.d/common-auth
,由几行扩展:
auth [success=3 default=ignore] pam_unix.so nullok
auth optional pam_exec.so expose_authtok /usr/local/sbin/pam-addsmbuser
auth [success=1 default=ignore] pam_unix.so nullok
auth requisite pam_deny.so
auth required pam_permit.so
auth [success=ok default=1] pam_succeed_if.so quiet_fail user ingroup sambahome
auth optional pam_mount.so
第一行(带有pam_unix
)检查本地用户的凭据。
成功后,接下来的 3 行将被跳过并pam_permit
生效。
如果没有本地用户,则考虑第二行。pam_exec
将执行pam-addsmbuser
这将创建一个新的本地用户。然后pam_unix
再次查询(在第三行)。
无论哪种情况,pam_mount
都会执行,但前提是用户的主目录实际上位于 samba 共享上。对此进行保护pam_succeed_if
是可选的,但可以保持身份验证日志干净。
帐户
总的来说,/usr/local/sbin/pam-addsmbuser
看起来像这样:
#!/bin/sh
read password
if smbclient --workgroup="AD.FH-WEDEL.DE" --user="$PAM_USER" --password="$password" --directory "$PAM_USER" --command="quit" "\\\\fs1.ad.fh-wedel.de\\tux-homes"
then
adduser --disabled-password --gecos "" --home "/home/ad/$PAM_USER" --no-create-home --quiet --add_extra_groups "$PAM_USER" &&
echo "$PAM_USER:$password" | chpasswd &&
adduser "$PAM_USER" "sambahome"
fi
请注意,这$PAM_USER
是一个环境变量,而$password
它是从标准输入读取的。
贮存
中的相关行/etc/security/pam_mount.conf.xml
:
<volume fstype="cifs" server="fileserver.example.com" path="homes/%(USER)" mountpoint="/home/%(USER)" options="uid=%(USER),gid=%(USERGID),dir_mode=0700,file_mode=0700,nosuid,nodev,mfsymlinks" />
<mkmountpoint enable="1" remove="true" />
您可能需要根据需要调整最后的选项。我对此百感交集mfsymlinks
。
会议
为了工作,pam_mount
还必须存在于/etc/pam.d/common-session
:
session [success=ok default=1] pam_succeed_if.so quiet_fail user ingroup sambahome
session optional pam_mount.so
结果
我已经使用这个设置几个月了。到目前为止,它看起来足够可靠。
注意事项
据我所知,这种检查凭据的方法仅适用于用户名和密码。无密码方法(例如通过 SSH 进行公钥身份验证)可能行不通。我没有检查。
该系统不会妥善处理密码更改。如果更改本地密码,通过 验证将成功pam_unix
,但 samba 服务器将拒绝该密码并pam_mount
失败。服务器端密码更改也会出现类似的问题。这可能可以通过更复杂的脚本来解决。
系统中的本地 UID 不会相同。不过,我认为这没有任何问题。