linux 利用LDAP身份集中认证
碰巧所在的公司用到了ldap 集中身份认证,所有打算研究下这套架构,但是看遍了网络上的很多教程,要么不完整,要么就是照着根本弄不出来,十月一研究了三天,结合八方资源终于弄出来了,真是不容易,哎,特此记录一把: 一。实现效果: 1.实现linux openldap 账号集中管理 2.可以控制账号是否可以sudo 到root 3.可以实现密码和pubkey 登陆 4.可以控制用户可以登陆到哪些主机 ? 二。系统环境: Red Hat Enterprise Linux Server release 6.7 (Santiago) 三。项目拓扑: 采用两节点演示: ldap server端: 192.168.85.137? (既充当server端,也做client端) ldap? client端: 192.168.85.139 四.软件版本: openldap-servers-2.4.40-16.el6.x86_64 ?#安装前准备: 1.关闭防火墙及selinux 2.配置hosts解析: 192.168.85.137 node1 3.配置ntp时间同步: ntpdate time.windows.com ? # 安装openldap server: yum install -y openldap-servers-2.4.40-16.el6.x86_64 openldap-clients-2.4.40-16.el6.x86_64 openldap-2.4.40-16.el6.x86_64 openldap-devel-2.4.40-16.el6.x86_64 compat-openldap.x86_64 # 初始化openldap配置: cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf chown -R ldap.ldap /etc/openldap chown -R ldap.ldap /var/lib/ldap #编辑?/etc/openldap/slapd.conf? (修改以下配置,其他可以保持默认,或者根据自己需求修改,我这里只是修改了下面三项) suffix "dc=hello,dc=com" #配置域名后缀,类似最上次的父域名称 rootdn "cn=admin,dc=hello,dc=com" #新建管理员admin rootpw {SSHA}LoVG+OZ61YG95bbZbVDZnkotGRSchz+Q #管理员的password,可以使用明文或密文,密文用 slappasswd 生成 #生成配置文件: rm /etc/openldap/slapd.d/* -fr #删除老的配置数据库 slaptest -f /etc/openldap/slapd.conf #检测配置文件是否有语法错误
# 启动ldap server: /etc/init.d/slapd start # openldap 默认使用389,端口,查看服务是否启动成功: ? ?############################################# 客户端配置 # 客户端部署,安装openldap client 软件: yum install -y openldap-clients.x86_64 nss-pam-ldap
# 修改/etc/nslcd.conf,添加下面内容: uri ldap://192.168.85.137/ base dc=hello,dc=com ssl no
# 修改/etc/pam_ldap.conf,增加下面内容: base dc=hello,dc=com uri ldap://192.168.85.137/
# 修改/ /etc/pam.d/system-auth auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid>=500 quiet auth sufficient pam_ldap.so #增加ldap模块 auth required pam_deny.so account required pam_unix.so account sufficient pam_succeed_if.so uid<500 quiet account required pam_ldap.so #增加ldap模块 account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok password sufficient pam_ldap.so use_authtok md5 #增加ldap模块 password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore]pam_succeed_if.so service in crond quiet session required pam_unix.so session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 session optional pam_ldap.so #增加ldap模块 ? # 修改/etc/pam.d/sshd? (ssh登陆的话需要用到这个文件,如果只修改/etc/pam.d/system-auth的话控制台登陆没问题,但是如果远程ssh 连接就会出现问题) auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid>=500 quiet auth sufficient pam_ldap.so use_first_pass #加载ldap auth required pam_deny.so account required pam_unix.so account sufficient pam_succeed_if.so uid<500 quiet account [default=bad success=ok user_unknown=ignore] pam_ldap.so #加载ldap account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok password sufficient pam_ldap.so use_authtok #加载ldap password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore]pam_succeed_if.so service in crond quiet session required pam_unix.so session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 #自动创建用户家目录 session optional pam_ldap.so #加载ldap模块
# 修改/etc/nsswitch.conf,指定查找顺序: passwd: files ldap shadow: files ldap group: files ldap # 修改?/etc/sysconfig/authconfig USESHADOW=yes USELDAPAUTH=yes USELOCAUTHORIZE=yes USELDAP=yes # 新建ou,用来存放用户: dn: ou=People,dc=com ou: People objectClass: top objectClass: organizationalUnit # 新建ou,用来存放组: dn: ou=Group,dc=com ou: Group objectClass: top objectClass: organizationalUnit # 新建用户 user200 dn: uid=user200,ou=People,dc=com uid: user200 cn: user200 sn: user200 objectClass: posixAccount objectClass: person objectClass: inetOrgPerson objectClass: shadowAccount userPassword: {CRYPT}-s2a6QekMTXp6 #这里填的是密文密码,用slappasswd -c -s? 命令生成 shadowLastChange: 18171 shadowMin: 0 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 5204 gidNumber: 5204 homeDirectory: /home/user200 ? NOTE:虽然可以填明文密码,也可以填密文密码,但是如果想要结果linux 登陆,就必须填slappasswd -c -s 生成的密码,这个命令生成crypt(3) 加密的格式,linux 可以识别,网上虽然说可以用明文,但是我反正没有尝试成功。 ? # 启动ldap 客户端 /etc/init.d/nslcd start ? 配置完成,可以进行ssh 远程连接了 ? ? ? ? ############################## 配置用户sudo ##### 服务器配置 ?1.可以通过本地sudo文件,也可以通过ldap server 端配置sudo,这里利用ldap server端来配置 # 拷贝sudo schema? cp /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP /etc/openldap/schema/sudo.schema # 编辑/etc/slapd.conf ,增加下面配置: include /etc/openldap/schema/sudo.schema # 生成新的数据库配置: rm -rf /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d chown -R ldap.ldap /etc/openldap/slapd.d/ #赋权,不然启动sladp 会报错 /etc/init.d/sladp restart #重启服务让配置生效
# 最好装好phpldapadmin,这个web界面可以让我们图形化操作ldap,具体安装过程可以google,这里省略,还有需要注意的一点是如果用yum 安装的 phpldapadmin可能始终会提示密码错误,具体原因没有去研究,到网上下载源码自己安装下就好了,不必去纠结 ? # 新建 sudoers Ou: dn: ou=sudoers,dc=com ou: sudoers objectClass: top objectClass: organizationalUnit # 新建组admin: dn: cn=admin,ou=group,dc=com
# 新建sudo 规则: dn: cn=%admin,ou=sudoers,dc=com objectClass: sudoRole cn: %admin sudoUser: %admin sudoHost: ALL sudoRunAsUser: root sudoOption: !authenticate sudoCommand: /bin/bash EOF # 将用户加入admin组,这个这个用户就有了sudo 到root 的权限 cat >> modify_gid.ldif << EOF dn: uid=user200,dc=com changetype: modify replace: gidNumber gidNumber: 505 EOF ldapmodify -x -W -D "cn=admin,dc=com" -f modify_gid.ldif ? ### 客户端配置: cat >> /etc/nsswitch.conf << EOF
sudoers: ldap files
? ? ? ########################################## 配置ssh 秘钥登陆 # 拷贝 schema cp /usr/share/doc/openssh-ldap-5.3p1/openssh-lpk-openldap.schema /etc/openldap/schema/
#? /etc/openldap/sladp.conf 增加ssh schema include /etc/openldap/schema/openssh-lpk-openldap.schema # 重新生成新的配置文件: rm -rf /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d # 配置sshldap 配置文件? (我的环境没有配置设个配置文件也没有出问题,还不知道什么时候会用这个配置,但是还是配上吧,保险起见) cp /usr/share/doc/openssh-ldap-5.3p1/ldap.conf /etc/ssh/
# 增加下面配置文件到/etc/ssh/ldap.conf uri ldap://192.168.85.137/ base dc=hello,dc=com ssl no ? # 配置 /etc/ssh/sshd_config RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysCommand /usr/bin/get_pubkey #这个命令可以自己实现,只要最终能获取pubkey就行了,切结配置末尾不要有空格,否则会报错。 AuthorizedKeysCommandRunAs nobody ? # get_pubkey 内容(其实就是连接ldap 服务器然后把key 取回来): #!/bin/sh -e ldapsearch -x -D ‘cn=admin,dc=com‘ -w 123qaz! -b ‘ou=People,dc=com‘ -H ldap://192.168.85.137 ‘(&(objectClass=posixAccount)(uid=‘"$1"‘))‘ ‘sshPublicKey‘ | sed -n ‘/^ /{H;d};/sshPublicKey:/x;$g;s/n *//g;s/sshPublicKey: //gp‘ ? # user200增加新的属性以支持pubkey: cat >> add_objectclass.ldif << EOF ? # 向ldap server提交user200属性的的修改 ?ldapadd -x -w 123qaz!! -D "cn=admin,dc=com" -f add_objectclass.ldif ? ########################################### 限制用户只能登陆指定的主机 默认情况下用户可以登陆所有的主机,此时我们可以限制用户可以登陆哪些指定的主机,可以在客户端上配置?/etc/security/access.conf,也可以在openldap中限制,这里在openldap server端控制: 1.可以基于host 限制一个用户登陆哪些主机 2.也可以基于主机限制一个主机允许哪些用户登陆?? ? ########## 限制用户可以登陆哪些主机: # 导入新的schema cat > /etc/openldap/schema/ldapns.schema << EOF
# 配置/etc/slapd.conf,加入下面内容: include /etc/openldap/schema/ldapns.schema modulepath /usr/lib64/openldap moduleload dynlist.la overlay dynlist dynlist-attrset inetOrgPerson labeledURI ? # 重新生成数据库配置: rm -rf /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d chown -R ldap.ldap /etc/openldap/slapd.d/ #赋权,不然启动sladp 会报错 /etc/init.d/sladp restart #重启服务让配置生效 # 定义主机组redis和webserver,两个组里包含不同的主机: cat << EOF | ldapadd -x -W -H ldaps:/// -D cn=admin,dc=com dn: ou=servers,dc=com objectClass: organizationalUnit ou: servers dn: ou=redis,ou=servers,dc=com objectClass: organizationalUnit objectClass: hostObject ou: redis host: node1 host: node2 dn: ou=webserver,dc=com objectClass: organizationalUnit objectClass: hostObject ou: webserver host: node1 EOF ? # 用户增加新的属性,用来支持自动读取主机组里主机 dn: uid=user200,dc=com changetype: modify add: objectClass objectClass: hostObject - add: labeledURI labeledURI: ldap:///ou=webserver,dc=com?host ? #客户端/etc/pam_ldap.conf 增加配置: pam_check_host_attr yes ? # 通过上面的配置客户端已经可以自动获取主机组里配置的主机,但是现在是以组为单位,如果这是要单独加一台不属于任何组的主机,可以直接给用户添加host 属性,然后单独加入要登录的hostname: cat >> add_objectclass.ldif << EOF ok!,现在新增了一台主机Nod3 ? NOTE: 这样只能基于客户端的主机名来限制用户登陆,当用户登录时客户端会从ldap 查询用户属性里的host 字段是否和要登录的host 的hostname一致,如果一致就可以登陆,或则拒绝,所有一定要保证hostname 和属性利配置一致,而且如果要通过ssh登陆,必须保证/etc/pam.d/sshd 文件配置正确,否则检查host不会生效(具体配置本文开头已给出) ? ## 下面是第二种方式:指定主机允许哪些用户登陆: # 添加hosts 设备 dn: cn=node2,dc=com objectClass: ipHost objectClass: device objectClass: extensibleObject ipHostNumber: 192.168.85.139 cn: node2 uniquemember: uid=user200,ou=people,dc=com #指定允许登陆用户 ? # 客户端配置: /etc/pam_ldap.conf 增加配置: pam_groupdn cn=node2,dc=com
pam_member_attribute uniquemember
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |