作者:阿东
微信公众号:杰哥的IT之旅(ID:Jake_Internet)

一、单点登录

1、原理
单点登录SSO(Single Sign on):一个多系统共存的环境下,用户在一处的登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。

以下两个是要点:

存储信任

验证信任

单点登录实现方式:
1.1 以Cookie作为凭证媒介
最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。用户登录父应用后,应用返回一个加密的cookie,当用户访问子应用的时候,会携带这个cookie,授权应用解密cookie并进行验证,校验通过则登录当前用户,此方式:cookie不安全,不能跨域实现免密登录。


1.2 通过JSONP实现
对于跨域问题,可以采用JSONP实现

用户在父应用登录后,跟session匹配的cookie会存到客户端中,当用户需要登录子应用时,授权应用访问父应用提供的JSONP接口,并在请求中带上父应用域名下的cookie,父应用接收到请求,验证用户的登录状态,返回加密的信息,子应用通过解析返回来的加密信息来验证用户,如果通过验证则登录用户。


1.3 通过页面重定向的方式
通过父应用和子应用来回重定向进行通信,实现信息的安全传递。

父应用提供一个GET方式的登录接口,用户通过子应用重定向连接的方式访问这个接口,如果用户还没有登录,则返回一个登录页面,用户输入账号密码进行登录。如果用户已经登录了,则生成加密的Token,并且重定向到子应用提供的验证Token的接口,通过解密和校验之后,子应用登录当前用户。

此方法解决了安全问题和跨域问题,但是没有前面两种方便。


1.4 使用独立登录系统
一般来说,大型应用会把授权的逻辑与用户信息的相关逻辑独立成一个应用,称为用户中心。用户中心不处理业务逻辑,只是处理用户信息的管理及授权给第三方应用,第三方应用需要登录的时候,则把用户的登录请求转发给用于中心进行处理,用户处理完毕返回凭证,第三方应用验证凭证,通过后就登录用户。

二、LDAP 协议
2.1 介绍
目录服务:一个特殊的数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能;是动态的、灵活的、易扩展的。

LDAP:基于X.500标准的轻量级目录访问协议。

目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。

目录数据库和关系数据库不同,有优异的读性能,但写性能很差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。

LDAP 目录服务是由目录数据库和一套访问协议组成的系统

LDAP 是开放的internet标准,支持跨平台的internet的协议。

LDAP:轻量级目录访问协议,LDAP仅仅是一个访问协议。

应用:ldap用来构建同一的账号管理、身份验证平台,实现sso单点登录机制。

2.2 特点
基于TCP/IP

以树状结构存储数据

读取速度快,写入速度慢

采用client-server模型,服务器用于存放数据,客户端用于操作数据

跨平台、维护简单

支持SSL/TLS加密

协议是开放的

2.3 基本模型
目录树概念
1、目录树:在一个目录服务系统中,整个目录信息集可以表示一个目录信息树,树中的每个节点是一个条目;

2、条目:每个条目就是一条记录。每个条目有自己的唯一可以区别的名称(DN);

3、对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必需属性也会被继承下来;

4、属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性由必需属性和非必需属性;

关键字含义


Rdn Relative dn 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”,或‘cn=exmaple’
信息模型:在ldap信息以树状方式组织,在树状信息中的基本数据单元是条目,而每个条目由属性构成,属性中存储有属性值;

命令模型:在ldap中的条目定位方式,在ldap中每个条目均有自己的DN,DN是该条目在整个树中唯一名称标识,如同文件系统中,带路径的文件名就是DN;

功能模型:在ldap中共有四类10中操作:查询操作,如搜索、比较,更新类操作,如添加条目,删除条目,修改条目,修改条目名,认证类操作,如绑定,其他操作:如放弃和扩展操作。扩展操作:有修改密码和startTLS扩展;

安全模型:ldap中的安全模型主要通过身份认证、安全通道和访问控制来实现;

信息组织
目录条目以层次型的树状结构来组织。反应地域和组织机构界限。


树可以根据互联网域名组织,允许使用DNS为目录服务定位。


最顶层即根乘坐“基准DN(baseDN)”,如“dc=example,dc=com”或“o=example.org”
OU(organization Unit)用来表示公司内部机构,如部门等,也可表示设备、人员等。

