我将附加到一个小项目,该项目基本上是在AWS Linux服务器群集中组织用户的。用户分配的服务器具有不同的UIDS,也许还有不同的GUID。我希望使用Ansible来解决此问题并更好地组织用户。我可以让Ansible在测试环境上运行,但让我感到紧张的是/etc/passwd完全被搞砸了!所以我的问题如下:


更好的方法是使用Ansible覆盖/etc/passwd。所以基本上我有一个/etc/passwd的模板,并结合使用Jinja2和Ansible保管库来重写/etc/passwd中的值(我目前正在使用sudoers这样做,并且效果很好)?如果是这样,我是否需要对/etc/shadow做任何事情还是在那儿安全?
在不需要使用/etc/passwd的地方,Ansible是否足够聪明?例如,当我将用户bob分配给UID 5001时,应该将其始终分配给5002。如果我要使用用户模块读取用户,并专门将5002分配给他的UID,这样做会更好吗? >如果需要更多信息,请告诉我。

评论

我会先尝试用户模块。您可能最终得到不在中央列表中的本地用户,这些本地用户不应被覆盖。替换/ etc / passwd会使那些用户迷路。

我担心的一个问题是试图为现有用户组织UID,并确保他们的UID被正确覆盖并在我拥有的服务器群集中保持一致。.

Ansible用户管理文档中关于强制uid尚不清楚的是什么?

@Tensibai我从未说过我不清楚Ansible的文档。实际上,Ansible有据可查。我要问的是,是否为已创建的用户重新分配UID是否会有任何副作用,而我最好改写/ etc / passwd。但是我认为在这一点上,仅使用Ansible的用户模块覆盖UID就可以了。

更改用户uid不会更改文件所有权,因此,不管您要使用哪种解决方案,都会产生影响。

#1 楼

如果在一个地方跨多个服务器编辑关键的平面文件太吓人了。.

我经常建议的一种方法是让系统用户驻留在/ etc / passwd文件中,并添加一个附加名称。 nss_db + pam_userdb用于需要登录的人员的服务切换(NSS)源。对于大型项目(大量用户通过PAM用户数据进行身份验证),这意味着LDAP;对于小型项目(很少有数百个此类用户),则为nss_db + pam_userdb 。

使用多个NSS和PAM用户源,您可以避免在人工用户帐户分发由于任何原因而失败时禁用服务器。服务(例如您的特权Ansible帐户)应始终仅取决于标准的/ etc / passwd文件。在某些情况下(例如您的情况),LDAP(甚至MySQL)可能会显得有些过时。

考虑一下旧的BDB支持的gems,它最初是为大型FTP文件分发服务器而设计的,其登录速度比/ etc文件要快,但在其他方面却几乎相同。它们存储相同的passwd并将分组平面文件的内容分组,但是被加载到(现在是非GPL)BerkeleyDB NOSQL键/值数据库文件中,该文件读取速度更快。为此,它只是存储用户/组身份验证/授权数据的额外地方。

NSS

https://en.wikipedia.org/wiki/Name_Service_Switch

https://www.systutorials.com/docs/linux/man/5-nsswitch.conf/

https://sourceforge.net/p/nssdb/home / Home /

PAM

https://en.wikipedia.org/wiki/Linux_PA

https://www.systutorials.com / docs / linux / man / 8-pam_userdb /

https://www.cyberciti.biz/tips/centos-redhat-vsftpd-ftp-with-virtual-users.html

步骤


使用nss_db Makefile在安全的服务器上收集密码,影子和组文件
构建nss密码和组db文件使用提供的nss_db
Makefile

从影子文件中提取用户和密码散列并构建PAM数据库文件

awk -F: '{print ;print}' shadow > users.txt # used like the vsftpd vusers.txt example

db_load -T -t hash -f users.txt pam-users.db


将文件分发到目标服务器上的适当位置
(也许/var/db/authdb/*.db)
设置目标服务器的pam.conf和nsswitch.conf文件以使用
这些数据库文件
步骤1-4是可重复的构建/部署过程。

为什么? ,通过更新/破坏用户auth / auth破坏服务的风险非常低。
用户身份验证将在没有外部网络依赖性(例如LDAP或MySQL等)的每台服务器上运行。
您可以将数据库文件视为服务器场上的不可变工件,即使您没有不可变服务器,也可以减少/防止用户身份验证雪花。


评论


对于3,stdin重定向是多余的,awk可以直接读取文件:awk -F:'{print $ 1; print $ 2}'shadow> users.txt就足够了

–滕西拜
17-10-24在7:53

我选择了这种语法@Tensibai,它仅对shell,命令是多余的。它传达了更多意图

–杰里米
17-10-24在14:58

随时对其进行编辑,起初我主要是为代码块进行编辑。 (我反对不必要的上下文更改,并在不需要的地方滥用流)

–滕西拜
17-10-24在15:16



不值得在我这头小题大做。谢谢您的关心!

–杰里米
17-10-25在18:19