第十一章:LDAP中的安全策略

sudo的一个问题是,它通常在本地计算机上配置。入侵者(或聪明但非常顽皮的用户)利用自己的方式更改sudoers文件,可以更改自己的权限。这太糟糕了。消除此风险的方法是从计算机中删除sudoers策略。

轻量级目录访问协议(Lightweight Directory Access Protocol —— LDAP)提供跨网络的通用信息。虽然它通常存储用户名和密码,但它可以支持任何任意目录样式的信息。sudo安全策略非常适合LDAP。

在LDAP中使用sudoers策略的优点是,危及机器的用户无法更改sudoers政策。即使在服务器上获得root权限,他也无法访问只读LDAP服务器。此外,对基于LDAP的安全策略的更改会立即传播到网络上的所有计算机。

Typos不能阻止sudo运行,就像sudoers一样。LDAP服务器不会接受格式不正确的数据。您可能会键入错误的机器名和用户名,但您在LDAP服务器中键入的任何sudo配置在语法上都是有效的。

从LDAP配置sudo的缺点是什么?首先,您必须有一个LDAP服务器。当LDAP服务器发生故障时,您的身份验证和sudo安全都会随之失效,因此您可能需要多个。您必须有一个支持LDAP的sudo安装,这通常不在默认安装中,但很容易获得。

Sudo在文档 README.ldapsudoers.ldap 手册页中包含了关于使用LDAP作为安全策略提供者的非常详细的文档。在计划部署之前,请阅读这些文档。本书不会取代官方的sudo文档,但提供了与该文档并行的上下文、指导和概述。我不介绍使用 /etc/netsvc.conf 而不是 /etc/nsswitch.conf 的AIX等细节;为此,您需要操作系统手册或官方sudo文档。

Sudoers策略与LDAP策略

为LDAP构建sudo安全策略与创建基于sudoers的策略不同。首先,LDAP sudo策略不支持别名。我们在本书前面花了一章时间讨论的用户别名、命令别名和soforth?不适用于基于LDAP的策略。相反,为用户和服务器使用LDAP组。这不一定是优点或缺点,但你需要了解它。然而,LDAP的设计意味着很容易向规则中添加新的命令、用户或主机。

基于sudoers的策略在“最后匹配”的基础上工作,因此您可以将通用规则放在策略的顶部,并进一步获得更具体的规则。LDAP不会以确定性的顺序自动传递查询结果。您可以在LDAP中排序您的单个sudo规则,将一个规则放在另一个规则之前,以便“最后一个匹配”正常工作,但这是需要记住的额外步骤。您不能在单个LDAP sudo规则内对属性进行排序。

最后,基于LDAP的策略不会对主机、用户或RunAs使用否定。对命令的否定与对突发事件的否定一样有效——效果很差。请记住,您不能使用单个sudo规则对属性进行排序,因此如果发生冲突,任何命令否定都优先。避免消化不良。不要在LDAP sudo策略中使用否定。

先决条件

这不是一本关于LDAP的书。如果你不知道什么是模式(schema)或LDIF,这一节会让你困惑、恼火,甚至可能吓到你。这是因为LDAP会让不熟悉它的人感到困惑、烦恼和害怕。跳到第12章。记录sudo活动比听起来有趣和有用得多,而且您不需要任何外部基础设施来完成。本章重点介绍基于LDAP的sudoers策略和将sudo客户端连接到LDAP。

站点(site)要求差异太大,我无法为您介绍“通用(generic)”LDAP配置。由于OpenLDAP是最常用于sudo的服务器,我将在具体的详细示例中使用它,但我会介绍其他支持的LDAP服务器。

我假设您可以使用基于LDAP的身份验证,您的设置是安全稳定的,并且您既可以导入LDIF文件,也可以通过LDAP浏览器进行细微更改。我假设您使用的用于sudo的LDAP服务器与用于身份验证的LDAP服务器相同。LDAP中的sudoers策略不应被它所服务的sudo客户端写入——否则,一台受感染的机器可以为网络上的所有系统重写sudoers政策。同样,我不允许我的LDAP客户端服务器对LDAP服务器有任何写入权限,这要求用户转到特定的主机或界面来更改密码和其他帐户信息。

