详析OpenLDAP 账户权限管理机制
2020-01-15河南刘景云
河南 刘景云
Sudo 权限的控制方式及配置规则
当本地账户需要执行拥有Root 权限的命令时,可以通过Sudo 方式来实现,使其无需知晓Root 账户的密码,就可以执行相关的命令。其原理是利用“/etc/sudoers”配置文件中预先定义的命令,主机和运行身份信息,来实现权限的提升行为。Sudo的权限级别包括用户级别、组级别和命令级别。
在本地配置Sudo 规则来实现OpenLDAP 账户的权限切换操作时,必须先连接到OpenLDAP 服务器,执行“authconfig--enablemkhomedir--disableldaptls--enableldap--enableldapauth -emableforcelegacy-disablesssd -disablessdauth -enablelocauthorize--ldapserver=ldap://x.x.x.x -ldapbasedn="d c=Manager,dc=ldp,dc=com"--enableshadow --update”命令,来完成连接操作。
“x.x.x.x”为OpenLDAP 服务器地址,“ldp”为OpenLdap域名。假设登录用户为“user1”,执 行“sudo/user/sbin/useradd newuser”命令来检测当前用户是否具有新建用户Sudo 权限,如果失败,说明不具备管理员权限。为允许提权操作,可配置合适的Sudo 权限规则。
配置Sudo Schema 数据架构
当在OpenLDAP 服务器上集中配置Sudo 权限时,需要配置Sudo Schema 规则。
默认情况下,在OpenLDAP中的Schema 并没有包含Sudo所需的数据架构,因此必须导入所需的Schema 文件。以Root 账户登录OpenLDAP 服务器,执行“rpm -ql sudo-1.x.x |frep -i schema 命令,来显示服务器自身软件包所生成的Schema 文件。例如,进入“usr/share/doc/sudo-x.x.x/”目录,执行“/bin/cp -f schema.OpenLDAP/etc/openldap/schema/sudo.schema”命令,将所需的自带Sudo Schema文件复制到Schema 存储路径。执行“restorecon/etc/openldap/schema/sudo.schema”命令,来恢复该文件的安全上下文属性,避免出现无法访问的情况。
执行“mkdir~/sudo”命令,在家目录下创建名为“sodu”的目录,使用VIM 命令在其下创建名为“sudoSchema.conf”的 文件,在其中输入“include/etc/openldap/schema/sudo.schema”行,通过配置文件引入上述Sudo Schema 文件。执行“slapcat -f~/sudo/suduSchema.con -F/tmp/ -n0 -s "cn=[0]sudo,cn=schema,cn=config">~/sudo/sudo.ldif”,“sed-i "s/{0sudo/g~/sodu/sudo.ldif}"”,“head -n-8~/sudo/sudu-config.ldif”命令,通过Schema 来产生LDIF 文件。
LDFI 是存储LDAP 配置信息以及目录内容的标准文件文件格式,这些信息需要按照LDAP 中的Schema 规范进行导入和导出,以及数据文件的添加、删除和更名等操作。执行“ldapadd -Y EXTERNAL -H ladpi:/// -f~/sodu/sudo-config.ldif”命令,通过OpenLDAP 自带的命令将上述LDFI 文件导入到目录树中。执行“ls/etc/openldap/slapd.d/cn=config/cn=schema”命令,来查看OpenLDAP 数据库目录中由Schema 所产生的文件信息。
在OpenLDAP 上配置Sudo 规则
在OpenLDAP 目录树结构中,默认情况下并没有指定Sudo 规则。这 样OpenLDAP 会先在目录树中查找“cn=defaults”的条目,如果存在,那么所有的sudoOption 属性都会被解析为全局默认值。当客户端用户执行Sudo 权限查询时,可能会执行多次操作,例如,会先解析全局配置,之后会查询与其匹配的账户或组,来获取Sudo 权限配置信息。如果都失败,就会查询所有包含用户组的条目,并检测其是否存在这些组中。
sudoOption 属性包括很多项目,如sudoCommand(允许执行的命令)、sudoHost(允许在哪些主机上执行上述命令)、soduNotAfter(sudo 规则匹配起始时间)、soduNotNefore(规则匹配结束时间)等。
对于Sudoers 权限配置信息来说,是保存在“ousudoers”的组织单元中的。执行“cat < 例如,输入“dn:cn=%glygrp,ou=sudoers,dc=ld p,dc=com”,“objectClass:sudorole”,“cn:%glygrp”,“sudoUser:%glygrp”,“soduHost:ALL”,“sudoRunASUser:glyuser”,“ sudoOption :!authentication”,“sudoCommand:/bash/chmod”,“sudoCommand:/bash/chown”,“sudoCommand:/ bash/ chmod ”,“sudoCommand:/usr/sbin/useradd”,“sudoCommand:/bin/fsck*”,“sudoCommand:/usr/bin/chattr”,“sudoCommand:/”,“sudoCommand:/usr/sbin/passwd”,“sudoOrder:0”等行来定义名为“lgygrp”的组,可切换到名为“glyusr”的账户中,不需输入密码,只能执行指定的命令。 当然,这里仅仅是简单的例子,您可以根据实际情况来定义更加复杂的规则。定义好Sudo 规则后,接下来就需要将OpenLDAP 中的用户添加到预设的组中。例如执行“cat < 例如,输入“dn:cn=glygrp,ou=groups,dc=ldp,dc=com”,“objectClass:posixGroup”,“cn:glygrp”,“gidNumber:11008”,“dn:uid=orauser,ou=yhdy,dc=l dp,dc=com”,“objectclass:account”,“objectclass:posixAccount ”,“objectclass:shadow Account”,“cn:orauser”,“uid:orauser”,“uidMunber:22009”,“gidNumber:11008”,“userPassword:xxx”,“homeDirectory:/ home/orauser ”,“loginShell:/bin/bash”,“EOF”行。之后按照提示输入OpenLDAP 管理员密码,将名为“orauser”的用户指派到上述Sudo 规则中定义的名为“glygrp”的组中。 其中的“yhdy”为预先在OpenLDAP 目录树中定义好的OU,用来存储用户信息,“xxx”为该用户的密码,其中的组和用户的ID 均为假设。执行“ldapsearch -x -LLL uid=orauser”命令,可以在OpenLDAP 目录树中查看名为“orauser”账户的信息。当然,如果觉得使用OpenLDAP 自带命令比较繁琐,也可以使用phpLDAPadmin、LDAP Admin等图形化工具执行创建所需的OU,定义Sudo 规则及查看目录树详细信息等操作。 当在服务器端定义好Sudo 规则后,在客户端也需要进行对应的调整才可以发挥作用。这里客户端使用的是Redhat6.x 版本,执行“rpm -qi sudo | grep -i version”命令,来检测其是否支持Sudo规则。执行“sudo-V”命令,查看Sudo 版本信息。一般现在的系统基本都支持LDAP Sudo 规则。如果Sudo 版本过低要进行升级。 执行“authconfig--enablemkhomedir--disableldaptls--enableldap--enableldapauth -emableforcelegacy-disablesssd -disablessdauth -enablelocauthorize--ldapserver=ldap://x.x.x.x -ldapbasedn="dc=Manager,dc=ldp,dc=com"--enableshadow --update”命令,将客户端加入到OpenLDAP 服务器中。 执行“vim/etc/nsswitch.conf”命令,对“nsswitch.conf”配置文件进行编辑,输入“sudoers:ldap files”行,作用是先从OpenLDAP 服务器端获取Sudo 规则并加以应用,如果获取失败,再从本地获取Sudo 权限配置参数。执行“vim/etc/sudo-ldap.conf”命令,输入“SUDOERS_BASE ou=sudoers,dc=ldp,dc=com”,从OpenLDAP 服务器获取Sudo 权限信 息。这样,客户端就可以使用预设的OpenLDAP 用户进行登录,并从OpenLDAP 服务器上获取的Sudo 权限来执行各种操作。 对于OpenLDAP 用户来说,密码的安全是极为重要的。密码的安全策略包括很多内容,例如密码的使用周期、密码的历史、密码的复杂度和密码认证的次数等。本地的密码管理策略的各种属性信息实际上定义在“/etc/login.defs”文件中,并将“/etc/skel”目录下的环境参数信息附加到用户属性中。 在“/etc/login.defs”文件中包含密码的有效期、更改天数、密码最小长度和密码失效警告天数等信息。当用户修改密码时,按照该文件定义的规范进行。当然,管理员可以利用PAM 模块对密码策略进行修改。例如执行“vim/etc/pam.d/systemauth”命令,打开“systemauth”,添加“password requisite pam_cracklib.so minlen=9 ucredit=-3 lcredit=-2 dcredit=-3 ocredit=-1”行。这样,当用户修改密码时,密码的长度最好为9 位,其中必须包含3个大写字母,2 个小写字母,3个数字及1 个特殊字符。 执行“cat < 执行“ cat < 例如输入:dn:cn=defau lt,ou=passpolicy,dc=ldp,dc=com 设置默认的密码策略。 按照顺序依次设置密码过期前警告时间、密码失败后恢复时间、密码过期后不能登录的时间、开启密码历史记录功能等。注意,当账户密码被锁定后,是不能自动解锁的,必须由管理员解锁。实际上,OpenLDAP 的账户密码策略具有很强的灵活性,允许针对特定的组或账户来配置合适的密码策略。 执行“cat < 其中的“policy1”为预先定义好的OU,让指定的用户“user1”遵循为“kaifabu”的组设置的密码策略,而不必使用默认的密码策略。 除了允许用户使用“passwd”命令来修改密码外,为提高系统安全性,最好在用户初次登录时设置密码。 为了让客户端使用上述密码策略,可以在客户机上执行: 让客户端可以识别OpenLDAP 服务器端的密码策略信息。 执行“service nslcd restart”命令,重启nslcd服务,根据预设的配置和OpenLDAP 服务器进行交互来获取请求条目。客户端执行“yum install openldapclients nss-pam-ldapd -y”命令,之后等客户端登录时,按预设的密码策略执行配置。 为了便于OpenLDAP 管理员了解用户密码变动信息,可以利用OpenLDAP 提供的密码审计功能来实现。例如在OpenLDAP 服务器上执行“cat < 开启OpenLDAP 密码审计功能。 OpenLDAP 配置文件可以通过修改配置文件或数据库的方式实现,后者的优点是可以实现动态配置,而且不必重启Slapd 服务,这里采用后者来实现。 这样,当客户端登录时,就需要遵循预设的密码规则。当用户输入错误的密码次数查过预设值后,就会被锁定,管理员可以执行“cat< 将“user1”账户中密码属性中的“pwdAcount LockedTime”标记删除,就可以解除其锁定状态。 如果是密码过期,可以执行“cat < 将“user1”账户的密码删除,之后重新为其添加面膜即可,“xxx”为具体的面密码。这里均以“user1”账户为例进行说明。将用户指定Sudo 权限规则
在客户端使用Sudo 规则
配置本地密码安全策略
在OpenLDAP 上配置密码策略
在客户端应用密码策略
使用密码变动审计功能