访问限制

访问限制
许多操做系统都遵循基于一个列表给用户分配权限。称为访问控制列表(Access Control List),其主要基里就是定义作什么。拿Unix,来讲,一个用户列在了/etc/passwd/etc/group中的一个用户群组里,这个组被授予了执行某一程序、写一些文件、删除一些目录的权限。在Windows系统中,也存在相同的访问控制。用户分到预先设定的组里,相应的具备某些特定的权限(AdministratorsPower UsersBackup OperatorsGuests等等)。其中一些组如Administrators(管理员)组及Power Users组能够在系统上安装软件,关闭或重启计算机等权限。人其余的一些组诸如Guests(来宾)组,就只有很是有限的权限,只能运行特定的程序。这都很是好,但有时,由于一些难以拒绝的理由,用户须要临时使用较日常更高的权限。典型的如,一个用户能够经过su命令或run as回到管理员登陆状态(分别对应Unix/LinuxWindows),可是这些方法缺乏应该有的安全特性。
在现实生活中也有相似的状况,例如,在安装某些电线的时候,施工的工程师们须要进入配电间。合理的程序应该是这样的:把进入者的相关信息记录下来,名字、单位等等,颇有可能,还会被要求出示某种证件或徽章,只有被承认了,才能够进入配电间。而且在认证后通过一段时间,必需要交回证件,否则的话就会过时。
sudo命令的工做原理几乎和这个过程同样。开始先把用户加入权限列表,这就说明该用户具备了一些附加权限(用户被加入/etc/sudoers文件中,认证用户),给该用户一个凭证(输入用户本身的口令,不要输入root口令),不样该用户就被赋予了一个临时令牌,但在通过一段时间后(默认为5分钟)就会过时。该用户的任何行为会被记入日志(经过syslog或其余类型的日志),这样就能够进入只有管理员才能进入的房间了(程序)。
sudo
sudo在几乎全部类Unix系统上都获得支持,大部分管理员至少都比较熟悉该命令。在sudo的时候,用户并非真正使用root帐户的UID来运行某个程序,而只是经过sudo进程以root身份运行程序。这与典型的su命令不一样,该命令直接改变了用户的UID。这听起来差异不大,可是对于本篇文字来讲却颇有用。第一是日志,默认状况下,sudosyslog中记录了全部usage和命令行。第二是访问控制,能够经过配置sudo,而只让用户在提高权限后使用一部分命令。第三是生效时间,su将用户改变成为root以后,运行因此一切程序都是rootUID;而sudo只是在运行sudo命令以后的程序时是root的身份。
遗憾的是,大多数管理员没有时间来学习如何把sudo命令配置好。理想状况下,应该严格限制不但愿运行的程序,达到即便运行了sudo提高了权限,也不能运行。例如,管理员须要添加、编辑、删除用户、修改用户权限、启动和中止重要进程甚至杀掉进程。即便用户仅仅管理本身的桌面,通常只须要以普通帐户的身份登陆,只有在须要的时候,才提高本身的权限。AppleMac OS X系统在默认状况下就是这样,真正作到了不能以root帐户直接登陆到系统,除非对netinfo数据库进行了修改。是有可管理的功能均可以经过更为平滑的sudo接口实现(惋惜是专有的)。固然Ubuntu也是这样。
即便已经使用过了sudo,我相信对于大多数系统的/etc/sudoers文件看起来以下所示:
User privilege specification
root       ALL=(ALL)  ALL
gibson     ALL=(ALL)  ALL
# Uncomment to allow people in group wheel to run all commands
%wheel     ALL=(ALL)     ALL
%admins    ALL=(ALL)     ALL
上例中,最好不要简单地把root权限交给gibson,但这是出于安全考虑。这里的明显的意图是赋予gibson运行命令的权限,可是这样作却留下了巨大的安全隐患。例如,gibson只要运行sudo passwd root命令就能够随意改变root口令。或者,gibson可使用sudo启动一个shell,并使用sudo /bin/bash命令绕开sudo的日志记录。因此合理的状况是gibson须要提高权限才能运行某些程序,而且严格限定这些程序的范围。
下面是一个/etc/sudoers文件的范例,它解决了上述问题。把管理员改变一个别名,而且经过让用户以!字符开头运行命令,从而使sudosu不能提高系统shell的权限。而后,配置sudo,以使管理员能够修改用户数据库,而且在的状况下杀掉进程。
User privilege specification
root        ALL=(ALL)   ALL
 
Cmnd_Alias  SHELL=/bin/bash,/bin/csh,/bin/sh,/usr/bin/bash
Cmnd_Alias  PROGRAMS=/usr/sbin/useradd,/usr/sbin/userdel,/usr/sbin/usermod
User_Alias  ADMINS=gibson,eric,Stephen
ADMINS      ALL=!/user/bin/su,!SHELL,PROGRAMS,/bin/kill
下面还有一个例子,增长了一些限制,但赋予了用户 gibson /bin,/sbin/user/bin /usr/sbin 目录下提高权限的能力,脚本一般的写法以下所示:
User privilege specification
root        ALL=(ALL)   ALL
 
Cmnd_Alias  SHELL=/bin/bash,/bin/csh,/bin/sh,/usr/bin/bash
Cmnd_Alias  PATH=/bin/,/sbin/,/usr/bin/,/usr/sbin/
 
# Custom admin program, does remote shutdown, backups, restores,etc.
Cmnd_Alias  ADMINCMDS=/usr/local/sbin/administration.pl
Cmnd_Alias  DANGEROUS=/usr/bin/passwd,/bin/su
 
gibson      ALL=PATHS,ADMINCMDS,!SHELL,!DANGEROUS
特别注意一下对于gibson可以运行哪些程序的限定,这条配置很重要,由于这里的规则是按照从左到右的顺序的。假如配置是这样的:!SHELL,!DANGEROUS,PATH;那么sudo会容许gibson运行passwd命令,这就达不到原先的目的了。根据配置sudo规则的复杂程度,一般把容许作的放在前面,把不容许作的写在后面,这样产生的结果会比较好。
相关文章
相关标签/搜索