一、 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. pandas的使用(3)

    pandas的使用(3)

  2. IDEA+JSP+Servlet+Tomcat简单的登录示例

    1.用IDEA新建Java WEB项目并配置Tomcat 这一部分可以参考之前的一篇随笔 https://www.cnblogs.com/lbhym/p/11496610.html 2.导入Servl ...

  3. deepin MySQL 安装以及编码格式的修改utf-8

    deepin MySQL 安装以及编码格式的修改utf-8: 1.sudo apt-get install mysql-server mysql-client 2.sudo mysql -u root ...

  4. nyoj 10 skiing (DFS)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  5. expect 自动填充密码

    它的脚本以#!/usr/bin/expect开头,执行时用expoct,而不是bash.我的一个给samba自动创建用户并且自动填写默认密码的脚本如下: vim smb_passwd.exp #!/u ...

  6. Cognitive Graph for Multi-Hop Reading Comprehension at Scale(ACL2019) 阅读笔记与源码解析

    论文地址为:Cognitive Graph for Multi-Hop Reading Comprehension at Scale github地址:CogQA 背景 假设你手边有一个维基百科的搜索 ...

  7. 同时发起TCP连接

    如果你的socket编程只限于创建SOCK_STREAM的socket,用connect-accept建立连接,然后就是recv,send.你就会惊奇tcp连接还可以不用accept. 上图为两个AF ...

  8. Openlayers ol.interaction.Select取消默认选中效果

    说明: 在使用ol.interaction.Select进行点击查询时,默认会把点击选中的要素显示在地图上 我的需求是做轨迹回放,并可以点击轨迹上某一点,进行查询.这时候如果重新播放轨迹,会发现这个选 ...

  9. 扛把子组Scrum立会报告+燃尽图 07

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/8684 一.小组情况组长:迟俊文组员:宋晓丽 梁梦瑶 韩昊 刘信鹏队名:扛把 ...

  10. go中的关键字-go(下)

    1. goroutine源码分析 1.1 初始化 go程序的启动流程分为四步 call osinit, 这里就是设置了全局变量ncpu = cpu核心数量 call schedinit make &a ...