Linux 中使用 LDAP 服务器身份验证为单个用户提供多个登录名

Linux 中使用 LDAP 服务器身份验证为单个用户提供多个登录名

我的实验室里有大约 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 或类似驱动器)上。

这是标准方法。您不这样做有什么原因吗?

相关内容