我问今天有一个类似的问题,关于如何向 postgres 数据库验证我的服务器用户而不是/etc/passwd
文件或 LDAP,我在那里得到了一些有用的答案。我发现我的服务器身份验证有三个部分需要处理:登录用户、设置他们的 uid 和 gid,并sudo
在必要时授予他们访问权限。
我能够找到 postgres 的 NSS 和 PAM 模块,但没有关于如何使用数据库(尤其是 postgres)来sudo
代替sudoers
和 的信息sudoers.d
。我试图找到 sudo 的插件,但似乎不存在 - 我只在sudo 网站插件页面。
是否可以使用外部数据库sudo
?
答案1
通常的做法是将 sudo 视为一组配置文件。通过您选择的任何配置管理来管理它们,可以是 chef、puppet、CFengine、subversion、git 等,也可以简单地手动编辑它们。
当 sudo 中的权限/规则被赋予团体而不是个人时,根据我的经验,它们会变得非常静态,DBA 团队需要这样做,su - oracle; su - sybase ; /etc/init.d/oracle * ; /etc/init.d/sybase *
并且变化最大的是 DBA 团队的成员。
然后,您的 sudo 管理将简化为身份验证、用户和组管理。这就是 PAM 再次发挥作用的地方。配置 PAM 以使用集中管理的用户数据库,可以是 LDAP、NIS、Active Directory(LDAP + Kerberos),甚至是 MySQL 或 Postgresql 数据库。sudo 默认已经使用 PAM。
现在只需使用最有效工具来管理您的用户/组数据库即可。
答案2
如果我处于你的位置,我会使用 LDAP 来解决你所有三个问题:
登录/注销用户(身份验证)。/
pam_ldap
、nss_ldap
或pam_ldapd
任何其他选项都存在。
它们都经过充分验证且被广泛使用(这意味着操作系统供应商确保它们有效),那么为什么不使用它们呢?设置它们的 UID 和 GID(属性。还有诸如主目录、shell、ETC)。
已经通过解决(1)的相同工具解决了 - LDAP 目录中有用户和组信息,这要归功于RFC 2307 架构扩展几乎每个 LDAP 服务器都支持它。授予人们 sudo(授权的一种特殊情况)。Sudo
可以与 LDAP 目录通信,并且它附带架构规范。
将其添加到您的目录中很简单,更改会立即生效。
如果你对 LDAP 有强烈的反对意见,并坚持在 SQL 数据库中管理这些信息,你可以使用 SQL 作为 OpenLDAP 的后端,但坦率地说,我认为这是错误的——数据不是自然“关系”的,你不应该试图强迫它成为关系。
如果你想这样做,因为你已经在 SQL 支持的用户存储方面投入了大量资金,那么你可能希望将其视为将这些用户纳入 LDAP 并将其他应用程序转换为针对 LDAP 目录进行身份验证/授权的过渡步骤。
LDAP/RFC 2307 确实是一个不错的用户账户管理模型(虽然它并不完美,因为它有一些我不赞同的愚蠢选择)。
作为奖励一大堆其他的事情以 LDAP 为母语(例如,微软的 Active Directory 只是 LDAP 加上一些附加功能,而且 MS 支持使用 RFC 2307 模式扩展 AD;Apache 具有使用 LDAP 的身份验证模块),因此通过使用 LDAP,您可以顺利进行单点登录,并且可以与微软的产品进行互操作,这是一项不错的功能。
你确实还有另外两个选择,但在我看来它们确实没有什么吸引力:
编写一个
sudo
插件来查询数据库。
这具有实时性的优势,就像使用 LDAP 一样。您需要成为一名相当优秀的程序员(或有一名程序员),但如果您要编写这样的插件,我相信您可以将其开源并找到一些愿意帮助开发的人。将您的数据存储在数据库中并使用 cron 作业同步服务器。
基本上就是定期生成一个新sudoers
文件——编写代码确实很容易,但这绝对是一种不优雅的黑客行为。更新不是实时发生的这一事实意味着它在很多环境中都是行不通的。