支持向量机

一 概述及问题提出

支持向量机的原理是找到一个划分(我们假设训练集是可分的),使离这个划分几何最近的训练集元素点(称为支持向量)与划分的距离最远。本文首先介绍了支持向量机的数学计算目标,然后介绍如何通过拉格朗日对偶、kernel函数以及SMO算法有效的得出支持向量机的计算结果。其中拉格朗日对偶和SMO算法是求解支持向量机的方法,kernel是优化(或者说是快速)计算结果的一种方法。

在解决支持向量机的问题上,我们使用了一种新的符号。首先分类结果y={-1,1},其次,线性分类的参数不使用?而是用?和b,分别代表了?(1-n)和?0。分类器如下:,如果z>=0,g(z)=1,否则g(z)=-1。这个分类器模型是直接预测分类结果,而不像前两章那样预测每个分类的概率。

我们的目标就是获得参数w和b。或者说,机器学习算法的目标就是根据模型和训练集获得模型的参数!

现在我们定义函数margin和几何margin,直观的说,支持向量机就是使训练集的margin最大。函数/几何margin虽然从数值上可能不一样,但是它们之间成比例,所以,求最大化不需要区分函数或几何margin。

函数margin:对于一个训练集元素:对于一个训练集的margin

几何margin:几何margin就是在几何上计算点与划分直线的距离。

为了获得更好的分类,有上面所说,我们希望获得一个最大的margin。

可以使用一下公式:

我们不要求||w||=1,这样不可以使用现有的求最优解方法。我们使用以下公式:

因为我们是求margin的最大值,由margin的定义可以知道,我们可以给参数w和b分配任意的倍数,因此我们假设。(因为通过调整w和b总能获得这个结果)。这样,我们就获得了以下公式:

(1)

通过一系列的转换,我们可以通过求最优化问题(1)求出参数w和b。这样,我们就获得了最优的分类器。

下面将要介绍如何解决最优化问题(1)。

二 拉格朗日对偶

为了解决上一节中提出的基于约束的最小化问题,我们可以使用拉格朗日对偶定理,使参数原先的多参数优化问题编程单参数优化问题,并通过内积快速计算结果。首先计算对偶问题,计算出拉格朗日乘数,然后求出原参数w和b。最本文的最后结果中,我们会得到问题(1)的对偶问题,在对偶问题中,我们发现计算内积<X(i),X(j)>是关键环节。我们在下一节会介绍使用kernel函数计算内积的方法。

对偶问题的说明和相关证明我会在最后一节进行介绍。

首先将最优化问题(1)的约束我们定义为:

构建拉格朗日函数:

(2)

对于原问题,我们首先要求出对于a函数L的最大值。直观的说,要求最大值(2)式中的后项(背减的项)如果是0,(2)式将最大。因此,当gi(w)!=0时,我们使ai=0.当ai!=0时,则gi(w)=0,即此点为支持向量。

要求出此问题的对偶问题,首先固定a并根据w和b最小化函数(2)。可以通过对函数L偏导为0,则:

=》(4)

将上列结果带入原拉格朗日函数,获得:

这样,我们可以获得问题(1)的对偶问题:

(3)

可以证明,在本文的最优化问题中是符合对偶问题等于原问题的条件的(KKT),因此,我们可以通过解决对偶问题解决原问题。当我们可以解决最优化问题(3)的时候,我们获得了参数a,就可以根据公式(4)计算出w并进一步计算出b的值。

现在让我们看看对于一个新的input,如何进行预测。首先我们要计算并根据他的值预测最终分类。根据公式(4)可知:

因此,如果我们计算出了a的值,就可以进行预测。同时,对于a大部分分量都是0,只有对于支持向量a才不是零,只需要计算少量的内积就可以获得最终结果。

三 Kernel

在上节中,我们发现要SVM算法的计算需要计算各训练集元素之间的特征向量的内积,而kernel函数不仅可以快速计算原始特征向量的内积,而且可以计算高维高阶特征向量的内积,并同时保证时间复杂度为O(n)。

使用kernel函数很简单,只要选择一个适当的kernel函数,并且将最优化问题中的所有内积改为kernel函数,然后继续计算SVM算法就可以了。

使用kernel的好处就是:可以将原始特征向量转化为高阶的特征向量,并且可以解决非线性分类的问题。因为在原始特征向量空间中,分类问题可能是非线性的,而到了高维(高阶)空间中,分类问题可能使用线性分类解决。

Kernel函数的表示形式是:

其中代表着原始特征到高阶特征的映射,我们称之为特征映射。(很明显,使用高阶特征可以获得更好的精度并解决非线性分类问题)

下面我们举几个kernel函数的例子来说明使用kernel函数计算内积的方法。

例1 我们设,其中

则:

我们可以将kernel函数写成标准函数,其中特征映射函数为

由此例可以看出,如果我们直接计算高维,则需要O(n^2),而计算kernel函数则只需要线性时间O(n)。

例2

直观的说,kernel函数求内积,也可以理解为求他们的相似度。因此,我们可以使用下列公式。(我们成为高斯kernel)

四 训练集不可分解决方法

在以上所有论述中,我们都假设训练集时可分的,而在真实的环境中,往往无法得到这个要求(不可分)。还有一种情况,虽然训练集是可分的,但是由于一个特例的影响,我们获得的划分结果明显不是我们希望的,如下图,左图是一个较好的划分,而右图因为一个特例的引入导致划分变化很大,其实我们希望可以忽略或者减小这个特例的影响。

为了解决数据不可分和减小异常值的影响,我们对原优化问题进行了调整提出了新的优化问题。(5)中我们允许margin小于1,但是会对目标函数增加一个惩罚值。

(5)

我们可以得到拉格朗日函数:

我们获得上式的对偶问题如下:

(6)

五 SMO算法(sequential minimal optimization)

1 坐标上升法

坐标上升法和我们以前介绍的梯度算法和牛顿算法一样,都是最优算法。坐标上生法的目标函数为:

它的原理是根据一定的规则选取ai,并固定除了ai其他的所有参数,找到使W函数最大的ai,循环任务直至收敛。

2 SMO算法

综上所述,SVM算法是想解决最优化问题(6),我们可以根据坐标上升法求解。因为在此问题中,某一个参数可以通过其他n-1个参数计算得出,所以我们在此问题中需要同时改变两个参数

SMO算法如下:

我们现在假设我们选取根据a1和a2计算W的最大值,并将a3…am固定。因此,根据(6)中的约束可知:

由于右项都是常量,可以用下式表示:

如果y(1)和y(2)异号,则a1和a2的限制如下图所示

令L<a2<H,则:

同理,若y(1)和y(2)同号,则

用a2表示a1,则:

(7)

在公式(7)中,a3…am是常数,而由公式(6)可以看出,公式(7)是关于a2的一元二次方程,而要求是W最大化的a2可以直接使用公式获得。最后,根据a2的约束,就可以获得最终a2的值,然后就可以求出a1的值。

六 拉格朗日对偶的证明和解释

首先介绍对于等式约束的极值求解方法。对于有条件的最小问题:

可以使用拉格朗日乘数方法解决。令拉格朗日函数为:

令函数L的偏微分为0,就获得了最终的结果:

下面将上面的结果推广到不等式条件的情况下。假设原问题为:

定义拉格朗日函数为:

则如果w违反了任何约束,则为无穷大。

如果w满足所有约束,则

综上所述:

因此,如果我们最小化,则变成了和原问题同样的问题。

为了后边的使用,我们定义为原问题的结果。

下面,我们介绍一个和原问题稍微不同的问题,我们定义:

则对偶最优化问题为:

同样,我们定义为对偶问题。原问题和对偶问题的结果有以下关系:

然后,在一些情况下,我们可以得到p=d,也就是说我们可以通过解决对偶问题解决原问题。

假设:

  1. f和gi是凸函数。
  2. hi是affine函数()。
  3. 对于所有的i,存在w是gi(w)<0

在以上的假设前提下,一定存在w,α和β使w是原问题的解,α和β是对偶问题的解并且原问题和对偶问题的最优值相等:

同时,w,α和β*满足KKT条件:

Published: 24 Sep 2012

Generative learning algorithms

对于前面的算法,都是学习p(y|x)或者接学习一个从输入X到输出类别的算法,这种算法叫discriminative learning algorithms。

而存在另一种算法,这种算法首先为不同的分类建立不同的模型,对于一个新的需要判别的对象,计算它和哪一个模型更相似即可。

公式表达如下:

假设y={0,1}

我们首先根据训练集为p(x|y)和p(y)建模,然后根据贝叶斯法则:p(y|x)=p(x|y)p(y)/p(x)

P(x)=p(x|y=1)p(y=1)+p(x|y=0)p(y=0);

其实,在对输入x进行分类时,我们只希望使p(y|x)最大的y。可以不考虑p(x).

即:

1 高斯判别分析GDA

在此模型中,我们假设p(x|y)属于multivariate normal distribution。

即:

因此,有:

为了求出相应参数,我们使下式最大化。

下图是一个GDA模型的例子,因为两个高斯分布使用同一个∑,所以他们的shape是一样的。但是他们的u0和u1不一样。

和逻辑回归相比,GDA需要更严格的假设,如果假设成立,也可以获得更好的结果。

2 朴素贝叶斯

在GDA中,特征向量x是连续的实数。而在朴素贝叶斯中,特征向量是离散值。

下面以垃圾邮件分类为例举例说明。

设置描述邮件的特征向量x为50000个单词字典,如果邮件中存在某个单词即设置为1:

同时,假设每个特征与其他特征是相互独立的(贝叶斯假设)。如果不独立,则需要(2^50000-1)个参数。

同时我们使用,。这里的下标i不代表着第i个样本,而代表着第i个特征(word)。和下面的变量j对应。

只要使下式最大化:

则可得到参数(从物理意义也可以解释)。

计算出三个参数向量以后,如果需要预测一个新的对象x,只需要带入下列公式计算p(y=1|x)和p(y=0|x),并比较即可。

最后说明一点,虽然例子中特征向量X中的对象Xi只能为0或1,但是Xi也可以是多个不同的离散值。即使特征元素是连续值,也可以将连续值根据阈值分为离散值然后使用贝叶斯分类器。

2.1 Laplace平滑

由于训练集数量的问题,有些特征出现的概率可能较小而在这些训练集中没有出现,这时不应该认为在训练集中没出现过的事件的概率就为0。

在计算特征出现的概率时,分子加1,分母加k。k为特征可选取的集合元素个数。

物理上可以这么考虑,如果训练集个数足够小,比如没有训练集,则特征出现的概率为1/k。

如:

2.2 Event models for text classification

在文本分类问题中,文本特征的建模可以使用不同的模型从而达到更好的效果。

如在前面的叙述中,我们使用的模型是multi-variate Bernoulli event model。此模型可以将邮件的生成方法看为:1)首先随即决定邮件是否为垃圾邮件。2)然后遍历字典中的每个单词,根据概率决定每个单词是否包含在这个邮件中。因此,一个邮件的概率为:

下面提出一个更好的模型,叫multinomial event model。此模型Xi表示邮件中第i个单词在字典中的ID。此模型中的邮件生成方法可以看为:1)随机决定邮件是否为垃圾邮件。2)邮件发送者随即写下第一个单词。3)重复第二步。邮件的概率为:。虽然此模型的邮件概率同上一个模型一样,但是变量所代表的含义不相同。

参数如下:for any j,

则最大化:

得出:

从公式上来看,参数的物理意义:分子是所有垃圾邮件的样本中单词Xj=k出现的次数。分母是所有垃圾邮件的单词数。

如果使用Laplace平滑,可得到以下结果:

第二个模型比第一个模型好的原因可能是:第二个考虑了邮件中单词出现的次数。

3 神经网络

视频中简单介绍了神经网络的概念,我将视频上讲的大体记录一下,讲义中没有相关介绍。

目前我们介绍的都是线性划分,而神经网络是一种非线性划分。

线性划分如下:

而对于神经网络:

求出四个参数使最小。

这就是一个非线性的划分。

Published: 13 Sep 2012

Struts2 粗解

本文对Struts做了一个简单的综述性的叙述,用Struts时浏览一遍便可以知道Struts2提供的大部分功能。具体细节没有介绍。

一 Struts2处理流程和体系结构

体系结构:

一个请求在Struts2框架中的处理大概分为以下几个步骤:

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。

处理流程:

二 Struts2配置

1配置web.xml

主要配置struts2的全局应用信息。

2配置struts.properties

用来定义Struts2的一些属性。

3配置struts.xml

Struts.xml文件主要负责管理Action的映射以及Action包含的result定义。除此之外,还负责Bean配置,常量配置,包配置、命名空间配置和包含配置。

包配置是对某包中所有的Action的统一管理,如配置拦截器。在配置包是,可以配置包的命名空间(namespace属性),则Action处理的URL应该是"URL+命名空间/Action"。

包含配置主要是为了更好地管理讲不同的Action配置到不同的xml文件中。

三 拦截器

1拦截器工作原理

拦截器是一种面线切面编程(AOP)的实现策略,将一些常用的功能重用,如输入校验、上传文件等。

2拦截器配置

定义拦截器:<interceptor name="拦截器名字" class="拦截器对应的java类">

将多个拦截器合并在一起组成拦截器栈,可一起被附加到Action。

[java]

<interceptor-stack name="拦截器栈名">

<interceptor-ref name="拦截器名1"/>

<interceptor-ref name="拦截器名2"/>

<interceptor-ref name="拦截器名3"/>

</interceptor-stack>

[/java]

拦截器栈里可以为每个拦截器制定参数,也可以同一指定。

使用拦截器栈:

可以使用<interceptor-ref>在Action中配置拦截器或配置器栈。

系统存在默认拦截器栈,可实现大部分的功能。

同时,也可以在package中配置默认拦截器栈。

3自定义拦截器

实现拦截器类(Interceptor接口),定义拦截器并使用。

4 拦截器方法过滤

有些Action中包含不同的方法,可以通过配置,设置需要和不需要拦截的方法。

5内建拦截器

四 Action和类型转换

1 访问ActionContext

ActionContext是Action的上下文对象,Action运行期间的所有数据都保存在此,可以通过该类访问Servlet API。

使用以下代码来创建使用ActionContext:

ActionContext ac= ActionContext.getContext();

通过ActionContext的常用方法可以访问或设置application上下文和session值等。

2 直接访问Servlet API

上一种只能获得request,而直接访问可以访问response。直接访问分为IoC方式和非IoC方式,一般推荐第二种,比较方便。

3 配置Action

配置Action时,result标签有不同的类型,如chain、redirect等。Redirect用来重定向。

若某一结果的视图多次使用,可以配置为全局结果,如:

<global-results>

<result name="error">/error.jsp</result>

</global-results>

注:局部视图可覆盖全局视图。

配置时可以使用通配符,使用通配符可以减少很多配置编码量。(实习时george曾问我这个问题,当时我竟然不知道,全部都硬编码….)

4 简单类型转换

简单类型系统会自动转换,同时,也可以使用一个JavaBean来封装客户端请求参数,在文本框中使用OGNL表达式。

5 集合类型转换

对于Action中的List,form表单也可以传入相应的数值。

五 标签库

Struts2的标签的分类如下:

1控制标签

主要有if-else以及对集合的操作的标签。

主要介绍一下集合操作标签。

Iterator:可对集合类型进行迭代输出,包括List、Set、数组、Map等。

Append:将多个集合对象链接起来。

Merge:同append一样,但是连接后的新集合中,元素的排序方式不同。

Generator:通过指定的分隔符将字符串分割成多个子串。

Sort:对集合进行排序,排序规则实现Comparator实例。

2 数据标签

Action:直接在页面中调用一个Action,增加重用性。

Bean:在页面中创建一个JavaBean实例对象。

Debug:辅助调试,可以看到ValueStack和StackContext中的信息。

Include:将JSP或Servlet包含到当前页面。在include标签中可以使用param标签传入参数。

Param:与其他标签结合使用,提供参数。

Property:显示输出指定的value属性。

Set:定义一个新变量,并可以为其指定范围。

url:生成一个URL地址。

Date:按指定格式输出一个日期。

3 表单UI标签

Checkboxlist:创建复选框。

Radio:单选框。

Combobox:下拉框和单行文本框。下拉框辅助输入。

Select:下拉框。

Doubleselect:两个相关联的下拉列表框。

Optgroup:生成选项组,在select中使用。

Datetimepicker:生成日历。

Token:防止用户多次提交表单。

Updownselect:上移、下移和全选。

Optiontransferselect两个列表框。

4 非表单UI标签

Actionerror&actionmessage:输出Action的消息。在action中使用addActionError("string")和addActionMessage("string")设置返回内容。

Component:使用自定义组件。同时可以使用param传入参数。(翻页组件我觉得就可以)

Tree和treenode:生成一个树状结构。必须设置theme="ajax"

五 输入校验

Struts2校验主要分为两种,第一种是重写validate()方法,第二种通过配置action-validation.xmla文件使用内置校验器进行校验。

Struts2默认为服务器端校验,但是在form表单标签中使用属性validate="true"可添加客户端校验。

1 重写validate()方法

在此方法中,如果校验没有通过可记录fileError属性,框架在执行execute之前会自动判断是否有fieldError属性,如果有的话则返回结果为input。

如果只需要校验Action中的某一方法,则可以重写validateXxx方法。

2 内置器校验

内置校验器可使用字段校验器配置风格和校验器类型配置风格。

常见的内置校验器有:必填校验器、字符串长度校验器、整数范围校验器、日期校验器、以及:

表达式校验器:非字段验证器,要求OGNL表达式的返回值为true。

字段表达式验证:制定字段必须满足一个逻辑表达式。

邮件地址校验器

网址校验器

转换验证器

正则表达式校验器

3 自定义校验器

六 Struts2高级技巧

1 国际化

目前用不到,以前用过,用到再说。

2 异常处理

Struts2异常处理可在struts.xml文件中配置,而在Action中不需要编写任何异常处理代码。

Struts.xml文件中使用<exception-mapping>元素进行异常映射,包括两个属性:

Exception:指定异常的类型。

Result:指定异常出现时,返回给用户的视图名称。

异常映射范围分为两种:

全局异常映射,使用<global-exception-mapping>元素配置,内部使用异常标签。映射范围是package中的所有action。

局部异常映射:在Action配置内部使用异常标签,范围是他所在的action。局部映射可覆盖全局映射。

3 OGNL

OGNL是一种方便操作对象属性的语言。如果熟练使用需要一大篇篇幅介绍,这里只介绍三种符号的基本用途。

  • 访问OGNL上下文和Action上下文,相当于ActionContext.getContext()。如#session.userNmae.
  • 过滤和投影集合。如newsList.{?#this.id==1}.{title}[0]
  • 构造Map。如#{'book':'23','book2':'25'}

%

  • 计算OGNL的表达式

$

  • 国际化文件中使用OGNL表达式。
  • 配置文件中使用OGNL表达式。(一般是制定URL路径中需要带有参数)
    eg:<result type="redirect">/myOGNL.action?id=${id}</result>

4 文件上传和下载

没啥好说的,很简单,用的时候对着书看看就行了。

Published: 12 Sep 2012

回归算法

监督学习是根据输入的训练集学习获得一个假设函数,由特征映射到目标变量。主要解决两种问题,回归问题和分类问题,它们是根据目标变量是连续的还是离散的而分类的。

1 线性回归

对于线性回归,假设函数一般根据特征的个数而设置:

(X0=1)

提出假设函数以后,只要根据训练集求出假设函数中的参数即可。

要求出参数,只要参数使训练集中的最接近y。提出:

根据训练集,只要求出最小J(?)。

LMS算法

LMS(least mean squares,known as Widrow-Hoff学习规则)算法是用来求出最小的J(?),他的思想是梯度下降算法,即为了最小值,根据当前值向下降速度最快的方向移动。

注:梯度下降可能会找到局部最优点,但是由于J(?)是一个只有全局最优的凸函数,所以可以使用梯度下降算法。

给定一个初始? ,

假设训练集中只有一个元素:

则更新规则如下:

对于训练集存在多个元素的情况,有两种方法:

Batch gradient descent

此方法在每一步遍历所有的训练集:

遍历轨迹如图所示:

Incremental gradient descent

此方法在每一步中根据训练集中的一个元素,通常这种方法对于前一种方法更快,尤其在训练集较大的情况下。但此方法只能获得接近最小值的点,但是一般对于机器学习可以接受。

The normal equation

此方法不需要迭代求出J(?)的最小值。思想是令J(?)对于所有的?变量的导数都为0。

具体算法比较复杂,数学公式太多没看懂。

概率解释

此章从概率的角度验证了使用J(?)的合理性。其实我觉得我可以很好的理解或者说感觉J(?)是合理的,这里从另一个角度验证了,也是为了以后使用的概率模型做一个铺垫。

对于线性回归中使用的训练集,我们假设每个元素中由于种种原因会有一些误差,并且这些误差属于正态分布(高斯分布)。

则:

则,?的可能性为所有训练集中元素的可能性的乘积。

现在我们要使?的可能性最大,也就是求出?使L(?)最大

定义:

只要使上式最大,则L(?)也最大。

则只要使最小即可。

局部加权线性回归

在使用线性回归时,提出合理的假设函数很重要,也很难,因为很难确定参数的个数,特征个数确定,但是可以提出多次方程。这就会牵扯到过拟合和欠拟合的概念。

为了减小线性回归对参数假设的以来,可以使用局部加权线性回归。

此方法很简单,思想就是如果要求一个点x对应的结果y,只要根据x附近的训练集(已知数据)求出y。

2分类问题和逻辑回归

对于分类问题,结果变量y是几个离散的变量。

这里我们仅讨论y为0或1的情况,也就是只有两类的分类。

逻辑回归

在逻辑回归中,我们选择的假设函数为:

假设:

推出:

根据训练集,可以得出θ的概率为:

只要求出使L(?)最大化的?。

同样,使用梯度上升算法。

感知器算法

感知器算法是改变了g(z)函数,其他同上一节的一样。

感知器算法表面上同其他算法相似,但是感知器算法没有具体的概率意义,也没有概率最大化的评价算法。

牛顿算法

牛顿算法的引出是快速求出使y=0的x的方法。

对于f(?)只要迭代下式:

就能快速的求出f(?)=0。

而如果要求函数的最大值,只使函数导数为0。

即:

上述是对于?为变量,当?为矢量时,

牛顿算法收敛速度极快,但是每一轮牛顿算法都要使用极大的计算量,因为要计算H矩阵,所以不是用与特征较多的情况。

3 广义线性模型

在解决以上两种问题的情况下,我们可以将以上两种模型推导出更广义的线性模型。

广义线性模型是一种概率模型。

指数分布族

对于伯努利分布:

则:

对于高斯分布:

由以上推倒可以,高斯分布和伯努利分布都是指数分布族的特例。

构建广义线性模型

说白了,构建广义线性模型就是根据概率分布获得一个比较合适的假设函数

在构建广义线性模型之前,需要做三个假设:

1 假设y|x; ?属于指数族模型。

2 h(x)=E[y|x]。

3 这个不太像一个假设,更像一个设计。

步骤:

1 首先根据概率公式求出指数族的相关参数。

2 根据参数和假设二求出h(x)的形式。

对最小二乘法:

对于逻辑回归:

Published: 12 Sep 2012

推荐系统综述

推荐系统目前用途广泛,但是仍然处在一些不足需要改进。

推荐模型

用户向推荐主动提供个人偏好信息或推荐请求(也可不主动提供而让推荐系统主动采集),推荐系统根据不同的推荐策略或根据已建模的知识库进行推荐,返回推荐结果。

推荐根据用户和推荐对象(item)的信息对未评价的item进行评价:

现有的推荐算法

推荐算法有不同的分类,比较细致的分类可分为以下几类:

1 基于内容的推荐

基于内容的推荐是通过匹配item的特征和用户兴趣的特征的相关性,认为相关性高的item用户更可能感兴趣。

通常用户的兴趣根据用户的历史数据获得,如用户已评价的item的特征。

缺点:

特征提取对于某些item如多媒体来说很难,有些特征相同的item对用户来说具有较大的差异(比如我这篇文章和IEEE transaction那篇文章都是推荐系统的综述文章,但是估计没几个人愿意看我的)。

无法为用户推荐其他方面的文章。

User问题。

2 协同过滤

协同过滤技术是根据相似用户的喜好为用户进行推荐。,是目前应用最广泛的推荐技术。

1) 启发式算法

启发式算法的思想是使用用户c的相似用户c'对一个对象s的评价来预测用户c对对象s的评价已决定是否推荐。

用户的相似度的计算主要是根据两个用户对同意对象的评分差异。最近本的两种方法是基于关联的和基于余弦距离的。

基于关联的是根据用户c和用户c'共同评价的所有item的评价相似度计算关联。

基于余弦距离的方法直接把评分作为向量来计算余弦距离。

预测评价的计算公式如下表示:

aggr表示相似用户评价的启发式函数。

启发式函数主要有三种:

其中,(a)简单的取平均值,(b)根据相似度取期望值,(c)引入了归一化变量,杜绝了用户之间的评价标准(评价平均值)不同。

2) 基于模型的方法

此方法利用用户c对众多对象的评价来学习c的模型,把用户归类到一个模型或者一个类型中,然后使用概率的方法对新的对象s的评价进行预测。形式化表述如下:

公式表示对于item的评价的期望值。评价范围为0~nPr(r=i)表示评价为i的概率。

缺点:

新的用户

新的item

评价数据的稀疏性。

3 基于人口统计信息

此方法是在推荐系统中引入了用户人口统计信息,如年龄、性别等。

4 基于知识的推荐

此方法是一种推理技术,利用针对特定领域的规则来进行推理。如认为中国人喜欢吃中国菜。

但这种技术的瓶颈在于知识和规则的获取。

5 基于社区的推荐

引入用户的社会关系,根据用户的好友的偏好获知用户的偏好。

6 基于组合的推荐

组合推荐通过组合各种推荐技术以弥补某一推荐技术的缺点,根据组合方法可分为三类:

1)分别使用不同推荐方法获得推荐结果,结合不同的推荐结果获得最终的推荐结果。(也可以对不同的推荐结果进行评价将最好的推荐结果作为最终的推荐结果)

2)以一种推荐方法为框架,融合令一种推荐方法。

3)基于不同的推荐技术构建一个推荐模型

推荐系统的性能评价方法和试验方法

对于推荐系统存在多种多样的评价参数,最常用的是精确度(accuracy)和覆盖度(coverage)。覆盖度是评价推荐系统可推荐的item的覆盖范围。精确度常用的指标有基于统计的和基于决策的。基于统计是比较预测的评价和真实的评价的误差,如(mean absolute errorMAEroot mean square errorRMSE)和correlation。基于决策是评价推荐系统推荐的结果和用户需要的相关程度,如精度、召回率,F-measureROC等。

试验方法可分为离线实验(offline experiment),用户模拟(User Studies)和在线评价(Online Evaluation)。离线实验是通过已有的数据集进行模拟用户行为。

用户模拟是通过让一些试验志愿者对系统进行使用、反馈和评价。在线评价是将系统launch,让真正的用户使用,通过统计数据进行评价。

这三种方法的cost以此增加,离线实验是最好的也是最有说服力的,但是往往找不到合适的数据集,这也是很多研究的瓶颈。

最新研究方向

1 用户和item的特征提取

2 基于情境的推荐

3 多尺度(Multcriteria Rating)推荐技术

4 用户交互的侵袭性(Intrusiveness)

5 推荐系统的安全性

6 推荐系统的灵活性

7 推荐系统的评价准则

Reference

[1] Adomavicius, G., Toward the Next Generation of Recommender systems: A Survey of the State-of-the-Art and Possible Extensions. IEEE TRANSAC TIONS ON KNOWLEDGE AND DATA ENGINE ERING, 2005.

[2] 许海玲等, 互联网推荐系统比较研究. 软件学报, 2009.

Published: 01 Sep 2012

返利网的盈利模式浅谈以及如何获得更多的返利

最近看了不少返利网,有真的有假的,总的来说都比较坑爹,正巧我了解里面的这些道道,给大家说说这些返利网的背后盈利模式,这样,大家就可以直接跳过返利网直接拿到该你拿到的钱。

首先,给大家介绍一些淘宝联盟。

淘宝联盟就是一个淘宝卖家的广告平台,背后的运行模式我给大家举个例子:

比如我是淘宝卖家,我是卖减肥药的,因为我的减肥药利润非常高,我在淘宝联盟提交了信息,说如果谁帮我卖我的产品,也就是将流量引入我的出售页面,卖一份我就给他50%的收益!

这时候,有个屌丝是专门做网络销售的,他有一个网站或者他可以盗别人的人人账号发布信息或者它自动评论别人的日志。总之,他从我这里通过淘宝联盟获得了一个url连接,他通过各种手段让客户看到并点击这个url,客户通过这链接就回到我的淘宝页面,客户每购买一份减肥药,淘宝联盟都会记下来,然后将这50%的收益发给这个屌丝。

返利网盈利模式

这回大家知道了淘宝联盟,就知道这些返利网是怎么盈利的了吧。客户通过这些返利网去购买物品,其实返利网就相当于网络销售员,我们买一份减肥药,淘宝联盟给返利网50%,返利网在给客户20%,客户感觉自己赚了不少- -

好吧,说了这么半天,对大家有啥好处呢,我们又不是网络销售员。

问题就在这里,淘宝联盟对网络销售是没有门槛的,也就是说,你可以不通过返利网,直接以个人的身份去淘宝联盟获得你自己的url连接,拿到你所有的50%

给大家弄几个截图:

你在淘宝看好了一个想购买的物品,复制他的名字,在这里搜索:

?搜索了以后,点击立即推广,复制url连接:

复制到浏览器里面就会进入到想购买物品的页面,你购买就可以了,购买以后等你确认付款时钱就返还到你的淘宝联盟里。你的支付宝实名认证以后就可以把钱提取出来了。

我买的东西较少,所以返利也少。多少省点钱而已,高福帅就别弄了,怪麻烦的。

注:1.不是所有的东西都在淘宝联盟上都有的,不过绝大部分都有。

2.不是所有的物品都有50%的利润,我见过最多的就是减肥药50%,我也以此告诉大家减肥药是如何的不靠谱。

3.除了淘宝,其实当当和卓越也是有的,模式差不多,但是门槛稍微高点。

