CN1936915A - 在操作系统中根据用户行为历史来控制文件访问的方法 - Google Patents
在操作系统中根据用户行为历史来控制文件访问的方法 Download PDFInfo
- Publication number
- CN1936915A CN1936915A CNA200610053551XA CN200610053551A CN1936915A CN 1936915 A CN1936915 A CN 1936915A CN A200610053551X A CNA200610053551X A CN A200610053551XA CN 200610053551 A CN200610053551 A CN 200610053551A CN 1936915 A CN1936915 A CN 1936915A
- Authority
- CN
- China
- Prior art keywords
- acl
- ace
- file
- access
- operating system
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Storage Device Security (AREA)
Abstract
本发明涉及一种在操作系统中根据用户行为历史来控制文件访问的方法,主要包括如下步骤,为需要保护的文件设置ACL,在ACL中针对需要防备的每个程序都配备一个属性为“曾经执行”的访问控制项,在ACE中规定具体的访问权限,访问者的ID设置成需要防备的程序文件名;当某个进程要求访问一个文件时,操作系统依次查看该文件的“访问控制名单”ACL中的每一个访问控制项,对于属性为“曾经执行”的访问控制项,操作系统通过考察当前进程的“进程控制块”中提供的程序名确定当前进程是否正在执行该ACE所指定的程序。本发明优点是:把对于使用者行为历史的考察纳入ACL机制,防止恶意用户通过网络不适当地访问目标文件,其效果是提高了操作系统的安全性。
Description
技术领域
本发明涉及一种计算机操作系统的用户访问控制方法,主要是一种在操作系统中根据用户行为历史来控制文件访问的方法。
背景技术
计算机操作系统对于文件系统中的文件、目录、以及其它系统资源(例如“注册表”)的访问保护,是基础性的安全机制。如果没有这样的保护机制,那么谁都可以任意地修改、增添、删除、或者执行系统中的任何文件,至于黑客就更可以任意散布病毒、蠕虫、木马等等恶意代码。那样,系统就毫无安全性可言了。
为此,早在三十年前,Unix操作系统就采取了措施,把计算机用户分成“文件主(文件的创建者)”、“文件主的同组人”、“(其他)用户”三类,把对于文件的“访问”分成读、写、执行三种基本操作,并为每个具体的文件或目录(由文件主)规定好每一类用户对其可以实行哪几种操作、称为对此文件的“访问权限”。有关各类用户访问权限的信息“如影随形”地跟随着每个具体的文件,存储在每个文件的“目录项”中,不能被轻易改变。而具体的用户属于哪一类,则是在“登录”到系统的时候就(根据用户名和口令密码)决定了的。这样,例如有某个用户不怀好意、想要偷偷修改某个“可执行文件”使之染上病毒,就可能会因为既非文件主、又非文件主的同组人、而为操作系统所拒绝。Unix的这种方案在当时的条件下是很有效的,所以一直传了下来,后来的包括Windows在内的操作系统基本上都承袭了Unix的这种机制。
可是,随着计算机应用的普及,把用户分成三类就显得粗糙了。例如在银行中,可能即使是与文件主同组的人也不应该都有相同的权限、而要有所区别,并且实际上可能存在着很多不同的组,需要分别赋予访问权限,有时候甚至需要针对具体的人独立地赋予访问权限。所以,应该把将用户分三类赋予不同访问权限的方法加以扩充,使每个文件或目录(或其它资源)都有个“访问控制名单”,名单中详列哪一些组有什么样(读/写/执行及其它)的访问权限、哪几个人有什么样的访问权限,或者哪些组和哪些人不允许什么样的访问,名单上没有的就不许访问,或只允许读。这个名单就是ACL,即“Access Control List”,一般翻译成“访问控制列表”或“访问控制表”。在采用这种技术的操作系统中,ACL是作为文件的一部分而存储的;只要文件在,它的ACL就在。ACL可长可短,主要由一串“访问控制项”ACE构成,每一个ACE说明一个组或人对此文件的访问权限,实际上也就是一条是否允许访问的规则。
从表面上看,这只是提高了文件的安全性,但是实际上这也提高了整个系统的安全性、特别是防止病毒等恶意代码侵入方面的安全性。这是因为,无论是病毒、木马、还是别的什么恶意代码,一般都需要把一些信息写到被入侵系统的磁盘上、即文件系统中,或修改已经存在的文件,这样才能“落地生根”。而管住了文件系统(包括文件、目录等等)的安全,那么整个系统即使一时被侵入也留不下持续的后果,这就提高了整个系统的安全性。当然,实际使用中还要结合别的安全措施。
IBM版的Unix操作系统AIX(主要用于银行等等)很早以前就实现了ACL,后来别的操作系统也都逐渐跟上。目前,Windows和Linux两个操作系统都支持ACL,就是说都提供了ACL这种机制。最近几年,美国南加州大学等机构的一些研究者又对ACL作了进一步的改进,使得访问权限可以带上条件;例如规定某人可以在上班时间读/写某个文件,在此时间窗口以外则只允许读而不允许写。这样的ACL称为“扩充ACL”、即EACL。
传统的ACL只考虑企图访问文件的人、即用户,而不考虑是通过什么软件来访问的,可是实际上这一点往往也很重要。例如,对于一个银行账户,用户也许只应该通过某个特定的、为管理者认可的应用软件来访问,如果不是就很可疑,就应该拒绝(并应该报告或记录在案)。这一点在传统的ACL中是没有的,但是在EACL中已经有了。用哪一个应用软件来访问某一个文件(或目录、注册表等等,以下统称“对象”),是使用者的一种行为特征;而使用者是谁,属于哪一个组,则是其身份特征。所以EACL实际上把行为特征引入了ACL机制,这显然有利于提高系统的安全性。
但是,“通过什么软件来访问”只是一个局部的、一时一地的行为。光考虑一个局部的行为并据此作出判断还不够安全。就像对于人一样,不光要看其当前在做什么,还要考察其过去作了些什么,最好是要考察其“全部工作和全部历史”,这才能作出可靠的判断。仍以上述对于银行账户的访问为例,假如用户确实是通过规定的软件前来访问的,但是进一步的考察却发现这个软件是通过网络操作远程启动的,这就又非常可疑、甚至基本上可以断定为不正常了(假定银行的制度不允许职员通过网络远程操作),此时当然应该拒绝访问(并应该报告和记录在案)。那么,能否知道这个软件是通过网络操作远程启动的呢?
在计算机操作系统中,行为的主体是“进程”。一般而言,进程就是一个应用软件的运行。在操作系统的内核中,当前正在运行的每一个进程都有一个“进程控制块”PCB作为其代表,里面记录着许多有关该进程的信息,其中就包括所运行的是哪一个软件。上述在EACL中把通过哪一个应用软件前来访问作为一个判断依据,这信息就可以从进程控制块中获取。另一方面,一个进程在运行的过程中可以另外再创建新的进程,称为“子进程”,并让其执行别的程序。此时操作系统要为子进程分配一个进程控制块,并在进程控制块中记载下谁是它的“父进程”。这样,在理想的情况下(如果父进程还“在世”),从任何一个进程开始,就可以通过其进程控制块找到其父进程(其进程控制块),再找到父进程的父进程,如此等等,一直找出其所有直系的“祖上”。如果考察所有的进程控制块,则还可以归纳出所有这些进程的“家谱”,这家谱一般是一棵以系统中的原始进程为根的倒置的“进程树”。
这样,仍以前述对于银行账户的访问为例,如果发现虽然要求读/写文件的访问者进程是在执行规定的软件,但是它的父进程却是telnetd,这是供远程“登录”软件,那就可疑了,从而应该加以拒绝。因为这说明用户是先通过telnet远程登录,然后才启动执行所规定的软件,而这理应是在本地启动的,为什么现在却是远程启动的呢?显然,这是因为考察了访问者进程的父进程才发现的疑点。同样的道理还可以类推,可以“查三代”、甚至追溯得更远。需要指出的是:进程之间的父子关系,以及祖孙关系等等,所反映的表面上似乎是进程的“出身”,但是实际上却是行为,特别是使用者的行为。就拿telnetd来说,它启动什么软件运行就是由远程的使用者控制的。所以,从一个进程上溯所得出的该进程的“家世”,实际上反映了使用者宏观的操作过程、或者精心安排,总之是使用者的行为历史。
由此可见,把对于使用者此种行为历史的考察加入到操作系统的ACL机制中,对于提高操作系统的安全性是很有好处的。可是,目前的几种操作系统,无论是Windows还是Linux,都没有在ACL机制中把使用者的行为历史、即访问者进程的“家世”考虑进去。
应该说,在操作系统对于文件等对象的保护机制中不考虑、不考察使用者的行为历史,是现有技术的缺陷,它在一定程度上降低了系统的安全性。
发明内容
针对现有技术的缺陷,本发明提供了一种在操作系统中根据用户行为历史来控制文件访问的方法,其显著的特点是将对于用户行为历史的考察增添到计算机操作系统对于文件系统的“访问控制名单(ACL)”机制中,提高操作系统的安全性。
本发明解决上述原有技术方案所存在的问题。本发明所述的这种在操作系统中根据用户行为历史来控制文件访问的方法是对原有ACL机制的扩充和改进。
“访问控制名单”ACL实质上是由一组“访问控制项”ACE构成的,每一个ACE就是一条规则。一般ACE中有三个字段,代表着三个方面的内容:
1.ACE属性。说明本项规则的基础是什么,例如用户、用户所述的组、等等。
2.访问者的ID。当属性为“用户”时,这就是用户号;当属性为“组”时,这就是访问者所属的组号。
3.访问权。当访问者的身份等特征与前两个字段相符时,允许对本ACL所属目标文件的访问(操作)种类,一般包括读、写、执行,也可以包括例如删除、改名等等操作。这个字段通常是个位图。除“允许操作”位图外,有些ACL还可能使用“禁止操作”位图。
例如,要是某个ACE的属性为“组”、ID为201、访问权为“读+执行”,那就表示:只要不是另有规定(例如对其中的某几个特殊用户),凡是属于201组的用户,对于目标文件都可以读或者执行。如果一个访问者在某个文件的ACL中找不到任何相符的ACE,那就说明不允许访问这个文件。传统的ACL一般只有“用户”和“组”两种属性。
为实现根据用户行为历史来控制文件访问,需要增加一种属性为“曾经执行”的ACE,其ID则为程序名、而不是用户的身份。例如,要是ACE属性为“曾经执行”、ID为“telnetd”、访问权为0,那么这条规则就是:在使用者(不管是谁)的行为历史上,如果曾经执行过telnetd、也即其中的某一步是telnetd,那就不允许访问目标文件。那么怎样知道是否曾经执行过telnetd呢?只要从当前进程(即访问者进程)开始,逐步上溯,考察这个链中每个进程控制块的“程序名”或“命令行”字段、看其所执行的程序是否telnetd即可。只要当前进程或其某个“祖上”进程所执行的是telnetd,就与这个ACE相符了,而ACE的访问权字段为0表示不得访问。反之,如果都没有执行telnetd,那就继续查看ACL中的下一个ACE。一般,一个文件的ACL中可以有数百、甚至上千个ACE,即数百甚至上千条规则。
这样,系统的管理者只要为一些重要的文件设置好ACL,特别是设置好ACE属性为“曾经执行”的规则,就可以防止别人通过网络来访问这些文件。例如,假定一台计算机上有telnetd、firefox、foxmail、netmeeting和snmpd等5个程序(服务进程)都有可能通过网络受到远程访问,那就为这5个程序都各自配上一条属性为“曾经执行”的规则,都不允许访问(或者只允许读)那些重要的文件。当然,每个文件都应该有一个ACL。注意有些网络软件在正常情况下不会图谋不轨,但是却也可能成为祸根,因为程序中有可能会存在缓冲区溢出的漏洞,如果被攻击者发现并利用,就也可能转化成恶意程序。所以对于“涉外”的网络软件都应注意防范。
需要说明的是所说的文件实际上也包括目录,不允许对一个目录实行写操作,就是不允许在这个目录中创建文件。一般而言,恶意用户在侵入一个系统以后总是要把一些恶意代码写入某个目录。如果把这条路堵死,恶意代码就无处落脚了。
正常的网络连接也有可能要访问本地的文件。例如从网络上下载一个文件的时候,就总得要把它写在本地的文件系统中,再如有时候也需要把本地的文件作为电子邮件的附件发送出去。为此,可以在文件系统中固定设置几个目录(文件夹)专门用于这个目的,这几个目录的ACL可以设置得很宽松,而对其它的目录则严加防范。不过这些实际应用上的细节已经与本发明的实质关系不大。
所以,有了对ACL的扩充和对于访问者进程的“家世”考察(和比对)这么两个要素,就可以实现根据用户行为历史来控制文件访问的目的了。现将此方法具体陈述如下:
●在现有的“访问控制名单”ACL机制中增加一种访问控制项(ACE),该访问控制项的属性为“曾经执行”,内容包括一个访问者的ID和对于访问权限的规定,当属性为“曾经执行”时,ACE中的ID字段内容为程序名字符串;如果要求访问目标文件的用户曾经执行过这个程序,要求访问目标文件的当前进程即由该程序派生而来,并适用该ACE所规定的访问权限;
●系统管理员(或使用者)为需要保护的文件配置ACL,用属性为“曾经执行”的ACE防止由某个特定程序所派生的子进程不适当地访问目标文件。在ACL中针对需要防备的每个程序都配备一个属性为“曾经执行”的ACE,在ACE中规定具体的访问权限,访问者的ID设置成特定程序的程序名(程序文件名);
●每当需要访问一个目标文件时,ACL机制从头开始逐条查看其“访问控制名单”ACL中的每一条ACE,即访问控制项,并处理如下:
1.查看ACL中的下一条ACE,如果不再有下一条ACE,则拒绝访问、或按默认权限访问(例如只读),并结束对ACL的处理。
2.如果此ACE不是属性为“曾经执行”的访问控制项,就按ACL机制原有的方式处理,如果条件相符即得出结论,并结束对ACL的处理,否则继续查看下一条ACE,回到2。
3.如果ACE属性是“曾经执行”,就以该ACE的ID字段所提供的程序名字符串为比对目标。并从当前进程、即访问者进程的进程控制块开始比对。
4.比对进程控制块中的“程序名”或“命令行”字段,如果相符即得出结论,并结束对ACL的处理。有些操作系统的进程控制块给出的是“程序名”,有些则给出“命令行”。相比之下,“命令行”中的信息更为全面,只要ACE所提供的程序名字符串出现在“命令行”中就说明这个进程可能在执行有关的程序。一般而言,如果进程控制块给出的是“程序名”,那么操作系统就会提供一个获取完整“命令行”的手段。例如Linux就是这样。
5.否则查看当前进程的父进程字段,得到父进程的进程号。如果父进程的进程号等于原始进程的进程号,则对于访问者进程“家世”的上溯已经穷尽,转到7。
6.根据父进程的进程号找到其进程控制块,转到4,继续比对。
7.对于访问者进程“家世”的上溯已经穷尽,未发现曾经执行该ACE所述的程序文件,转到1,继续查看ACL中的下一条ACE。
进一步,作为入侵检测的一种辅助手段,在根据用户行为历史控制文件访问的同时,可以把越权访问的企图作为报警信息记录下来,甚至实时地发出警报。例如,发现某个进程企图访问载有敏感信息的文件,而这个进程又是由telnetd或者网络浏览器进程派生而来,则一方面要拒绝其越权访问要求,另一方面也要发出警报,因为这很可能是因为网络入侵所引起。
本发明有益的效果是:在现有的“访问控制名单”ACL机制中增加一种属性为“曾经执行”访问控制项(ACE),把对于使用者行为历史的考察纳入ACL机制,系统的管理者只要为一些重要的文件设置好ACL,特别是设置好ACE属性为“曾经执行”的规则,就可以防止由需要防备的程序如telnetd等等派生的进程不适当地访问目标文件,从而防止恶意用户通过网络不适当地访问目标文件,其效果是提高了操作系统的安全性。
附图说明
附图1是本发明操作系统中“进程树”的示意图;
具体实施方式
下面结合附图和实施例对本发明作进一步说明:
附图1中的每个方块都代表着一个进程控制块,即代表着一个进程。其中的1号进程是系统中的原始进程,是所有其它进程的始祖。在Linux系统中,1号进程所执行的程序是init。图中的6878号进程所执行的程序是evince,这是个相当于微软Word的文字编辑程序。这个方块有个箭头指向6872号进程,表示其“父进程”是6872号进程,余可类推。6872号进程执行的是firefox,而firefox就是网络浏览器。这说明6878号进程是由6872号进程、即网络浏览器进程派生(创建)出来的。假定我们有个需要保守秘密的文件,这个文件不应该允许来自网络的任何访问,所以在它的ACL中就应该有个属性为“曾经执行”、程序名为firefox、访问权限为禁止任何访问的ACE。意思是,只要是firefox、或者由firefox直接或间接派生出来的进程,就一律禁止访问这个文件。
这样,当6878号进程、即evince进程企图按“读”或“写”模式打开这个文件时,实施了本发明的软件就拿ACE中指定的程序名firefox与6878号进程的程序名(evince)进行比对,因为不符,就上溯到它的父进程6872号进程。这次比对相符,说明本条ACE所规定的访问权限应该生效,于是就拒绝访问,并且还可以发出警报。
如果与6872号进程的比对仍旧不符,就继续上溯,直到1号进程。如果全都不符,就说明本条ACE不生效,于是就继续考查ACL中的下一条ACE。
“进程树”中的进程可能很多,但是从某个特定的进程开始上溯,所涉及的只是它的“直系”亲属。
目前主流的操作系统就是Windows和Linux两种,所以下面以Linux为例说明本发明的实施,并指出在Windows操作系统中实施时的技术上的特殊之处。
但是,只要有需要,本发明所述方法在别的操作系统中也可以实施,而具体的实施(如程序代码以及数据结构的定义)并不影响本发明的实质。
实施例一、在Linux操作系统中的实施
Linux操作系统支持许多种不同的文件系统,但是就ACL机制的实现而言并无太大的不同,所以下面以ext2为例说明本方法的实施。
1.对ACL的扩充:
在2.6.14版Linux的代码中,ACE的数据结构定义为:struct posix_acl_entry {short e_tag;unsigned short e_perm;unsigned int e_id;};
这里的e_tag就是ACE的属性;e_id就是访问者在某一方面的ID,也就是某种属性的值,例如当属性为“用户”时这就是用户号;e_perm则是允许的访问权限位图。
而ACL,则基本上就是一个ACE数组、即posix_acl_entry结构数组:struct posix_acl{atomic_t a_refcount;unsigned int a_count;struct posix_acl_entry a_entries[0];};
结构数组a_entries[0]表示其大小是可变的,字段a_count的数值说明这个数组的大小。
原来的ACE属性有如下几种:
#define ACL_USER_OBJ (0x01)#define ACL_USER (0x02)#define ACL_GROUP_OBJ (0x04)#define ACL_GROUP (0x08)#define ACL_MASK (0x10)#define ACL_OTHER (0x20)
为实施本发明所述的方法,现在要加上一个新的属性“曾经执行”,所以就增加一个定义:#define ACL_EXECUTED (0x80)
原来e_id的值是用户号或组号,所以32位整数就够了。而现在需要用来给定一个程序名,32位整数显然不够了,所以要修改ACE数据结构的定义,把e_id改成一个Union,使它既可以是32位整数、也可以是用作程序名的字符数组:struct posix_acl_entry {short e_tag;unsigned short e_perm;union {unsigned int e_id;char prog[16];} u; };
用16个字符作为程序名的长度一般够了。其实,更好的办法是不修改数据结构,而把32位的e_id用作字符串指针,而在原来的ACL后面增加一个字符串数组(二维字符数组)。但是此种实现细节并不影响本发明所述方法的实质。
至于e_perm,即允许的访问权限位图,一般就是读、写、执行,但是也可以加上“问了再读”、“问了再写”、“问了再执行”等等,先在显示屏上跳出一个窗口,告诉使用者哪一个进程企图对哪一个文件进行何种操作,由使用者选择是否允许。
2.规则的设置:
Linux为ACL的设置和处理提供了若干系统调用,用于从用户空间读取/写入某个目标文件的ACL。其中getxattr()用于读取,setxattr()用于写入。此外还有lgetxattr()和fgetxattr(),以及lsetxattr()和fsetxattr(),其基本功能与前二者相同,只是使用的条件和环境有所不同。
系统调用getxattr()和setxattr()的操作对象是整个ACL。以setxattr()为例,应用软件应该在用户空间的缓冲区中准备好整个ACL,即posix_acl数据结构,然后调用setxattr()。
内核中与之对应的程序入口是sys_setxattr()。虽然ACL是作为一个整体读写的,但是内核中还是会接触具体的ACE,原因是整数的存储方式有“Big Ending”和“Little Ending”之分,这使得磁盘上存储的格式与程序中使用的格式不同,内核需要加以来回转换。内核中有三个函数涉及这种转换,这就是posix_acl_from_xattr()、posix_acl_valid()、ext2_acl_to_disk()。下面以ext2_acl_to_disk()为例说明为了实施本发明而需要的修改。
static void * ext2_acl_to_disk(const struct posix_acl *acl,size_t *size) {
...... for (n=0;n<acl->a_count;n++) { ext2_acl_entry *entry=(ext2_acl_entry *)e; entry->e_tag=cpu_to_le16(acl->a_entries[n].e_tag); entry->e_perm=cpu_to_le16(acl->a_entries[n].e_perm); switch(acl->a_entries[n].e_tag){ case ACL_USER: case ACL_GROUP: entry->e_id= cpu_to_le32(acl->a_entries[n].e_id); e+=sizeof(ext2_acl_entry); break; ...... default: goto fail; } } return(char *)ext_acl: }
这些代码是ext2_acl_to_disk()的关键部分。这里的指针acl指向一个ACL数据结构、即其缓冲区,而指针entry则指向另一个ACL缓冲区中的一个ACE,整个程序的目的是要生成一个内容相同而格式不同的副本。
程序中的for循环对ACL中的每个ACE进行操作。首先通过cpu_to_le16()变换ACE属性和权限位图两个16位整数的格式,这对于所有的ACE都是一样。下面,如果ACE属性为ACL_USER或ACL_GROUP,则通过cpu_to_le32()转换e_id的数值,因为此时的e_id是32位整数。但是,这里有几个问题:
●首先,由于ACE数据结构的定义已经改变,程序中凡是要引用e_id字段的地方都要作相应的改变,例如entry->e_id应改作entry->u.e_id,acl->a_entries[n].e_id应改作acl->a_entries[n].u.e_id,如此等等。
●程序中的case语句中没有涉及新增加的ACE属性ACL_EXECUTED,所以应该加上。
●当属性为ACL_EXECUTED时,e_id是个字符数组,所以不需要格式转换。但是字符数组不能像整数那样赋值,而需要作字符数组的复制。
所以,需要在上面的代码中的“default:”前面插入以下代码:
case ACL_EXECUTED:
strncpy(entry->u.prog,acl->a_entries[n].u.prog,16)
e+=sizeof(ext2_acl_entry);
break;
这样,对于属性为“曾经执行”的ACE,就把用于程序名的字符数组复制过去了。复制的长度为16,这是前面定下的。
对于其它两个函数的修改与此相似,可以类推。
至于用户空间的处理,即通过人机交互形成一个ACL(数据结构),那就简单了,任何一个略有经验的程序员都可以毫不费力地加以实现。具体的人机交互方式可以是菜单式的、表格式的,也可以是命令行方式的,还可以使用Web网页。形成了一个文件的ACL以后,就可以通过系统调用setxattr()把它设置到内核中去。
虽然有关系统调用是为整个ACL而设的,但也很容易在此基础上实现单项ACE的增添和修改,例如,要在ACL中增加一项属性为“曾经执行”的ACE,就可以这样操作:
先通过系统调用getxattr()从内核获取目标文件的ACL;
通过键盘、表格、Web页面等等手段和来源获取用户输入的ACE属性和程序名;
在ACL中比对,看是否已经有属性相同而且程序名也相同的ACE存在;
如果已经存在,则提醒用户,并询问是否需要修改成新的访问权限;
如果不是,就结束操作,不写回ACL;
如果是,就修改已有的ACE;
如果不存在,就扩大ACL的长度,根据用户输入的信息在ACL中增加一个ACE;
最后通过系统调用setxattr()把整个ACL写回内核。
3.规则的运用:
2.6.14版Linux代码中有个函数permission(),每当需要打开一个文件或目录时都要先调用这个函数,检测是否允许当前进程按所要求的模式(读/写/执行等等)打开目标文件。而permission(),则根据目标文件所在文件系统的种类调用该文件系统为此而提供的检测函数,对于ext2文件系统,这个检测函数是ext2_permission()。它又辗转调用一个函数ext2_check_acl(),这就是具体察看ACL的函数了。目前ext2文件系统采用的是传统POSIX的访问控制,所以最后调用posix_acl_permission()逐项比对ACL中的每个ACE,其伪代码描述如下:posix_acl_permission(){
对于ACL中的每个ACE
{
如果ACE属性为ACL_USER:
如果当前进程所属的用户与ACE所述用户相符,
并且所要求的访问模式与ACE所允许的模式相符,就允许;
如果ACE属性为ACL_GROUP:
如果当前进程所属用户在ACE所述的组内,
并且所要求的访问模式与ACE所允许的模式相符,就允许;
如果ACE属性...:
......
}
否则拒绝;}
注意这些函数都在Linux操作系统的内核中。
要在Ext2文件系统中实施本发明所述的方法,只要在posix_acl_permission()这个函数中增加一个条件就可以了:
如果ACE属性为ACL_EXECUTED:
如果当前进程没有曾经执行ACE所述的程序,
并且所要求的访问模式与ACE所允许的模式相符,就允许;
对于当前进程是否曾经执行ACE所述的程序,可以写一个函数once_executed(),使其根据检测结果而返回“是”或“否”,其伪代码描述如下:boolean once_executed(...){
以当前进程为目标进程,找到其进程控制块;
while(目标进程不是原始空转进程)
{
查看进程控制块中的程序名,与ACE中的程序名进行比对;
如果发现相符就返回“是”,
否则
{
从进程控制块中获取父进程的进程号;
根据父进程的进程号找到父进程的进程控制块,以父进程为目标进程;
}
}
返回“否”;}
这个函数从当前进程开始上溯,从当前进程开始检查,直到上溯到系统中的“始祖”进程,由此而得到的进程链就是当前进程的由来,只要在其中的某一步上所执行的是ACE所述的程序(例如telnet),就说明曾经执行过这个程序。换言之,当前进程就是在执行这个程序,或者是由这个程序直接或间接派生下来的。
注意在上述算法中比对的是进程控制块中的程序名,因为Linux的进程控制块只提供程序名。但是Linux也提供用来获取一个进程的完整命令行的手段,即函数proc_pid_cmdline(),通过这个函数就可以获取指定进程的命令行。如果是使用命令行比对,那就是在命令行中搜索,看是否出现ACE中指定的程序名。如前所述,使用命令行比对更为可靠。
以上叙述说明了在Linux操作系统中如何针对ext2文件系统实施本发明。
对于别的文件系统,虽然有关的函数和代码可能有所不同,但它们的逻辑和实质是相同的,所以这并不影响本发明的实质。
实施例二、在Windows操作系统中的实施
本发明所述方法也适用于Windows,在实施中可以参考上述的Linux实施例。
在Windows系统中,每个用户都有一个“证件(Token)”,凡是属于这个用户的进程都使用这个证件。而每一个受保护的“对象”,则都有一个“安全描述项(Security Descriptor)”,ACL就是其中的一部分。让每个用户都有个证件实际上并不是特别有新意的概念,因为证件中的信息也只是与身份有关的信息,例如用户名、所属的组等等,而没有与行为和历史有关的信息。其好处只是在于例如用户名可以用字符串、而不必像在Linux中那样只能使用数值形式的用户号。Linux虽然没有“证件”的概念,但是有关的信息记录在每个进程的控制块中,实质上还是一样。Windows的ACL称为DACL(还有个SACL,用于不同目的),DACL的数据结构等等定义当然与Linux中的不同,但是基本的原理和过程都是一样的,在“方法”的层次上并没有什么不同。
但是有两个例外的因素要考虑。
首先,在Linux操作系统中,进程控制块中所记载的“父进程”是本进程的“生父”、即创建者。在这个条件下,从一个进程上溯所得到的是一个进程创建链,它真实地反映了使用者(到这个进程为止)的行为历史、或精心安排。但是,Windows操作系统的进程控制块中所记载的“父进程”却有所不同,它所记载的是本进程的“养父”,本进程从这个父进程继承资源(例如已打开文件),但却未必是这个进程所创建。这是因为,在Windows操作系统中一个进程可以替另一个进程创建子进程。这样,心存叵测的进程(软件)A就可以创建一个子进程B、让它去干坏事,但是却说这是另一个(正派的)进程C的子进程,而在B的进程控制块中则记载其父进程为C。于是,如果从这个子进程B上溯,A就不出现在其家世中,因而其家世、实际上是使用者的行为历史、就被“漂白”了。
要克服这个问题,需要在Windows的进程控制块中增加一个新的字段,例如“创建者进程”。然后,每当创建一个新进程的时候,除保持把指定的“父进程”记载在进程控制块中的“父进程”字段中外,还要把创建者、即当前进程记载在“创建者进程”字段中。
另一方面,Windows操作系统把“文件”的概念扩充到了包括文件、进程、线程在内的“对象”。这样,受“访问控制名单”ACL机制保护的目标也得到了扩展。但是,进程和线程不像文件那样在文件系统的某个目录中有个相对稳定的项目,而是在动态地变化,所以一个进程的ACL是在创建该进程的时候作为参数传递给它的。所以,程序员在编写程序时要为所创建的进程准备好一个ACL。对于线程也是一样。
其余就跟在Linux操作系统中的实施一样了。
由于微软不公开其Windows操作系统的源代码,实际上只有微软自己才有可能来实施本发明所述的方法,但是这并不影响本发明作为一种方法、即根据用户的宏观行为历史控制文件访问和对象访问的实质。
同样,对于别的操作系统,其(文件)访问控制名单机制以及进程管理机制的实现多少有些不同,但是它们的逻辑和实质是相同的,所以这并不影响本发明根据用户的宏观行为历史控制文件访问的实质。
注意本发明的效果只是在一定程度上提高了操作系统的安全性。在系统安全领域,没有一种方法可以一劳永逸地解决问题,也没有一种方法单独就可以解决问题。所以,每一种能够使系统安全性有所提高的方法和措施都是有意义、有价值的,实际使用中则应该综合使用各种有益的方法和措施。
Claims (5)
1、一种在操作系统中根据用户行为历史来控制文件访问的方法,其特征是:主要包括如下步骤,
1.1)在原有的“访问控制名单”ACL机制中增加一种访问控制项(ACE),该访问控制项的属性为“曾经执行”,内容包括一个访问者的ID和对于访问权限的规定,其中访问者的ID为程序文件名;如果要求访问目标文件的用户曾经执行过这个程序,即说明访问目标文件的当前进程由该程序派生而来,并适用该ACE所规定的访问权限;
1.2)系统管理员为需要保护的文件设置ACL,在ACL中针对需要防备的每个程序都配备一个属性为“曾经执行”的ACE,在ACE中规定具体的访问权限,访问者的ID设置成需要防备的程序文件名;
1.3)当某个进程要求访问一个文件时,操作系统依次查看该文件的“访问控制名单”ACL中的每一个访问控制项,即ACE,对于属性不是“曾经执行”的访问控制项按ACL机制原有的方式处理;
1.4)对于属性为“曾经执行”的访问控制项,操作系统通过考察当前进程的“进程控制块”中提供的程序名确定当前进程是否正在执行该ACE所指定的程序;如果是,就按该ACE所规定的访问权限控制当前进程对文件的访问,拒绝越权的访问;如果否,操作系统就从当前进程开始上溯,根据“进程控制块”中的“父进程”字段逐步考察所涉及的每个进程的父进程,根据其“进程控制块”中提供的程序名确定该进程是否正在执行具体ACE所指定的程序,如果是就按该ACE所规定的访问权限控制当前进程对文件的访问,拒绝越权的访问。
2、根据权利要求1所述的在操作系统中根据用户行为历史来控制文件访问的方法,其特征是:
2.1)在Windows操作系统的进程控制块中增设代表着实际创建者的“创建者进程”字段,创建一个新进程的时候,除保持把指定的“父进程”记载在进程控制块中的“父进程”字段中外,还要把创建者、即当前进程记载在“创建者进程”字段中。
2.2)在Windows操作系统中,受“访问控制名单”ACL机制保护的目标是操作系统中包括文件和进程及线程在内的“对象”。
3、根据权利要求1所述的在操作系统中根据用户行为历史来控制文件访问的方法,其特征是:根据“进程控制块”中提供的“命令行”确定一个进程是否正在执行具体ACE所指定的程序。
4、根据权利要求1所述的在操作系统中根据用户行为历史来控制文件访问的方法,其特征是:通过操作系统提供的手段获取一个进程的“命令行”,并根据该“命令行”确定一个进程是否正在执行具体ACE所指定的程序。
5、根据权利要求1所述的在操作系统中根据用户行为历史来控制文件访问的方法,其特征是:在拒绝越权访问的同时将此越权访问的企图作为入侵报警信息记录下来。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB200610053551XA CN100465983C (zh) | 2006-09-15 | 2006-09-15 | 在操作系统中根据用户行为历史来控制文件访问的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB200610053551XA CN100465983C (zh) | 2006-09-15 | 2006-09-15 | 在操作系统中根据用户行为历史来控制文件访问的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1936915A true CN1936915A (zh) | 2007-03-28 |
CN100465983C CN100465983C (zh) | 2009-03-04 |
Family
ID=37954412
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB200610053551XA Active CN100465983C (zh) | 2006-09-15 | 2006-09-15 | 在操作系统中根据用户行为历史来控制文件访问的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100465983C (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102201043A (zh) * | 2010-03-24 | 2011-09-28 | 微软公司 | 基于资源属性审核对数据的访问 |
CN101645118B (zh) * | 2008-08-05 | 2012-10-10 | 董渝曦 | 控制访问计算机文件内容的系统及方法 |
CN102833267A (zh) * | 2012-09-14 | 2012-12-19 | 山东中创软件商用中间件股份有限公司 | 一种保护网页安全的方法和装置 |
CN106101149A (zh) * | 2016-08-15 | 2016-11-09 | 深圳前海信息技术有限公司 | 基于访问控制列表的进程访问控制方法及装置 |
CN106778350A (zh) * | 2016-12-29 | 2017-05-31 | 郑州云海信息技术有限公司 | 一种基于文件名的权限管理方法及系统 |
CN108959867A (zh) * | 2018-06-05 | 2018-12-07 | 浙江大学 | 一种基于Hive Matedata的多用户数据资产权限安全访问控制方法 |
CN109766700A (zh) * | 2018-05-04 | 2019-05-17 | 360企业安全技术(珠海)有限公司 | 访问文件的控制方法及装置、存储介质、电子装置 |
CN110837647A (zh) * | 2018-08-16 | 2020-02-25 | 迈普通信技术股份有限公司 | 管理访问控制列表的方法及装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4296111B2 (ja) * | 2004-03-23 | 2009-07-15 | 株式会社エヌ・ティ・ティ・ドコモ | アクセス制御システム及びアクセス制御方法 |
US7568230B2 (en) * | 2004-06-09 | 2009-07-28 | Lieberman Software Corporation | System for selective disablement and locking out of computer system objects |
-
2006
- 2006-09-15 CN CNB200610053551XA patent/CN100465983C/zh active Active
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101645118B (zh) * | 2008-08-05 | 2012-10-10 | 董渝曦 | 控制访问计算机文件内容的系统及方法 |
CN102201043A (zh) * | 2010-03-24 | 2011-09-28 | 微软公司 | 基于资源属性审核对数据的访问 |
CN102833267A (zh) * | 2012-09-14 | 2012-12-19 | 山东中创软件商用中间件股份有限公司 | 一种保护网页安全的方法和装置 |
CN106101149A (zh) * | 2016-08-15 | 2016-11-09 | 深圳前海信息技术有限公司 | 基于访问控制列表的进程访问控制方法及装置 |
CN106101149B (zh) * | 2016-08-15 | 2019-05-17 | 深圳前海信息技术有限公司 | 基于访问控制列表的进程访问控制方法及装置 |
CN106778350A (zh) * | 2016-12-29 | 2017-05-31 | 郑州云海信息技术有限公司 | 一种基于文件名的权限管理方法及系统 |
CN109766700A (zh) * | 2018-05-04 | 2019-05-17 | 360企业安全技术(珠海)有限公司 | 访问文件的控制方法及装置、存储介质、电子装置 |
CN108959867A (zh) * | 2018-06-05 | 2018-12-07 | 浙江大学 | 一种基于Hive Matedata的多用户数据资产权限安全访问控制方法 |
CN110837647A (zh) * | 2018-08-16 | 2020-02-25 | 迈普通信技术股份有限公司 | 管理访问控制列表的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN100465983C (zh) | 2009-03-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100465983C (zh) | 在操作系统中根据用户行为历史来控制文件访问的方法 | |
Ulusoy et al. | GuardMR: Fine-grained security policy enforcement for MapReduce systems | |
Griffiths et al. | An authorization mechanism for a relational database system | |
US7120635B2 (en) | Event-based database access execution | |
Ubale Swapnaja et al. | Analysis of dac mac rbac access control based models for security | |
CN103959247B (zh) | 虚拟化计算机程序中的安全 | |
Bertino et al. | Database security: Research and practice | |
US20110239293A1 (en) | Auditing access to data based on resource properties | |
Ulusoy et al. | Vigiles: Fine-grained access control for mapreduce systems | |
US7260718B2 (en) | Method for adding external security to file system resources through symbolic link references | |
Pernul | Information systems security: Scope, state-of-the-art, and evaluation of techniques | |
Pernul et al. | Modelling data secrecy and integrity | |
Bishop | How to write a setuid program | |
JP4276717B2 (ja) | データベースシステム | |
Alghathbar et al. | Securing UML information flow using FlowUML | |
Ye et al. | Improving web service security and privacy | |
CN100465980C (zh) | 通过进程行为的配伍禁忌提高操作系统安全性的方法 | |
Thuraisingham | Multilevel security for information retrieval systems | |
CN116628654B (zh) | 前端页面权限控制方法、装置、设备及存储介质 | |
Pernul et al. | Organizing MLS databases from a data modelling point of view | |
Cuppens et al. | A logical approach to model a multilevel object oriented database | |
Gendler-Fishman et al. | Compile-time flow analysis of transactions and methods in object-oriented databases | |
Volpano et al. | On the systematic design of web languages | |
Ali et al. | A programming language with role-based access control | |
Ge et al. | Secure database development and the Clark-Wilson security model |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |