基于OpenAM系列的SSO----基础

OpenAM简介:OpenAM是一个开源的访问管理、授权服务平台。由ForegeRock公司发起。OpenAM前身为OpenSSO,由SUN公司创建,现在属于Oracle。

本文在OpenAM 13版的Getting started With OpenAM文档上进行描述和总结。

在这个文档中你将了解如何使用OpenAM 和 Web策略代理 (policy agent)来管理一个网页的访问。

第一章:利用OpenAM对一个网站进行保护

 

1.1 关于OpenAM

OpenAM 将“控制访问”(access control)实现聚焦在处理验证(authentication)和授权(authorization)两个方面。

“验证”是对个体身份的鉴别,例如,验证用户名、密码等身份信息。

“授权”既授予通过验证后的用户对一些资源(图片、URL等)的访问权。

关于验证

OpenAM中定义了一条"验证链"(authentication chain)来对用户身份信息进行验证,“验证链”由单个或多个验证模块(authentication module)组成。

这些模块分别于身份信息仓储(identity repositories)连接,身份信息仓储存储了用户的信息并提供验证服务。

身份信息仓储包含了LDAP目录,关系型数据库,RADIUS(Remote Authentification Dial in User Service) , Windows授权,one-time 密码服务(OTP),和一些其他的访问管理系统。

“验证链”的意义:将不同的验证服务连接在一起,为一些敏感资源提供更强的保护。还可以实现当用户成功登陆后记住用户的登陆设备、当用户登陆环境不正常时提供额外的验证要求等。

本文由于是入门文档,所以采用了OpenAM中内置默认的身份信息仓储和验证链。

关于授权

OpenAM对授权信息进行了集中化管理(centralize authorization),这使得访问策略(access policy)与受保护的资源分离。

与在web应用(受保护的)代码中嵌入访问策略不同,OpenAM在web应用部署的web服务器上(httpd,tomcat等)上安装一个策略代理(policy agent,下文简称PA)来执行OpenAM的验证结果。

OpenAM做出用户验证判断结果(允许或拒绝用户访问某资源),交给PA来执行。

接下来,将安装OpenAM,创建一个策略(policy),安装一个策略代理(policy agent )及在一台Web服务器上实现对一个页面的访问验证。

1.2  需要安装的软件

  1. JDK(OpenAM是一个Java web 程序)
  2. Apache HTTP server(本文中访问控制的web应用部署在http server上)
  3. Apache Tomcat
  4. OpenAM 核心包 (OpenAM的主web程序)
  5. OpenAM Apache Policy Agent (安装在Apache HTTP server上,对用户的请求进行解析并执行OpenAM做出的用户验证判断结果)

1.3 安装过程 (本文仅讨论在CentOS下的安装)

a. 修改 hosts文件

OpenAM 保护Web资源时, 需要你使用完整域名(fully qualified domain names)

这是因为OpenAM 使用cookie来跟踪单点登录(Single Sign-On)的会话,根据完整的服务器名和域来识别cookies。

在这里我们通过修改hosts文件在一台服务器上实现两个不同的访问域名。

注:本文档是搭建一个简单的测试环境,所以OpenAM和web应用被放在一个server上。openam.example.com是OpenAM的域名,而www.example.com是Web应用的域名。

b. 安装Apache HTTP server

安装开发工具

OpenAM web 策略登代理需要Apache 1.3以上,这里推荐2.2.9以上的版本

安装 Apache HTTP server

 $ yum install httpd

修改httpd配置文件,使服务器名称为 www.example.com,将端口改为8000。

启动httpd:

service httpd start

访问URL: http://www.example.com:8000 看是否安装成功。

c.安装Tomcat(略)

安装完成启动后访问 http://openam.example.com:8080看是否成功。

d.安装OpenAM

从 OpenAM上下载 OpenAM企业版的.war文件。

https://backstage.forgerock.com/#!/downloads/OpenAM/OpenAM%20Enterprise/13.0.0/OpenAM%2013#list

将.war文件部署到Tomcat下

访问 http://openam.example.com:8080/openam/ 看是否成功。

点击主页上的Create Default Configuration,同意协议。

设置默认用户(amAdmin)的密码为password,默认策略代理(UrlAccessAgent)的密码为secret12,点击Create Configuration进入配置OpenAM。

注意:以上密码仅供这次测试用。amAdmin是OpenAM的管理员,拥有对OpenAM配置的一切控制权。在这篇文档中 UrlAccessAgent并未用到。配置的管理员是超级用户。

点击Proceed to Login,用amAdmin身份登录,成功后将进入 Realm 页面。

OpenAM完成配置后,将自动在用户的home目录下新建~/openam/(/root/openam/)文件夹,里面含有Openam的配置信息,集成的OpenDJ目录服务器。文件夹名字与服务器实例的名字相同(server instance),此外还有一个隐藏文件夹 ~/.openamcfg/,(/root/.openamcfg/)其中包含了OpenAM的启动文件,如果你损坏了OpenAM的配置文件,或者想重新安装OpenAM,最快的解决方法是关闭tomcat,删除这两个文件夹,重新配置OpenAM。

目前为止,OpenAM主服务器和OpenAM主机都配置完成。

e. 在OpenAM配置一个策略

策略(policy)是OpenAM验证用户并赋予用户权利的根据。根据以下步骤将创建一个策略,赋予所有通过验证用户,在之前配置的Apache HTTP 主页上行使HTTP GET的权利。

1. 打开OpenAM 控制台,在Realms页面上选择根域(Top level Realm)。

OpenAM将身份(identities),策略 (policies),策略代理信息(policy agent profiles)集成到realms里进行挂历。

2. 点击 Authorization > Polices > iPlanetAMWebAgentService > Add A New Policy

3. 在New Policy页面上,输入以下信息:

a. 名称:输入”Authenticated users can get Apache HTTP home page”供本次测试

b. 描述:输入”This policy lets users who have authenticated to OpenAM access to the Apache home page."供本次测试

c. 资源类型:点击下拉框,选择”URL”供本次测试

d. 资源:在下拉框中选中”*://*:*/*”,然后输入资源URL:http://www.example.com:8000/*,然后点击 Add

点击Create 保存设置。

4.在policy页面上点击Actions tab,输入以下信息

a. 在action 下拉框上选中 GET,点击Add action

b. 在action 下拉框上选中POST,点击Add action

c. 点击 Save Changes

5. 在policy页面上点击Subjects,输入以下信息

a.选择 All of ..

b. 在Type Section上点击Edit标识,在下拉框中选中Authenticated Users,然后点击checkmark。

c. 点击 save changes

f. 创建web 策略代理简介(policy agent profile)

OpenAM 存储策略代理的profile默认是”集中式”(centralized)的,既保存在openam server端,而不是policy agent所在web容器。

策略代理(policy agent)在web应用所在容器上的安装和启动过程中,通过OpenAM server中设置的策略代理profile,得到相应的配置信息。管理员在OpenAM后台中修改profile的配置,策略代理端也能同步更新。

1. 在OpenAM控制台上,点击Realms > Top Level Realm > Agents >Web,然后点击New 在 Agents table

2. 输入以下信息

Name : WebAgent

Password: password

Configuration: Centralized

Server URL: http://openam.example.com:8080/openam

Agent URL:  http://www.example.com:8000

3. 点击Create 保存 profile信息.

g. 安装OpenAM Web 策略代理 ( policy agent)

OpenAM 策略代理是OpenAM中定义的策略的实施者,判断用户是否对请求的资源具有访问权限是由OpenAM根据用户信息(HTTP cookie中的SSO token)及设定好的策略做出决定。

策略代理在Apache HTTP Server中以 Library的形式运行,当Apache HTTP Server启动的时候,它被载入。当请求到来,策略代理将用户重定向到OpenAM进行身份验证或者向OpenAM请求用户授权结果。

