一、 LDAP概念

#中文文档

#官方英文文档

 

的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP,类似DNS的树形结构来组织信息

  一般情况下,LDAP需要结合Kerberos做认证,kerberos提供了一个不需要传输密码的情况下,可以给你和你想使用的服务之间建立信任关系的服务,而且不需要你每次都输入密码。实现单点登陆

 

1、 entry

  条目,也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。

 

2、 dn

  每一个条目都有一个唯一的标识名(distinguished Name ,DN)

  类似URI的功能

 

都是 LDAP 连接服务器的端字符串中的区别名称(DN, distinguished   name) 
  LDAP连接服务器的连接字串格式为:ldap://servername/DN   
  

  其中DN有三个属性,分别是CN,OU,DC   

    DC (Domain Component)

    OU (Organizational Unit)

    CN (Common Name)

 

为用户名或服务器名,最长可以到80个字符,可以为中文;

为组织单元,最多可以有四级,每级最长32个字符,可以为中文;

为组织名,可以3—64个字符长

为国家名,可选,为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中定义的。

 

一些常用的别名:

:一条entry的唯一路径

:用户的全名

:用户的姓

:用户的登陆名称

:两个字符的国家代码,比如:中国,cn

:组织名称(公司名)

:部门名称

:邮件地址

 

4、 schema

定义了哪些属性可用,以及属性的格式(类似mysql的约束)

  比如:电话号码,就不能输入英文字母,否则报错

默认自带RFC标准的schema,如果没有特殊需求,导入即可

 

5、 ObjectClass

  对象类是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。

  比如,人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工(organizationalPerson)是人员(person)的继承类,除了上述属性之外还含有职务(title)、邮政编码(postalCode)、通信地址(postalAddress)等属性。

 

6、  LDIF

(LDAP Data Interchange Format,数据交换格式)是LDAP数据库信息的一种文本格式,用于数据的导入导出,每行都是“属性: 值”对

文件是OpenLDAP操作数据或修改配置的一切来源

 

二、 LDAP安装配置

1、 安装LDAP服务端

yum源:

的OS源

 

yum install -y openldap-servers openldap-clients

,服务端

,客户端工具箱,包含ldapadd等工具

 

2、 配置

https://www.openldap.org/doc/admin24/slapdconf2.html

 

OpenLDAP 2.4有两种配置方式:

,这是旧版本的配置方式

数据库(cn=config),这是新的推荐的配置方式

 

2.1、 主配置

slappasswd

产生一个加密过后的密码

 

vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif

olcSuffix: dc=example,dc=com

cn=Manager,dc=example,dc=com

{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

 

注意:

多个dn之间必须使用一个空行来隔离

最后一个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迁移用户

,将本地/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

,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

,是pam模块和nss模块的集合

让PAM身份验证服务使用 OpenLDAP 服务器中的用户

 

authconfig-tui

 

ldap单点登录是什么 ldap单点登录实例_ldap

ldap单点登录是什么 ldap单点登录实例_ldap单点登录是什么_02

 

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机构生成用户证书

 

注意:

用户必须有读取证书的权限

 

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

 

注意:

指CA证书所在目录,指定的路径下面只能放CA证书,不能放其它证书

和olcTLSCACertificateFile这两个参数冲突,二选一

 

9.4、 测试

ldapsearch -x  -D "cn=Manager,dc=example,dc=com" -W -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

 

ldap单点登录是什么 ldap单点登录实例_运维_03

ldap单点登录是什么 ldap单点登录实例_客户端_04

 

注意:

  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

和ldap结合,ldap存储用户信息,kerberos实现认证

  也就是密码要由kerberos来存储

 

1、 名称解释

,票据分发中心

,就是域名,要大写

 

注意:

要求参与通信的主机的时钟同步。票据具有一定有效期,因此,如果主机的时钟与 Kerberos 服务器的时钟不同步,认证会失败。默认设置要求时钟的时间相差不超过 10 分钟。

 

2、 kerbors身份验证过程

有一个中间人叫KDC(钥匙分发中心),他为用户端生成好密码,并分发给用户

知道所有人的密码,因为客户端的密码就是由KDC生成的

每个人都知道自己的密码

所有人都向KDC申请验证

 

密码hash保存到本地,用户名以明文发给KDC,请求验证

收到请求,在数据库搜索该用户,找到,就用该用户的密码hash值加密一个TGT(key1),发送给客户端。

  客户端收到TGT(key1),如果上面输入的密码正确,就可以解密,验证成功,并将解开的TGT缓存到本地

向KDC申请访问某个服务的请求,KDC将生成一个新的TGT,将新的TGT用key1加密,生成key2;再用服务的密码加密,生成key3,都发给客户端

,将用自己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的数据库,并设置数据库密码

,表示将密码保存为文件,不用每次启服务时,需要输入密码

 

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进行身份验证并获取票证。

 

这么多配置文件,很容易出错,所以建议使用工具,进行配置:

,命令行

,文本图形

,图形

 

7.1、 装包

yum install -y  krb5-workstation sssd pam_krb5

,kerberos客户端

,安全服务守护进程,负责检索和缓存用户信息和身份验证信息

  #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

 

ldap单点登录是什么 ldap单点登录实例_ldap单点登录是什么_05

ldap单点登录是什么 ldap单点登录实例_ldap单点登录是什么_06

ldap单点登录是什么 ldap单点登录实例_数据库_07

 

8、 配置ssh

  SSH登陆,通过kerberos认证,无需输入密码

:Generic Security Services Application Program Interface,GSSAPI 本身是一套 API,由 IETF 标准化。

  其最主要也是著名的实现是基于 Kerberos 的。一般说到 GSSAPI 都暗指 Kerberos 实现。

是一套通用网络安全系统接口。该接口是对各种不同的客户端服务器安全机制的封装,以消除安全接口的不同,降低编程难度。

 

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

 

systemctl restart nfs-secure

mkdir /mnt/share

showmout -e server.example.com

mount -o sec=krb5p,v4.2 server.example.com:/share /mnt/share