openLDAP
openLDAP是LDAPv3协议的具体实现,可以支持多平台,以提供目录服务,其进程为slapd。

安装
环境:
Centos-7
Openldap-2.4.44

使用yum安装openldap服务端、客户端等相关组件(需要epel源)

# sudo yum install -y epel-release# sudo yum install -y openldap openldap-servers openldap-clients openldap-servers-sql openldap-devel migrationtools compat-openldap

安装完成后查看版本号

# slapd -V

创建管理员密码,使用slappasswd命令生成加密字段

# slappasswd -s you_passwd

修改openldap配置文件,配置文件存放位置:/etc/openldap/slapd.d中

# vim /etc/openldap/slapd.d/cn=confg/olcDatabase={2}hdb.ldifolcRootPW: {SSHA}xxxxxxolcSuffix:dc=example,dc=com  #dc修改域名olcRootDN: cn=admin,dc=example,dc=com  #admin为管理员账号# vim /etc/openldap/slapd.d/cn=confg/olcDatabase={1}monitor.ldifolcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=hzins,dc=com" read by * none  #修改dc信息为自己的域名

验证配置文件是否正确

# slaptest -u

启动服务,openldap监听在389端口

# systemctl enable slapd# systemctl start slapd # firewall-cmd –add-service=ldap –permanent # firewall-cmd –add-port=389/tcp –permanent

Openldap使用数据库是BerkeleyDB,需要复制一份配置文件到合适目录中,并修改权限

# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG# chown ldap:ldap -R /var/lib/ldap# chmod 700 -R /var/lib/ldap

导入基本的Schema表结构

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

修改migrate_common.ph文件,该文件的信息会用于生成ldif文件

# vim /usr/share/migrationtools/migrate_common.ph$DEFAULT_MAIL_DOMAIN = “example.com”; #大约在71行$DEFAULT_BASE = “dc=example,dc=com”;$EXTENDED_SCHEMA = 1;

使用两个migrate_base.pl脚本生成base.ldif文件,然后将该文件加载到openldap的数据库

# ./migrate_base.pl > /root/base.ldif# ldapadd -x -W -D “cn=admin,dc=example,dc=com” -f /root/base.ldif

Openldap开启日志记录

1)首先创建日志文件,并调整权限,在修改rsyslog.con

# mkdir -p /var/log/slapd# chown ldap:ldap /var/log/slapd# touch /var/log/slapd/slapd.log# chow ldap.ldap /var/log/slapd/slapd.log# vim /etc/rsyslog.confLocal4.*       /var/log/slapd/slapd.log# systemctl restart rsyslog

2)修改数据库配置文件

# vim log.ldifdn: cn=configchangetype: modifyadd: olcLogLevelolcLogLevel: 32# ldapmodify -Y EXTERNAL -H ldapi:/// -f log.ldif

3)进行日志切割配置

# vim /etc/logrotate.d/ldap/var/log/slapd/slapd.log {        prerotate              /usr/bin/chattr -a /var/log/slapd/slapd.log        endscript        compress        delaycompress         notifempty         rotate 100         size 10M         postrotate              /usr/bin/chattr +a /var/log/slapd/slapd.log         endscript}

管理
Web端管理:Phpldapadmin
工具管理:Ldapadmin、ApacheDirectoryStud

©著作权归作者所有:来自51CTO博客作者mb5fe55acf14b1a的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. android菜单详解三:上下文菜单
  2. Android(安卓)QQ、微信、Facebook和推特第三方登录
  3. ANDROID GridView 分页平滑滑动 效果的实现(基于android TV遥控器
  4. Android进度条 多线程登录或下载
  5. Android登录界面的实现代码分享
  6. MingQQ Android版发布了,可以在Android手机上登录你的QQ,收发消息
  7. android微信api登录的接入
  8. Android第三方登录之微信登录
  9. Android(安卓)模仿QQ登录下拉历史列表

随机推荐

  1. 详解Golang的反射(实例)
  2. Go语言实现之基于websocket浏览器通知功
  3. 关于用Go语言编程的利与弊
  4. 如何使用go优雅地撰写单元测试
  5. golang用什么开发工具?
  6. 详解 Go 语言中的方法
  7. 教你导入golang.org的包
  8. golang是多线程模式吗?
  9. Go如何使用websocket实现弹幕功能
  10. golang是单进程的吗?