Published: 01 Sep 2012

关于未来

最近状态不是太好,爸妈一直想让我出国读博士,而我对于读博士实在没有啥兴趣,但我又没法说服我爸爸,一直纠结于此。最近自己决定了了不出国,突然感觉没有了压力学习的状态又没了。明天江江回南京,和他一起去见我叔叔,我知道我叔叔又会游说我,我打算和他好好谈谈,把我对于不想读博的原因告诉他。

不想读博的原因:

1 我对于科研实在提不出来兴趣,不喜欢看论文、写论文,做这些对社会很可能没有用处的东西不是我所希望的。其实我并不是不喜欢做研究,我不喜欢做一些离现实太过遥远的研究。比如我现在的研究方向是推荐系统,其实这个方向是不适合发论文的,因为推荐系统已经到了一个瓶颈,但是我知道这是现在客户需要的,所以我愿意去研究,或者说去学习。

2 如果走上科研这条轮,我将一事无成的可能性很大。自己和大牛比起来智力、能力、毅力差距很大,如果以后搞科研回高校当了老师,这辈子混的可能性非常大。而且即使出国读了博士,回国也不一定能去一个好的学校,很可能就去了南农那种计算机一般的学校,科研成果啥的就别想了,未来平淡无前途。科研都是一群天才和怪才去做的,我觉得我竞争不过他们,但是如果去工作,因为我的性格比较活,爱好比较多,虽然不是那种八面玲珑的人,但是综合能力还是不错的,所以我觉得我应该混的不错。我希望以后做技术管理,我确实还需要去学习、积累和沉淀,但是我愿意为之努力。

3 感觉一年内来不及准备这些东西。出国要准备托福和GRE,如果想去好学校论文时一定要得。自己英语基础太差,学英语也实在没这个天赋,花了这么多时间依然效果平平。一年后还要面临找工作,找工作也要看很多书,如果时间用在准备出国上,找工作必然受很大的影响,到时候工作都找不到满意的就苦逼了。

总的来说就是准备了不一定能出去,出去了不一定能出来,出来了不一定能进去,进去了不一定进的好,进的好不一定搞得好。里面有4个坎:准备出国、博士毕业、找工作近好高校、科研!。

读博也有优点,虽然和上面比比不值一提,但是还是写写吧:

1 名誉和社会地位。博士毕竟是人类社会最高的学历,洋博士也算是光宗耀祖了,作为人类文明的中流砥柱也确实可以获得相应的社会地位。

2 安定的工作。科研的话最好应该就去大学或者研究所,相对来说工作也比较稳定,不会太过劳累,幸福指数应该会比较高。

名誉和安定的工作,实在不应该是我现在主要考虑的。而且我觉得,无论是工作,还是科研,只要能出一定的成果,名利都会随之而来。

另外,我还有一些迷茫。对于找工作和读博科研这两条路来说,其实我明白科研是一条更好的路,这个好是客观的好,因为可以获得更多的幸福感,我觉得这也是人生应该追求的东西。但是科研这条路比工作艰难太多了,同时对我来说确实不是我所爱的和我所适合的,但我不知道自己不选这条路的根本原因是自己不想付出努力还是因为工作比科研更适合我,或者说是不是因为这条路很难所以我才不喜欢。"人一般都会选择一条错误的路,因为正确的路太难了"。这句话不知道适不适合现在的我。不读博是一种逃避,还是一种理性的选择,其实我也有点不懂。

昨天浏览了一遍风云的博客,有些感触:1) 他如此的努力让我对着几周的虚度光阴有些自惭形愧。2) 人应该做自己喜欢的事情。 3)我希望做他那种人。精通技术,有思想,有经验,有能力,并愿意为之努力。懂生活,有爱好,并懂得取舍和分享。

明天去和我叔叔交流交流,交流完了对未来进行一个比较客观的规划。不能一直这样浑浑噩噩。感觉这几个星期每天学习的时间平均可能还不到5个小时,对此我表示愧疚。学习能力和毅力无论是科研和工作都是很重要的。

Published: 01 Sep 2012

Windows系统的安全体系结构

摘要:本文以Windows NT系列版本为基础介绍了Windows安全体系结构,并重点介绍了Windows系统中的身份认证、访问控制和安全审计机制。对于身份认证,文章主要介绍了交互式登录和网络身份认证,并介绍了他们所使用的身份认证协议NTLM和Kerberos协议,同时介绍了智能卡、指纹识别等认证技术。对于访问控制主要介绍了Windows中访问控制的原理、用户组的概念以及对文件的访问控制,同时对Vista中最新引入的用户账户控制UAC进行了简单介绍。对于审计主要介绍了windows的审计工作原理和审计策略。

关键字:Windows安全;安全体系结构;身份认证;访问控制;审计;

1 引言

1983年微软发布了第一代Windows到现在Windows 8的诞生,Windows操作系统已经有了近30年的历史。早期由于网络的未普及性,电脑大部分以孤岛的形式独立运行,人们未预见到安全的重要性,微软公司也未为早期Windows操作系统设计完整的安全机制。

随着计算机的发展,人类社会的大量工作及财富转移到计算机平台,同时由于互联网的爆发式增长,安全问题受到人们越来越多的关注。而作为所有应用的运行平台,操作系统的安全成为重中之重。为此,在Windows NT系列的系统中,微软为Windows操作系统引入了各种安全机制以保证操作系统的安全性。

根据美国国防部于1983年提出并于1985年批准的"可信计算机系统安全评价准则(TCSEC),Windows NT系统达到了C2级别[1]。由于操作系统本身便是为了运行各种应用软件,以及用户的非专业性和对操作系统要求的方便操作等原因,操作系统不可能也无需达到完全地安全,相反,对安全过分追求可能导致操作的复杂从而降低用户体验。因此,如何平衡安全性和操作的简便性也是微软要考虑的问题。为此,微软也通过允许用户根据自身的使用要求进行个性化设置。

本文以Windows NT为核心首先介绍了Windows安全体系的基本思路和总体结构,在此基础上,重点介绍身份认证机制、访问控制机制和安全审计机制。

2 基本思路与总体结构

操作系统作为硬件和应用软件之间的连接桥梁和软件运行的平台,保证它的安全运行是信息安全的基础,操作系统所提供的安全服务主要包括[2]:认证、授权、隐私保护,数据完整性,不可否认性等。

本文以Windows Vista的安全体系结构为例,介绍Windows系统的安全体系结构。Vista的安全体系结构[3]如图1所示。

图1 Vista的安全体系结构

Windows安全体系结构主要分为三个层次,通用基础设施、安全基础设施和应用安全。

  • 通用基础设施:此模块是操作系统的核心部分,主要为上层(包括安全模块但不仅限于此)提供计算、通信和存储等基本服务。
  • 安全基础设施:此模块包括系统安全服务的主要模块[4],为操作系统、应用程序和网络提供安全服务。包括以下模块:
    • 安全硬件服务:Windows所支持的硬件安全服务,如USB Key以及Vista中引入的智能卡和可信计算模块(Trusted Computing Module, TPM)[5]等。
    • 密码服务:此模块主要为系统中其他模块提供加密解密、密钥管理等密码服务。包括公钥基础设施(PKI)和CryptoAPI、CNG密码模块。
    • 认证:对用户身份进行鉴别,在此基础上给用户赋予不同的权限。
    • 通信安全:此模块主要提供安全的网络、通讯服务,保护网络上传输数据的安全以及保证系统和服务免受非法用户的访问或攻击。主要包括IP安全协议(IPSec),安全套接字层(SSL)以及虚拟专用网络(VPN)。
    • 安全存储:此模块在密码服务的基础上对文件系统进行加密,以防止数据的非法访问。
    • 访问控制:在用户认证的基础上,给用户提供相应权限的服务,而防止非授权用户访问资源。
    • 审计:通过日志的形式对系统中有关安全的活动进行记录、检查和审核。
    • 安全管理:包括安全策略管理和安全补丁管理。在windows 7中微软引入了Action Center,从中可以对系统安全特性以及备份、更新等功能进行配置[6]

  • <li>
    
    安全应用:主要指基于安全基础设施构建的安全应用软件,其中安全机制是基于应用基础设施设计和开发的。
