验证
什么是验证?
: 就像你上网登录用户名和密码,验证对了才能登陆成功,也就证明了你的身份; 你用钥匙打开家门,钥匙
能打开门就说明门验证了你是主人的身份。但如果有人偷了你的钥匙,然后打开了你家的门,那门的验证就
出问题了? 答案是否定的,门的验证并没有出错,因为它只认钥匙,而不认是谁在用钥匙。
如何提高验证的准确性和安全性?
: 可以加多条件验证。比如你在家门再安装声音识别,指纹识别,眼角膜识别等等来加强安全验证。同样的
道理,我们知道linux系统也有用户和密码,正确的用户名和密码就代表验证成功,那么我们是否也可以加多
条件来加强安全性呢? 当然可以。
PAM验证
(重要程度: )
PAM介绍
pamPluggable Authentication Modules for Linux)是linux可植入式验证模块。
linux系统的/lib64/security/目录下这里有大量的pam模块,查看模块的使用文档就是使用man(比如
pam_access.so模块,就使用man pam_access命令。当然man文档不容易看懂😃)
怎么配置PAM
: PAM的配置文件一般存放在/etc/pam.d/目录下,通过/etc/pam.d/目录下的文件名就知道是控制哪个程序
的,比如login是控制系统登录的,sshd是控制sshd服务的,passwd是控制passwd命令的。假设我要对系统登
录加安全条件,那么你就得去对应的配置文件/etc/pam.d/login里去加。
我们以/etc/pam.d/login此文件为例
# cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth    include   system-auth
account  required   pam_nologin.so
account  include   system-auth
password  include   system-auth
# pam_selinux.so close should be the first session rule
session  required   pam_selinux.so close
session  required   pam_loginuid.so
session  optional   pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user
context
session  required   pam_selinux.so open
session  required   pam_namespace.so
session  optional   pam_keyinit.so force revoke
session  include   system-auth
问题1:下面的条件怎样才能最终成功,怎样才会失败?
问题2:下面的条件怎样才能最终成功,怎样才会失败?
问题3:下面的条件怎样才能最终成功,怎样才会失败?
问题4:下面的条件怎样才能最终成功,怎样才会失败?
-session  optional   pam_ck_connector.so
每一行(非注释行)都代表了一个验证条件。每一行我们又分为三列。
第一列叫module-type(简单的看作是pam模块的分类就好了),主要为:
auth:对用户身份进行识别,如提示输入密码,判断是否root
account:对账号各项属性进行检查,如是否允许登录,是否达到最大用户数;
session:定义登录前,及退出后所要进行的操作,如登录连接信息,用户数据的打开和关闭,挂载fs
password:使用用户信息来更新数据,如修改用户密码。
第二列叫control-flag(控制多个条件之间的逻辑),主要为:
required:表示该行以及所涉及模块的成功是用户通过鉴别的必要条件。
requisite:与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。
sufficient:表示该行以及所涉及模块验证成功是用户通过鉴别的充分条件。
optional:他表示即便该行所涉及的模块验证失败用户仍能通过认证
include: 包含后面的子配置文件,如果子配置文件里流程失败,也会退出父流程。
substack: 包含后面的子配置文件,如果子配置文件里流程失败,只退出子配置流程,不退出父流程。
第三列就是模块名。
比较难理解的是第二列,它代表了多个条件之间的逻辑。
举个例子,你是男的,要去相亲,requisitesufficientrequiredoptional怎么对应下面的条件才合你的
标准?:
1,性别女 requisite sufficient required optional
2,长得美  required
3,身材好 required
4,年龄比自己小 required
5,985毕业 required
条件一 required
条件二 required
条件三 required
成功: 三个条件都pass; 失败: 任意条件failed都失败,并且不会告诉你是哪一个条件failed.
条件一 required
条件二 requisite
条件三 required
成功: 三个条件都pass; 失败: 条件二failed就直接失败,并且不会验证条件三.
条件一 sufficient
条件二 required
条件三 required
成功: 条件一pass直接成功。条件一failed,但条件二,三pass也成功。 失败:条件二或三任意一个failed.
问题5:下面的条件有哪几种情况才能最终成功?
你可以这样理解:
PAM的各种模块就是相当于具备各种功能的锁(如:普通机械锁,可能还有看门狗,密码锁,声音识别,指纹识别,
人脸识别,眼角膜识别等)。我们要把这些锁安装到门或柜子这些需要加强安全的地方(门和柜子在linux里就是类
似系统login,ssh登录,ftp登录这种相应的程序)。你可以控制按顺序打开所有的锁才能进入,或者打开其中一个或
几个锁就可以成功进入(配置文件第二列的逻辑有关)。
所以PAM可能有无数种应用可能,如果你够牛逼,你可以把系统登录写上100个条件,再把逻辑打乱,那么除了你
谁也进不来了(条件太多,逻辑太复杂),这就是PAM加强安全验证的精髓。当然,实际应用时不会这么变态(这
就像我骑个单车出去,还要带100把锁锁上,这有点过分了)。所以我们一般会在原有的基础做一两个条件的增加
或更改,这还是非常实用的。下面就有一些小实例,希望有抛砖引玉的效果。
PAM实例
实例1: 禁止所有非root用户登录
条件一 requisite
条件二 sufficient
条件三 required
条件四 required
成功: 条件一,二pass就成功。条件一,三,四pass,二failed也成功。失败: 条件一failed。一pass,
failed,三,四任意一个failed
条件一 required
条件二 requisite
条件三 required
条件四 sufficient
条件五 required
条件六 required
条件七 requisite 
条件八 sufficient
条件九 required
条件十 required
--注意:required如果失败,不会验证后面的sufficient
三种成功可能:
1,条件一,二,三,四pass
2,条件一,二,三,五,六,七,八pass,failed
3,条件四,八failed,其它都pass
实例2: 使用pam实现服务登录的黑名单或白名单
实例3: 使用pam实现时间控制
根据/etc/pam.d/login的第四行来进行测试,这一行默认就有,不需要做任何修改
account  required   pam_nologin.so
# touch /etc/nologin
然后登出用户,再用普通用户登录测试,发现所有普通用户都登录不了系统了
# rm /etc/nologin -rf
删除此文件,普通用户又可以登录
测试时,可以用init 3切换到3级别,然后使用普通用户登陆来测试,或者远程用普通用户ssh来测试。不要使用su -
普通用户测试。
根据/etc/pam.d/vsftpd的第二行进行测试
auth    required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers
onerr=succeed
/etc/vsftpd/ftpusers文件里列出的用户,就算是你加入了白名单,也登录不了,如果你把这个用户名
/etc/vsftpd/ftpusers文件里删掉,或者把sense=deny改为sense=allow,那么这个用户就可以登录ftp
可以通过查看/var/log/secure日志看到pam相关的拒绝信息
前两个例子就是用于控制系统用户登录的,你可以将这两个模块应用到ssh,ftp,samba等相关服务也可以实现相同的
效果
对系统登陆加上时间控制
# vim /etc/pam.d/login --把下面这句加到最前面
account   requisite   pam_time.so
# vim /etc/security/time.conf --然后修改这个配置文件,在最后加上
login;*;abc;!Th1700-1800 --表示针对login程序实现abc用户在任何终端(只对tty终端有效,图形登录
无效)非周四的17点到18点才能登录
login;tty1;abc;!We1100-1300 --abc用户在周三的11点到13点不能在tty1登录系统,但可以在tty2,tty3
其它终端正常登录
sshd服务加上时间控制
# vim /etc/pam.d/sshd --把下面这句加到最前面
account   requisite   pam_time.so
# vim /etc/security/time.conf
sshd;*;abc;!Th1700-1800 --这样测试就是abc用户在周四的17点到18点不能ssh登录
课后练习:按上面原理对vsftpdsamba等实现时间控制。
实例4: 控制密码复杂度 (centos6及以前用的是pam_cracklib模块,centos7pam_pwquality模块。但centos7
仍然可以使用pam_cracklib模块,pam_pwquality模块也完全兼容pam_cracklib模块的参数)
实例5: 防止暴力猜root密码
实例6: 控制本地登录的终端
pam_cracklib.so用法
# vim /etc/pam.d/passwd --在此文件最前面加上下面一行
password required pam_cracklib.so minlen=8 minclass=4 difok=3 maxrepeat=3
maxsequence=5
测试:使用普通用户自己改自己的密码来测试(这里要求是长度为8,字符类型要包含4:数字,小写字母,大写字
母,符号;difok=3表示新改的密码和老密码最少需要变动3个字符)
maxrepeat=3表示重复相同字节不要超过3个,比如666可以,但6666就不行
maxsequence=5表示类似12345febcd这种连续字节不能超过5
pam_pwquality用法
配置方法一:
# vim /etc/pam.d/passwd
password required pam_pwquality.so dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
minlen=8 disfok=3 retry=3 --参数写到这里,那么没写的参数会使用/etc/security/pwquality.conf
文件里的默认值
配置方法二:
# vim /etc/pam.d/passwd
password required pam_pwquality.so --这里不写参数,把参数写
/etc/security/pwquality.conf
# vim /etc/security/pwquality.conf
dcredit=-1
ucredit=-1
lcredit=-1
ocredit=-1
minlen=8
disfok=3
retry=3
因为pam_pwquality模块兼容pam_cracklib模块的参数,所以下面主要介绍几个不同的参数:
dcredit=N:定义用户密码中最多包含N个数字(-1表示至少有一个)
ucredit=N:定义用户密码中最多包含N个大写字母
lcredit=N:定义用户密码中最多包含N个小些字母
ocredit=N:定义用户密码中最多包含N个特殊字符
注意:这两个模块对root无效
# vim /etc/pam.d/sshd --把下面这句加到最前面
auth  required  pam_tally2.so deny=3 even_deny_root root_unlock_time=600
表示连续失败的次数等于或超过3次,就会锁定600秒。
服务器端可以通过pam_tally2 --user=root命令查看连续失败的次数。成功ssh登录后,失败次数会清零。
服务器端也可以使用pam_tally2 --user=root --reset把连续失败次数清零。
实例7: 限制用户会话对系统资源的使用
课后思考题目
我有一个公网上的服务器,实现需求:
1. 拒绝root用户的本地登录和远程ssh登录
2. 控制普通用户的密码复杂度为:小写字母,大写字母,数字,符号四类都需要,其它默认
3. 控制普通用户远程ssh密码登录三次则锁定10分钟
4. 控制普通用户远程ssh只能同时登录一个终端
5. 控制普通用户只能7:00-22:00点才能远程ssh登录
权限
大家都学习过了系统的基本文件权限(r,w,x,s,t权限位和文件ACL等), 用户权限 。这里给大家补充两个与权限有关
的知识点:sudoselinux
sudo
# vim /etc/pam.d/login --验证此文件默认有的第一句pam_securetty模块
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
# vim /etc/securetty
tty2 --只留下tty2,表示只能在tty2进行root用户登录(非root用户不受影响);还可以把这
里的终端全去掉,实现root用户无法登录,只能使用普通用户登录(后面讲sudo会提到这种管理方式)
扩展:
# vim /etc/pam.d/sshd --加上下面这一句
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
# vim /etc/securetty
tty2
ssh --这里要加上ssh(不是sshd)才能允许远程ssh登录
# vim /etc/pam.d/sshd --把下面这句加到最前面
session  required   pam_limits.so
# vim /etc/security/limits.conf
abc   hard  maxlogins    2 --表示abc普通用户,最多只能ssh登录两个,第三个登录就会
被拒绝
当然pam_limits.so模块还可以应用于很多其它资源限制场景,比如像oracle,nginx这种大并发的软件调大限制
nofile(进程能打开的文件描述符数),nproc(用户能打开的进程数),因为系统默认的限制比较保守。
(重要程度: )
sudo介绍
问题:
1. 一个公司大概三十台服务,3个运维(1组长,2个小弟),工作怎么分?
按时间 一人十台 按职责来分
2. 公司一个lnmp测试环境,(测试环境--》生产环境) ,开发人员也要连接到测试环境系统上,怎么给开发人员
权限?
3. 一个小公司,就几台服务器,一个运维,如何防止自己误操作?
man sudo得到的标准定义为execute a command as another user,意为用另一个用户的身份来执行命令。
在前面的学习中遇到的能够转换用户身份来执行命令的方法有:
1, suid,sgid(也就是s: -rwsr-xr-x )
2, # su - user1 <<EOF
touch 123
exit
EOF
3, su - user1 -c "touch 123"
sudo实例
实例1: root授予普通用户abc所有权限(此做法安全隐患大),实际环境尽量考虑权限最小化
# useradd abc
# echo 123 | passwd --stdin abc
# vim /etc/sudoers
91 root  ALL=(ALL)    ALL
92 abc   ALL=(ALL)    ALL --加上这一句表示把所有的相关权限给abc用户
# su - abc
$ touch /root/abc --abc不允许在root家目录创建文件
touch: cannot touch `/root/abc': Permission denied
$ sudo touch /root/abc --命令前加sudo,第一次使用sudo,会有下面的一段话
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
 #1) Respect the privacy of others.
 #2) Think before you type.
 #3) With great power comes great responsibility.
实例2: 直接使用完整命令授予普通用户abc部分权限
实例3: 使用命令授予普通用户abc部分权限
实例4: 使用命令别名授予普通用户abc部分权限
练习题目:
运维组长老李(root),手下有5个新员工。现在分配各自的权限,规则如下:
网络路由管理: 张三(zhangsan),李四(lisi)
磁盘管理: 王五(wangwu),马六(maliu)
软件包管理: 田七(tianqi)
如何实现?
[sudo] password for abc: --输入的是abc的密码,而不是root的密码,就可以成功创建
$ sudo ls -l /root/abc --再次用sudo就不需要输入密码了,也可以看到其实还是用的root的身份
-rw-r--r-- 1 root root 0 Nov 7 09:59 /root/abc
# vim /etc/sudoers
91 root  ALL=(ALL)    ALL
92 abc   ALL=/usr/bin/touch /root/222,/usr/bin/touch /root/333  
这里表示只给abc用户touch /root/222touch /root/333的权限,那么abcsudo ls -l /root/222都不
行。(注意,命令要写绝对路径)
# vim /etc/sudoers
91 root  ALL=(ALL)    ALL
92 abc ALL=/usr/sbin/route
这里表示abc用户可以使用route命令的所有权限,包括使用route增删路由,增删网关等
# vim /etc/sudoers
Cmnd_Alias NETWORKING = /usr/sbin/route,/usr/sbin/ifconfig
root  ALL=(ALL)    ALL
abc   ALL=NETWORKING  
多条命令可以一起定义一个别名,然后直接把别名授权给用户
小结: root用户授予相应的权限给普通用户(权限最小化的原则),普通就可以不使用root密码来实现root相应的
权限,即使做了误操作,也能相应防护。
LDAP(拓展)
LDAP 轻量级目录访问协议(Lightweight Directory Access Protocol
关系型数据库
员工表 工号 姓名 性别 生日 工资 奖金 部门 职位 上级领导工号 100 张三 1990-01-01 10000 50000 it 1 10 101
李四 1991-01-01 10000 50000 it 2 10
ldap树状结构
cn=zhangsan,dc=itcast,dc=com
ou=it,dc=itcast,dc=com
c countryName(国家) o organization(组织-公司) ou organization unit(组织单元-部门) dc
domainComponent(域名) cn common name(常用名称)
dn Distinguished Name唯一名,不能与其它重复
实验过程:
o=itcast公司 (dc=itcast,dc=com)
|
|---------|----------|
ou=管理层    ou=员工 ou=部门分组
  |
|
|----------|
cn=张三 cn=李四
准备一台kvm虚拟机做ldap服务器
准备工作:
1,主机名
2,关闭防火墙,selinux
3,时间同步
4,配置本地yum
第一步:安装相关软件包
# yum install openldap openldap-servers openldap-clients openldap-devel
migrationtools --只需要本地yum源就可以了
# slapd -V --确认版本
@(#) $OpenLDAP: slapd 2.4.40 (Nov 6 2016 01:21:28) $
mockbuild@worker1.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.40/openldap-
2.4.40/servers/slapd
第二步:拷贝数据库模版文件,修改权限并启动服务
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap.ldap -R /var/lib/ldap/
# netstat -ntlup |grep :389 --先确认389端口没有启动,如果已经启动了可以pkill slapd杀掉进程,再启
# systemctl start slapd
# systemctl enable slapd
# netstat -ntlup |grep :389
tcp    0   0 0.0.0.0:389       0.0.0.0:*        LISTEN  
10270/slapd    
tcp6    0   0 :::389         :::*          LISTEN  
10270/slapd  
第三步:设置管理员密码,并添加到配置文件中
# slappasswd
New password:
Re-enter new password:
{SSHA}g/4TYKKn1rcat7Ebvm0HIoHzo3Nzdi8X
# vim /tmp/change_root_pw.ldif --LDIFLDAP Interchange Format)格式
dn: olcDatabase={0}config,cn=config --
/etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif文件(此版本不要直接用vi去修
改配置文件,需要写成ldif文件再ldapadd增加到配置文件)
changetype: modify --要对文件做修改(add也是修改)
add: olcRootPW --增加一个叫olcRootPW的条目
olcRootPW: {SSHA}g/4TYKKn1rcat7Ebvm0HIoHzo3Nzdi8X --增加的密码为前面用slappasswd命令创建的
密码
# ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/change_root_pw.ldif --导入数据,导入
后可以去/etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif文件里查看多了一行
olcRootPW条目
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
第四步:
LDAP中导入一些基本的 Schema。这些Schema文件位于/etc/openldap/schema/目录中,schema控制着条目拥
有哪些对象类和属性
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"
第五步:配置自己的域为dc=itcast,dc=com,管理员为cn=admin,dc=itcast,dc=com
# cat /tmp/change_domain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
read by dn.base="cn=admin,dc=itcast,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=itcast,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=itcast,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}g/4TYKKn1rcat7Ebvm0HIoHzo3Nzdi8X --密码对应前面的
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=admin,dc=itcast,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=itcast,dc=com" write by * read
# ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/change_domain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
# slaptest -u --测试配置文件是否有异常
config file testing succeeded
第六步:把基本的域信息定义并导入
dc=itcast,dc=com
|
|------------------|
people group
用户
zhangsan zhangsan
lisi lisi
# cat /tmp/basedomain.ldif
dn: dc=itcast,dc=com
changetype: add
objectClass: top
objectClass: dcObject
objectClass: organization
o: itcast Company
dc: itcast
dn: cn=admin,dc=itcast,dc=com
changetype: add
objectClass: organizationalRole
cn: admin
dn: ou=People,dc=itcast,dc=com
changetype: add
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=itcast,dc=com
changetype: add
objectClass: organizationalRole
cn: Group
# ldapmodify -x -D cn=admin,dc=itcast,dc=com -W -f /tmp/basedomain.ldif
Enter LDAP Password: --输入前面定义的密码
adding new entry "dc=itcast,dc=com"
adding new entry "cn=admin,dc=itcast,dc=com"
adding new entry "ou=People,dc=itcast,dc=com"
adding new entry "ou=Group,dc=itcast,dc=com"
第七步:导入数据(可以自己写ldif文件导入,也可以使用我下面的做法,:/etc/passwd,/etc/shadow里的用户
信息migrateldif文件,再导入)
# vim /usr/share/migrationtools/migrate_common.ph
71 $DEFAULT_MAIL_DOMAIN = "itcast.com";
74 $DEFAULT_BASE = "dc=itcast,dc=com";
90 $EXTENDED_SCHEMA = 1;
[root@vm1 ~]# useradd zhangsan
[root@vm1 ~]# useradd lisi
[root@vm1 ~]# echo 123456 | passwd --stdin zhangsan
Changing password for user zhangsan.
passwd: all authentication tokens updated successfully.
[root@vm1 ~]# echo 123456 | passwd --stdin lisi
Changing password for user lisi.
passwd: all authentication tokens updated successfully.
[root@vm1 ~]# tail -2 /etc/passwd > /tmp/user
[root@vm1 ~]# tail -2 /etc/group > /tmp/group
[root@vm1 ~]# /usr/share/migrationtools/migrate_passwd.pl /tmp/user > /tmp/user.ldif
[root@vm1 ~]# /usr/share/migrationtools/migrate_group.pl /tmp/group > /tmp/group.ldif
# ldapadd -x -D cn=admin,dc=itcast,dc=com -W -f /tmp/user.ldif
Enter LDAP Password:
adding new entry "uid=zhangsan,ou=People,dc=itcast,dc=com"
adding new entry "uid=lisi,ou=People,dc=itcast,dc=com"
# ldapadd -x -D cn=admin,dc=itcast,dc=com -W -f /tmp/group.ldif
Enter LDAP Password:
adding new entry "cn=zhangsan,ou=Group,dc=itcast,dc=com"
adding new entry "cn=lisi,ou=Group,dc=itcast,dc=com"
第八步:安装图形管理openldap的工具phpldapadmin
# yum install epel-release
# yum install httpd php php-ldap php-gd php-mbstring php-pear php-xml php-bcmath php-
mbstring phpldapadmin --php-bcmathphp-mbstringcentos163源里,phpldapadminepel
# vim /etc/phpldapadmin/config.php
$servers->setValue('login','attr','dn'); --397行,打开注释
// $servers->setValue('login','attr','uid'); --398行,注释掉
# vim /etc/httpd/conf.d/phpldapadmin.conf
<Directory /usr/share/phpldapadmin/htdocs>
<IfModule mod_authz_core.c>
 # Apache 2.4
 Require local
 Require ip 192.168.72.0/24 --指定允许访问的IP或网段
</IfModule>
[root@vm1 ~]# systemctl restart httpd
[root@vm1 ~]# systemctl enable httpd
http://192.168.72.129/phpldapadmin/ --用浏览器访问
用户名:cn=admin,dc=itcast,dc=com
密码: --前面自己定义的密码
客户端操作
# yum install nss-pam-ldapd
# authconfig-tui --Use LDAPUse LDAP Authentication前打*,把Use Shadow Passwords前面
*去掉
下一步:填上ldap服务器的ipdn
ldap://192.168.72.129
dc=itcast,dc=com
测试:
下面的命令发现zhangsan,lisi,wangwu用户可以用id命令查出来(但是客户端自己是没有这几个用户的,说明是通
ldap服务器验证得到的)
# id zhangsan
uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan)
# id lisi
uid=1002(lisi) gid=1002(lisi) groups=1002(lisi)
# id wangwu
uid=1003(wangwu) gid=1003(wangwu) groups=1003(wangwu)