我还假设你一开始就有一个基于sudoers的政策。它不需要是一个大政策——即使是像“这里有一些默认值,这个组可以完全访问”这样的简单政策也会让你开始行动。

如果您没有基于LDAP的身份验证,请停止尝试将sudo填充到LDAP中。你已经超越了自己。让您的机器从LDAP中提取用户和组信息并进行身份验证。然后返回此处并重试。

我们将从您的sudo客户端开始,然后转到LDAP服务器。

LDAP感知Sudo

LDAP感知(LDAP-aware)的sudo在LDAP中没有sudo策略的情况下工作,因此安装LDAP感知的sudo是明智的起点。大多数操作系统都有一个支持LDAP的sudo包,或者允许您轻松启用它。基于Debian的系统有一个sudo LDAP包。CentOS风格的系统允许您在 /etc/nsswitch.conf 中为sudo启用LDAP。在FreeBSD上,您必须构建自己的sudo包来启用LDAP,但ports系统使这变得非常容易。查看操作系统文档,并按照说明在系统上安装支持LDAP的sudo。

然后配置LDAP服务器以提供和识别sudo数据。

将Sudo架构添加到LDAP服务器

支持sudo策略的LDAP服务器必须理解这些策略的语法和结构。模式(schema)定义了LDAP服务器的数据结构。每个供应商的LDAP服务器产品都有自己的模式系统,该系统(当然)与所有其他LDAP服务器微妙地不兼容。Sudo在文件中为三个LDAP服务器服务器提供了三个LDAP模式: schema.OpenLDAP(用于OpenLDAP服务器),schema.ActiveDirectory(用于Microsoft服务器)和 schema.iPlanet (用于Netscape派生服务器)。一些操作系统打包程序在其LDAP服务器中包含sudo模式,因此在尝试安装自己的模式之前请检查它。

将架构添加到这些LDAP服务器中的任何一个后,对 sudoUser 属性进行索引。这大大加速了sudo查找。

接下来,我将简要介绍如何将模式添加到所有三个LDAP服务器。

将Sudo添加到OpenLDAP

要将sudo模式添加到OpenLDAP,请将模式复制到模式目录(通常是 /etc/OpenLDAP/schema/ )中,作为文件 sudo.schema。然后在 slapd.conf 中添加以下行。您可能希望将这些语句放在其他模式和索引语句附近:

重新启动 slapd ,OpenLDAP将支持sudo策略。

将Sudo添加到iPlanet

将架构文件复制到服务器架构目录。此目录因操作系统而异,请查看服务器文档。给它起名叫 99sudo.ldif 。重新启动服务器。

现在,使用LDAP浏览器为sudoers创建服务搜索描述符。

你准备好了。

将Sudo添加到Active Directory

将Active Directory架构文件复制到域控制器,然后运行以下命令。

就这样。

在LDAP中创建Sudo策略

sudo策略需要一个容器和一个初始策略。以下是如何处理每一个。

Sudoers 容器

您的sudo策略需要一个LDAP容器。大多数LDAP管理员对附加软件的新容器的归属都有非常明确的想法。在这件事上听从她的意愿——LDAP给她带来了足够的悲伤,她不需要你的任何嘴唇。作为参考,以下是每个主要服务器的默认位置:

尽管将容器称为“sudoers”,但请记住,基于LDAP的策略并不像sudoers文件那样工作。

这是mwlucas.org的OpenLDAP服务器的sudo容器的LDIF。对于其他服务器或其他容器位置,请更改可分辨名称路径。

通过命令行或浏览器将其导入服务器。现在,您可以创建初始LDAP sudoers策略。

/etc/sudoers 转换为LDAP

/etc/sudoers 策略切换到基于LDAP的策略的方便之处在于,您不需要从头开始创建LDAP条目。您可以使用sudo套件中包含的脚本 sudoersoldif 将现有的sudoers文件转换为LDAP友好的LDIF文件。这是一个Perl脚本,通常作为支持LDAP的sudo包的一部分安装。

在运行 sudoersoldif 之前,您需要将SUDOERS_BASE环境变量设置为sudo策略容器的位置。该命令使用此变量将创建的LDIF放入目录树的正确部分。

现在运行 sudoersoldif ,将sudoers文件作为参数。

