本文共 8929 字,大约阅读时间需要 29 分钟。
在centos7中,实现Kerberos+openldap来实现集中身份认证,其中Kerberos来作认证,openldap用来做账号管理。
LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP,类似DNS的树形结构来组织信息.一般情况下,LDAP需要结合Kerberos做认证,kerberos提供了一个不需要传输密码的情况下,可以给你和你想使用的服务之间建立信任关系的服务,而且不需要你每次都输入密码。实现单点登陆.1、entry
条目,也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。2、dn
每一个条目都有一个唯一的标识名(distinguished Name ,DN)类似URI的功能3、Attribute
每个entry都可以有很多属性,比如常见的人都有姓名、地址、电话等属性。属性不是随便定义的,需要符合一定的规则,而这个规则可以通过schema制定。常用的属性:
dn:一条entry的唯一路径cn:用户的全名sn:用户的姓uid:用户的登陆名称c:两个字符的国家代码,比如:中国,cno:组织名称(公司名)ou:部门名称mail:邮件地址4、schema
schema定义了哪些属性可用,以及属性的格式(类似mysql的约束)比如:电话号码,就不能输入英文字母,否则报错openlda默认自带RFC标准的schema,如果没有特殊需求,导入即可5、ObjectClass
对象类是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。6、 LDIF
LDIF文件,用来定义对数据的操作或配置的修改cat /etc/yum.repos.d/base.repo
[os]name=osbaseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/enabled=1gpgcheck=0[epel]name=epelbaseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/enabled=1gpgcheck=0
yum install -y openldap-servers openldap-clients
#openldap-servers,服务端 #openldap-clients,客户端openldap 2.4有两种配置方式:
(1)slapd.conf,这是2.3版本以前的配置方式,2.4版本也支持(2)LDIF数据库,2.3版本以后,使用动态运行时配置引擎的方式来配置ldap,其配置数据存储在LDIF数据库中,位于/etc/openldap/slapd.d优势:
ldap的配置在运行中就可以进行修改,无需重启服务即可生效cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
#ldap的数据库配置文件#不用修改chown -R ldap. /var/lib/ldap/
slappasswd
#产生一个加密过后的密码vi /etc/openldap/slapd.d/cn\=config/olcDatabase\={0}config.ldif
olcRootPW: {SSHA}fdD1iX+g42FnwbjVhuDuKv2FEj69U9No
#设置管理员密码 #在最后添加一行 #密码为上面产生的密码
vi /etc/openldap/slapd.d/cn\=config/olcDatabase\={2}hdb.ldif
olcSuffix: dc=example,dc=com
olcRootDN: cn=Manager,dc=example,dc=comolcRootPW: {SSHA}oe7odi30W9Jy4YbqW348HV4p7B5n6khUolcAccess: {0}to attrs=userPassword by self write by dn.base="cn=Manager,dc=example,dc=com" write by anonymous auth by noneolcAccess: {1}to by dn.base="cn=Manager,dc=example,dc=com" write by self write by * read#设置manager的密码#将dc改成自己的域名
vi /etc/openldap/slapd.d/cn\=config/olcDatabase\={1}monitor.ldif
olcAccess: {0}to by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=example,dc=com" read by none
#将dc改成自己的域名
slaptest -u
systemctl start slapd
systemctl enable slapdls /etc/openldap/schema/*.ldif |xargs -I {} ldapadd -Y EXTERNAL -H ldapi:/// -f {}
也就是定义整个组织的架构
vi /etc/openldap/base.ldif
dn: dc=example,dc=com
objectclass: dcObjectobjectclass: organizationdc: exampleo: ldap#定义suffix,也就是目录树的最顶端 dn: ou=People,dc=example,dc=comobjectclass: organizationalUnitou: People#在根下面定义一个分支,叫people,使用部门这个类,表示这定义的是一个部门信息dn: ou=Group,dc=example,dc=com
objectclass: organizationalUnitou: Group#同上,定义另一个部门
注意
1.条目之间必须要有一个空行 2.文件的最后不能有空行ldapadd -x -D cn=Manager,dc=example,dc=com -W -f /etc/openldap/base.ldif
#使用ldapadd工具,将上面的定义,写进数据库 #-x,使用简单身份认证,也就是使用账号和密码#-D,指定账号#-W,指定密码,不指定,回车会提示输密码#-f,指定ldif文件ldapsearch -x -D cn=Manager,dc=example,dc=com -w -b "dc=example,dc=com"
#使用ldapsearch工具,对数据库进行查询要往ldap数据库中添加用户信息,有两种方法:
1.将用户信息写到一个ldif文件,然后用ldapadd工具导入2.使用migrationtools工具,将本地/etc/passwd和/etc/group文件内容,转换成ldif文件,然后用ldapadd工具导入为了方便,我们这里使用migrationtools工具
yum install -y migrationtools
useradd demouser1
useradd demouser2
grep demo /etc/passwd > /tmp/users
grep demo /etc/group > /tmp/groups
vi /usr/share/migrationtools/migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "example.com";
$DEFAULT_BASE = "dc=example,dc=com";$EXTENDED_SCHEMA = 1;#指定转换中,需要用到的信息
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
配置ldap客户端,要改的配置文件太多,所以我们使用工具来配置
配置工具有:
1.authconfig,命令行2.authconfig-tui,文本图形3.authconfig-gtk,图形化,系统装了图形化才能用这里我们使用authconfig-tui工具
yum install -y nss-pam-ldapd
authconfig-tui
#图形化配置客户端getent passwd demouser1
#如果能获取到用户信息,说明OKid demouser1
注意,
默认ldap用户在客户端本地是没办法创建家目录的使用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
使用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
如果要通过客户端的sssd进行LDAP认证,必须开启TLS加密。sssd不支持不加密的认证通道。
cd /etc/pki/tls/certs
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacert.crt -days 3650
cd /etc/pki/CA
touch serial index.txt
echo 01 > serial
cd /etc/pki/tls/certs
(umask 077;openssl genrsa -out slapd.key 1024)
openssl req -new -key slapd.key -out slapd.csr
#生成请求文件openssl ca -in slapd.csr -out slapd.crt -days 3650
#CA机构签发用户证书vi /etc/openldap/slapd.d/cn\=config.ldif
olcTLSCACertificateFile: /etc/pki/tls/certs/cacert.crt
olcTLSCertificateFile: /etc/pki/tls/certs/slapd.crtolcTLSCertificateKeyFile: /etc/pki/tls/certs/slapd.key #指定3个文件的位置,并将将3个文件拷贝到指定位置#olcTLSCACertificateFile,指定CA证书的位置#olcTLSCertificateFile,指定kerberos服务器的证书#olcTLSCertificateKeyFile,指定kerberos服务器的key #删除TLSCACertificatePath这一行
systemctl restart slapd
注意:
1.TLSCACertificatePath,指CA证书所在目录,指定的路径下面只能放CA证书,不能放其它证书2.TLSCACertificatePath和olcTLSCACertificateFile这两个参数冲突,二选一注意:
默认,会到/etc/openldap/cacert目录下找CA证书,所以提前将CA证书拷贝过去authconfig-tui
kerberos服务器,有一个角色叫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,如果能解开,说明客户端可信。yum install -y krb5-server
#安装kerberosvi /etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log[libdefaults]
dns_lookup_realm = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsedefault_realm = EXAMPLE.COMdefault_ccache_name = KEYRING:persistent:%{uid}[realms]
EXAMPLE.COM = { kdc = kerberos.example.comadmin_server = kerberos.example.com}[domain_realm]
.example.com = EXAMPLE.COMexample.com = EXAMPLE.COM
注意:
1. kerberos.example.com这个主机名要能解析 2. 不管服务端,还是客户端,都会用到/etc/krb5.conf,这是个通用配置文件vi /var/kerberos/krb5kdc/kdc.conf
#服务端的主配置文件#没有特殊需求,只需要将realm改下即可vi /var/kerberos/krb5kdc/kadm5.acl
#配置访问控制 #将域名改为自己的就好kdb5_util create -s -r EXAMPLE.COM
#创建kerberos数据库systemctl start kadmin
#kadmin,管理工具systemctl start krb5kdc
#krb5kdc,kerberos守护进程systemctl enable krb5kdc
systemctl enable kadmin
Kerberos认证的唯一ID叫principal,由primary、instance、realm三部分组成
格式为:primary/instance@realmprincipal有3种类型:user、service、host
kadmin.local
addprinc root/admin
#创建一个用户root,角色是admin#并创建密码addprinc demouser1addprinc demouser2 #创建两个普通用户addprinc -randkey host/node1.example.comaddprinc -randkey host/node2.example.com #创建两台主机,用户和服务都需要认证主机#-randkey,随机创建密码,因为主机的密码,我们不需要记忆addprinc -randkey nfs/node1.example.com #创建一个service,在node1.example.com这台主机上 #后面node1节点配置NFS,可通过kerberos安全导出ktadd -k /tmp/node1.keytab host/node1.example.comktadd -k /tmp/node2.keytab host/node2.example.comktadd -k /tmp/nfs.keytab nfs/node1.example.com #将key从KDC导出listprincs #列出客户端quit
scp /etc/krb5.conf /tmp/node1.keytab root@node1:/tmp
scp /etc/krb5.conf /tmp/node2.keytab root@node2:/tmp #拷贝krb5配置文件和客户端的keyyum install -y pam_krb5 sssd krb5-workstation
#pam_krb5,默认,kerberos会绕过pam,安装此包,就是让使用pam的应用程序可以使用kerberos进行身份验证#krb5-workstation,kerberos的客户端小工具,可不装#sssd,安全服务守护进程,负责检索和缓存用户信息和身份验证信息,可选cp /tmp/krb5.conf /etc/
#将之前从kerberos服务器拷贝的配置文件,拷贝到/etc/mkdir /etc/krb5.conf.d/
#因为配置文件里有includedir /etc/krb5.conf.d/,所以必须创建这个目录,否则下面的命令失败#也可以将配置文件中的inludedir删掉ktutil
rkt /tmp/node1.keytab
#读取文件wkt /etc/krb5.keytab#将上面读取的内容,生成一个新文件:brb5.keytablist#查看quit#退出
authconfig-tui
GSSAPI:Generic Security Services Application Program Interface,GSSAPI 本身是一套 API,由 IETF 标准化。其最主要也是著名的实现是基于 Kerberos 的。一般说到 GSSAPI 都暗指 Kerberos 实现。
GSSAPI 是一套通用网络安全系统接口。该接口是对各种不同的客户端服务器安全机制的封装,以消除安全接口的不同,降低编程难度。vi /etc/ssh/ssh_config
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
vi /etc/ssh/sshd_config
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
systemctl reload sshd
ssh demouser1@node1
klist
#列出连接信息转载于:https://blog.51cto.com/gongxin12/2174978