centos7下ldap+kerberos实现单点登陆

centos7下ldap+kerberos实现单点登陆

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

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

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

 

二、 LDAP安装配置

1、 安装LDAP服务端

yum源:

  1.centos7OS

  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"

  #查询ouPeople的信息

 

ldapsearch -H ldap://172.25.254.142 -x -b "uid=demouser1,dc=example,dc=com"

  #查询uiddemouser1的信息

 

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

  #phpldapadminldapweb程序,在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

  

      # Apache 2.4

      Require all granted

    

 

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/

usernamecn=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

 centos7下ldap+kerberos实现单点登陆_第1张图片

centos7下ldap+kerberos实现单点登陆_第2张图片

 

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.TLSCACertificatePatholcTLSCACertificateFile这两个参数冲突,二选一

 

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 [email protected]:/etc/pki/CA/cacert.pem /etc/openldap/cacerts/

 

  #在server端,将CA证书拷过来

 

 

authconfig-tui

 centos7下ldap+kerberos实现单点登陆_第3张图片

centos7下ldap+kerberos实现单点登陆_第4张图片

 

注意:

  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

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

  也就是密码要由kerberos来存储

 

1、 名称解释

  KDC,票据分发中心

  realm,就是域名,要大写

 

注意:

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

 

2、 kerbors身份验证过程

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

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

  2.每个人都知道自己的密码

  3.所有人都向KDC申请验证

 

  客户端输入用户密码-->密码hash保存到本地,用户名以明文发给KDC,请求验证

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

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

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

  客户端拿到这两个加密的TGT,将用自己key1解开key2;然后用解开的新TGT加密系统当前的时间戳,生成key4,然后将key4key3一起发给要访问的服务

  服务收到这两个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认证的唯一IDprincipal,由primaryinstancerealm三部分

 

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、 客户端配置

SSSDLDAP目录中查找用户,然后联系Kerberos KDC进行身份验证并获取票证。

 

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

  authconfig,命令行

  authconfig-tui,文本图形

  authconfig-gtk,图形

 

7.1、 装包

yum install -y  krb5-workstation sssd pam_krb5

  #krb5-workstationkerberos客户端

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

  #pam_krb5,默认,kerberos会绕过pam,安装此包,就是让使用pam的应用程序可以使用kerberos进行身份验证

 

7.2、 配置文件

scp [email protected]:/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

 centos7下ldap+kerberos实现单点登陆_第5张图片

centos7下ldap+kerberos实现单点登陆_第6张图片

centos7下ldap+kerberos实现单点登陆_第7张图片

 

8、 配置ssh

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

  GSSAPIGeneric Security Services Application Program InterfaceGSSAPI 本身是一套 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

 

systemctl restart nfs-secure

mkdir /mnt/share

showmout -e server.example.com

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

 

posted on 2018-10-25 18:42 gongxin12 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/gongxin12/p/9851868.html

你可能感兴趣的:(ldap,数据库,运维)