这会抛出你的sudoers政策的LDIF版本。sudoers2ldif 的一个很好的特性是,它填充了sudoOrder属性,对规则进行排序,以便“最后匹配”规则处理正常工作。有关详细信息,请参阅本章前面的“Sudoers策略与LDAP策略”。

您可以将此文件导入LDAP服务器并完成操作,但这会让您盲目地相信脚本有效。让我们看看你的sudoers文件变成了什么样的条目。

Sudoers 进入 LDIF

让我们从一个非常简单的/etc/sudoers开始。

我们保留了几个环境变量来允许SSH代理转发,然后我们允许组 wheel sysadmins 中的任何人通过sudo运行所有命令。本质上,此sudo策略将su替换为sudo。

作为LDIF,这会变成什么?稍后我们将介绍所有各种模式字段的描述,但生成的LDIF非常容易理解。我们将分别查看每个条目。

根据 dn 语句,此条目名为“defaults”。objectClass 语句将此附加到sudo策略。sudoOption 语句给出了实际的sudo规则。最后,sudoOrder 将此sudo规则放在要处理的规则列表中的第一位。

这是sudoers行,它允许两个组以root身份运行所有命令,编写为LDIF。

此规则有两个 sudoUser 条目,每个适用于该规则的组一个。有一个 sudoHost 条目显示此规则适用于所有主机,还有一个 sudoRunAsUser 条目表示此规则允许这些用户像所有其他用户一样运行命令。sudoCommand 条目列出了此规则涵盖的所有命令。

请记住,条目在项目中的出现没有特定的顺序。此规则有两个 sudoUser 条目,一个用于 wheel ,另一个用于 sysadminswheel 组恰好出现在此列表中的第一个,但在实时查询中可能会颠倒过来。如果顺序很重要,您需要制定第二条规则,并使用 sudoOrder 属性对其进行排序。

您可以将此初始策略导入LDAP服务器,然后配置sudo客户端从LDAP中提取信息。

激活Sudo客户端LDAP

您的LDAP感知sudo客户端能够向LDAP请求安全策略,但默认情况下可能不会这样做。您必须告诉sudo在哪里可以找到基于LDAP的策略,然后配置sudo以使用该策略。

查找LDAP策略

我之前说过,我假设您有一个可用的LDAP设置。这意味着您的本地计算机可以从LDAP目录中提取用户和组信息以及密码。这简化了sudo配置,因为您只需要担心LDAP的sudo部分。

首先运行 sudo –V ,询问您的sudo安装程序在哪里可以找到其LDAP配置文件。

这个特殊的sudo安装需要在 /etc 中找到 ldap.confldap.secret ,这是此操作系统的默认设置。

大多数操作系统可以在所有应用程序之间共享一个 ldap.conf 。这使您的sudo安装可以依赖于您的工作LDAP配置。一些操作系统使用sudo特定的LDAP配置。对于这些操作系统,您通常可以将基本LDAP配置从主系统文件复制到sudo特定文件。如果您有任何疑问,请查看操作系统手册。

现在将sudo LDAP配置添加到sudo的 ldap.conf 中。sudo接受三个不同的 ldap.conf 语句,但只有sudoers_base是必需的。

我网络上sudo的标准 ldap.conf 条目如下:

旧文档提到在 ldap.conf 中设置sudoers_debug。这已被弃用,不久之后该设置将被埋葬在一个没有标记的坟墓中,所以现在不要开始使用它。要记录sudo与LDAP的交互,请使用第12章中描述的LDAP日志子系统。

现在您的LDAP客户端可以找到sudo策略,请告诉sudo查看LDAP。

Sudo 和 nsswitch.conf

使用 /etc/nsswitch.conf 命令sudo查看LDAP。名称服务交换机配置文件通常告诉程序在哪里查找主机名和用户名等信息。sudo和其他人混在一起了。使用这样的条目告诉sudo检查LDAP:

Sudo将按照此处列出的顺序检查信息源——首先是LDAP,然后是 /etc/sudoers 。如果您的sudo安装永远不应该使用本地sudoers文件,请删除此行中的files语句。您还应该将 ignore_local_sudors 选项添加到LDAP策略中,我们稍后会看到。

Sudo规则和角色

/etc/sudoers 中的一行sudo策略将成为一个LDAP条目,称为 sudoRole 。我们之前在“Sudoers into LDIF”一节中看到的两个条目都是sudoRoles。