1. 根据Apache HTTP Server的版本,在下载页面上下载OpenAM policy agent。

这里选择 3.3.0版本。

2.创建密码文件,当代理安装器(agent installer)第一次连接OpenAM时读取。(密码等于openam端设置的agent profile密码)

3. 查看OpenAM 服务器 URL,保证OpenAM正在运行

http://openam.example.com:8080/openam

4. 停止Apache HTTP Server

$  service httpd stop

5. 安装 策略代理

解压下载的zip包,并进入文件夹中的bin目录

$ cd /path/to/web_agents/apache22_agent/bin

运行agentadmin指令,输入准确的信息

$ ./agentadmin ——instal ——acceptLicense

6. 启动 Apache HTTP Server,安装完成

1.4 验证

1.     注销 OpenAM控制台

2.     浏览 http://www.example.com:8000

此时,策略代理将拦截你对上页面的请求,如果你的浏览器中并没有一个包含了OpenAM session的cookie,因此你将会被重定向到OpenAM,进行身份验证。

3.     输入用户名 demo ,密码 changeit

一旦登陆成功,OpenAM设定了一个session cookie ,名称为iPlanetDirectoryPro,域名为.example.com。

该域名为你访问的web应用域名。

如果你在浏览器将查看这个cookie,你将看到类似AQIC5wM2LY4SfcwciyfvJcQDUIB7kIWEH187Df_txqLdAVc. *AAJTSQACMDEAAlNLABMxMDYwNzY1MjQ0NTE0ODI2NTkx*.的值。这是加密后的SSO Token值。Openam通过它来决定你的一系列身份操作,例如验证,登陆,注销。当这个session失效,你必须重新认证。

OpenAM session 用于 SSO(单点登陆)。OpenAM以此为依据进行授权判断。

SSO session 终结的方式有几种,例如:当浏览器session终结时,从OpenAM注销时。OpenAM也设立了两个限制:当session不活动一段时间(默认30分钟),超过生命上限(默认2小时)。

4. 成功登陆后,你被重新定义到最初请求页面。

在后台,OpenAM将你的浏览器重定义到你最初请求的页面http://www.example.com:8000。web策略代理拦截该请求,发现SSO Token的存在,然后向OpenAM咨询“该用户是否有权限访问http://www.example.com:8000”,OpenAM回复策略代理“同意通过”。因此策略代理允许Apache HTTP Server 返回请求页面。

以上为部署一个简单OpenAM 单点登录的例子。

关于更多OpenAM的信息,请阅读下文。

1.5 关于Stateless Session

在上文中提到的 名称为iPlanetDirectoryPro的session cookie实际上保存的是一个定位信息,指向的是OpenAM服务器上真正的关于本次会话信息的保存位置。

关于这种保存在服务器内存中的session称为有状态Session(stateful session)。

OpenAM也支持无状态Session(stateless session),既session保存在客户端。

关于如何配置stateless sessions。

https://backstage.forgerock.com/#!/docs/openam/13/admin-guide#chap-session-state

第二章:更多关于OpenAM

 

时间: 2024-08-30 12:50:30

基于OpenAM系列的SSO----基础的相关文章

SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC)的GIS专业理论知识. 5.其他相关知识. SQL Server 2

LNMP系列网站零基础开发记录