从本质上来讲,操作系统的安全便是在用户对资源和服务进行访问和使用时,对用户操作进行管理,阻止非法用户访问资源和服务。用户访问资源过程如图2 所示。

图2 用户访问资源过程

由图2 可以看出,在windows安全体系中,身份认证、访问控制和审计是三个核心模块,在windows安全中起着非常重要的作用。因此,本文将分别重点介绍windows安全框架中的身份认证、访问控制和审计模块。

3 身份认证

3.1 身份认证概述

身份认证[7](又称身份鉴别)对用户身份进行识别和验证,防止攻击者假冒合法用户获取访问权限,一般涉及识别和验证两方面内容。 识别:识别访问者身份,并可区分不同用户。 验证:对访问者生成的身份进行确认。 身份认证主要使用以下几种依据:
  • 验证他知道什么,如口令。
  • 验证他拥有什么,如智能卡。
  • 验证他的生物特征,如指纹、视网膜、语音甚至DNA。
  • 验证他特有的能力,如签名。

3.2 Windows 2000的身份认证机制

Windows 2000的身份认证机制主要分为两部分:交互式登陆和网络身份认证[8]。交互式登录要求用户登录到域账户或者本地计算机账户,而网络身份认证则是向特定的网络服务提供对身份的证明。 早期Windows使用NTLM协议进行身份认证,在Windows 2000中,微软引入了更加安全的Kerberos v5认证协议,同时并向下兼容NTLM协议。此外,Windows 2000 还支持使用硬件令牌作为身份认证,如使用智能卡将密钥存储在硬件设备中,更有效地防止了网络上的假冒攻击。

3.2.1 交互式登陆

用户帐户分为本地用户和域用户,本地用户用于访问本地计算机资源,只在本地进行身份认证,用户信息存储在SAM中,域用户用以访问网络资源,用户信息存储与活动目录中。域是window NT 中数据安全和集中管理的基本单位。 在Windows系统中,用户可以交互式登录到本地计算机或者域账户。登录到本地计算机即可获得该机算上机上的资源的相应的使用权限。而登录到域账户则可同时获得本地计算机和域上资源和服务的相应访问权限。

3.2.1.1 交互式登陆框架

在Windows系统中,交互式登陆的框架如图3 [9]所示。

图3 交互式登陆框架

在交互式登录框架中,各组件的功能如下
  • Winlogon:负责管理登录相关的安全性工作,处理用户的登录与注销、启动用户 shell、输入口令、更改口令、锁定与解锁工作站等。此外,Winlogon还要向GINA发送事件通知消息,并提供可供GINA调用的各种函数。
  • GINA:此模块所提供的动态链接库实现了登陆进程的认证和身份认证,实现了Windows默认的登陆界面并提供了Winlogon用于标志和认证用户的输出函数。同时,GINA 收集用户的登录数据,然后集中传递到本地安全授权机构(LSA)
  • 本地安全授权机构(LSA):LSA是安全子系统的核心,负责在本地登录和远程登录中认证用户的身份,并维护本地安全策略。如图所示,LSA调用特定的身份认证程序包来完成以上任务。
  • 身份认证程序包:身份认证程序包接受输入的登陆证书,并通过自己的认证程序来约定是否允许用户登录。Windows 2000 默认安装了两个认证程序包,它们分别是MSV1_0 和Kerberos v5。
当身份认证程序验证了用户的可登录性以后,将结果通过LSA返回给GINA,GINA向用户显示验证是否成功,同时,GINA还将结果返回给Winlogon。如果验证成功,Winlogon会为用户创建一个Windows工作桌面,并启动用户与计算机交互的相关进程。

3.2.1.2 登陆到本地计算机

在Windows2000中,每个用户都在系统安全账户管理器(Security Account Manager, SAM)中存储一个用户信息。当用户登录到本地计算机时,系统将登陆信息和SAM数据库中的条目进行比较以判断用户提交的信息是否有效。

图4 交互登陆到本地计算机

登录到本地计算机的交互式登陆过程如图4 所示,具体的步骤如下:
  1. 用户启动登陆过程。Winlogon切换至Winlogon桌面,并调用GINA显示的登陆对话框。
  2. 用户输入用户名和密码,GINA将登录信息发送给LSA进行认证。
  3. LSA调用认证程序包(如MSV1_0)。
  4. 身份认证程序包根据用户的登录信息在SAM数据库中寻找匹配信息。
  5. 如果找到匹配的用户信息,SAM就向身份认证程序包返回用户的SID和用户所在组的SID。
  6. 认证程序包向LSA返回用户ID和用户所在组的SID。
  7. LSA使用这些SID创建安全访问令牌,并将令牌和登陆确认信息返回给Winlogon。
通过以上步骤,用户完成了登录到本地计算机的过程并获得了系统对该用户提供的访问资源权限。

3.2.1.3 登录到域账户的交互式登陆过程

域用户账户信息存储在域的活动目录服务中。本质上来讲,当用户从一台 Windows计算机登录到域账户时,用户实质上是在请求允许使用那台计算机上的本地系统服务。域账户的登录和身份认证使用Kerberosv5协议,该协议是一个基于Ticket的协议,为客户和服务器之间提供双向的身份认证。 用户启动登陆过程如下:
  1. 切换至Winlogon桌面,并调用GINA显示登陆对对话框。
  2. GINA将用户输入的账户信息发送给LSA进行验证。
  3. LSA接收到用户的登陆信息后对口令进行散列函数转换,并通过Kerberos身份认证程序包发送给域控制器的密钥分发中心(Key Distribution Center, KDC)。
  4. KDC收到验证服务请求后,利用自己的密钥对信息解密以判断用户是否正确。
  5. KDC证实用户的身份后为用户返回一个登录会话密钥并向Kerberos认证程序包返回一个TGT(Ticket Granting Ticket,票据授予票据)。
  6. LSA根据用户特有的信息为用户创建会话令牌,并将其和登陆确认信息返回给Winlogon。
至此,用户完成了域用户的登录并进入了Windows桌面。交互式域登陆过程[9]如图5 所示。

图5 交互登陆到域账户

通过使用KDC返回给用户的TGT,用户可以在TGT的有效期内使用KDC的票据授予服务获得ST(Session Ticket,会话票据),用户持有ST便可以访问相应的资源和服务。

3.2.2 网络身份验证

在Windows2000系统中,网络身份验证依赖于成功的交互式域账户登录。网络身份验证如图所示。通过 Kerberos 验证程序包,用户会话将预先建立的TGT 提交给 KDC上的票据授予服务TGS,TGS向用户生成一个可用于该项服务或资源的会话票据。然后,用户把这个服务票据(Service Ticket)提交给所请求的资源,就可以被授予相应的访问权限。 网络身份验证过程[9]如图6 所示。

图6 网络身份验证

3.3 身份认证协议

3.3.1 NTLM身份认证协议

NTLM(NT局域网管理器)是Windows NT早期版本的标准安全协议,由于NTLM容易破解,自Windows 2000开始操作系统的默认协议使用Kerberos,但是为了向前兼容性,Windows仍支持NTLM。 NTLM主要存在以下问题:
  • NTLM是微软开发的非开放性协议,对它支持的厂商较少。
  • NTLM不提供双向的认证,只能服务器认证客户端,而客户端无法认证服务器。因此,容易被攻击者使用伪装的服务器认证而获得系统的访问权限。