所有sudo属性都有特定的允许值,最常见的是用户名、组或命令。您不能在属性中输入无效的数据类型——需要用户名的属性不会接受IP地址,如果您尝试设置不正确,LDAP服务器将拒绝它。请注意,LDAP服务器无法知道mike是主机名还是用户名,因此您必须验证您刚才编写的语法有效的规则是否是您想要编写的规则。一个特殊值是ALL,它匹配该属性的所有可能条目。

所有sudoRoles都具有可分辨名称(Distinguished Names —— DN)属性、sudoRole objectClass属性和通用名称(Common Name —— CN)属性。毕竟,LDAP需要它们。但是,每个sudoRole中都必须出现三个附加属性,并且在有用时可以出现一些可选属性。三个必需属性是sudoUser、sudoHost和sudoCommand。

sudoUser

sudoUser属性是一个用户名,与sudoers策略中使用的用户名完全相同。请记住,您不能在sudoUser属性中使用别名。您可以使用操作系统组、组ID和网络组。如果你想在LDAP规则中使用非系统组,你必须在每个本地sudo安装中为它们添加一个插件。存储在LDAP中的组工作良好,因此请使用它们,而不是跳过这些额外的步骤。每个用户名必须出现在sudoRole中自己的sudoUser条目中。

sudoHost

这是一个主机列表,其语法和限制与sudoers规则中的主机条目相同。您可以使用主机名、IP地址和网络以及网络组。ALL匹配所有主机。

sudoCommand

这是命令的完整路径,以及任何命令行参数和通配符。这与sudoers中的命令列表完全相同,只是不能使用别名。ALL,就像sudoers一样,匹配所有命令。

您可以使用单词sudoedit,后跟文件名或路径,以允许在这些文件上使用sudoedit。类似地,将摘要算法和摘要放在命令之前,告诉sudo在运行命令之前验证摘要。

除了sudoRole的三个强制属性外,基于LDAP的策略还有四个可选属性,使其能够完全模拟sudoers策略:sudoRunAsUser、sudoRunAssGroup、sudoOptions和sudoOrder。

sudoRunAsUser

sudoRunAsUser属性给出了sudo用户可以运行命令的目标用户列表。这与sudoers的RunAs列表(见第4章)的工作原理完全相同。单词ALL匹配所有用户。sudoRunAsUser还接受用户ID号、组或网络组。在各自的sudoRunAsUser条目中列出每个目标。

sudoRunAsGroup

此属性允许用户以组成员的身份运行命令。这些组与sudoers策略中的组具有相同的有效名称。在自己的行中列出每个目标组。

sudoOrder

此属性指定角色编号。角色按从低到高的顺序处理。SudoOrder允许您模拟sudoers策略中的最后一个匹配规则行为。没有sudoOrder的sudoRole的sudoOrder为0,因此首先处理。如果您有多个没有sudoOrder的sudoRoles,它们将按照LDAP提供的顺序进行处理,即随机处理。

sudoRole 时间

基于LDAP的策略允许您为sudoRole设置激活和过期日期和时间,这是您在基于sudoers的策略中找不到的功能。只有当您在 ldap.conf 中有 sudoers_timed 选项时,Sudo才会检查激活和过期时间戳。如果没有此选项,Sudo会忽略时间。

sudoRole属性 sudoNotBeforesudoNotAfter 控制sudoRoles计时。这些属性接受一个四位数的年份值,后面跟着两位数的月份、日期、小时、分钟、秒和十分之一位数的秒。或者,如果你愿意,YYYYMMDDHHMMSSZ。日期和时间采用协调世界时(UTC),而不是您的本地时区。

上述示例中的sudoRole于2014年1月1日13:00生效,并于2014年01月31日22:00到期。这些时间看起来很奇怪,但我的网站比UTC早了五个小时。该规则于当地时间上午8点生效,并于最后一天下午5点到期。

此sudoRole在 sudoNotBefore 属性中的日期和时间之前无效。在 sudoNotAfter 属性之后,它不再有效。

