centos7下ldap+kerberos实现单点登录

1、 LDAP概念

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

 

一、 entry

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

 

二、 dn

  每个条目都有一个惟一的标识名(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

  每一个条目均可以有不少属性(Attribute),好比常见的人都有姓名、地址、电话等属性。每一个属性都有名称及对应的值,属性值能够有单个、多个,好比你有多个邮箱。

  属性不是随便定义的,须要符合必定的规则,而这个规则能够经过schema制定。好比,若是一个entry没有包含在 inetorgperson 这个 schema 中的objectClass: inetOrgPerson,那么就不能为它指定employeeNumber属性,由于employeeNumber是在inetOrgPerson中定义的。

 

一些经常使用的别名:

  dn:一条entry的惟一路径

  cn:用户的全名

  sn:用户的姓

  uid:用户的登录名称

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

  o:组织名称(公司名)

  ou:部门名称

  mail:邮件地址

 

四、 schema

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

  好比:电话号码,就不能输入英文字母,不然报错

  openlda默认自带RFC标准的schema,若是没有特殊需求,导入便可

 

五、 ObjectClass

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

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

 

六、  LDIF

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

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

 

2、 LDAP安装配置

一、 安装LDAP服务端

yum源:

  1.centos7OS

  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),这是新的推荐的配置方式

 

2.一、 主配置

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.二、 测试配置文件

slaptest -u

 

2.三、 启动服务

systemctl start slapd

systemctl enable slapd

 

三、 导入schema

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迁移用户

  migrationtools,将本地/etc/passwd/etc/group文件,转换成ldif文件

 

6.一、 安装

yum install -y migrationtools

 

6.二、 迁移用户组

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.三、 查询

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.四、 修改密码

ldappasswd -x -D "cn=Manager,dc=example,dc=com"  \

-w redhat "cn=demouser1,dc=example,dc=com" -s New_PASS

  #管理员修改普通用户密码

 

七、 安装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

  <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/

usernamecn=Manager,dc=example,dc=com

 

八、 LDAP客户端

  

方法一,pam直接去找ldap服务器,这样若是中间网络出问题,客户端就没办法登录

方法二,在客户端上安装一个缓存服务(sssd或nss),pam找这个缓存服务去拿认证信息,而后缓存服务和ldap服务器通信,拿到认证信息交给pam,并缓存到本地,这样,就能够实现客户端脱机状态也可登录。

 

注意:

  若是要经过客户端的sssd进行LDAP认证,必须开启TLS加密。sssd不支持不加密的认证通道。

 

8.一、 使用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用户在客户端本地是没办法建立家目录的

 

九、 配置TLS加密

http://www.openldap.org/doc/admin24/tls.html#Server%20Certificates

 

若是要经过客户端的sssd进行LDAP认证,必须开启TLS加密。sssd不支持不加密的认证通道。

 

9.一、 建立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.二、 生成用户证书

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.三、 配置服务端

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.四、 测试

ldapsearch -x  -D "cn=Manager,dc=example,dc=com" -W -Z

  #-Z,使用加密链接

 

9.五、 配置客户端

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服务自动启动

 

十、 nfs共享家目录

10.一、 服务端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.二、 客户端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

 

3、 kerberos

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

  也就是密码要由kerberos来存储

 

一、 名称解释

  KDC,票据分发中心

  realm,就是域名,要大写

 

注意:

  Kerberos 要求参与通讯的主机的时钟同步。票据具备必定有效期,所以,若是主机的时钟与 Kerberos 服务器的时钟不一样步,认证会失败。默认设置要求时钟的时间相差不超过 10 分钟。

 

二、 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,若是能解开,说明客户端可信。

 

三、 安装kerberos

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

 

五、 初始化kerberos

kdb5_util create -s -r EXAMPLE.COM

  #建立kerberos的数据库,并设置数据库密码

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

 

systemctl start kadmin

systemctl start krb5kdc

systemctl enable krb5kdc

systemctl enable kadmin

 

六、 建立票据

6.一、 principal概念

Kerberos认证的惟一IDprincipal,由primaryinstancerealm三部分

 

6.二、 建立principal

kadmin.local

?

  #查看帮助

addprinc root/admin

  #建立一个用户root,角色是admin

  #并建立密码

addprinc demouser1

addprinc demouser2

  #设置两个用户的密码

  #注意,这两个用户信息存在LDAP中

addprinc -randkey host/node2.example.com

  #建立主机,即kerberos客户端主机

  #-randkey,主机密码随机设置

listprincs

  #列出建立的princ

quit

 

七、 客户端配置

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

 

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

  authconfig,命令行

  authconfig-tui,文本图形

  authconfig-gtk,图形

 

7.一、 装包

yum install -y  krb5-workstation sssd pam_krb5

  #krb5-workstationkerberos客户端

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

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

 

7.二、 配置文件

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.三、 导入keytab

keytab必须为:/etc/krb5.keytab

 

kadmin

  #远程连到KDC服务器

  #链接信息,在配置文件中

ktadd host/node1.example.com

  #根据配置文件,链接到kerberos服务器,将主机的key下载到本地

 

7.四、 配置

authconfig-tui

 

 

八、 配置ssh

  SSH登录,经过kerberos认证,无需输入密码

  GSSAPIGeneric Security Services Application Program InterfaceGSSAPI 自己是一套 API,由 IETF 标准化。

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

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

 

8.一、 ssh服务端和客户端启用ASSAPI

vi /etc/ssh/ssh_config

  GSSAPIAuthentication yes

  GSSAPIDelegateCredentials yes

 

vi /etc/ssh/sshd_config

  GSSAPIAuthentication yes

  GSSAPICleanupCredentials yes

 

systemctl restart sshd

 

8.二、 测试

ssh demouser1@node1

  #不须要输入密码就对了

klist

  #列出票据

 

九、 配置nfs secure

  NFS默认不须要身份验证,带来不少安全问题,经过kerberos来保护NFS的安全

 

  前提:

    NFS服务端和客户端先配置好kerberos验证

 

9.一、 在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.二、 安装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.六、 客户端

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

相关文章
相关标签/搜索