AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1055986
Accepted
Brian Bauman
Brian Bauman
Asked: 2021-03-05 16:42:07 +0800 CST2021-03-05 16:42:07 +0800 CST 2021-03-05 16:42:07 +0800 CST

为 SSH 和 Samba 身份验证设置可组合 POSIX 组的最简单方法是什么?

  • 772

背景

我将我认为是相当普通的基础设施块放在一起,但遇到了很多问题,我不禁想知道是否有更简单的方法。


我需要能够执行以下操作:

  • 使用委派身份验证和基于组的权限将文件从 Linux 服务器安全地共享给 OSX、Linux 和 Windows 计算机上的数百名用户。
  • 允许基于组的 SSH 访问数十个 Linux 服务器,具有委派的身份验证和基于组的权限。
  • 能够创建由其他组和用户组成的组,最好是任意深度。
  • 能够允许基本任务的自助服务(密码更改和恢复,个人信息的有限编辑等)
  • 能够以最少的配置迁移现有服务器(运行各种 Linux 风格) - 因此尽可能坚持“标准”配置,尤其是客户端。

我希望能够选择执行以下操作:

  • 除基于密码的身份验证外,还支持公钥身份验证

对我来说,上述所有听起来都像是 LDAP + Samba 是唯一可行的方法,尤其是因为之前的实现使用了 FreeIPA/Samba。团队决定使用 OpenLDAP 和 LDAP Account Manager 来提供身份验证和目录服务,但实施过程却是一场噩梦。


OpenLDAP 设置

