http://wiki.jabbercn.org/index.php/OpenLDAP2.4%E7%AE%A1%E7%90%86%E5%91%98%E6%8C%87%E5%8D%97php
#中文文档html
http://www.openldap.org/doc/admin24/node
#官方英文文档mysql
LDAP的英文全称是Lightweight Directory Access Protocol,通常都简称为LDAP,相似DNS的树形结构来组织信息web
通常状况下,LDAP须要结合Kerberos作认证,kerberos提供了一个不须要传输密码的状况下,能够给你和你想使用的服务之间创建信任关系的服务,并且不须要你每次都输入密码。实现单点登录sql
条目,也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。一般对LDAP的添加、删除、更改、检索都是以条目为基本对象的。数据库
每个条目都有一个惟一的标识名(distinguished Name ,DN)编程
相似URI的功能centos
CN, OU, DC 都是 LDAP 链接服务器的端字符串中的区别名称(DN, distinguished name)
LDAP链接服务器的链接字串格式为:ldap://servername/DN
api
其中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 组织单元中。
每一个条目均可以有不少属性(Attribute),好比常见的人都有姓名、地址、电话等属性。每一个属性都有名称及对应的值,属性值能够有单个、多个,好比你有多个邮箱。
属性不是随便定义的,须要符合必定的规则,而这个规则能够经过schema制定。好比,若是一个entry没有包含在 inetorgperson 这个 schema 中的objectClass: inetOrgPerson,那么就不能为它指定employeeNumber属性,由于employeeNumber是在inetOrgPerson中定义的。
一些经常使用的别名:
dn:一条entry的惟一路径
cn:用户的全名
sn:用户的姓
uid:用户的登录名称
c:两个字符的国家代码,好比:中国,cn
o:组织名称(公司名)
ou:部门名称
mail:邮件地址
schema定义了哪些属性可用,以及属性的格式(相似mysql的约束)
好比:电话号码,就不能输入英文字母,不然报错
openlda默认自带RFC标准的schema,若是没有特殊需求,导入便可
对象类是属性的集合,LDAP预想了不少人员组织机构中常见的对象,并将其封装成对象类。
好比,人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工(organizationalPerson)是人员(person)的继承类,除了上述属性以外还含有职务(title)、邮政编码(postalCode)、通讯地址(postalAddress)等属性。
LDIF(LDAP Data Interchange Format,数据交换格式)是LDAP数据库信息的一种文本格式,用于数据的导入导出,每行都是“属性: 值”对
LDIF文件是OpenLDAP操做数据或修改配置的一切来源
yum源:
1.centos7的OS源
2.epel源
yum install -y openldap-servers openldap-clients
#openldap-servers,服务端
#openldap-clients,客户端工具箱,包含ldapadd等工具
https://www.openldap.org/doc/admin24/slapdconf2.html
OpenLDAP 2.4有两种配置方式:
(1)slapd.conf配置文件,这是旧版本的配置方式
(2)数据库(cn=config),这是新的推荐的配置方式
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命令建立的加密事后的密码
slaptest -u
systemctl start slapd
systemctl enable slapd
ls /etc/openldap/schema/*.ldif |xargs -I {} ldapadd -Y EXTERNAL -H ldapi:/// -f {}
也就是定义整个组织的架构
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工具,将上面的定义,写进数据库
ldapsearch -x -D cn=Manager,dc=example,dc=com -w
#默认查询全部内容
migrationtools,将本地/etc/passwd和/etc/group文件,转换成ldif文件
yum install -y migrationtools
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的管理员
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的信息
ldappasswd -x -D "cn=Manager,dc=example,dc=com" \
-w redhat "cn=demouser1,dc=example,dc=com" -s New_PASS
#管理员修改普通用户密码
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
方法一,pam直接去找ldap服务器,这样若是中间网络出问题,客户端就没办法登录
方法二,在客户端上安装一个缓存服务(sssd或nss),pam找这个缓存服务去拿认证信息,而后缓存服务和ldap服务器通信,拿到认证信息交给pam,并缓存到本地,这样,就能够实现客户端脱机状态也可登录。
注意:
若是要经过客户端的sssd进行LDAP认证,必须开启TLS加密。sssd不支持不加密的认证通道。
有两个图形工具,均可以:
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用户在客户端本地是没办法建立家目录的
http://www.openldap.org/doc/admin24/tls.html#Server%20Certificates
若是要经过客户端的sssd进行LDAP认证,必须开启TLS加密。sssd不支持不加密的认证通道。
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
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.*
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这两个参数冲突,二选一
ldapsearch -x -D "cn=Manager,dc=example,dc=com" -W -Z
#-Z,使用加密链接
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服务自动启动
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
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和ldap结合,ldap存储用户信息,kerberos实现认证
也就是密码要由kerberos来存储
KDC,票据分发中心
realm,就是域名,要大写
注意:
Kerberos 要求参与通讯的主机的时钟同步。票据具备必定有效期,所以,若是主机的时钟与 Kerberos 服务器的时钟不一样步,认证会失败。默认设置要求时钟的时间相差不超过 10 分钟。
有一个中间人叫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,若是能解开,说明客户端可信。
yum install -y krb5-server
#安装kerberos
通用配置文件
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
kdb5_util create -s -r EXAMPLE.COM
#建立kerberos的数据库,并设置数据库密码
#-s,表示将密码保存为文件,不用每次启服务时,须要输入密码
systemctl start kadmin
systemctl start krb5kdc
systemctl enable krb5kdc
systemctl enable kadmin
Kerberos认证的惟一ID叫principal,由primary、instance、realm三部分组成
kadmin.local
?
#查看帮助
addprinc root/admin
#建立一个用户root,角色是admin
#并建立密码
addprinc demouser1
addprinc demouser2
#设置两个用户的密码
#注意,这两个用户信息存在LDAP中
addprinc -randkey host/node2.example.com
#建立主机,即kerberos客户端主机
#-randkey,主机密码随机设置
listprincs
#列出建立的princ
quit
SSSD在LDAP目录中查找用户,而后联系Kerberos KDC进行身份验证并获取票证。
这么多配置文件,很容易出错,因此建议使用工具,进行配置:
authconfig,命令行
authconfig-tui,文本图形
authconfig-gtk,图形
yum install -y krb5-workstation sssd pam_krb5
#krb5-workstation,kerberos客户端
#sssd,安全服务守护进程,负责检索和缓存用户信息和身份验证信息
#pam_krb5,默认,kerberos会绕过pam,安装此包,就是让使用pam的应用程序可使用kerberos进行身份验证
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删掉
keytab必须为:/etc/krb5.keytab
kadmin
#远程连到KDC服务器
#链接信息,在配置文件中
ktadd host/node1.example.com
#根据配置文件,链接到kerberos服务器,将主机的key下载到本地
authconfig-tui
SSH登录,经过kerberos认证,无需输入密码
GSSAPI:Generic Security Services Application Program Interface,GSSAPI 自己是一套 API,由 IETF 标准化。
其最主要也是著名的实现是基于 Kerberos 的。通常说到 GSSAPI 都暗指 Kerberos 实现。
GSSAPI 是一套通用网络安全系统接口。该接口是对各类不一样的客户端服务器安全机制的封装,以消除安全接口的不一样,下降编程难度。
vi /etc/ssh/ssh_config
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
vi /etc/ssh/sshd_config
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
systemctl restart sshd
ssh demouser1@node1
#不须要输入密码就对了
klist
#列出票据
NFS默认不须要身份验证,带来不少安全问题,经过kerberos来保护NFS的安全
前提:
NFS服务端和客户端先配置好kerberos验证
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
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
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