3.3.2 Kerberos身份认证协议

Kerberos [10]协议是麻省理工学院设计的一种用户双方进行验证的认证协议,是Windows 2000默认的身份认证协议。

图7 Kerberos身份认证过程

Kerberos身份认证过程如图7所示,此协议包括两个部分: 1 .身份认证 用户向密钥分发中心KDC发送自己的身份信息,KDC的身份认证服务(Authentication Service ,AS)对用户信息进行鉴别,鉴别成功后为用户生成TGT, 并用用户的密钥将TGT加密回复给用户。 此时只有真正的用户才能利用它与KDC之间的密钥将加密后的TGT解密,从而获得TGT。 2.票据授予 当用户需要访问相应的网络资源时,用户把TGT和希望访问的服务名称发送给票据授予服务(Ticket Granting Service,TGS),一经批准,TGS为用户发行一个会话票据ST,客户收到ST后可持有ST访问相应的网络资源。 相比于NTLM协议,Kerberos协议更加灵活高效,且具有更好的安全性。Kerberos主要具有以下优点:
  • 服务器验证过程更加高效。
  • 可以提供双向验证。
  • 简化了信任管理,使信任验证通过默认的双向和传递。
  • Kerberos是开放的标准,可以与其他网络协同工作。

3.4 其他身份认证技术

3.4.1 智能卡

智能卡通常和信用卡大小一样,它所提供的抗篡改存储能保证用户的证书和私钥。Windows 2000系统引入了智能卡验证,它是基于用户持有凭证的身份认证技术,通过智能卡进行身份验证相比传统的用户名&口令的认证方式在安全性上有了极大的提高。 目前,使用智能卡及关联个人标记(PIN)的组合验证形式越来越受到人们的关注并广泛应用于金融、军事等安全级别要求较高的环境,它主要有以下优势[11]
  • 提高了攻击者的破解难度。由于智能卡使用难以伪造的电子证书作为凭证,黑客必须窃取智能卡并同时获取PIN才可以通过身份验证。
  • 无法抵赖。由于智能卡能识别登录用户信息,所以降低了用户抵赖责任的可能性。

3.4.2 生物特征认证

利用人类特征进行身份认证也是一种安全性较高的认证方法。口令和信物都有泄漏和复制的可能,但是生物特征具有无法复制的特点。因此,在对于安全性要求较高的系统,可使用这种费用相对比较昂贵的身份鉴别系统。这些鉴别系统利用授权用户的人类特征作为鉴别依据,主要有语音、指纹、视网膜及DNA等。 对于生物特征的认证程序目前大部分都是由第三方开发的,微软在Windows Vista中内置了指纹识别的认证程序[1]

4 访问控制

4.1 访问控制概述

访问控制是在保障授权用户能取所需资源的同时拒绝非授权用户的安全机制。在用户身份认证和授权之后,访问控制机制根据用户身份将根据预先设定的规则对用户访问某项资源进行控制,只有规则允许时才能访问,违反预定的安全规则的访问行为将被拒绝。访问控制的是为了根据权限限制访问主体对访问客体的访问,从而使计算机系统安全的运行。 为了实现访问控制的目的,访问控制机制需要完成识别确认用户和拒绝或允许用户访问资源的任务。前者主要由身份认证完成,因此,本章主要介绍访问控制如何根据权限限制用户访问资源。 访问控制一般包括三种类型[7]
  • 自主访问控制

    自主访问控制基于对主体和主体所属的主体组的识别来限制对客体的访问,它是一种比较宽松的访问控制机制。

  • 强制访问控制

    强制访问控制是一种比较强硬的访问控制机制,系统为主题和客体分别制定安全级别,不同级别标记了不同的重要程度和访问能力,不同级别的主题对不同级别的客体的访问在强制的安全策略下实现。

  • 基于角色的访问控制

    在基于角色的访问控制模式中,用户以一定的角色访问资源,不同的角色被赋予不同的访问权限。

其中,Windows操作系统是基于自主访问控制实现的访问控制机制。

4.2 windows访问控制工作原理

对于访问控制的主体(即用户),Windows在用户登陆的时候为用户创建一个访问令牌,该令牌包含用户的SID、用户组的SID和用户访问权限。对于访问控制的客体(即被访问对象),Windows为访问资源提供了安全描述,定义了客体的安全信息。

访问令牌把用户权限通知安全子系统,而安全子系统通过安全描述获知被访问对象是否允许用户访问和如何访问。

访问令牌和安全描述关系[9]如图8 所示。

图8 访问令牌和安全描述的关系

图8 中各模块分别介绍:

  • 安全标识(Security Identifier,SID)。

    Windows使用SID唯一标识用户和用户组,在用户和用户组创建的时候生成。

  • 访问令牌。

    当用户登录系统时,本地安全授权机构LSA在登陆过程中获得该用户和用户组的SID,并以此为用户创建访问令牌,其中包括了与用户有关的标识和特权信息。在此后代表该用户工作的每个进程和线程中都有访问令牌的一个副本。

  • 访问控制列表和访问控制项。

    访问控制项ACE包含了用户或组的SID以及对象的权限,访问控制项有两种,允许访问和拒绝访问。访问控制列表ACL是ACE的有序列表,定义了主体对对象和对象属性的访问限制和保护措施。ACL包括自主访问控制列表DACL和系统访问控制列表SACL,DACL规定了哪些安全主体可以访问对象以及以何种方式访问,而SACL定义了操作系统将产生何种类型的审计信息。

  • 安全描述。

    Windows为访问对象创建安全描述,其中包含了此对象的一组安全属性。其中主要包括所有者信息、自由访问控制列表和系统访问控制列表。安全描述由对象所有者创建。

Windows系统中访问控制工作原理如下:
  1. 当用户成功登陆后,系统根据用户SID为用户生成访问令牌,包括用户名、所在组、安全标识等信息。
  2. 当用户生成新进程和线程时,系统为其复制一个访问令牌的副本。
  3. 当进程要访问某个对象时,访问控制监视器将进程中的访问令牌中的SID和对象的安全描述中自主访问控制表遍历比较,从而决定是否允许进程访问对象。

4.3 用户组

组是用户账户的一种容器。通过用户组的设置可以允许将权限分配给一组用户而不是某个用户,从而大大的简化了用户和用户权限分配的管理。Windows2000中包括两种类型的组:安全组和分布组。安全组用于授权,可用来分配访问资源的访问权限。分布组用于与安全不相关的列表。 Windows 2000具有一些内置的组,他们是预定义的用户集合,同时具有不同的权限。Windows系统中默认的用户组如表1所示。 表1 Windows系统中默认的用户组
组名 注释
Administrators 成员具有所有的权利,可以执行所有操作系统提供的功能
Users 成员权限较低,只能运行经过认证的一些程序
Guests 成员和用户组成员具有相同权限,但是限制更多
Authenticated Users 隐藏组,包括所有的已登录账户
Backup Operators 备份操作员为备份或还原文件可以代替安全限制
Replicator 用于域中的文件复制
Server Operators 成员可以管理域服务器
AccountOperators 成员可以管理域用户和组账户
LINTERATIVE 包括物理控制台和终端服务登录到本地系统的所有用户
Everyone 当前网络的所有用户
Network 通过网络访问指定资源的用户
Print Operators 成员可以管理域打印机。

4.4 文件系统的访问控制

NTFS是一种高效、安全的文件系统[12]。在Windows2000中引入,他提供了对文件系统的访问控制,可以通过设置文件或者目录的ACL来调整文件对用户的访问权限。

在NTFS文件系统中,文件可以设置的权限从低到高分别为:无、读取、更改和完全控制,对目录的访问权限包括"无"、"读取"、"写入"、"列目录"、"读取和写入"、"修改"和"完全控制"。

