我觉得我忽略了一些显而易见的事情。
我的目标是在系统启动时使用 LDAP 服务帐户运行 systemd 服务。这样,如果我在 LDAP 中禁用该帐户,那么下次该服务尝试启动时,它将失败,因为该用户未获得授权。 (最终,我需要为该服务设置 Kerberos 以使用票证,但我还没有做到这一点,这可能是我的整体问题)
我有一个功能正常的 LDAP,可用于控制用户登录,因此我的用户是我的用户,cn=cbrand,ou=people,dc=jcolebrand,dc=info
并且我可以在网络中连接的计算机上使用该用户登录。我通过 LDAP 设置了 sudoers,因此我自己和系统上的另一名用户可以登录并运行 sudo 命令,但具有登录权限的其他人无法运行 sudo 命令。我有其他用户可以使用 LDAP 对我的服务器上的各种应用程序进行身份验证(因此他们没有系统登录权限,但他们有带密码的基本帐户)。
我设置了 ldap2pg 来处理系统上的读取器/写入器/超级用户,我还想用它来限制对连接到 LDAP 实例的网络上运行的服务的访问。
我希望能够在 LDAP 中为某些服务 X 定义一个帐户(作为一个实际示例,我将安装 gogs,或者也许我将迁移我的 jellyfin 服务以在类似的帐户下运行),然后使用该服务帐户来运行服务(所以我期望类似cn=gogs,ou=services,dc=jcolebrand,dc=info
或cn=jellyfin,ou=services,dc=jcolebrand,dc=info
)。我想要什么避免要做的就是必须手动创建一个本地用户/组来运行,因为这必须按服务器进行管理。相反,我希望能够使用 ldap2pg 撤销数据库访问,或使用 LDAP 拒绝目录级别的登录/访问权限。
如果我要创建一个本地帐户,我只需修改我的服务目标以使用该User=
指令,但这对于连接到 LDAP 似乎是不正确的,特别是如果我想强制使用密码(这可能需要一些自动化来旋转该密码服务帐户,我怀疑这是另一个故事,但也许不是!我知道我对此了解不够,不知道我是否忽略了一些“明显”的东西。)
作为部分配置片段,如果这有帮助,我有:
cat /etc/openldap/ldap.conf
<snip>
BASE dc=jcolebrand,dc=info
<snip>
如果这是一个 Windows Active Directory 域,我将使用 gMSA 帐户,这将是无缝的,或者我什至可以使用密码在目录中创建一个通用服务帐户,但我不知道如何在 Fedora 中执行此操作/Linux。具体来说,我不知道如何从 Windows 世界复制这一步:
Windows -> 打开 services.msc -> 查找服务 -> 转到属性 -> 根据需要将安全选项卡上的用户凭据设置为 gMSA 或帐户/密码。
查看 systemd 文档,我看到了 LoadCredential 文档,但这对于提供作为 LDAP 帐户运行的密码似乎没有意义(按照文档的编写方式)。
我是否想得太多了,我应该有一个无密码objectClass applicationProcess
LDAP 条目并设置服务配置User="cn=gogs,ou=services,dc=jcolebrand,dc=info"
,然后停止做额外的思考?
注意:最终我还希望这个相同的服务使用相同的信息与 postgres 对话,但这可能只需要一个适当的连接字符串,我可以使用 systemd 服务配置的环境文件。也欢迎对此的指点。
答案1
我将创建一个 Linux 系统用户(objectClass: posixAccount
LDAP 中的一个)并简单地将 systemd 单元文件设置为User=< uid value from the LDAP record
如果 PAM 配置正确,这应该会填充一个 uid 和 linux 用户名,systemd 将能够在其下生成可执行进程。无论如何,你都需要一个在 maine ch 上具有 linux UID 的服务用户,以便内核跟踪进程,所以我认为你不能避免使用objectClass: posixAccount
您的 LDAP 记录可能类似于:
dn: cn=gogs,ou=services,dc=jcolebrand,dc=info
objectClass: posixAccount
uid: gogs
cn: gogs
loginShell: /bin/nologin
uidNumber: 9999
gidNumber: 9999
homeDirectory: /path/to/gogs/install
description: gogs service user
我相信objectClass applicationProcess
如果您愿意,您也可以添加到此条目中。
然后,您可以直接编辑 gogs systemd 单元,或创建一个覆盖(EG with sudo systemctl edit gogs.service
)并添加:
[Service]
User=gogs
(您可能objectClass: posixGroup
还需要 gogs 的条目,然后您可以Group=gogs
在 systemd 单元中使用)
我对你问题的这些部分感到困惑:
只需修改我的服务目标以使用 User= 指令,但这对于连接到 LDAP 似乎是不正确的,特别是如果我想强制使用密码
和
查看 systemd 文档,我看到了 LoadCredential 文档,但这对于提供作为 LDAP 帐户运行的密码似乎没有意义
在Linux下,服务帐户通常不会有根据我的经验,密码。他们只是一个单独的用户,该服务的进程以该用户的身份运行。数据库身份验证可以使用密码字符串(您可以使用 LDAP 分发)或通过 Kerberos(可能?我不确定服务如何获取票证)来完成,但服务 POSIX 帐户没有密码 - 因为没有人登录到它。