基于安全的一些思考--访问控制

来源:互联网 发布:阿里云 健康管理平台 编辑:程序博客网 时间:2024/06/05 03:12

最为复杂的访问控制模型用于分布式计算体系结构和移动代码系统,如CORBA和Java模式。通常访问控制系统基于很难使用的复杂的数学模型。

接下来介绍传统的UNIX访问控制系统和基于访问控制列表(ACL,Access Control Lists)的Windows模型

 

在UNIX中,每个用户用一个整数表示,称为用户ID(UID),用户也可以属于“组”,组是允许人们在合作项目上工作的虚拟集合,每个组都有自己的组标识符,称为组ID(GID)。用户可以属于多个组。

 

UID为0是特殊的情况,这是系统管理员(root)使用的UID,UID为0给系统管理员提供了对整个机器的访问和控制权限。

 

系统中的所有对象,包括文件、设备、目录,都被分配一个UID和GID。除了所有者标识符,每个对象都有与它关联的访问权限,这个权限指定谁有权读、写和执行这个对象。每个文件有三组“rwx”这样的访问权限。第一组用于文件的拥有者;第二组用于同组的用户,第三组用于系统中的其他用户。UID为0的用户可以对任何对象做任意操作,不受权限控制。

当用户执行一个程序时,执行这个程序的用户的UID被分配给执行中的程序和它所有的子进程。这是UNIX访问控制的基础。对象总是被运行中的进程访问。当试图访问某一对象时,操作系统先检查被分配给当前进程的有限UID(EUID)和有效GID(EGID),然后再查看他们是否有需要的访问权限。

通常UID与进程的真实UID相同,然而有些程序需要对系统资源进行特殊访问,它们能基于一组严格的规则改变进程的EUID。这种程序被称为setuid程序,对于组也有相似的概念,称为setgid编程

用户可以对他拥有的任何文件随意设置权限,root用户可以随意设置所有文件权限。

其他人不能修改文件权限

系统不对root用户做读或写的检查,然而ROOT用户要接受执行权限的检查

Setgid\setuid只对可执行程序起作用,这些权限表示UID\GID\EUID\EGID标识符是否可以被可执行程序修改。举个例子,如果一个文件拥有setuid权限,当它运行时,进程的EUID被设置成文件属主的UID

 

UNIX shell提供两个基本命令用于修改文件属性:chmod和chown。Chmod设置文件和目录权限,chown修改文件和目录的所有者(所属用户和所属组)

Chmod命令设置时,基本上权限可以被认为是4个八进制数字,每一个权限由单个数字的一个位来表示。八进制的最高位通常是0,最高位的数字编码了setuid,setgid,sticky位。这个数字的最高有效位改变setuid位,最低有效位改变sticky位。第二个有效数字代表文件属主的权限,第三个是组用户权限,最后一个是其他用户权限。对于这三个八进制数字,每个数字的最高有效位表示读权限,第二位表示写权限,最低有效位表示执行权限

 

文件权限可以通过调用带-l 标识的ls命令查看。在大多数列表中,权限显示在左边第一列上,用10个字符表示。第一个字符指示条目是否是一个目录,如果是目录显示d否则显示一个横杠,剩余9字符被分成3组,第一组代表文件属主权限,第二组代表组用户权限,第三组代表其他用户权限,每组权限按序表示读、写、执行

 

长目录列表也显示与属主UID相关联的用户名、组名或ID、文件最后的修改时间,以及其他一些注意事项。注意,除非能完全控制系统环境,否则不要相信最后修改时间是准确的,因为这是可以编程控制的,。例如,可用touch 命令随意更改最后修改时间

 

Chown命令可以改变文件的所有者和组别,通常只有root用户可以使用这个命令

 

运行程序时,要注意一个重要的程序特征:默认权限掩码umask.umask定义了程序运行过程中所创建文件的默认访问权限。Umask是一个三位的八进制数,表示不允许访问的权限。Umask不会影响特殊访问权限位(setuid,setgid,sticky)。当程序打开一个新文件,设置给新文件的权限会与umask的值合并

 

基于unix系统只允许root用户使用1024以下的端口

 

给脚本setuid会带来危险的条件竞争。脚本解释器运行setuid,然后加载脚本。如果攻击者连接到了setuid脚本,攻击者可以在脚本解释器加载的过程中将脚本重新链接到攻击代码,这样攻击代码就可以用脚本拥有者的权限运行了

 

Windows nt提供了更细粒度的权限,例如,在unix中,拥有对文件所有权转移的权限意味着同时拥有这个文件的所有权,但在NT中,这一权限是作为一个单独的属性来实现的

Windows有几种不同的令牌,最重要的是访问令牌(access token),它是机器持有的一组数据,以确定特定的实体是否经过之前的身份验证。另一重要的令牌就是扮演令牌(impersonation token),这中令牌允许应用程序使用其他用户的安全配置

 

安全属性通常存储在访问令牌中,指定了在满足符合要求的准则时实体能被授予的特权

 

Chroot提供了一个标准的分割代码的方法。Chroot()系统调用将改变后续文件操作的根目录,实际上它建立了一个虚拟的根目录。在最好的情况下,即使攻击者破坏了运行中的程序,危害也仅限于虚拟根目录下的那些文件。当运行了chroot()进程后,进程应该立即将EUID和UID设置成更小权限的用户,以消除漏洞空窗期,降低危险性

Chroot不能阻止人们打开套接字或执行与文件系统无关的其他调用

 

“沙箱”方法:“即时(just-in-time)”访问控制策略

 

阅读全文
0 0
原创粉丝点击