Linux用户与之权限组管理


  • 权限(rwx、sst、umask)

  • chown

  • chmod

  • ACL(见下篇)


试验环境:CentOS 7.2 与CentOS 6.8,具体会在应用场景明确指出

权限

Linux系统对用户与组的管理,其具体操作手段就是对于权限的分配,而常见的权限分配工具有 rwx, sst, umask, ACL. 跟用户与组有uid和gid一样,权限也有自己的数字标识,用八进制数表示。 我们先逐一作个简单认知,其具体的应用就在后面的实验中慢慢说明了!

rwx

当我们在ls -l 时,会看见如下字段:九个位,每三位一组,每个组有对应的对象

Linux用户与组之权限管理_第1张图片

这就是我们通常所说的一般权限标识:

rwx:
    r: Readable     可读         100   4          
    w: Writable     可写         010   2
    x: eXcutable    可执行       001   1
    -:             无权限位
    X:              只针对目录给予x权限
    
sst:
    s: SUID,Set User ID     100   4     只对二进制可执行程序有效
    s: SGID,Set Group ID     010   2     针对可执行文件与创建协作目录
    t: Sticky   001   1     粘滞位,只针对目录
    
umask:  
    root用户:022
    其它用户:002
    ACL: Access Control List    访问控制列表

rwx

我们分配权限,一定是分配给某一对象而言的,而且分配权限,往往也是针对“别人”来说的,如果我对一个文件有所有权,那么我就可以把自己的权力分配给相关用户,规定谁可以访问,谁可以修改,谁可以用它去执行相关任务;那么“我”,就是该文件的属主;如果这个文件或目录有特定的几个人需要共同管理,或这几个人需要协作完成一件事,都要用到某文件或目录,那么我们把这几个用户组建个小团队,这个小团队就是该文件或目录的属组;除属主与属组之外的其它人,我们则管它叫其它用户

属主:u, owner
属组:g, group其它用户:o, other

另外,rwx对于文件与目录而言,其具体含义是有区别的:

文件:    r: 可使用文件查看类工具获取其内容 
         w: 可修改其内容 
         x: 可以把此文件提请给内核从而发起一个进程
    
目录:    r: 可以使用ls查看此目录中的文件列表    
         w: 可在此目录中创建文件,也可删除此目录中的文件    
         x: 可cd进此目录,可使用ls -l查看文件列表 
         X:给给目录x权限,不给文件x权限

sst

接下来我们了解下SUID与SGID,SUID与SGID是的标识都是s,在异常的情况下会显示为S,且分别位于文件属主和属组的执行位上,即 原先在执行位上的x被修改为s, 其所起的主要作用是一种“借势”;

所谓借势,对于SUID来说,就是本来A用户要执行一个文件,却发现自己没有权限,心有不甘,“借” 来一个s 替代了自己属主位上的可执行位x,使自己拥有了该文件属主的权限,进而能够正常执行此文件,SUID只对可执行的二进制程序有效!

有了SUID,解决了对于特殊情况下特殊用户的特殊需求,说白了,SUID就是一个“法外之地”,只要管理员分配给你这个权限,你就可以去执行自己本不能执行的文件,而当此文件的属主是root的时候,那么执行者也就有了超级用户的特权,此处的想象力无限!

SUID带来使得的同时,不免会有安全隐患,这也符号“任何事物具有两面性”的哲学思考,所以,SGID也就应用而生了,当SGID应用于可执行文件时,其虽无法获取该文件属主的权限,但它却退而求其次,顺利地”借“到了该可执行文件属组的权限,从而用一个s替代了自己属组位上的可执行位x,从而获得该文件属组的特权,任意存取整个组所能使用的系统资源。

而当SGID应用于目录上时,则在此目录下创建的文件,其属组都将被设置为与此目录的属组一致;而当把一个文件复制到该目录下时,除非在复制时加上-p 或 -a选项,才能保留原来的属组,注意,文件的属主不变,还是建立这个文件的用户。

延伸:安全上下文

前提:进程有属主与属组;文件有属主与属主

(1)任何一个可执行程序文件能否启动为进程:取决于发起者对程序文件是否有执行权限;
(2)启动为进程之后,其进程的属主为发起者的属主;进程的属组为发起者的属组;
(3)进程访问文件时的权限,取决于进程的发起者    
     a.如果进程的发起者,同文件的属主,则应用文件属主权限    
     b.如果进程的发起者,属于文件的属组,则应用文件的改组权限
     c.应用文件其它权限

任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限

可执行文件上SUID权限
    启动为进程之后,其进程的属主为原程序文件的属主
    SUID只对二进制可执行程序有效
    SUID设置在目录上无意义
    权限设定:
        chmod u+s FILE...
        chmod u-s FILE...
        
可执行文件上SGID权限
    启动为进程之后,其进程的属组为原程序文件的属组
    权限设定:
        chmod g+s FILE...
        chmod g-s FILE...
        
目录上的SGID权限
    默认情况下,用户创建文件时,其属组为此用户所属的主组
    一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的
    文件所属的组为此目录的属组
    通常用于创建一个协作目录
    权限设定:
        chmod g+s DIR...
        chmod g-s DIR...

接着来认识Sticky位,首先,Sticky是对目录中文件的一种保护,但只能应用于目录,而具有写权限的目录,用户通常可以删除该目录下的任何文件,而给目录设置了Sticky位之后,只有文件的属主或root可以删除该文件,所以说Sticky位的意义就是避免用户误操作或防止恶意用户的一些行为,要知道,Linux可是一个多任务多用户的操作系统。 但要注意的是,sticky设置在文件上是无意义的,只能针对于目录。

权限设定:
    chmod o+t DIR...
    chmod o-t DIR...

吐血了,我们还有一个umask.

umask

umask, 俗称遮罩码,该命令用设置了用户创建文件时的默认权限。所谓遮罩码,其实就是一种掩码,对于IP地址来讲,如果IP地址不配合子网掩码一起使用,那么这个IP就是无意义的,子网掩码了灵活使用,打破了传统IP地址的类别,已无所谓什么A类、B类还是C类;对于umask而言,当用户每次进行系统时,umask都会被执行,并自动设置掩码改变默认值。

Linux系统是一个多任务多用户的操作系统,系统管理员必须要为每个用户设置一个合理的umask值,以确保该用户在创建文件时能够有相应的权限控制,同时也可防止非同组用户对该用户的文件具有写权限;另外,直接设置的umask只对当前shell进程有效,一般地,umask是在/etc/profile文件中设置的,每个用户在登录时都会引用此文件,当然,也可以只在自己的家目录$HOME下.profile或.bash_profile或.bashrc中进行设置。

umask是一个四位八进制数,第一位代表suid被“掩”的权限,第二位代表文件或目录的属主被“掩”的权限,第三位代表文件或目录的属组被“掩”的权限,第四位代表其它用户被“掩”的权限。由于suid一般情况下不常用,所以umask通常就说后三位。

常用参数

  1. -S: 以符号方式输出权限掩码

  2. -p: 输出的权限掩码可直接作为指令来执行

使用示例

环境:CentOS 6.8

[root@centos6 ~]# umask 0022              # root默认的umask为022
[root@centos6 ~]# umask -S
u=rwx,g=rx,o=rx
[root@centos6 ~]# touch laohu
[root@centos6 ~]# ll laohu
-rw-r--r--. 1 root root 0 Aug  4 09:15 laohu # root创建文件的默认权限为644
[root@centos6 ~]# ll -d dir1
drwxr-xr-x. 2 root root 4096 Aug  4 10:02 dir1 # root创建目录的默认权限为755
[root@centos6 ~]#
[root@centos6 ~]# su - liansir
[liansir@centos6 ~]$ umask
0002                              # 普通用户的默认的umask为002   
[liansir@centos6 ~]$ umask -S
u=rwx,g=rwx,o=rx
[liansir@centos6 ~]$ touch shizi
[liansir@centos6 ~]$ ll shizi
-rw-rw-r--. 1 liansir liansir 0 Aug  4 09:15 shizi    # 普通用户创建文件的默认权限为664
[liansir@centos6 ~]$ ll -d dir2
drwxrwxr-x. 2 liansir liansir 4096 Aug  4 10:06 dir2   # 普通用户创建目录的默认权限为775
[liansir@centos6 ~]$

通过比较,可得出:

umask, 就是通过屏蔽相应的权限位,从而得出默认的权限umask与rwx之间有如下关系:
       dir: 777-umask
       file: 666-umask, 结果有奇数则加1,偶数保留

注:对于目录,x权限代表可以进入该目录,故对于这个权限初始赋值是没有什么问题的;对于文件,x权限代表执行,风险太高,故一般权限赋值一般去掉x权限。(这就是666-mask其结果为奇数要加1的解释,逆向思维应用下)


chown

主要用途

修改文件的属主和属组

chown - change file owner and group
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...

chown命令用来改变某个文件或目录的属主和属组,这是一个比较大的权限修改问题,所以只有文件原有的属主与超级用户root才可以使用该命令。

常用参数

  1. -c: --changes, 仅回显被更改的部分

  2. -h: --no-dereference, 只对符号链接的文件做修改,而不更改其他任何文件

  3. -R: --recursive, 递归处理,将指定目录下的所有文件及其子目录一并处理

  4. -v: --verbose, 回显指令执行过程

  5. --dereference: 引用其它文件的权限属性

使用示例

[root@centos6 ~]# chown -c liansir laohu
changed ownership of `laohu' to liansir             # 回显出了被更改的信息
[root@centos6 ~]# 
[root@centos6 ~]# ls -l /usr/tmp
lrwxrwxrwx. 1 root root 10 Jul 20 16:56 /usr/tmp -> ../var/tmp
[root@centos6 ~]# chown -h liansir /usr/tmp
[root@centos6 ~]# ls -l /usr/tmp           
lrwxrwxrwx. 1 liansir root 10 Jul 20 16:56 /usr/tmp -> ../var/tmp
[root@centos6 ~]# ls -l ../var/tmp
total 4-rw-r--r--. 1 root root 899 Aug  3 15:19 fstab  # 被链接的文件属主不变
[root@centos6 ~]#  
[root@centos6 ~]# chown wang /usr/tmp
[root@centos6 ~]# ls -l ../var/tmp   
total 4-rw-r--r--. 1 root root 899 Aug  3 15:19 fstab  # 默认被链接的文件的属主不变
[root@centos6 ~]#
[root@centos6 liansir]# chown wang dir2    # dir2下面的文件及子目录属主不变

Linux用户与组之权限管理_第2张图片

[root@centos6 liansir]# chown -R wang dir2  # dir2下的文件及子目录结构递归改变了

Linux用户与组之权限管理_第3张图片

[root@centos6 home]# chown wangcai --dereference=wang  # 给目录wangcai引用目录wang属主属组

Linux用户与组之权限管理_第4张图片

关于chown的几种写法:

Linux用户与组之权限管理_第5张图片



chmod

主要用途

修改文件或目录的权限

chmod - change file mode bits
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...

chmod命令用来修改文件或目录的固有权限,设置方式可采用字符或数字标识,注意,符号链接文件的权限无法修改,如果要对符号链接文件修改权限,则要改变被链接的原始文件。

方式:mode

修改一类用户的所有权限:    u= g= o= ug= a= u=,g=
修改一类用户某位或某些位权限    u+ u-g+ g-o+ o-a+ a-
    
chmod[OPTION]... --reference=RFILE FILE...
参考RFILE文件的权限,将FILE的修改为同RFILE;

常用参数

  1. -c: --changes, 仅回显被更改的部分

  2. -R: --recursive, 递归处理,将指定目录下的所有文件及其子目录一并处理

  3. -v: --verbose, 回显指令执行过程

  4. --dereference: 引用其它文件的权限属性,即把指定文件或目录的权限属性变成参考文件的权限属性

使用示例

[root@centos6 ~]# chmod g+w laohu

Linux用户与组之权限管理_第6张图片

[root@centos6 liansir]# chmod -R g+rwX dir2

Linux用户与组之权限管理_第7张图片

所以,rwx对于文件的意义

r: 文本
w: 可修改内容,但不能删除文件本身
x: 针对二进制的程序或脚本
X: 不会增加x(前提本身无x权限)

如果其它用户对目录缺少写权限,则无法创建与删除目录下的文件

Linux用户与组之权限管理_第8张图片

如果其它用户对目录只有x权限,则

Linux用户与组之权限管理_第9张图片

如果其它用户对目录只有w权限,则

Linux用户与组之权限管理_第10张图片

所以,rwx对于目录的意义:

r:可以查看目录内的文件列表,但不能访问文件,不能cd进去,不能查看文件的元数据
w:可以创建或删除目录中的文件,要配合x权限
x:可以进入目录,可以访问目录中的文件,但不能查看目录内的文件列表
X:针对目录加x权限,而对文件不加x权限

利用数字标识修改权限:

[root@centos6 dir1]# chmod 640 f1
[root@centos6 dir1]# chmod 111 f2

Linux用户与组之权限管理_第11张图片

引用其它文件的权限属性:

[root@centos6 testdir]# chmod --reference /etc/shadow dir1

Linux用户与组之权限管理_第12张图片


接下来,我们来几个关于特殊权限sst的试验:环境---CentOS 7.2

对于二进制可执行程序,必须要有x权限才能运行:

Linux用户与组之权限管理_第13张图片

由id liansir可看出,liansir既不是/etc/cat的属主,也不属于root组,所以就只能以other的角色运行cat,又因为chmod o=r 去掉了other原来的x权限,所以在cat /etc/issue时cat程序运行出错。

当一个程序运行起来之后,就是一个进程,而一个进程能否启动取决于发起者对程序文件是否拥有可执行权限。 而liansir 既非文件的属主,亦不是文件属组的成员,就只能以other的角色来运行程序,可other只有r权限无x权限,最终导致程序运行出错!

此时我们再恢复other的x权限:

Linux用户与组之权限管理_第14张图片

[root@centos6 ~]# ps aux

wKiom1ekhmbRghJAAAAw99lvg40298.png

可见cat这个进程又成功执行了!

但是,例外发生了:

Linux用户与组之权限管理_第15张图片


其他用户liansir竟然可以执行passwd成功修改密码,这意味着在/etc/shadow里面写入了东西,而/etc/shadow这个机密文件除了超级用户其他人都是看不了的,更何况写入密码!

我们通过which 命令得到passwd的绝对路径,然后查看其权限发现其属主的权限为rws, 这个s就是所谓的suid. 而s权限的好处是程序的发起者可以继承程序属主的权限,此处,是liansir继承了root的权限,从而成功修改的密码。

我们再来反证一下:去掉s权限,再让liansir修改密码看能否成功!

[root@localhost ~]# chmod u-s /usr/bin/passwd

Linux用户与组之权限管理_第16张图片

再用数字标识恢复该文件的s权限:

[root@localhost ~]# chmod 4755 /usr/bin/passwd

Linux用户与组之权限管理_第17张图片

suid真是一把利斧,想想,如果给文本编辑器nano或者vi给予s权限。。。引得想像力无限,如果一旦这样,就只能把其属主修改为一个拥有普通权限的普通用户了!


sgid与suid是一样的思路,只不过是把可执行程序继承其属主的规则移花接木到继承其属组的规则,不同的是,sgid还应用于目录,通常用来创建协作目录。

Linux用户与组之权限管理_第18张图片

从上图可看到,虽然给/bin/cat 添加了sgid权限,liansir用户应该是继承了root组的权限,但也没能打开/etc/shadow文件,这是因为/etc/shadow本身的特殊权限问题,root组也无权限访问。你可能会问,如果设置成suid,/etc/shadow也没有给root帐号任何权限啊,那为什么liansir用户就可以访问呢?因为它继承的是root帐号的权限,而非root组(普通组或管理组)的权限。任何权限对于超级用户root而言是没有任何意义的,谁让root是老子天下第一了!!!

同样,我们得反证一下,既然/etc/shadow没有给属组r的权限,导致liansir空欢喜一块,那就给其属组r的权限,再看:

Linux用户与组之权限管理_第19张图片

成功读取!

用数字标识修改sgid权限:

[root@localhost ~]# chmod 2755 /bin/cat

创建一个协作目录:所谓协作目录就是同一组的用户可以相互修改对方的文件,但不在此组的人无访问权限。

1.首先得创建一个项目组
2.把相关用户加入项目组
3.找个目录将其属组改为项目组,且将项目组的权限修改为o=---,且加sgid
[root@localhost ~]# groupadd it             # 创建it项目组
[root@localhost ~]# gpasswd -a wangcai it
Adding user wangcai to group it
[root@localhost ~]# gpasswd -a liansir it   # 在项目组中添加用户
Adding user liansir to group it
[root@localhost ~]#
[root@localhost ~]# id wangcai
uid=1003(wangcai) gid=1005(wangcai) groups=1005(wangcai),1006(it)
[root@localhost ~]# id liansir
uid=1001(liansir) gid=1001(liansir) groups=1001(liansir),1006(it)
[root@localhost ~]# 
[root@localhost ~]# chgrp it /testdir/    # 给项目组找个项目目录
[root@localhost ~]# chmod o= /testdir/   # 将项目目录的权限设置为别人无法访问
[root@localhost home]# chmod g+s /testdir/  # 给项目目录添加sgid
[root@localhost home]# ll -d /testdir/drwxrws---. 2 root it 93 Aug  4 10:13 /testdir/
[root@localhost home]#

接着Sticky, 它是一个粘滞们或粘贴位,它要粘贴谁呢,sticky位“粘贴”的是root和其属主

Linux用户与组之权限管理_第20张图片

上图中,用户wangcai对于liansir来说是其它用户,拥有r权限,但wangcai却所liansir的文件f1给删除了,岂有此理,有人可以随时把你的东西给扔了(linux是一个多任务多用户的操作系统),这是为何,wangcai只是liansir的其它用户,且只有r权限,没有w权限,怎么就把liansir的f1文件就给删除了呢???这是因为其父目录有w写权限!!!为了防止某一用户随意删除其他用户的文件,Sticky权限应用而生!

经目录添加sticky权限:

[root@localhost /]# chmod o+t /testdir/

Linux用户与组之权限管理_第21张图片

有了sticky权限,我们再来看:

Linux用户与组之权限管理_第22张图片

结果:别人的文件删除不了,只能删除自己的文件;当然root用户可以删除任何用户的文件!

注意:sst权限必须要配合x权限,很好理解,没有基本的执行权限,你这在执行权限之上的特权如何存在?皮之不存,毛将焉附!当sst变成SST的时候,则称之为sst权限异常。

Linux用户与组之权限管理_第23张图片

Linux用户与组之权限管理_第24张图片

liansir用户也无法正常查看/testdir目录下的文件列表了!

注意:在sst权限中,t权限可用数字标识法去掉,而s权限只能用字符去掉。

Linux用户与组之权限管理_第25张图片

而在Centos 6.8中是可以的。

Linux用户与组之权限管理_第26张图片

师曰:每执行一步都要检查其结果,不要自认为执行成功了!


试证明suid是继承了可执行文件属主的权限:

liansir发起一个cat进程:

wKioL1ekklfxbd2-AAAT87Ekpo0568.png

wKioL1eklLqCMOTGAAA98ftxSt4651.png

给/bin/cat可执行文件添加suid权限:

[root@localhost ~]# ll /bin/cat
-rwxr-xr-x. 1 root root 54048 Nov 20  2015 /bin/cat
[root@localhost ~]# chmod u+s /bin/cat
[root@localhost ~]# ll /bin/cat       
-rwsr-xr-x. 1 root root 54048 Nov 20  2015 /bin/cat
[root@localhost ~]#

让liansir再次发起cat进程:

wKiom1eklNjCKBqCAAAgx7FYg2k241.png

wKiom1eklOWhJzT6AAAjmv3uFes065.png

可见,当/bin/cat这个可执行文件有了suid之后,liansir这个普通用户改进的进程实质上是root帮其执行的!原来并不是“借势”,而是有人暗中相助啊!

最后还有一个个性化的控制权限的工具,ACL,学习网络的伙伴应该不陌生了,在网络中,ACL是用来匹配感兴趣的数据流,从而控制其走向;同样在Linux中,ACL就是匹配感兴趣的用户,进而控制其权限的!具体详情,看下回分解。