我的目录树具有以下结构:

 - dc=example,dc=com
   - ou=groups
     - cn=groupA
     - ...
   - ou=policies
     - cn=passwordDefault
     - ...
   - ou=services
     - cn=service1
     - ...
   - ou=users (
     - uid=user1
     - ...

用户有以下类别:

  • inetOrgPerson(结构)
  • posixAccount
  • 影子账户
  • sambaSamAccount
  • ppolicyUser
  • 密码自复位
  • ldapPublicKey
  • 一般信息

用户工作得很好。大多数 Linux 机器都使用sshd -> libpam-ldap -> libnss-ldapd -> nscd -> nslcdand coreutils -> libnss-ldapd -> nscd -> nslcd,因此getent passwd根本id [username]不需要任何特殊配置即可工作。

服务有以下类:

  • applicationProcess(结构)
  • 简单安全对象

服务只是内部服务(如 Gitlab)的简单 DN/pw 实体,可以直接联系 LDAP,这样我们就可以关闭匿名绑定而不切断它们。他们也工作得很好。(注意 - 一些服务实际上需要作为 POSIX 帐户存在,因此为简单起见将它们配置为用户)

策略是诸如密码策略之类的实体,它们不在此问题的范围内。

组一直是真正的问题,因此我将在下一节中详细讨论它们。


团体的问题

无论我做什么,我似乎都无法创建可组合的 POSIX 兼容组。在这种情况下,我使用“可组合”来表示以下内容。假设配置了这些组 - GroupA(User1、User2、User3)、GroupB(User4、User5)和 GroupC(User1、User5)。可组合组将允许创建动态 GroupD (GroupA, GroupC),有效成员资格为 (User1, User2, User3, User5)。 理想情况下,GroupD 也可以定义为 (GroupA, GroupC, User6)。此外,理想情况下,您可以继续嵌套多于一层的组。

OpenLDAP 和 LAM 有一些工具似乎适用于这类事情,但我不断遇到模式问题、设计问题、实现问题或三者的某种组合。

  • dynlist - 这个 OpenLDAP 覆盖允许您基于 LDAP 过滤器即时填充属性列表。您甚至可以拥有由用户和其他组组成的混合组!不幸的是,覆盖仅在直接查看它所附加的实体时触发。这意味着getent group [group](直接查看一个或多个组)有效,但groups [user](搜索用户在组中的存在)无效。nss这使得如果不将您自己的映射层或其他 LDAP 使用者写入,就不可能基于动态组进行 SSH 。此外,可能出于类似原因,您无法从其他 dynlist 组创建 dynlist 组。

  • memberof - 此 OpenLDAP 覆盖将自动更新memberOf用户的属性,以对应用户在组中的添加和删除。然而,它似乎需要使用基于 RFC2307 的类以外的组类posixGroup,因为它memberof需要基于 DN 的成员资格,而不是基于 uid 的成员资格。它实际上也无助于管理组本身。

  • 自动组 - 此OpenLDAP覆盖将自动从可配置属性中添加或删除用户 DN,对应于用户在可配置 LDAP 过滤器结果中的存在或不存在。这个覆盖似乎需要memberof安装,因为autogroup除非我包含olcAGmemberOfAd配置属性,否则安装会失败。它似乎也需要基于 DN 的成员资格,所以memberof它需要一个基于 RFC2307 以外的类posixGroup

我最初尝试使用 class 实现静态组posixGroup (structural),并使用附加labeledURIObject类来附加dynlist过滤器的动态组。这基本上奏效了,但我遇到了dynlist上面列出的缺点。

然后我尝试改用autogroup覆盖,但遇到了似乎需要基于 DN 的成员资格的问题。在这一点上,我觉得我必须尝试摆脱posixGroup结构类,因为似乎没有任何东西支持它。LAM似乎更喜欢使用 和 的组合groupOfNames,因为它包含一个功能,当两个属性都存在于同一个对象上时RFC2307bis-posixGroup,它可以自动member将属性与属性同步。memberUid所以我修改了posixAccountOpenLDAP 附带的模式,使其成为辅助而不是结构,并使用groupOfNames(结构)和修改的posixAccount类创建组。破解 OpenLDAP 的objectClass使用 RFC2307bis-esque 类来欺骗它的模式感觉就像 Not The Right Thing To Do™,但 OpenLDAP/LAM 似乎接受了它。这样做也使我能够memberof成功安装,这很好。

autogroup,但是,只有一半有效。虽然它会将用户添加到动态组(使用 可见groups [user]),但在将用户从基本组中删除时不会将其删除。 groupOfNames还要求其members字段始终至少有一个用户在其中,这对于与autogroup. 您必须使用初始设置它,但是一旦锁定属性member就无法删除虚拟成员。autogroupmember


配置

cn=模块{0},cn=配置

dn: cn=module{0}
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_mdb
olcModuleLoad: {1}ppolicy
olcModuleLoad: {2}autogroup
olcModuleLoad: {3}memberof

olcOverlay={1}memberof,olcDatabase={1}mdb,cn=config

dn: olcOverlay={1}memberof
objectClass: top
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcMemberOf
olcOverlay: {1}memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

olcOverlay{2}autogroup,olcDatabase={1}mdb,cn=config

olcOverlay: {2}autogroup
structuralObjectClass: olcAutomaticGroups
olcAGattrSet: {0}labeledURIObject labeledURI member
olcAGmemberOfAd: memberOf

问题

最具体到最少:

  1. 为什么autogroup能够将用户添加到动态组,但不能删除它们?
  2. 有没有更简单的方法来实现这个用例?
  3. 我是否使用了错误的工具来完成这项工作?使用不同的 LDAP 实现、一些简单的客户端配置或完全非 LDAP 的东西,这个用例会更容易吗?
ldap openldap pam nss
  • 1 1 个回答
  • 509 Views

1 个回答

  • Voted
  1. Best Answer
    Brian Bauman
    2021-05-06T13:26:53+08:002021-05-06T13:26:53+08:00

    事实证明,这里最好的方法是让 LDAP 客户端完成繁重的工作:

    我将组设置为在结构上groupOfNames由RFC2307bis-posixGroup附加组成。由于我的环境不RFC2307bis-posixGroup直接支持,我将一个 LDIF 放在一起,以使 OpenLDAP 删除其现有定义posixGroup并用一个辅助副本替换它:

    不要按原样修改您的配置! 如果您选择走这条路,请找到您服务器的posixGroup配置,并将其与STRUCTURAL更改为AUXILIARY.

    dn: cn={2}nis,cn=schema,cn=config
    changetype: modify
    delete: olcObjectClasses
    olcObjectClasses: {2}( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction of a group of accounts' SUP top STRUCTURAL MUST ( cn $ gidNumber ) MAY ( userPassword $ memberUid $ description ) )
    -
    add: olcObjectClasses
    olcObjectClasses: {2}( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction of a group of accounts' SUP top AUXILIARY MUST ( cn $ gidNumber ) MAY ( userPassword $ memberUid $ description ) )
    

    然后服务器可以假装支持 RFC2307bis-posixGroup 规范。从那里,我能够添加 memberOf 并完成 OpenLDAP 配置。

    关键是现代版本的 NSLCD 和 SSSD 都包含允许递归组搜索的标志。显然,此功能称为“嵌套”分组,这在 LDAP 目录结构的上下文中有点令人困惑,它还允许组相互嵌套。这些功能与 LDAP 结构无关,但是,它们是关于能够遵循对groupOfNames其他groupOfNames.

    nslcd : nss_nested_groups是|否

    如果设置了这个选项,一个组的成员属性可能指向另一个组。嵌套组的成员也会在更高级别的组中返回,并且在为特定用户查找组时返回父组。默认设置是不对嵌套组执行额外搜索。

    sssd:ldap_group_nesting_level(整数)

    如果 ldap_schema 设置为支持嵌套组的模式格式(例如 RFC2307bis),则此选项控制将遵循多少级嵌套 SSSD。此选项对 RFC2307 架构没有影响。默认值:2

    有一些注意事项 - Red Hat 更喜欢您使用 SSSD,因此 Red Hat 存储库中的 nslcd 版本不足以支持该功能。但是这种方法应该适合大多数用例。最终,使用 sssd 或 nslcd 在所有服务器上重新配置标志比尝试让 OpenLDAP 自行进行“嵌套”分组要容易得多。

    我现在可以在 LDAP 树中引用其他组中的组, getent group现在将列出每个组以及在组中直接引用或在引用组中递归引用的所有用户的扁平列表。

    • 1

相关问题

  • Cygwin sshd 和 LDAP 身份验证

  • 从 OpenLDAP 检索操作属性

  • 为 Mac 网络使用 Linux 和 Open LDAP

  • 使用LDAP服务器身份验证的Linux中单个用户的多个登录名

  • 使用 smbldap 管理用户/组的 Web 前端

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve