碰巧所在的公司用到了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. Navicat 破解版链接

    本文为转载内容 百度网盘地址: https://pan.baidu.com/s/1nvIIOad 压缩包中有注册码和使用方法

  2. PAT 甲级 1080 Graduate Admission (30 分) (简单,结构体排序模拟)

    1080 Graduate Admission (30 分)   It is said that in 2011, there are about 100 graduate schools ready ...

  3. EasyNVR网页Chrome无插件播放摄像机视频功能二次开发之云台控制接口示例代码

    随着多媒体技术和网络通信技术的迅速发展,视频监控技术在电力系统.电信行业.工业监控.工地.城市交通.水利系统.社区安防等领域得到越来越广泛的应用.摄像头直播视频监控通过网络直接连接,可达到的世界任何角 ...

  4. 【Python学习之一】Python安装、IDE安装配置

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python2.X python3.X 所谓安装Python,安装的是 ...

  5. 【转】Fuel-openstack的搭建(二)

    原文链接:https://blog.csdn.net/qq_35180983/article/details/82181525 部署Openstack 3.1 登陆 登陆http://10.20.0. ...

  6. java File源码理解,探索File路径

    1.方法: new File(path); 我们知道根据输入的路径path的不同 ,File可以根据path的不同格式,来访问文件.那么,path的形式有几种呢? 根据源码 可以知道,输入的路径pat ...

  7. 罗辑思维首席架构师:Go微服务改造实践

    转自:http://www.infoq.com/cn/news/2018/05/luojisiwei 方圆 曾先后在 Cisco,新浪微博从事基础架构研发工作.十多年一直专注于后端技术的研发,在消息通 ...

  8. 使用JMeter进行Apache Kafka负载测试

    1.卡夫卡负载测试 在这个Apache Kafka教程中,我们将了解如何使用Apache JMeter,如何在Apache Kafka上执行Kafka负载测试.此外,这个Kafka负载测试教程教我们如 ...

  9. tcpdump网络调试

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

  10. SVN:修改文件后提示感叹号消失了处理办法

    使用SVN发现文件修改后,默认的修改标记红色感叹号不见了 重新显示设置方法: [右键]——[TortoiseSVN]——[Setting] 在[Icon Overlays]中选择[Default]即可 ...