碰巧所在的公司用到了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
192.168.85.139 node2

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
suffix "dc=hello,dc=com"

#编辑 /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 #检测配置文件是否有语法错误
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d #通过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=hello,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

# 新建ou,用来存放组:

dn: ou=Group,dc=hello,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

# 新建用户 user200

dn: uid=user200,ou=People,dc=hello,dc=com
uid: user200
cn: user200
sn: user200
objectClass: posixAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: shadowAccount
userPassword: {CRYPT}-s2a6QekMTXp6 #这里填的是密文密码,用slappasswd -c -s  命令生成
shadowLastChange:
shadowMin:
shadowMax:
shadowWarning:
loginShell: /bin/bash
uidNumber:
gidNumber:
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=hello,dc=com
ou: sudoers
objectClass: top
objectClass: organizationalUnit

# 新建组admin:

dn: cn=admin,ou=group,dc=hello,dc=com
cn: admin
gidNumber: 505
objectClass: posixGroup
objectClass: top

  

# 新建sudo 规则:

dn: cn=%admin,ou=sudoers,dc=hello,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,ou=People,dc=hello,dc=com
changetype: modify
replace: gidNumber
gidNumber: EOF ldapmodify -x -W -D "cn=admin,dc=hello,dc=com" -f modify_gid.ldif

### 客户端配置:

cat >> /etc/nsswitch.conf << EOF
sudoers: ldap files
EOF

########################################## 配置ssh 秘钥登陆

# 拷贝 schema

cp /usr/share/doc/openssh-ldap-.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
chown -R ldap.ldap /etc/openldap/slapd.d/ #赋权,不然启动sladp 会报错
/etc/init.d/sladp restart #重启服务让配置生效

# 配置sshldap 配置文件  (我的环境没有配置设个配置文件也没有出问题,还不知道什么时候会用这个配置,但是还是配上吧,保险起见)

cp /usr/share/doc/openssh-ldap-.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=hello,dc=com' -w 123qaz\! \
-b 'ou=People,dc=hello,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
dn: uid=user200,ou=People,dc=hello,dc=com
changetype: modify
add: objectclass
objectClass: ldapPublicKey
-
add: sshPublicKey
sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxKFoN4eC4bkKYDjK7YoivzGz2tpHbL2Gu4fyEIHrVDuxFwBHt2sKNG/Y56xDIwaMczeLgJkymjzfq7bZTJxZHAKN4x3qvzBA0UYSjnbr3YM9yMKqCllEWMjhVCchDI7vclO/VhsZRB/rSsGivIQjPEzwnn7qcnPhkqte6pa5i5C71NlcFf2Bz3HIE6zpcRFKEYrQgEcJa2fNFDUuY9PN5O1KRahSIPmg2mvWrr7DgTzI+TjCtlxrZuWXJPmJUuV2CWl9J4xcq5KV8Pf8LwlTvIuLx1hnYhojelM7LE4jh2mXweWl4My8xoeOw5hhJ9ekGTQgi1EeooVexguDHo/pnQ== root@node
EOF

# 向ldap server提交user200属性的的修改

ldapadd -x -w 123qaz\! -D "cn=admin,dc=hello,dc=com" -f add_objectclass.ldif

########################################### 限制用户只能登陆指定的主机

默认情况下用户可以登陆所有的主机,此时我们可以限制用户可以登陆哪些指定的主机,可以在客户端上配置 /etc/security/access.conf ,也可以在openldap中限制,这里在openldap server端控制:

1.可以基于host 限制一个用户登陆哪些主机

2.也可以基于主机限制一个主机允许哪些用户登陆

########## 限制用户可以登陆哪些主机:

# 导入新的schema

cat > /etc/openldap/schema/ldapns.schema << EOF
attributetype ( 1.3.6.1.4.1.5322.17.2.1 NAME 'authorizedService'
DESC 'IANA GSS-API authorized service name'
EQUALITY caseIgnoreMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.{} ) attributetype ( 1.3.6.1.4.1.5322.17.2.2 NAME 'loginStatus'
DESC 'Currently logged in sessions for a user'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
ORDERING caseIgnoreOrderingMatch
SYNTAX OMsDirectoryString ) objectclass ( 1.3.6.1.4.1.5322.17.1.1 NAME 'authorizedServiceObject'
DESC 'Auxiliary object class for adding authorizedService attribute'
SUP top
AUXILIARY
MAY authorizedService ) objectclass ( 1.3.6.1.4.1.5322.17.1.2 NAME 'hostObject'
DESC 'Auxiliary object class for adding host attribute'
SUP top
AUXILIARY
MAY host ) objectclass ( 1.3.6.1.4.1.5322.17.1.3 NAME 'loginStatusObject'
DESC 'Auxiliary object class for login status attribute'
SUP top
AUXILIARY
MAY loginStatus )
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=hello,dc=com
dn: ou=servers,dc=hello,dc=com
objectClass: organizationalUnit
ou: servers dn: ou=redis,ou=servers,dc=hello,dc=com
objectClass: organizationalUnit
objectClass: hostObject
ou: redis
host: node1
host: node2 dn: ou=webserver,ou=servers,dc=hello,dc=com
objectClass: organizationalUnit
objectClass: hostObject
ou: webserver
host: node1
EOF

