权限管理

权限管理

在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。

我们先来看看文件的属性:

zz.png

权限:

r:可获取文件数据(读取文件)

w:可修改文件的数据(写入数据)

x:可以把此文件提请内核启动为一个进程 (执行)

文件的权限主要针对三类对象进行定义: 

owner: 属主, u 

group: 属组, g 

other: 其他, o 

通过设定权限可以从以下三种访问方式限制访问权限:

  只允许用户自己访问;

  允许一个预先指定的用户组中的用户访问;

  允许系统中的任何用户访问。

一个文件或目录可能有读、写及执行权限。当创建一个文件时,系统会自动地赋予文件所有者读和写的权限,这样可以允许所有者能够显示文件内容和修改文件。文件所有者可以将这些权限改变为任何他想指定的权限。

三种不同的用户类型能够访问一个目录或者文件:所有者、用户组或其他用户。

所有者就是创建文件的用户,用户是所有用户所创建的文件的所有者,用户可以允许所在的用户组能访问用户的文件。

例如,某一类或某一项目中的所有用户都能够被系统管理员归为一个用户组,一个用户能够授予所在用户组的其他成员的文件访问权限。用户也将自己的文件向系统内的所有用户开放,在这种情况下,系统内的所有用户都能够访问用户的目录或文件。

每一个用户都有它自身的读、写和执行权限。

-rw-r--r--. 1 root root 103 Jul 25 09:47 /etc/issue

第一位-:表示文件类型

第二到第四位:属主的权限

第五道第七位:属组的权限

第八到第十位:系统里其他(other)用户的权限

我们可以把它分成三组:第一组(第二到第四位),第二组(第五道第七位),第三组(第八到第十位)

权限对于文件:

第一组权限控制访问自己的文件权限,即所有者权限。

第二组权限控制用户组访问其中一个用户的文件的权限。

第三组权限控制其他所有用户访问一个用户的文件的权限。

权限的表示法:

可以用字符表示,也可以用八进制数字表示

r:4         w:2          x: 1   

rw: 6        rx: 5         wx:3  

rwx:7       0:代表没有权限

— 000 0 无权限      –x 001 1 执行    -w- 010 2 写

-wx 011 3 写和执行     r– 100 4 只读     r-x 101 5 读和执行

rw- 110 6 读写        rwx 111 7 读写执行

例如:640: rw-r—–  

    755:rwxr-xr-x

权限对于文件和目录的意义:

读 (r):Read     对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限

写 (w):Write    对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限

执行(x):execute  对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限,可以使用ls -l查看此目录中文件列表   

“—”表示不具有该项权限

目录 X:只给目录x权限,不给文件x权限

权限管理相关的命令:

修改文件的属主和属组

修改文件的属主:chown 

chown [OPTION]… [OWNER][:[GROUP]] FILE… 

    用法: 

      OWNER 

      OWNER:GROUP 

      :GROUP 

      [root@localhost zzz]# ll 
      total 0
      -rw-r--r-- 1 root  root  0 Aug  4 16:10 a
      -rw-r--r-- 1 user1 user1 0 Aug  4 16:13 abc
      命令中的冒号可用.替换;  
      -R: 递归 
      chown [OPTION]... --reference=RFILE FILE...
     
      [root@localhost zzz]# ll
      total 0
      -rw-r--r-- 1 root root 0 Aug  4 16:10 a
      -rw-r--r-- 1 zzz  zzz  0 Aug  4 16:13 abc
      [root@localhost zzz]# chown --reference=a abc
      [root@localhost zzz]# ll
      total 0
      -rw-r--r-- 1 root root 0 Aug  4 16:10 a
      -rw-r--r-- 1 root root 0 Aug  4 16:13 abc

 

修改文件的属组:chgrp 

    chgrp [OPTION]… GROUP FILE… 

    chgrp [OPTION]… –reference=RFILE FILE… 

    [root@localhost zzz]# ll
    total 0
    -rw-r--r-- 1 root root 0 Aug  4 16:10 a
    -rw-r--r-- 1 root root 0 Aug  4 16:13 abc
    [root@localhost zzz]# chgrp zzz a
    [root@localhost zzz]# ll
    total 0
    -rw-r--r-- 1 root zzz  0 Aug  4 16:10 a
    -rw-r--r-- 1 root root 0 Aug  4 16:13 abc
    [root@localhost zzz]# chgrp --reference=a abc
    [root@localhost zzz]# ll
    total 0
    -rw-r--r-- 1 root zzz 0 Aug  4 16:10 a
    -rw-r--r-- 1 root zzz 0 Aug  4 16:13 abc

    -R 递归