如果您有多个 sudoNotBeforesudoNotAfter 属性,则使用最宽松的条目,即最早的 sudoNotBefore 和最新的 sudoNotAfter 。如果您尝试设置两个单独的时间范围,sudoRole将允许从最早的开始时间到最晚的结束时间进行访问。如果你输入一个sudoRole,上面写着“此规则在9月的前10天有效”,另一个sudo Role写着“该规则在10月的最后10天有效。”用户将从9月1日到10月31日获得访问权限。从目录中删除过时的 sudoNotBeforesudoNotAfter 属性。

有无用日期的角色永远不会被使用。

在这里,Thea授予我对所有系统的完全访问权限,为期12小时。2月30日。

禁用 sudoers

将安全策略放在LDAP中的目的是让那些设法编辑 /etc/sudoers 的用户无法编写给自己更多访问权限的规则。我们将sudo配置为首先查看LDAP的策略,这是一个很好的步骤。现在我们需要决定是否要有一个本地sudoers文件。

如果我们有一个本地sudoers策略文件,用户可能会知道如何编辑它。如果LDAP命令sudo忽略本地sudoer策略,那么用户是否编辑sudoers无关紧要;他们没有额外的权限。您面临的风险是,当LDAP系统发生故障时,您将失去对LDAP客户端的sudo访问权限。有关可能的解决方案,请参阅本章后面的“LDAP缓存”。

告诉sudo完全忽略 /etc/sudoers 。使用LDAP中的 ignore_local_sudoers 选项。将 ignore_local_sudoers 添加到默认策略中。域的OpenLDAP服务器上此策略的标准位置将是可分辨名称cn=defaults,ou=sudoers, dc=example,dc=org:

当sudo在LDAP中看到此选项时,它将停止查看本地sudoers文件。

您想禁用本地sudoers策略吗?可能。没有LDAP的LDAP客户端无论如何都无法正常运行,因此您会遇到更多问题。然而,这是你的选择。

学习sudoRole策略

如果管理LDAP不是你的主要工作,但你想通过LDAP支持sudo策略,那么你需要学习一项新技能。一旦你理解了编写sudoers安全策略,在LDAP中表达同样的东西就不会那么难了。

如果你感到困惑,sudoers2ldif 就是你的新朋友。您想知道如何编写特定sudoers规则的LDIF版本吗?编写一个仅包含所需规则的单行sudoers文件,然后运行 sudoers2ldif 查看结果。修改示例LDIF比从头开始编写要容易得多。很快,你就可以毫不费力地编写和编辑sudoRole LDIF了。但是,不要告诉LDAP管理员您可以编写LDIF,否则她可能会试图诱使您为其他人编写更多LDIF。

我认识一些人,他们使用LDAP分发他们的sudo策略,但实际上是以sudoers格式编写策略,然后使用 sudoers2ldif 生成LDAP配置。这将自动使用sudoOrder处理规则排序。这是一个完全可以接受的解决方案,如果您对LDAP不满意,甚至可能是可取的。

LDAP缓存

使用LDAP进行身份验证和策略分发时的最大风险是,您的网络变得依赖于LDAP服务器。希望您至少有两个LDAP服务器,其分布方式能够抵御大多数故障情况。希望您有足够的LDAP服务器,其中很大一部分的故障不会使幸存者过载。

您可以选择在每台机器上本地缓存LDAP信息,以使服务器度过短暂的停机。系统安全服务守护进程(System Security Services Daemon —— SSSD)提供缓存服务。SSSD是Fedora项目中创建的一个相当新的程序,它对非Linux系统的支持是混合的,但正在改进。

从sudo 1.8.4开始,您可以使用SSSD支持构建sudo。Sudo sssd允许您通过 /etc/nsswitch.conf 将sssd添加为附加信息源。这使Sudo即使在LDAP服务器关闭时也能引用缓存的安全策略。您可以将SSSD配置为主动从LDAP服务器下载sudo策略,以便为LDAP故障做好准备。

大多数操作系统都没有支持SSSD的sudo软件包。如果你正在使用SSSD,也可以考虑将其用于sudo。鉴于SSSD在除Linux之外的所有操作系统上的混合支持,我在这里不打算详细介绍。如果SSSD支持您的操作系统,您可以在以下网址找到关于使用sudo和SSSD的有用教程http://jhrozek.livejournal.com/2065.html.

现在让我们来看看sudo日志。它比你想象的更有用。