我觉得我好像忽略了一些显而易见的东西。
我的目标是在系统启动时使用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>如果这是一个域,我将使用gMSA帐户,这将是无缝的,或者我甚至可以使用密码在目录中创建一个通用服务帐户,但是我不知道如何在Fedora/Linux中这样做。具体来说,我不知道如何从Windows世界中复制的步骤是:
Windows -> Open services.msc ->查找服务-> Goto Properties ->,酌情将安全选项卡上的用户凭据设置为gMSA或帐户/密码。
看一下systemd文档,我看到了LoadCredential文档,但这似乎没有意义(通过编写文档的方式)来提供作为LDAP帐户运行的密码。
我是不是想过了,应该有一个无密码的objectClass applicationProcess LDAP条目,并为User="cn=gogs,ou=services,dc=jcolebrand,dc=info"设置服务配置,然后停止进行额外的思考?
Nota bene:最终,我也希望这个服务能够使用相同的信息与postgres对话,但这可能只需要一个适当的连接字符串,我可以使用这个环境文件来进行systemd服务配置。这方面的指针也是受欢迎的。
发布于 2023-03-01 20:35:15
我将创建一个linux系统用户(LDAP中的objectClass: posixAccount ),并简单地将systemd单元文件设置为有User=< uid value from the LDAP record。
如果PAM配置正确,这将填充一个uid和linux用户名,系统d将能够在该用户名下生成可执行进程。无论如何,您需要一个在缅因州ch.linux上具有linux的服务用户来跟踪进程,所以我认为您无法避免使用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单元,也可以创建覆盖(例如使用sudo systemctl edit gogs.service)并添加:
[Service]
User=gogs( gogs也可能需要一个objectClass: posixGroup条目,然后可以在systemd单元中使用Group=gogs )
我对你问题的这些部分感到困惑:
只会修改我的服务目标以使用User=指令,但对于连接到LDAP似乎不正确,特别是如果我想强制使用密码的话。
和
查看systemd文档,我看到了LoadCredential文档,但是提供作为LDAP帐户运行的密码似乎没有意义。
在Linux下,在我的经验中,服务帐户通常没有密码。它们只是一个单独的用户,用于该服务的进程以相同的方式运行。数据库身份验证可以使用密码字符串(可以使用LDAP分发)或通过Kerberos (可能吗?我不知道服务如何获得票证),但是服务POSIX帐户没有密码--因为没有人登录到它。
https://unix.stackexchange.com/questions/737196
复制相似问题