文件权限操作命令:chmod

     chmod [OPTION]… OCTAL-MODE FILE… 

        -R: 递归修改权限 

     chmod [OPTION]… MODE[,MODE]… FILE… 

        MODE: 

        修改一类用户的所有权限: 

        u=  g= o= 

        a=     (所有权限all) 

        ug=   

        u=,g= 

        [root@localhost zzz]# ll a
        -rw-r--r-- 1 root zzz 0 Aug  4 16:10 a
        [root@localhost zzz]# chmod u=rwx,g=rw,o=rw a
        [root@localhost zzz]# ll a
        -rwxrw-rw- 1 root zzz 0 Aug  4 16:10 a

        修改一类用户某位或某些位权限 

         u+  u- g+ g- o+ o- a+ a- +

        [root@localhost zzz]# ll a
        -rwxrw-rw- 1 root zzz 0 Aug  4 16:10 a
        [root@localhost zzz]# chmod u-x,o-w a
        [root@localhost zzz]# ll a
        -rw-rw-r-- 1 root zzz 0 Aug  4 16:10 a

 

     chmod [OPTION]… –reference=RFILE FILE… 

     参考RFILE文件的权限,将FILE的修改为同RFILE;

        [root@localhost zzz]# ll
        total 0
        -rw-rw-r-- 1 root user1 0 Aug  4 16:10 a
        -rw-r--r-- 1 root zzz   0 Aug  4 16:13 abc
        [root@localhost zzz]# chmod --reference=a abc
        [root@localhost zzz]# ll
        total 0
        -rw-rw-r-- 1 root user1 0 Aug  4 16:10 a
        -rw-rw-r-- 1 root zzz   0 Aug  4 16:13 abc

新建文件和目录的默认权限

umask值 可以用来保留在创建文件权限  

    新建FILE权限: 666-umask 

        如果所得结果某位存在执行(奇数)权限,则将其权限+1  

        新建DIR权限: 777-umask  

    非特权用户umask是 002 

    root的umask 是 022 

    umask: 查看 

    [root@localhost zzz]# umask
    0022

    umask #: 设定 (设定支队当前shell有效)

    [root@localhost zzz]# umask 026
    [root@localhost zzz]# umask
    0026

    umask –S 模式方式显示 

    [root@localhost zzz]# umask -S
    u=rwx,g=rx,o=x

    umask –p 输出可被调用  

    全局设置: /etc/bashrc 

    用户设置:~/.bashrc

Linux文件系统上的特殊权限:

    SUID, SGID, Sticky

    SUID 4 

    SGID 2 

    Sticky 1 

安全上下文  

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

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

(2) 启动为进程之后,其进程的属主为发起者;进程的属组为 发起者所属的组 

(3) 进程访问文件时的权限,取决于进程的发起者 

    (a) 进程的发起者,同文件的属主:则应用文件属主权限 

    (b) 进程的发起者,属于文件属组;则应用文件属组权限 

    (c) 应用文件“其它”权限

来看看他们的作用:

SUID:当用户执行具有x权限的二进制文件时拥有此文件所有者的权限

SGID:当用户执行具有x权限的二进制文件时拥有此文件所在组的权限,另外也可以对目录设置此权限

Sticky:当用户对某个目录具有w和x权限时,常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权。在该目录设置Sticky位,目录下建立的文件和目录只有该用户和root用户才可以删除

        

setuid与setgid:

先用ls -l命令看一下下面几个文件或目录的信息:

    [root@localhost ~]# ll -d /tmp /usr/bin/passwd
    drwxrwxrwt. 3 root root  4096 Aug  4 16:50 /tmp
    -rwsr-xr-x. 1 root root 30768 Nov 24  2015 /usr/bin/passwd

这里发现在文件或目录的拥有者,所属组,其他用户的权限x的位置上被s或者t取代。

举个例子说:

比如普通用户用passwd命令去修改密码,而密码是存在/etc/shadow文件中,而普通用户是无法修改这个文件的,也就无法把新密码保存进来。

但事实的结果是普通用户是可以修改密码,并且保存到/etc/shadow这个文件中的。

[root@localhost ~]# ll /etc/shadow
---------- 1 root root 1205 Aug  4 16:11 /etc/shadow

它的流程是这样的:

先看下/usr/bin/passwd这个文件,也就是命令passwd。

[root@localhost ~]# which passwd
/usr/bin/passwd
[root@localhost ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 30768 Nov 24  2015 /usr/bin/passwd

发现这个文件的拥有者是root,并且other的权限为r-x,也就说普通用户对其具有r和x的权限

普通用户对其具有执行权限,因此当普通用户执行这条命令时,由于s这个权限的存在,那么在执行过程中会暂时获取root的权限 

只有root才可以修改/etc/shadow文件,而在执行过程中使用了root用户的权限密码顺利得写入到这个文件中

可执行文件上SUID权限:

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

启动为进程之后,其进程的属主为原程序文件的属主 

SUID只对二进制可执行程序有效 

SUID设置在目录上无意义  

    权限设定: 

        chmod u+s FILE… 

        chmod u-s FILE…

    [root@localhost ~]# ll
    total 68
    -rwxrwxrwx  1 root root     0 Jul 25 11:26 zzzzzzz
    [root@localhost ~]# chmod u+s zzzzzzz 
    [root@localhost ~]# ll
    total 68
    -rwsrwxrwx  1 root root     0 Jul 25 11:26 zzzzzzz

可执行文件上SGID权限:

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

启动为进程之后,其进程的属主为原程序文件的属组 

    权限设定: 

        chmod g+s FILE… 

        chmod g-s FILE…

    [root@localhost ~]# ll
    total 68
    -rwsrwxrwx  1 root root     0 Jul 25 11:26 zzzzzzz
    [root@localhost ~]# chmod u-s,g+s zzzzzzz 
    [root@localhost ~]# ll
    total 68
    -rwxrwsrwx  1 root root     0 Jul 25 11:26 zzzzzzz

目录上的SGID权限:

默认情况下,用户创建文件时,其属组为此用户所属的主组  

一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组 

通常用于创建一个协作目录 

   

另外,还有可能出现大写的情况rwSrwSrwT,出现这种情况是因为用户不具备文件的x权限。

权限位映射:

SUID: user,占据属主的执行权限位 

    s: 属主拥有x权限 

    S:属主没有x权限 

SGID: group,占据属组的执行权限位 

    s: group拥有x权限 

    S:group没有x权限 

Sticky: other,占据other的执行权限位 

    t: other拥有x权限 

    T:other没有x权限

设定文件特定属性:

    chattr +i 不能删除,改名,更改(包括root用户)

    [root@localhost ~]# chattr +i zzzzzzz 
    [root@localhost ~]# rm -f zzzzzzz 
    rm: cannot remove `zzzzzzz': Operation not permitted

    chattr -i 解锁

    [root@localhost ~]# chattr -i zzzzzzz 
    [root@localhost ~]# rm -f zzzzzzz 
    [root@localhost ~]# ll 
    total 68
    -rw-------. 1 root root  2429 Jul 25 09:47 anaconda-ks.cfg
    -rw-r--r--. 1 root root 45324 Jul 25 09:46 install.log
    -rw-r--r--. 1 root root  9963 Jul 25 09:44 install.log.syslog

    chattr +A 锁定文件的读时间  -A 解锁

    chattr +a 可以查看、写入数据,不能删除

    [root@localhost ~]# chattr +a zz
    [root@localhost ~]# ll zz
    -rw-r----- 1 root root 0 Aug  4 21:48 zz
    [root@localhost ~]# echo very hard
    very hard
    [root@localhost ~]# echo very hard >> zz
    [root@localhost ~]# cat zz
    very hard
    [root@localhost ~]# rm -f zz
    rm: cannot remove `zz': Operation not permitted

    lsattr 显示特定属性

    [root@localhost ~]# lsattr zz
    -------------e- zz

原创文章,作者:zanghonglei,如若转载,请注明出处:http://www.178linux.com/29193