由于文件夹是子文件夹和文件的容器,因此文件夹的权限是默认继承的,即分配给文件夹的权限将自动应用于该文件夹内的子文件夹和文件。

同时,Windows提供了对文件的加密服务。早期Windows系统主要使用加密文件系统(EFS),但由于该系统只能对文件或目录进行加密,无法做到对整个磁盘卷的加密,因此微软在Vista系统引入了BitLocker,它可以加密整个Windows卷,包括页面文件、注册表数据文件等系统文件。在Windows7中,BitLocker功能获得了进一步的提升[6],已经可以为移动硬盘等移动存储介质进行加密。

4.5 用户账户控制UAC

在Windows系统中,很多用户都有管理特权,这对计算机安全管理是一个很大的隐患。因此,微软在Windows Vista和Windows Server 2008中引入了UAC(User Account Control,用户账户可控制)。用户账户控制(UAC)[13]也称作用户账户保护,是最小特权原则在Vista中的体现,即通过控制使用户在执行任务时使用尽可能少的特权。其设计目的是尽量减少用户权限为管理员的时间,从而帮助用户更好的保护系统安全,防止恶意软件的攻击。

UAC允许用户验证系统行为,从而组织未经认证的计算机系统的使用和变动。当用户以管理员身份登录到Windows后,会得到两个访问令牌:完全访问令牌和标准受限访问令牌。标准受限的访问令牌并没有系统的完全管理权,而系统中程序默认都是以标准受限的访问令牌运行。因此,当程序运行需要管理员权限的操作时,必须通过特定的用户界面(UAC对话框)确定之后才能将权限提升为管理员。

但是,用户账户的引入大大增加了系统操作的复杂性,降低了用户体验,因此在Windows 7中微软提供给用户更多的选择[6],可以使用户根据自己的使用环境对其进行配置甚至关闭。

5 安全审计机制

审计是对信息系统访问控制的必要补充,它会对用户使用何种信息资源、使用的时间,以及如何使用 (执行何种操作) 进行记录与监控,这样就可以在安全事故发生后帮助管理员发现发生事故的原因并提供相应的证据。

审计可以实现多种安全相关目标[14],包括:个人职能、事件重建、入侵检测、故障分析。

5.1 Windows审计工作原理

Windows审计子系统通过和安全监控和安全策略组件联合工作,记录用户的操作和系统的安全事件。安全监控根据审记策略监控系统的安全事件,当有相关的安全事件发生时,监视器就会通知安全审计子系统,并将事件信息发送给审计子系统,审计子系统将这些信息格式化为事件日志,并通过安全日志引擎存储与安全日志中。Windows审计工作原理[15]如图9 所示。

图9 Windows审计模块工作原理

同时,Windows根据不同的事件定义了三种日志,每种日志记录不同的事件。应用程序日志记录由应用程序或一般程序产生的事件信息。系统日志记录系统本身活动产生的事件信息。安全日志记录安全事件的信息,包括监视系统、用户和进程相关的安全活动的信息。

在以上基础上,Windows还提供了另外三种日志供用户选择使用:目录服务日志、文件复制日志和DNS服务日志。

5.2 审计策略

Windows审计子系统是根据审计策略来选择要记录的事件类型,对于每一个可审核的事件,又可以选择事件执行成功或执行者失败时跟踪记录事件信息。

Windows中可以审计的事件类型[9]有以下九种:

  • 登陆事件

    每次用户在计算机上登录或者注销时,审计系统会在安全日志中生成一个事件

  • 账户登录事件

    当某用户登录到域时,需要在域控制器上对登陆进行处理,这是域控制器上会记录用户对账户进行验证的登陆尝试。

  • 账户管理

    当用户对账户进行管理时,如创建、更改或操作用户或组的操作,该审计策略会记录此操作的相关信息。

  • 对象访问

    在windows系统中,每个被访问对象都有一个系统访问控制列表SACL,它包含一个将要审计的对对象进行操作的用户和租的列表,基于SACL可以实现对对象访问的审计。

  • 目录服务访问

    活动目录同样具有SACL,因此可以对他们进行审计。

  • 特权使用

    用户具有自己的权限,并在权限的限制下进行操作,审计系统也会对某些特权的使用活动进行记录。

  • 进程跟踪

    当系统要求审计计算机上的某些进程的运行信息时,审计系统会记录创建进程和结束进程的尝试。

  • 系统事件

    当用户或进程改变计算机环境的某些方面时,比如更改事件、清空日志等操作,系统会记录这些操作的事件信息。

  • 策略更改

    当用户修改审计策略本身时,系统也会对他们的更改操作进行审计。

在windows Vista之前,所有安全事件都属于9中审记策略类别之一。通过启用该类别的成功或失败的审计,就启用了该类别的所有审计事件,审计策略都是平级的[15]

在Windows Vista和Windows Server2008中,审计策略是分层的,所有的安全事件都属于一个审计策略自类别。当启用某子类别的审计策略时,就启用了所有属于该类别的审计策略。审计策略组织形式如图10 所示。

图10 Windows审计策略层次组织形式

6 总结

本文以Windows NT系列版本为基础首先介绍了Windows安全体系结构,并重点介绍了Windows系统中的身份认证、访问控制和安全审计机制。对于身份认证,文章主要介绍了交互式登录和网络身份验证,并介绍了他们所使用的身份验证协议NTLM和Kerberos协议,同时介绍了智能卡、指纹识别等验证技术。对于访问控制主要介绍了Windows中访问控制的原理、用户组的概念以及对文件的访问控制,同时对Vista中最新引入的用户账户控制UAC进行了一些介绍。对于审计主要介绍了windows的审计工作原理和审计策略。

除此以外,在Windows安全体系中,还有其他安全模块也是保证Windows正常安全的为用户提供服务的重要手段,如网络传输安全、应用服务安全以及安全管理等。

参考文献

[1] 谭彬.Windows Vista操作系统的安全关键技术分析[D] .上海交通大学.2008.

[2] 贾春福,郑鹏. 操作系统安全 [M] .武汉:武汉大学出版社,2006.

[3] 卿斯汉,沈晴霓. 操作系统安全 [M] . 北京:清华大学出版社,2011.

[4] Vista安全技术纵览[EB/OL]. http://blog.chinaunix.net/uid-20197215-id-1729356.html.

[5] Larry Chaffin, Scott Granneman. Microsoft Vista for IT Security Professionals [M] .Syngress,2007.

[6] Windows 7安全机制十大革新[EB/OL].http://netsecurity.51cto.com/art/200912/167515.htm

[7] 龚俭,吴桦,杨望. 计算机网络安全导论 [M]. 南京:东南大学出版社,2007.

[8] windows系统安全机制[EB/OL]. http://wenku.baidu.com/view/b303108cd0d233d4b14e6 999.html.

[9] 薛质,王轶骏,李建华. Windows系统安全原理与技术 [M]. 北京:清华大学出版社,2005.

[10] 维基百科. Kerberos协议 [EB/OL]. http://en.wikipedia.org/wiki/Kerberos_(protocol).

[11] 潘晓恒. WINDOWS域智能卡认证实施方案设计[D].内蒙古大学.2008.

[12] 维基百科.NTFS [EB/OL]. http://zh.wikipedia.org/zh/NTFS.

[13] 彭爱华. WindowsVista安全机制分析[J] .程序员.2007,(7).

[14] Windows网络安全审计的四部曲 [EB/OL]. http://cio.ccw.com.cn/research/info/htm2009/ 20090217_589158.shtml.

[15] Jesper M. Johansson. Windows Server 2008安全技术详解[M].北京:人民邮电出版社,2010.

Published: 16 Aug 2012