LDAP 服务器关闭时 Linux 控制台不可用

LDAP 服务器关闭时 Linux 控制台不可用

当我们的 OpenLDAP 服务器断电时,CentOS 机器的控制台几乎变得无法使用。

我们尝试使用本地帐户登录,但每个命令都需要几分钟才能返回。即使是像下面这样的简单命令也ls只是停留在那里。

在 Ubuntu 下使用相同的配置似乎没有问题。本地帐户的初始登录需要一段时间才能成功,但一旦登录,一切就都正常了。

我正在寻找一种方法来缓解该问题,并提出了以下几个想法:

  • 为 ldap-pam 模块设置超时值(如果存在)
  • 运行本地 ldap db 并进行身份验证(它将是主 ldap db 的从属)
  • 创建一个 cron 任务,用于在与 ldap 服务器失去连接时启用/禁用

有没有更好的解决方案来管理 LDAP 的某种冗余/故障转移?

答案1

您有多种选择。

我们使用复制功能在网络上拥有多个 LDAP 服务器,这些服务器隐藏在负载平衡器后面,因此如果其中一个服务器出现故障,我们仍然有一个可用。我们使用 keepalived 进行负载平衡。您还可以在故障转移设置中使用 keepalived,这样您就拥有一个热备份从属服务器。

其次,您可以在每个工作站上安装本地 LDAP 服务器,但这会导致高维护成本,因为您需要管理所有这些服务器并监视它们以确保它们与复制同步。您不希望它们不同步。

当您拥有从属服务器时,请确保设置 updateref 选项,以便任何尝试的更新都发送到主服务器。

/etc/ldap.conf 中有几个设置可用于改善情况。最重要的一个是:

bind_policy soft

默认值为“hard”,即会不断重试联系服务器,中间会等待一段时间。如果将其设置为 soft,则会立即返回。您还可以使用超时选项来减少等待时间。

# Search timelimit
timelimit 30

# Bind/connect timelimit
bind_timelimit 30

答案2

我知道你已经接受了戴维的答案,但我想在这里提出一种不同的方法并分享一些我的经验。

我发现使用时的问题bind_policy soft在于,如果您没有立即收到服务器的响应,例如服务器繁忙或网络负载过高,您将立即收到 LDAP 故障。对于 nss_ldap,这意味着您的 nss 查找将失败,并且尝试使用它的任何进程都将简单地报告它找不到它正在查找的用户或组并失败。当您的 LDAP 服务器启动时,这可能会在正常运行期间出现问题,在我看来,这比服务器关闭时的问题更糟糕。

我发现了一个更可接受的解决方案,即使用以下设置:

bind_policy hard
nss_reconnect_tries 3
nss_reconnect_sleeptime 1
nss_reconnect_maxsleeptime 8
nss_reconnect_maxconntries 2

这样,您仍将拥有硬连接策略,但这些nss_reconnect_*设置将大大减少 LDAP 客户端尝试获取 LDAP 结果所花费的时间。这也意味着在正常使用期间,如果第一次尝试无法获取 LDAP 结果,它将再次尝试,并且通常会在第二次尝试时获取结果。这意味着在正常使用期间失败的次数更少。

至于在每个工作站上运行本地 LDAP 服务器,我不建议这样做。我可以告诉你的是nss缓存。它由 Google 的一些工程师编写,通过创建 LDAP 数据库的本地缓存并通过 cron 作业逐步更新它来解决此问题。然后,您将 nsswitch 源设置为使用其库而不是 nss_ldap,并且所有查找都是本地的。这样做的好处是大大减少了 LDAP 服务器上的负载,并且在与服务器的连接断开时使所有查找都可用。它目前没有最好的文档,并且没有得到广泛使用,但它确实运行良好,邮件列表响应速度很快。

答案3

我们遇到过这个问题,我们的解决方案是告诉 LDAP 不要成为服务器运行所需组的来源。这是通过将以下内容放在我们的ldap.conf

# We need to ensure that various things can work without LDAP being available
# for example: booting, ssh in as root, apache ...
nss_initgroups_ignoreusers avahi,avahi-autoipd,backup,bin,daemon,dhcp,dhcpd,games,gdm,gnats,haldaemon,hplip,irc,klog,libuuid,list,lp,mail,man,messagebus,munin,mysql,nbd,news,ntp,nut,polkituser,proxy,pulse,root,sshd,statd,sync,sys,syslog,uucp,www-data

来自nss_ldap 手册页

nss_initgroups_ignoreusers <user1,user2,...,userN>
          This option directs the nss_ldap implementation of initgroups(3)
          to return NSS_STATUS_NOTFOUND if called with a listed  users  as
          its argument.

因此,LDAP 基本上假装它不认识这些用户,甚至不联系主服务器,因此 NSS 会依赖本地用户,系统可以正常运行。

我们还在多个服务器上设置了 LDAP 副本,以采取双重保障措施。

相关内容