一、 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

centos7下ldap+kerberos实现单点登陆的更多相关文章

  1. 在tomcat集群下利用redis实现单点登陆

    场景:比如说我们要实现一个集群环境,无非是把多个项目部署到多个tomcat下,然后按照一定的算法,轮询什么的随机访问多个tomcat服务器,但是问题也会有许多,比如说,我们最开始是把登陆人的信息存放到 ...

  2. 在多点环境下使用cas实现单点登陆及登出

    CAS 介绍 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以下特 ...

  3. CentOS7 下 ldap 部署

    环境准备 # 关闭防火墙以及selinux,生产环境中,以实际需求为准 [root@localhost ~]# hostnamectl --static set-hostname ldap-serve ...

  4. centos7下源码方式安装gitlab8.9+发送邮件+ldap

    CentOS7下源码方式安装gitlab 环境描述 操作系统: centos7 redis: >=2.8 mysql >=5.5.14 git >=2.7.4 架构设计 一台gitl ...

  5. ASP.NET在不同情况下实现单点登陆(SSO)的方法

    第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...

  6. 集成基于OAuth协议的单点登陆

    在之前的一篇文章中,我们已经介绍了如何为一个应用添加对CAS协议的支持,进而使得我们的应用可以与所有基于CAS协议的单点登陆服务通讯.但是现在的单点登陆服务实际上并不全是通过实现CAS协议来完成的.例 ...

  7. 集成基于CAS协议的单点登陆

    相信大家对单点登陆(SSO,Single Sign On)这个名词并不感到陌生吧?简单地说,单点登陆允许多个应用使用同一个登陆服务.一旦一个用户登陆了一个支持单点登陆的应用,那么在进入其它使用同一单点 ...

  8. ldap + kerberos + google authentication 实现两步验证

    第一步:ldap + kerberos 整合  ,参考之前的文章 第二步:google authentication 安装配置,参考之前的文章 第三步:整合 ldap + kerberos + goo ...

  9. ASP.NET 单点登陆

    第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...

随机推荐

  1. 修改 processor.php 文件,监听用户对该应用的消息

    修改 processor.php 文件,监听用户对该应用的消息 class cgc_fdModuleProcessor extends WeModuleProcessor { public funct ...

  2. pat 1041 Be Unique(20 分)

    1041 Be Unique(20 分) Being unique is so important to people on Mars that even their lottery is desig ...

  3. 力扣(LeetCode)二进制间距 个人题解

    输入:6 输出:1 解释: 6 的二进制是 0b110 . 示例 4: 输入:8 输出:0 解释: 8 的二进制是 0b1000 . 在 8 的二进制表示中没有连续的 1,所以返回 0 . 提示: 1 ...

  4. kafka connector 使用总结以及自定义connector开发

    Kafaka connect 是一种用于在Kafka和其他系统之间可扩展的.可靠的流式传输数据的工具.它使得能够快速定义将大量数据集合移入和移出Kafka的连接器变得简单.Kafka Connect可 ...

  5. Stream系列(一)Filter方法使用

    Filter 是过滤器,也可以当查询方法使用 EmployeeTestCase.java package com.example.demo; import lombok.extern.log4j.Lo ...

  6. linux awk(gawk)

    awk的前世今生: awk名字的由来:分别取三个创始人Ah,Weiberger,Kernighan三个人的首字母. awk是一个报告生成器可以格式化输出文本内容.模式扫描和处理语言(pattern s ...

  7. Java核心技术第八章-泛型

    摘要 本文根据<Java核心技术 卷一>一书的第八章总结而成,部分文章摘抄书内,作为个人笔记. 文章不会过于深入,望读者参考便好. 为什么要使用泛型程序设计 泛型程序设计(Generic ...

  8. HTML标签的for属性

    HTML 标签的 for 属性 for 属性规定 label 与哪个表单元素绑定. 隐式和显式的联系 label通常以下面两种方式中的一种来和表单控件相联系: 将表单控件作为标记标签的内容,这样的就是 ...

  9. python中的局部变量和全局变量

  10. 第五章 Unity中的基础光照(3)

    目录 1. 在Unity Shader中实现高光反射光照模型 1.1 实践:逐顶点光照 1.2 逐像素光照 1.3 Blinn-Phong光照模型 2. 召唤神龙:使用Unity内置的函数 @ 1. ...