# 用户增加新的属性,用来支持自动读取主机组里主机

dn: uid=user200,ou=People,dc=hello,dc=com
changetype: modify
add: objectClass
objectClass: hostObject
-
add: labeledURI
labeledURI: ldap:///ou=webserver,ou=servers,dc=hello,dc=com?host

#客户端/etc/pam_ldap.conf 增加配置:

pam_check_host_attr yes

# 通过上面的配置客户端已经可以自动获取主机组里配置的主机,但是现在是以组为单位,如果这是要单独加一台不属于任何组的主机,可以直接给用户添加host 属性,然后单独加入要登录的hostname:

cat >> add_objectclass.ldif << EOF
dn: uid=user200,ou=People,dc=hello,dc=com
changetype: modify
add: host
host: node3
EOF ldapadd -x -w 123qaz\! -D "cn=admin,dc=hello,dc=com" -f add_objectclass.ldif

ok!,现在新增了一台主机Nod3

NOTE: 这样只能基于客户端的主机名来限制用户登陆,当用户登录时客户端会从ldap 查询用户属性里的host 字段是否和要登录的host 的hostname一致,如果一致就可以登陆,或则拒绝,所有一定要保证hostname 和属性利配置一致,而且如果要通过ssh登陆,必须保证/etc/pam.d/sshd 文件配置正确,否则检查host不会生效(具体配置本文开头已给出)

## 下面是第二种方式:指定主机允许哪些用户登陆:

# 添加hosts 设备

dn: cn=node2,ou=servers,dc=hello,dc=com
objectClass: ipHost
objectClass: device
objectClass: extensibleObject
ipHostNumber: 192.168.85.139
cn: node2
uniquemember: uid=user200,ou=people,dc=hello,dc=com #指定允许登陆用户

# 客户端配置:

/etc/pam_ldap.conf 增加配置:

pam_groupdn cn=node2,ou=servers,dc=hello,dc=com
pam_member_attribute uniquemember

NOTE: 也可以借助下面两种方法实现(具体没去研究):

1./etc/pam_ldap.conf :

  pam_filter memberOf=cn=IP,ou=Hosts,dc=hello,dc=com

2./etc/nslcd.conf:

  filter shadow (&(objectClass=posixAccount)(memberOf=cn=IP,ou=Hosts,dc=hello,dc=com))
  filter passwd (&(objectClass=posixAccount)(memberOf=cn=IP,ou=Hosts,dc=hello,dc=com))

到这里已经完成了基本功能了,还有很多没有做,例如 访问控制,拒绝匿名用户访问,密码保护,密码字段禁止随便读,TLS,主从同步等,总之如果生成环境用的话这些都是不可避免的。ldap 网上能用的资料太少了,很少看了一篇教程就能完全搭出来,只是说如果在搭建过程中卡住了,这时候可以找下教程,说不定正好解决了你的问题,我一开始网上研究了下ldap,感觉云里雾里,理论太多,而且都比较抽象,后来买了本书叫 openldap实战指南,是某大勇写的,哎,看完一万个草泥马,很多地方按照他的文档根本搞不定,而且节奏太快,如果没有点linux 工作经验可能根本就看不懂,更抽的是那本书竟然没有提供书里的代码下载地址,全靠手敲。最后结合那本书和百度,谷歌各种鼓捣,花了三天,终于全部搞完了。总之ldap 这玩意儿,功能感觉还是挺强大的,建议还是静下心来研究下基础,否则网上的教程文档可能你根本就看不懂,这也情有可原,没人有义务或者有时间免费写一个小白教程,都只是以文档形式记录下自己的过程拿来自己备忘的。

搭建有几个点卡了很长时间:

1.AuthorizedKeysCommand /usr/bin/get_pubkey.sh     #这里是配置sshd 去ldap获取公钥的程序,配置的时候不小心在最后面多敲了空格,导致用户登陆的时候 cat /var/log/secure 始终找不到这个脚本。

