![Linux 中使用 LDAP 服务器身份验证为单个用户提供多个登录名](https://linux22.com/image/487710/Linux%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20LDAP%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E4%B8%BA%E5%8D%95%E4%B8%AA%E7%94%A8%E6%88%B7%E6%8F%90%E4%BE%9B%E5%A4%9A%E4%B8%AA%E7%99%BB%E5%BD%95%E5%90%8D.png)
我的实验室里有大约 30 个系统(独立 PC),将有近 200 名学生使用它。每个系统都有一个名为 USER 的帐户,其密码为 123456,这 200 人都知道这个帐户。因此,他们可以访问任何免费的系统并工作一段时间。他们的使用情况仅通过登记簿条目进行记录。我想为每个用户提供单独的登录名和密码,这可以通过 LDAP 服务器轻松实现。但我不想在每台 PC 上创建 200 个用户帐户。我想将所有 200 人的登录名映射到 USER 帐户本身。他们将拥有相同的配置文件和相同的主目录。我只想将个人使用实验室的时间和日期记录在一个文件中。可以使用 LDAP 或其他软件来完成此操作吗?
答案1
同意 SLESKE,但要扩展他/她的评论,您需要先做几件事!
在 Linux 中,控制登录的库需要重定向以使用 LDAP 后端,而不是在 /etc/passwd 中查找内容。
如果您正在使用 OpenLDAP,那么您需要查看两件事:
NSCD(名称服务器缓存守护程序)用于缓存 LDAP 查询。您将在用户登录的每个主机上运行它。
NSSLDAP(LDAP 的名称服务器交换机)是导致登录查询 NSCD 的粘合剂,反过来,它将查询 LDAP 后端,或者如果 NSCD 过时或不可用,NSSSLDAP 将直接查询 LDAP 后端。
因此,您需要在每个工作站上安装 OpenLDAP、NSCD 和 NSSLDAP(如果它们不是您的发行版的一部分)。OpenLDAP 是获取知道如何使用 LDAP 协议的客户端库所必需的。
然后您需要对一些文件进行编辑:
/etc/nscd.conf 此文件控制缓存的内容。以下是我的一个用作 Samba 服务器的系统转储:
enable-cache passwd yes
positive-time-to-live passwd 10
negative-time-to-live passwd 3
suggested-size passwd 211
check-files passwd yes
persistent passwd yes
shared passwd yes
max-db-size passwd 33554432
auto-propagate passwd yes
enable-cache group yes
positive-time-to-live group 3600
negative-time-to-live group 3
suggested-size group 211
check-files group yes
persistent group yes
shared group yes
max-db-size group 33554432
auto-propagate group yes
enable-cache hosts yes
positive-time-to-live hosts 3600
negative-time-to-live hosts 3
suggested-size hosts 211
check-files hosts yes
persistent hosts yes
shared hosts yes
max-db-size hosts 33554432
然后,您需要修改 nsswitch.ldap 文件(阅读其上的 DOC,内容太多,这里就不一一介绍了)。
一件非常重要的事情!
如果您的 LDAP 服务器关闭,您需要确保本地根帐户仍然可以登录。或者,如果您的某个工作站出现网络问题,您需要确保您仍然可以登录。
因此,当我的 Linux 机器启动时,我有一个脚本,它总是将 nsswitch.conf 文件复制到如下所示的位置:
密码: compat 组: compat
主机:文件 dns 网络:文件
服务:文件 协议:文件 rpc:文件 ethers:文件 网络掩码:文件 网络组:文件 引导参数:文件
自动挂载:文件别名:文件
当我准备好使用 LDAP 进行登录时,我将用以下内容替换 nsswitch.conf 文件:
密码:文件 ldap 组:文件 ldap 影子:文件 ldap
主机:文件 dns 网络:文件
服务:文件 协议:文件 rpc:文件 ethers:文件 网络掩码:文件 网络组:文件 引导参数:文件
自动挂载:文件别名:文件
前者允许我本地登录,后者允许两者,但由于 NSCD 的缓存,NSCD 需要时间才能过时,从而导致登录延迟或问题。
关于这一点还有很多话要说,但希望这能帮助你入门。
顺便说一句:我是 Pozix Linux 和 Pozix Linux 小型企业服务器的开发人员,我们有超过 400 个 Samba 系统以这种方式运行!
同意,TRS80 的评论是正确的,但这里有一个我们用来从 /etc/passwd 文件创建 LDIF 文件的脚本。生成的 LDIF 文件可用于填充您的 LDAP 数据库。您需要确保如果您在多个工作站上运行此脚本,您会清除重复的帐户名,以便最终获得具有唯一 UID 的唯一帐户名。
cat /etc/passwd | while read i; do
uid=`echo $i | cut -d : -f 1`
uidNumber=`echo $i | cut -d : -f 3`
gidNumber=`echo $i | cut -d : -f 4`
gecos=`echo $i | cut -d : -f 5`
homeDirectory=`echo $i | cut -d : -f 6`
loginShell=`echo $i | cut -d : -f 6`
userPassword=`cat /etc/shadow | grep $uid | cut -d : -f 2`
echo "dn: cn=$gecos,ou=people,dc=mycompany,dc=com"
echo "objectClass: account"
echo "objectClass: posixAccount"
echo "cn: $gecos"
echo "uid: $uid"
echo "uidNumber: $uidNumber"
echo "gidNumber: $gidNumber"
echo "homeDirectory: $homeDirectory"
echo "loginShell: $loginShell"
echo "userPassword: $userPassword"
done
答案2
如果您将每个帐户的 uidNumber 和 homeDirectory 属性设置为相同,事情可能就会按照您希望的方式工作。
答案3
您无需在每台 PC 上创建 200 个用户帐户。Linux 可以从 LDAP 获取所有用户信息,因此帐户不存在于本地(即 /etc/passwd 中)。主目录通常位于网络驱动器(NFS 或类似驱动器)上。
这是标准方法。您不这样做有什么原因吗?