Linux权限控制的基本原理

来源:互联网 发布:苹果官方申请解网络锁 编辑:程序博客网 时间:2024/05/29 08:09
这里,我们主要介绍Linux在Linux系统中,我们所有的操作实质都是在进行进程访问文件的操作。我们访问文件需要先取得相应的访问权限,而访问权限是通过LinuxLinux系统中的安全模型,我们需要知道下面两点
Linux系统上最初的安全模型叫DAC,全称是Discretionary Access Control,翻译为自主访问控制。后来又增加设计了一个新的安全模型叫MAC,全称是Mandatory Access Control翻译为强制访问控制。MACDAC不是互斥的,DAC是最基本的安全模型,也是通常我们最常用到的访问控制机制是Linux必须具有的功能,而MAC是构建在DAC之上的加强安全机制,属于可选模块。访问前, Linux系统通常都是先做DAC检查,如果没有通过则操作直接失败 ;如果通过DAC检查并且系统支持MAC模块,再做MAC权限检查。为区分两者,我们将支持MAC的Linux系统称作SELinuxLinux这里,我们将讲述Linux系统中的DAC安全模型。DACLinux中,进程理论上所拥有的权限与执行它的用户的权限相同。其中涉及的一切内容,都是围绕这个核心进行的。用户和组 ID信息控制通过/etc/passwd和/etc/group保存用户和组信息,通过/etc/shadow保存密码口令及其变动信息,每行一条记录。用户和组分别用UID和GID表示,一个用户可以同时属于多个组,默认每个用户必属于一个与之UID同值同名的
对于/etc/passwd,每条记录字段分别为用户名:口令(在 /etc/shadow加密保存):UID:GID(默认 UID):描述注释:主目录:登录 shell(第一个运行的程序)
对于/etc/group,每条记录字段分别为组名:口令(一般不存在组口令):GID:组成员用户列表(逗号分割的用户 UID列表)
对于/etc/shadow,每条记录字段分别为:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:举例以下是对用户和组信息的举例。/etc/shadow中的口令信息为加密存储,不举例。
文件权限控制信息文件类型中的文件有如下类型:
普通文件,又包括文本文件和二进制文件,可用touch创建;套接字文件,用于网络通讯,一般由应用程序在执行中间接创建;管道文件是有名管道,而非无名管道,可用mkfifo创建;字符文件和块文件均为设备文件,可用mknod创建;链接文件是软链接文件,而非硬链接文件,可用ln创建。访问权限控制组
分为三组进行控制:
user包含对文件属主设定的权限group包含对文件属组设定的权限others包含对其他者设定的权限可设定的权限
下面给出常见(但非全部)的权限值,包括:
表示具有读权限。表示具有写权限。一般针对可执行文件/目录,表示具有执行 /搜索权限。一般针对可执行文件 /目录,表示具有赋予文件属主权限的权限,只有user和group组可以设置该权限。一般针对目录,设置粘滞位后,有权限的用户只能写、删除自己的文件,否则可写、删除目录所有文件。旧系统还表示可执行文件运行后将 text拷贝到交换区提升速度。举例通过ls -l可以查看到其文件类型及权限,通过chmod修改权限。
举例来说,
输出中,第 1个字符表示文件类型,其中,普通文件 、套接字文件(sp);第 2个字符开始的-rwxr-xr-x部分表示文件的权限位,共有 9位。对于文件
第2~4位的rwx表示该文件可被它的owner(属主)以或或的权限访问。第5~7位的r-x表示该文件可被与该文件同一属组的用户以或的权限访问第8~10位的r-x表示该文件可被其它未知用户以或的权限访问。对于test/, test2/, test3/设定的权限:
r,w,x权限对每一权限控制组的权限用一位 8进制来表示;例如:755表示rwxr-xr-x。s,t权限会替代位置显示;设定s,t权限则需在对应的、用于控制r,w,x的8进制权限控制组前追加数字;权限用于属主属组控制,用于其它控制。设定属主需追加,设定属组追加,设定其它者权限追加;例如前面对test/设定,则用1775,表示rwxrwxr-t。进程权限控制信息进程权限
对于进程,有如下属性与文件访问权限相关:
effective userid:进程访问文件权限相关的UID(简写为euid)。effectivegroup id:进程访问文件权限相关的GID(简写为egid)。real user id:创建该进程的用户登录系统时的UID(简写为ruid)。real group id:创建该进程的用户登录系统时的GID(简写为rgid)。saved set user id:拷贝自euid。saved set group id:拷贝自egid。举例我们可以使用ps和top选择查看具有euid和ruid的进程。或者通过top来查看进程的通过
这里通过-d选项延长top的刷新频率便于操作。此处可见,只有USER字段,表示相应进程的 b.输入即可打开Real user name的显示开关。
c.最后 Return回车回到 top中,即可看到 real user id的选项。此时输入`o`,可调整列次序。最终我们可看到包含`effective user id`和`real user id`的输出如下:
进程访问文件的权限控制策略规则
进程访问文件大致权限控制策略euid,所以其权限属性均以euid为"中心"。
进程的euid一般默认即为其ruid值若可执行文件的可执行权限位为,进程对其调用exec后,其euid被设置为该可执行文件的user id进程的saved set user id拷贝自euid当进程的euid与文件的user id匹配时,进程才具有文件user权限位所设定的权限组权限gid的控制规则类似。exec
进程ruid值始终不变;saved set-user ID始终来自euid;euid值取决于文件的set-user-ID位是否被设置。
如下:
setuid(uid)通过setuid(uid)修改权限属性之时:
superuser可顺利修改ruideuidsaved set-user ID;unprivileged user只能在uid与ruid相等时修改euid,其它无法修改。
如下:举例设置了set-user-id
如前所述,这个输出的含义是,对于/usr/bin/sudo文件,
第1~3位的rws表示该文件可被它的 owner(属主)以或或的权限访问第4~6位的r-x表示该文件可被与该文件同一属组的用户以或的权限访问。第7~9位的r-x表示该文件可被其它未知用户以或的权限访问。这样设置之后,对于 owner,具有读、写、执行权限,这一点没有什么不同。但是对于不属于root普通用户进程执行命令时通过其others中的x获得执行权限,再通过user中的s使得普通用户进程临时具有了sudo可执行文件属主(root)的权限,即超级权限。sudo设置了stick-bit
这样设置之后,对于/tmp目录,任何人都具有读、写、执行权限,这一点没有什么不同。但是对于others,其功能却大不相同。
若目录没设置粘滞位,任何对目录有写权限者都则可删除其中任何文件和子目录,即使他不是相应文件的所有者,也没有读或写许可 ;设置粘滞位后,用户就只能写或删除属于他的文件和子目录。/tmp目录写文件、目录,却只能写和删除自己拥有的文件或目录的原因。举一个man程序的应用片断,描述man程序可以用来显示在线帮助手册,man程序可以被安装指定set-user-ID或者set-group-ID为一个指定的用户或者组。man程序可以读取或者覆盖某些位置的文件,这一般由一个配置文件 (通常是/etc/man.config或者/etc/manpath.config)或者命令行选项来进行配置。man程序可能会执行一些其它的命令来处理包含显示的man手册页的文件。为防止处理出错,会从两个特权之间进行切换:运行命令的用户特权,以及man程序的拥有者的特权。需要抓住的主线:当只执行man之时,进程特权就是man用户的特权,当通过man执行子进程(如通过!bash引出shell命令)时,用户切换为当前用户,执行完又切换回去。
过程如下:
假设man程序文件被用户man所拥有,并且已经被设置了它的set-user-ID位,当我们exec它的时候,我们有如下情况:real user ID=我们的用户 UIDeffective user ID= man用户 UIDsaved set-user-ID= man用户 UIDman程序会访问需要的配置文件和man手册页。这些文件由man用户所拥有,但是由于effective user ID是man,文件的访问就被允许了。在man为我们运行任何命令的时候,它会调用setuid(getuid))getuid返回的是real user id).因为我们不是superuser进程,这个变化只能改变effective user ID.我们会有如下情况:现在man进程运行的时候把我们得 UID作为它的effective user ID.这也就是说,我们只能访问我们拥有自己权限的文件。也就是说,它能够代表我们安全地执行任何filterreal user ID=我们的用户 UID(不会被改变)effective user ID=我们的用户 UIDsaved set-user-ID= man的用户 UID(不会被改变)当filter做完了的时候,man会调用setuid(euid)这里,euid是man用户的 UID.(这个 ID是通过man调用geteuid来保存的)这个调用是可以的,因为setuid的参数和saved set-user-ID是相等的。(这也就是为什么我们需要saved set-user-ID).这时候我们会有如下情况:real user ID=我们的用户 UID(不会被改变)effective user ID= man的 UIDsaved set-user-ID= man的用户 UID(不会被改变)由于effective user ID是man,现在man程序可以操作它自己的文件了。通过这样使用saved set-user-ID,我们可以在进程开始和结束的时候通过程序文件的set-user-ID来使用额外的权限。然而,期间我们却是以我们自己的权限运行的。如果我们无法在最后切换回saved set-user-ID,我们就可能会在我们运行的时候保留额外的权限。
这里的shell是man使用fork和exec来启动的。因为这时real user ID和effective user ID都是我们的普通用户 UID(参见 step3),所以shell没有其它额外的权限.启动的shell无法访问man的saved set-user-ID(man),因为shell的saved set-user-ID是由exec从effective user ID拷贝过来的。在执行exec的子进程 (shell)中,所有的user ID都是我们的普通用户 ID.实际上,我们描述man使用setuid函数的方法不是特别正确,因为程序可能会set-user-ID为root.这时候,setuid会把所有三种uid都变成你设置的 id,但是我们只需要设置effective userID
原创粉丝点击