一、 LDAP概念
http://wiki.jabbercn.org/index.php/OpenLDAP2.4%E7%AE%A1%E7%90%86%E5%91%98%E6%8C%87%E5%8D%97
#中文文档
http://www.openldap.org/doc/admin24/
#官方英文文档
LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP,类似DNS的树形结构来组织信息
一般情况下,LDAP需要结合Kerberos做认证,kerberos提供了一个不需要传输密码的情况下,可以给你和你想使用的服务之间建立信任关系的服务,而且不需要你每次都输入密码。实现单点登陆
1、 entry
条目,也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。
2、 dn
每一个条目都有一个唯一的标识名(distinguished Name ,DN)
类似URI的功能
CN, OU, DC 都是 LDAP 连接服务器的端字符串中的区别名称(DN, distinguished name)
LDAP连接服务器的连接字串格式为:ldap://servername/DN
其中DN有三个属性,分别是CN,OU,DC
DC (Domain Component)
OU (Organizational Unit)
CN (Common Name)
CN=Common Name 为用户名或服务器名,最长可以到80个字符,可以为中文;
OU=Organization Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;
O=Organization 为组织名,可以3—64个字符长
C=Country为国家名,可选,为2个字符长
例如:CN=test,OU=developer,DC=domainname,DC=com
在上面的代码中 cn=test 可能代表一个用户名,ou=developer 代表一个 active directory 中的组织单位。这句话的含义可能就是说明 test 这个对象处在domainname.com 域的 developer 组织单元中。
3、 Attribute
每个条目都可以有很多属性(Attribute),比如常见的人都有姓名、地址、电话等属性。每个属性都有名称及对应的值,属性值可以有单个、多个,比如你有多个邮箱。
属性不是随便定义的,需要符合一定的规则,而这个规则可以通过schema制定。比如,如果一个entry没有包含在 inetorgperson 这个 schema 中的objectClass: inetOrgPerson,那么就不能为它指定employeeNumber属性,因为employeeNumber是在inetOrgPerson中定义的。
一些常用的别名:
dn:一条entry的唯一路径
cn:用户的全名
sn:用户的姓
uid:用户的登陆名称
c:两个字符的国家代码,比如:中国,cn
o:组织名称(公司名)
ou:部门名称
mail:邮件地址
4、 schema
schema定义了哪些属性可用,以及属性的格式(类似mysql的约束)
比如:电话号码,就不能输入英文字母,否则报错
openlda默认自带RFC标准的schema,如果没有特殊需求,导入即可
5、 ObjectClass
对象类是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。
比如,人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工(organizationalPerson)是人员(person)的继承类,除了上述属性之外还含有职务(title)、邮政编码(postalCode)、通信地址(postalAddress)等属性。
6、 LDIF
LDIF(LDAP Data Interchange Format,数据交换格式)是LDAP数据库信息的一种文本格式,用于数据的导入导出,每行都是“属性: 值”对
LDIF文件是OpenLDAP操作数据或修改配置的一切来源
二、 LDAP安装配置
1、 安装LDAP服务端
yum源:
1.centos7的OS源
2.epel源
yum install -y openldap-servers openldap-clients
#openldap-servers,服务端
#openldap-clients,客户端工具箱,包含ldapadd等工具
2、 配置
https://www.openldap.org/doc/admin24/slapdconf2.html
OpenLDAP 2.4有两种配置方式:
(1)slapd.conf配置文件,这是旧版本的配置方式
(2)数据库(cn=config),这是新的推荐的配置方式
2.1、 主配置
slappasswd
#产生一个加密过后的密码
vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
olcSuffix: dc=example,dc=com
olcRootDN: cn=Manager,dc=example,dc=com
olcRootPW: {SSHA}oe7odi30W9Jy4YbqW348HV4p7B5n6khU
olcAccess: {0}to attrs=userPassword by self write by dn.base="cn=Manager,dc=example,dc=com" write by anonymous auth by * none
olcAccess: {1}to * by dn.base="cn=Manager,dc=example,dc=com" write by self write by * read
#定义一个管理员,中Manager,并且设定密码
#注意,密码为上面slappasswd命令创建的加密过后的密码
2.2、 测试配置文件
slaptest -u
2.3、 启动服务
systemctl start slapd
systemctl enable slapd
3、 导入schema
ls /etc/openldap/schema/*.ldif |xargs -I {} ldapadd -Y EXTERNAL -H ldapi:/// -f {}
4、 定义命名空间
也就是定义整个组织的架构
vi /etc/openldap/base.ldif
dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
dc: example
o: ldap
#定义suffix,也就是目录树的最顶端
dn: ou=People,dc=example,dc=com
objectclass: organizationalUnit
ou: People
#在根下面定义一个分支,叫people,使用部门这个类,表示这定义的是一个部门信息
dn: ou=Group,dc=example,dc=com
objectclass: organizationalUnit
ou: Group
注意:
1.多个dn之间必须使用一个空行来隔离
2.最后一个dn定义完成之后,不能有空行
3.dn最左边的定义项(RDN),必须出现在属性描述里
ldapadd -x -D cn=Manager,dc=example,dc=com -W -f /etc/openldap/base.ldif
#使用ldapadd工具,将上面的定义,写进数据库
5、 查询
ldapsearch -x -D cn=Manager,dc=example,dc=com -w
#默认查询所有内容
6、 migrationtools迁移用户
migrationtools,将本地/etc/passwd和/etc/group文件,转换成ldif文件
6.1、 安装
yum install -y migrationtools
6.2、 迁移用户组
useradd demouser1
useradd demouser2
vi /usr/share/migrationtools/migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "example.com";
$DEFAULT_BASE = "dc=example,dc=com";
$EXTENDED_SCHEMA = 1;
grep demo /etc/passwd > /tmp/users
grep demo /etc/group > /tmp/groups
cd /usr/share/migrationtools/
./migrate_passwd.pl /tmp/users /tmp/users.ldif
./migrate_group.pl /tmp/groups /tmp/groups.ldif
ldapadd -x -D cn=Manager,dc=example,dc=com -w redhat -f /tmp/groups.ldif
ldapadd -x -D cn=Manager,dc=example,dc=com -w redhat -f /tmp/users.ldif
注意:
默认,会有一个Manager的管理员
6.3、 查询
ldapsearch -H ldap://172.25.254.142 -x -b "ou=People,dc=example,dc=com"
#查询ou为People的信息
ldapsearch -H ldap://172.25.254.142 -x -b "uid=demouser1,dc=example,dc=com"
#查询uid为demouser1的信息
6.4、 修改密码
ldappasswd -x -D "cn=Manager,dc=example,dc=com" \
-w redhat "cn=demouser1,dc=example,dc=com" -s New_PASS
#管理员修改普通用户密码
7、 安装web
yum install -y httpd phpldapadmin
#phpldapadmin,ldap的web程序,在EPEL源中
vi /etc/phpldapadmin/config.php
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','port',389);
$servers->setValue('server','base',array('dc=example,dc=com'));
$servers->setValue('login','auth_type','session');
#取消上述行的注释
// $servers->setValue('login','attr','uid');
#将这行注释掉
vi /etc/httpd/conf.d/phpldapadmin.conf
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
</IfModule>
vi /etc/openldap/base.ldif
dn: dc=example,dc=com
o: ldap
objectclass: dcObject
objectclass: organization
dc: example
#定义根节点
ldapadd -f /etc/openldap/base.ldif -x -D cn=Manager,dc=example,dc=com -W
#创建根节点
#注意,根节点必须命令行创建,web没法创建根
systemctl start httpd
systemctl enable httpd
firefox http://172.25.254.142/phpldapadmin/
username:cn=Manager,dc=example,dc=com
8、 LDAP客户端
方法一,pam直接去找ldap服务器,这样如果中间网络出问题,客户端就没办法登陆
方法二,在客户端上安装一个缓存服务(sssd或nss),pam找这个缓存服务去拿认证信息,然后缓存服务和ldap服务器通讯,拿到认证信息交给pam,并缓存到本地,这样,就可以实现客户端脱机状态也可登陆。
注意:
如果要通过客户端的sssd进行LDAP认证,必须开启TLS加密。sssd不支持不加密的认证通道。
8.1、 使用NSS配置
有两个图形工具,都可以:
system-config-authentication
#纯图形化
authconfig-tui
#字符图形化
yum install -y nss-pam-ldapd
#nss-pam-ldapd,是pam模块和nss模块的集合
#让PAM身份验证服务使用 OpenLDAP 服务器中的用户
authconfig-tui
getent passwd demouser1
id demouser1
注意,
默认ldap用户在客户端本地是没办法创建家目录的
9、 配置TLS加密
http://www.openldap.org/doc/admin24/tls.html#Server%20Certificates
如果要通过客户端的sssd进行LDAP认证,必须开启TLS加密。sssd不支持不加密的认证通道。
9.1、 创建CA机构
cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
touch serial index.txt
echo 01 > serial
9.2、 生成用户证书
cd /etc/pki/tls/certs
(umask 077;openssl genrsa -out slapd.key 1024)
#创建key
openssl req -new -key slapd.key -out slapd.csr
#创建请求文件
openssl ca -in slapd.csr -out slapd.crt -days 3650
#由CA机构生成用户证书
注意:
ldap用户必须有读取证书的权限
chown root.ldap slapd.*
chmod 750 slapd.*
9.3、 配置服务端
vi /etc/openldap/slapd.d/cn\=config.ldif
olcTLSCACertificateFile: /etc/pki/CA/cacert.pem
olcTLSCertificateFile: /etc/pki/tls/certs/slapd.crt
olcTLSCertificateKeyFile: /etc/pki/tls/certs/slapd.key
#指定3个文件的位置
#删除TLSCACertificatePath
systemctl restart slapd
注意:
1.TLSCACertificatePath,指CA证书所在目录,指定的路径下面只能放CA证书,不能放其它证书
2.TLSCACertificatePath和olcTLSCACertificateFile这两个参数冲突,二选一
9.4、 测试
ldapsearch -x -D "cn=Manager,dc=example,dc=com" -W -Z
#-Z,使用加密连接
9.5、 配置客户端
yum install -y sssd
#使用sssd缓存用户信息,实现单点登陆
mkdir /etc/openldap/cacerts/
#sssd默认查找ca证书的路径
scp root@server.example.com:/etc/pki/CA/cacert.pem /etc/openldap/cacerts/
#在server端,将CA证书拷过来
authconfig-tui
注意:
1.会更改三个配置文件:/etc/sssd/sssd.conf 、/etc/nsswithch.conf、/etc/pam.d/system-auth
2.配置结束,sssd服务自动启动
10、 nfs共享家目录
10.1、 服务端NFS共享
yum install -y nfs-utils
vi /etc/exports
/home *(rw,sync)
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
10.2、 客户端autofs挂载
yum install -y nfs-utils autofs
vi /etc/auto.master
/home /etc/auto.autofs --timout=600
vi /etc/auto.autofs
* kerberos.example.com:/home/&
systemctl enable autofs
systemctl start autofs
三、 kerberos
kerberos和ldap结合,ldap存储用户信息,kerberos实现认证
也就是密码要由kerberos来存储
1、 名称解释
KDC,票据分发中心
realm,就是域名,要大写
注意:
Kerberos 要求参与通信的主机的时钟同步。票据具有一定有效期,因此,如果主机的时钟与 Kerberos 服务器的时钟不同步,认证会失败。默认设置要求时钟的时间相差不超过 10 分钟。
2、 kerbors身份验证过程
有一个中间人叫KDC(钥匙分发中心),他为用户端生成好密码,并分发给用户
1.KDC知道所有人的密码,因为客户端的密码就是由KDC生成的
2.每个人都知道自己的密码
3.所有人都向KDC申请验证
客户端输入用户密码-->密码hash保存到本地,用户名以明文发给KDC,请求验证
KDC收到请求,在数据库搜索该用户,找到,就用该用户的密码hash值加密一个TGT(key1),发送给客户端。
客户端收到TGT(key1),如果上面输入的密码正确,就可以解密,验证成功,并将解开的TGT缓存到本地
客户端-->向KDC申请访问某个服务的请求,KDC将生成一个新的TGT,将新的TGT用key1加密,生成key2;再用服务的密码加密,生成key3,都发给客户端
客户端拿到这两个加密的TGT,将用自己key1解开key2;然后用解开的新TGT加密系统当前的时间戳,生成key4,然后将key4和key3一起发给要访问的服务
服务收到这两个key,用自己的密码解开key3,拿到TGT,然后解开key4,如果能解开,说明客户端可信。
3、 安装kerberos
yum install -y krb5-server
#安装kerberos
4、 配置
通用配置文件
vi /etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
default_realm = EXAMPLE.COM
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
EXAMPLE.COM = {
kdc = kerberos.example.com
admin_server = kerberos.example.com
}
#注意,要能解析
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
注意:
不管服务端,还是客户端,都会用到/etc/krb5.conf
5、 初始化kerberos
kdb5_util create -s -r EXAMPLE.COM
#创建kerberos的数据库,并设置数据库密码
#-s,表示将密码保存为文件,不用每次启服务时,需要输入密码
systemctl start kadmin
systemctl start krb5kdc
systemctl enable krb5kdc
systemctl enable kadmin
6、 创建票据
6.1、 principal概念
Kerberos认证的唯一ID叫principal,由primary、instance、realm三部分组成
6.2、 创建principal
kadmin.local
?
#查看帮助
addprinc root/admin
#创建一个用户root,角色是admin
#并创建密码
addprinc demouser1
addprinc demouser2
#设置两个用户的密码
#注意,这两个用户信息存在LDAP中
addprinc -randkey host/node2.example.com
#创建主机,即kerberos客户端主机
#-randkey,主机密码随机设置
listprincs
#列出创建的princ
quit
7、 客户端配置
SSSD在LDAP目录中查找用户,然后联系Kerberos KDC进行身份验证并获取票证。
这么多配置文件,很容易出错,所以建议使用工具,进行配置:
authconfig,命令行
authconfig-tui,文本图形
authconfig-gtk,图形
7.1、 装包
yum install -y krb5-workstation sssd pam_krb5
#krb5-workstation,kerberos客户端
#sssd,安全服务守护进程,负责检索和缓存用户信息和身份验证信息
#pam_krb5,默认,kerberos会绕过pam,安装此包,就是让使用pam的应用程序可以使用kerberos进行身份验证
7.2、 配置文件
scp root@server.example.com:/etc/krb5.conf node1:/etc
#拷贝kerberos服务器的/etc/krb5.conf过来
mkdir /etc/krb5.conf.d/
#因为配置文件里有includedir /etc/krb5.conf.d/,所以必须创建这个目录,否则下面的命令失败
#也可以将配置文件中的inludedir删掉
7.3、 导入keytab
keytab必须为:/etc/krb5.keytab
kadmin
#远程连到KDC服务器
#连接信息,在配置文件中
ktadd host/node1.example.com
#根据配置文件,连接到kerberos服务器,将主机的key下载到本地
7.4、 配置
authconfig-tui
8、 配置ssh
SSH登陆,通过kerberos认证,无需输入密码
GSSAPI:Generic Security Services Application Program Interface,GSSAPI 本身是一套 API,由 IETF 标准化。
其最主要也是著名的实现是基于 Kerberos 的。一般说到 GSSAPI 都暗指 Kerberos 实现。
GSSAPI 是一套通用网络安全系统接口。该接口是对各种不同的客户端服务器安全机制的封装,以消除安全接口的不同,降低编程难度。
8.1、 ssh服务端和客户端启用ASSAPI
vi /etc/ssh/ssh_config
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
vi /etc/ssh/sshd_config
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
systemctl restart sshd
8.2、 测试
ssh demouser1@node1
#不需要输入密码就对了
klist
#列出票据
9、 配置nfs secure
NFS默认不需要身份验证,带来很多安全问题,通过kerberos来保护NFS的安全
前提:
NFS服务端和客户端先配置好kerberos验证
9.1、 在NFS服务端远程创建principal
kadmin -p root/admin
#使用root登陆到KDC
addprinc -randkey host/server.example.com
addprinc -randkey host/client.example.com
#创建nfs服务器和客户端的host principal
addprinc -randkey nfs/server.example.com
addprinc -randkey nfs/client.example.com
#创建nfs服务端和客户端的service principal
ktadd host/server.example.com
ktadd nfs/server.example.com
#默认会将两个principal,以追加的方式保存到本地的/etc/krb5.keytab
q
10.2、 安装nfs-server
yum install krb5-workstation
yum install nfs-utils
mkdir -p /share
chown demouser1.demouser1 /share
vi /etc/exports
/share *(rw,sec=krb5p)
vi /etc/sysconfig/nfs
RPCNFSDARGS="-V 4.2"
#开启NFS4.2版本
#注意,在centos7.1之后,需要重启系统才能生效
systemctl start nfs-server
systemctl start nfs-secure-server
#注意,centos7.1之后,不再使用nfs-secure-server服务,改用rpc-gssd
10.6、 客户端
kadmin -p root/admin
ktadd host/client.example.com
ktadd nfs/client.example.com
q
systemctl restart nfs-secure
mkdir /mnt/share
showmout -e server.example.com
mount -o sec=krb5p,v4.2 server.example.com:/share /mnt/share