[目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 Bootstrap 前端页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配置 ... 一.扯淡吹逼之开发前奏 终于答辩完了,实在没什么事,作为一个死宅到底的码农,只有呆在宿舍写程序玩. 以前项目都是基于Windows平台开发的,主要是.NET和C++,一直想学一学python,可是没有项目驱动实在是没动力,看了文档不动手过几天就忘了,好吧,我们干脆就开发一个开发的

GL_GL系列 - 总账系统基础(概念)

1. 分类账 分类账是公司财务记录的核心,任何事物处理都必须经过这个环节 主要分类账: 按4C定义的用于保存记录的主要分类账 科目表 日历 币种 子分类续航会计方法 辅助分类续航: 用于辅助目的, 跨国公司可借助其遵守多种法律要求 可不主要分类账不同: 科目表 日历 币种 会计方法 分类续航处理选项 分类账的基本要素 帐套 会计科目结构 - 会计期间 - 本为币币种 - 定义子分类账会计方法 总账中可与分类账共享的元素 账户结构 值集 段值 安全性规则 交叉验证规则 会计日历 期间 期间类型 币

IOS开发系列—Objective-C之基础概览

概览 前面我们已经用了几章内容进行C语言介绍,当然要通过几篇文章完整的介绍C语言的知识是不太现实的,例如C语言的文件操作.内存申请等我们都没有重点介绍,当然核心知识点基本都已经提到了,后面有时间我们会继续扩充.今天我们正式开始学习Objective-C,以后简称"ObjC",ObjC是在C语言的基础上加上了一层面向对象的特性,它完全兼容C语言,甚至可以混写C++.它是Mac OS X和IOS的主要开发语言,从IOS发布之后可以说ObjC的地位呈直线上升趋势,当前ObjC已经是仅次于C语

LNMP系列网站零基础开发记录(三)

[目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 web 页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配置 ... 三.web页面开发 好吧,本来想单独写一章bootstrap的,但是前端确实没什么好写的,这里我们直接结合实际直接开搞吧.做WEB我习惯先把想要的页面模板做完,然后再根据razar或者这里要用到的django template修改.美工确实不太好,P得一手烂图,所以一般都用现成的开源框架,这里我

多线程系列(1)多线程基础和Thread

因为现项目中有用到多线程和并发的知识,所以打算近期补习一下多线程相关的内容.第一篇文章从最基础的开始,就是如何开启一个线程,如何启动线程和阻塞线程等,这篇文章分以下几点进行总结. 多线程初印象 多线程的使用场景 线程的启动,挂起和终止 一个简单的多线程实例 多线程初印象 首先通过一张图来了解一下进程Process,应用程序域AppDomain和线程Thread之间的关系. 从图中可以总结出以下几点: 一个进程Process可能包含多个应用程序域,也包含多个线程,线程也可以穿梭于多个应用程序域当中

基于Spring的简易SSO设计

通常稍微规模大一些的企业,内部已经有很多的应用系统,多个系统整合首先要解决的便是“统一登录(SSO)”问题,之前写过一篇 利用Membership实现SSO(单点登录) ,java环境下已经有一些开源的成熟sso项目(比如CAS),但如果觉得CAS太麻烦,想自己再造轮子重复发明一个,可以参考下面的思路:(仍然是基于Cookie的实现,只不过安全性上略有加强,cookie端存放的token标识,不再与用户名.密码等这些敏感信息相关) 1.组件图 主要由3大部分组成, 1.1 SSO Client

【小白的java成长系列】——Java基础知识

今天来说说java的基础知识,个人感觉都不知道要说啥的,还是为后面的内容做一些铺垫吧~ 今天主要说的都是java面向对象之前的基础知识,比如数据类型呀,表达式运算符呀~等等一系列的知识,下节来说说面向对象.今天这节我就不用程序来说明,直接用文字说明.因为个人感觉真木有啥好说的,这些程序后续都会说到的,比较简单,写写就会了的..好吧~开始了... 1. Java数据类型划分: 基本数据类型:都是一个个具体的值 数值型:表示具体的数字,所有的整数默认情况下都是int,所有的小数都是double型的

1Python全栈之路系列之面向基础

Python全栈之路系列之面向对象基础 面向对象基本介绍 Python编程方式: 面向过程编程 面向函数编程 面向对象编程 名称定义: 如果函数没有在类中称之为函数 如果函数在类中称之为方法 创建类 # 创建一个类,类名是Class_basis class Class_basis:     # 在类里面创建了一个方法ret,类里面的方法必须加一个self关键字     def ret(self):         # 当调用方法的时候输出ret         print("ret")