2.配置了限制用户主机登陆后未生效,用户依然可以ssh登陆所有主机 ,但是通过控制台登陆却生效   #因为用户ssh登陆时 检查的是/etc/pam.d/sshd ,最后重新配置了这个文件问题解决

3.新建用户是指定了明文密码,但是ssh 登陆却失败,始终提示密码不正确     #最后看官网,linxu 支持crypt(3) 格式加密,后来用 slappasswd -c -s  重新生成密码后问题解决。

linux 利用LDAP身份集中认证的更多相关文章

  1. OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证

    导读 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门针对读取,浏览 ...

  2. Linux下LDAP统一认证解决方案

    Linux下LDAP统一认证解决方案 --http://www.cangfengzhe.com/wangluoanquan/3.html 转自:http://www.cnblogs.com/MYSQL ...

  3. Linux下基于LDAP统一用户认证的研究

    Linux下基于LDAP统一用户认证的研究                   本文出自 "李晨光原创技术博客" 博客,谢绝转载!

  4. 配置Linux使用LDAP用户认证

    配置Linux使用LDAP用户认证 本文首发:https://www.cnblogs.com/somata/p/LinuxLDAPUserAuthentication.html 我这里使用的是Cent ...

  5. linux利用sendmail发送邮件的方法

    Linux利用sendmail发送邮件, 方法1 安装sendmail即可使用, mail -s "test" user@sohu.com bin/mail会默认使用本地sendm ...

  6. APACHE + LDAP 的权限认证配置方法

    原文地址:http://www.chinaunix.net/jh/49/627646.html 一.前言 很多朋友希望利用 Apache 通过 LDAP 进行用户认证及权限管理.     通过多次试验 ...

  7. 如何在 Linux 中配置基于密钥认证的 SSH

    什么是基于 SSH 密钥的认证? 众所周知,Secure Shell,又称 SSH,是允许你通过无安全网络(例如 Internet)和远程系统之间安全访问/通信的加密网络协议.无论何时使用 SSH 在 ...

  8. [原创]django+ldap实现统一认证部分二(python-ldap实践)

    前言 接上篇文章 [原创]django+ldap实现统一认证部分一(django-auth-ldap实践) 继续实现我们的统一认证 python-ldap 我在sso项目的backend/lib/co ...

  9. [原创]django+ldap实现统一认证部分一(django-auth-ldap实践)

    前言 接之前我的文章,django+ldap+memcache实现单点登录+统一认证 ,ldap部署相关,ldap双机\LAM配置管理\ldap备份还原,目前来说,我们已经有了高可用性的ldap环境了 ...

随机推荐

  1. Shell流程控制语句while

    while语法格式: while 判断条件 do 命令 done while语句流程控制图: 实例: [root@youxi1 ~]# vim a.sh #!/bin/bash i=0 while [ ...

  2. Oracle的ole db连接字符串

    Provider=msdaora;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.59.22)(PO ...

  3. RobotFramework与Jenkins集成后发送groovy报告(比别处多了用例作者信息)

    https://www.cnblogs.com/gcgc/p/10037891.html 这篇文章中最终的发送报告是这个样子,每天大家看到这封邮件后也不知道是不是自己的用例错误了,导致大家不积极回复邮 ...

  4. 分享一下我的个人微信小程序

    分享一下我的个人微信小程序 1.有我平时整理的一些小程序相关的技术,供大家参考. 2.有几个好玩的例子 有问题可以一起参考

  5. 用Postman做接口测试

    The higher your test coverage, the more flexible and bug-resistant your code will be, and the less t ...

  6. LeetCode | 152. 乘积最大子序列

    原题(Medium): 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 思路: 遍历数组时且逐元素相乘时,如果遇到了0,在求乘积最大值的情况下,0左边的元素 ...

  7. python 之 前端开发( jQuery事件、动画效果、.each()、 .data())

    11.58 事件 11.581 事件绑定方法与解绑 绑定事件: // 绑定方式一: $('.box1').click(function () { alert('绑定方式一') }); ​ // 绑定方 ...

  8. Linux安装centos

    在虚拟机上安装centos 虚拟机使用win10自带的hyper-v非常好用 centos下载地址http://mirrors.aliyun.com/centos/7.6.1810/isos/x86_ ...

  9. Java性能调优—— VisualVM工具基本使用及监控本地和远程JVM进程超详细使用教程

  10. INNODB 统计信息采集

    SHOW GLOBAL VARIABLES LIKE 'INNODB_STATS_PERSISTENT_SAMPLE_PAGES'; ALTER TABLE TABLE_NAME STATS_SAMP ...