【Linux命令行与Shell脚本编程】第七章 Linux文件权限

Linux命令行与Shell脚本编程

第七章 Linux文件权限



七,Linux文件权限

·理解Linux的安全性
·理解文件权限
·使用Linux组

7.1,Linux的安全性

用户权限是通过创建用户时分配的用户ID(UID)来跟踪的。
UID是个数值,每个用户都有一个唯一的UID。
7.1.1,用户信息 /etc/passwd文件
文件/etc/passwd来匹配登录名与对应的UID值。该文件包含 用户有关的信息:
    $ cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    ·   登录用户名
    ·   用户密码
    ·   用户账户的UID(数字形式)
    ·   用户账户的组ID(数字形式)
    ·   用户账户的文本描述(称为备注字)
    ·   用户$HOME目录的位置
    ·   用户的默认shell

root用户账户是Linux系统的管理员,为其固定分配的UID是0。

Linux系统会为 各种功能创建不同的用户账户,并非真正的人类用户。为系统账户,是系统中运行的各种服务进程访问资源使用的特殊账户。
    所有运行在后台的服务都需要通过一个系统用户账户登录到Linux系统中。

Linux 为系统账户预留了500以下的UID。有些服务 要用特定的UID才能正常工作。
为普通用户创建账户时,大多数Linux系统会从500开始,将第一个可用UID分配给这个账户。(Ubuntu从1000开始)
7.1.2,用户密码 /etc/shadow文件
/etc/shadow文件对 Linux系统密码管理提供了更多的控制。
只有root用户才能访问/etc/shadow文件,这使其与/etc/passwd相比要安全许多。
/etc/shadow 文件为系统中的每个用户账户都保存了一条记录
    rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::
    
/etc/shadow文件中的每条记录共包含9个字段。
    登录名,对应于/etc/passwd文件中的登录名。
    加密后的密码。
    自上次修改密码后已经过去的天数(从1970年1月1日开始算)。
    多少天后才能更改密码。
    多少天后必须更改密码。
    密码过期前提前多少天提醒用户更改密码。
    密码过期后多少天禁用用户账户。
    用户账户被禁用的日期(以从1970年1月1日到当时的天数表(=)。
    预留给以后使用的字段。
7.1.3,useradd 添加新用户
useradd 向Linux系统添加新用户,创建新用户账户并设置用户的$HOME目录结构
useradd命令使用系统的默认值以及命令行参数来设置用户账户。
查看所使用的Linux发行版的系统默认值,可以使用加入了-D选项的useradd命令。
-D选项显示了在命令行中创建新用户账户时,如果不明确确指明具体值,useradd命令所使用的默认值:
    ·新用户会被添加到GID为100的公共组。
    ·新用户的主目录会位于/home/loginname。
    ·新用户账户密码在过期后不会被禁用。
    ·新用户账户不设置过期日期。
    ·新用户账户将bash shell作为默认shell。
    ·系统会将/etc/skel目录的内容复制到用户的$HOME目录录。
    ·系统会为该用户账户在mail目录下创建一个用于接收邮件的文件。
    # useradd -D
        GROUP=100
        HOME=/home
        INACTIVE=-1
        EXPIRE=
        SHELL=/bin/bash
        SKEL=/etc/skel
        CREATE_MAIL_SPOOL=yes
useradd命令的默认值使用 /etc/default/useradd 文件设置。进一步的安全设置在/etc/login.defs文件中定义。调整这些文件,改变默认安全行为。

useradd 命令允许管理员创建默认的 $HOME目录配置,将其作为创建新用户$HOME目录的模板。自动在每个新用户的 $HOME 目录里放置默认的系统文件。
    在Ubuntu Linux系统中,/etc/skel目录包含下列文件:
        $ ls -al /etc/skel
        total 32
        drwxr-xr-x   2 root root  4096 2010-04-29 08:26 .
        drwxr-xr-x 135 root root 12288 2010-09-23 18:49 ..
        -rw-r--r--   1 root root   220 2010-04-18 21:51 .bash_logout
        -rw-r--r--   1 root root  3103 2010-04-18 21:51 .bashrc
        -rw-r--r--   1 root root   179 2010-03-26 08:31 examples.desktop
        -rw-r--r--   1 root root   675 2010-04-18 21:51 .profile
用默认系统参数创建一个新用户账户,然后检查一下新用户的$HOME目录:
    # useradd -m test
    # ls -al /home/test
        total 24
        drwxr-xr-x 2 test test 4096 2010-09-23 19:01 .
        drwxr-xr-x 4 root root 4096 2010-09-23 19:01 ..
        -rw-r--r-- 1 test test  220 2010-04-18 21:51 .bash_logout
        -rw-r--r-- 1 test test 3103 2010-04-18 21:51 .bashrc
        -rw-r--r-- 1 test test  179 2010-03-26 08:31 examples.desktop
        -rw-r--r-- 1 test test  675 2010-04-18 21:51 .profile

多数发行版 useradd 命令默认并不创建 $HOME目录,但是-m命令行选项会使其创建 $HOME 目录。可以在/etc/login.defs文件中更改该行为。

可以使用相应的命令行选项 改变创建新用户时 的 默认值或默认行为.
选项描述
-c comment给新用户添加备注
-d home_dir为主目录指定一个名字(如果不想用登录名作为主目录名的话)
-e expire_date用YYYY-MM-DD格式指定账户过期日期
-f inactive_days指定账户密码过期多少天后禁用该账户;0表示密码一过期就立即禁用,-1表示不使用这个功能
-g initial_group指定用户登录组的GID或组名
-G group …指定除登录组之外用户所属的一个或多个附加组
-k必须和-m一起使用,将/etc/skel目录的内容复制到用户的$HOME目录
-m创建用户的$HOME目录
-M不创建用户的$HOME目录,即便默认设置里要求创建
-n创建一个与用户登录名同名的新组
-r创建系统账户
-p passwd为用户账户指定默认密码
-s shell指定默认的登录shell
-u uid为账户指定一个唯一的UID
使用-D选项来修改系统默认的新用户设置
    # useradd -D -s /bin/tsch
    # useradd -D
    GROUP=100
    HOME=/home
    INACTIVE=-1
    EXPIRE=
    SHELL=/bin/tsch
    SKEL=/etc/skel
    CREATE_MAIL_SPOOL=yes
选项描述
-g group修改默认的组名称或GID
-b default_home修改用户$HOME目录默认创建的位置
-f inactive修改从密码过期到账户被禁用的默认天数
-e expiration_date修改新账户的默认过期日期
-s shell修改默认的登录shell
7.1.4,userdel 删除用户
默认情况下,userdel命令只删除/etc/passwd和/etc/shadow文件中的用户信息,属于该账户的文件会被保留。

userdel -r选项, 会删除用户的$HOME目录以及邮件目录。然而,系统中仍可能存有已删除用户的其他文件。
    # userdel -r test
    # ls -al /home/test
    ls: cannot access /home/test: No such file or directory
大量用户的环境中使用-r选项要小心,用户可能在个人的$HOME目录中存放了其他用户或程序要用到的重要文件
7.1.5, 修改用户
Linux提供了一些工具来修改已有用户账户的信息
工具描述
usermod修改用户账户字段,还可以指定主要组(primarygroup)以及辅助组(secondarygroup)的所属关系
passwd修改已有用户的密码
chpasswd从文件中读取登录名及密码并更新密码
chage修改密码的过期日期
chfn修改用户账户的备注信息
chsh修改用户账户的默认登录shell
1,usermod
usermod命令是用户账户修改工具中最强大的一个,提供了修改 /etc/passwd 文件中大部分字段的相关选项,只需指定相应的选项即可。
    大部分选项与 useradd 命令的选项一样(-c用于修改备注字段,-e用于修改过期日期,-g用于修改默认的登录组)。
    额外选项:
        ·-l:修改用户账户的登录名。
        ·-L:锁定账户,禁止用户登录。
        ·-p:修改账户密码。
        ·-U:解除锁定,恢复用户登录。
        ·-L:选项尤为实用。该选项可以锁定账户,使用户无法登录,无须删除账户和用户数据。要恢复账户,只需使用-U选项即可。
        ·-G group user : 将该组加入该用户的属组列表
2,passwd,chpasswd
passwd 命令可以 修改用户密码:
    # passwd test
    Changing password for user test.
    New UNIX password:
    Retype new UNIX password:
    passwd: all authentication tokens updated successfully.
系统中的任何用户都能修改自己的密码,但只有root用户才有权限修改别人的密码。

-e选项 可以强制用户下次登录时修改密码。可以先给用户设置一个简单的密码,之后强制用户在下次登录时改成更复杂的密码。

chpasswd命令可以 为系统中的大量用户修改密码。
chpasswd命令能从标准输入自动读取一系列以冒号分隔的登录名和密码对,自动对密码加密,然后为用户账户设置密码。也可以用重定向命令将包含username:password对 的文件重定向给该命令
    # chpasswd < users.txt
3,chsh,chfn,chage
chsh、chfn和chage用于修改特定的账户信息。

1,chsh命令可以快速修改默认的用户登录shell。使用时必须用shell的全路径名作为参数.
    #  chsh -s /bin/csh test
    Changing shell for test.
    Shell changed.
2,chfn 命令提供了在 /etc/passwd文件的备注字段中保存信息的标准方法。
    chfn命令会将用于Unix的 finger 命令的信息存入备注字段,而不是简单地写入一些文本 或 将备注字段留空。
    finger命令可以非常方便地查看Linux系统的用户信息。
        # finger rich
        Login: rich                             Name: Rich Blum
        Directory: /home/rich                   Shell: /bin/bash
        On since Thu Sep 20 18:03 (EDT) on pts/0 from 192.168.1.2
        No mail.
        No Plan.
    
    使用 chfn命令 时不加任何选项,则会询问你要将哪些内容写入备注字段
        # chfn test
        Changing finger information for test.
        Name []: Ima Test
        Office []: Director of Technology
        Office Phone []: (123)555-1234
        Home Phone []: (123)555-9876
        
        Finger information changed.
        # finger test
        Login: test                         Name: Ima Test
        Directory: /home/test               Shell: /bin/csh
        Office: Director of Technology      Office Phone: (123)555-1234
        Home Phone: (123)555-9876
        Never logged in.
        No mail.
        No Plan.
        # grep test /etc/passwd
        test:x:504:504:Ima Test,Director of Technology,(123)555-
        1234,(123)555-9876:/home/test:/bin/csh
    
3,chage命令可用于帮助管理用户账户的有效期。  
    chage命令的日期值可以用下面两种方式中的任意一种表示。
        ·YYYY-MM-DD格式的日期
        ·代表从1970年1月1日起的天数
    chage命令 功能是设置账户的过期日期。创建在特定日期自动过期的临时用户,不用删除用户。过期的账户仍然存在,但用户无法用其登录。
选项描述
-d设置自上次修改密码后的天数
-E设置密码过期日期
-I设置密码过期多少天后锁定账户
-m设置更改密码的最小间隔天数
-M设置密码的最大有效天数
-W设置密码过期前多久开始出现提醒信息

7.2,Linux组

组权限允许多个用户对系统对象共享一组权限.
每个组都有唯一的GID和唯一的组名,在系统中是唯一的。除了GID。
7.2.1,/etc/group文件
/etc/group文件包含系统中每个组的信息
    四个字段
        ·组名
        ·组密码
        ·GID
        ·属于该组的用户列表
    root:x:0:root
    bin:x:1:root,bin,daemon
    daemon:x:2:root,bin,daemon
    sys:x:3:root,bin,adm
    adm:x:4:root,adm,daemon
    rich:x:500:
    mama:x:501:
    katie:x:502:
    jessica:x:503:
    mysql:x:27:
    test:x:504:
组密码允许非组内成员使用密码临时性地成为该组成员.  
对于系统账户组,为其分配的GID值低于500,而普通用户组的GID则从500开始分配。
使用 usermod命令 向组中添加用户。在将用户添加到不同的组之前,必须先创建组。
!!!!当一个用户在 /etc/passwd 文件中指定某个组作为主要组时,该用户不会作为该组成员再出现在/etc/group文件中
7.2.2,groupadd 创建新组
groupadd 命令可用于创建新组   
    # /usr/sbin/groupadd shared
    # tail /etc/group
    ... ...
    shared:x:505:
groupadd命令 没有提供向组中添加用户的选项,但可以用usermod命令来解决
    # usermod -G shared rich
    # usermod -G shared test
    # tail /etc/group
    ... ...
    shared:x:505:rich, test
更改了已登录系统的用户所属的组,则该用户必须 注销后重新登录,新的组关系才能生效。

-g选项,则指定的组名会替换掉在/etc/passwd文件中为该用户分配的主要组。-G选项则会将该组加入该用户的属组列表,不会影响主要组。
7.2.3, 修改组
groupmod命令可以修改已有组的GID(使用-g选项)或组名(使用-n选项):
    # groupmod -n sharing shared
    # tail /etc/group
    ... ...
    sharing:x:505:test,rich

7.3 文件权限

7.3.1, 文件权限符号
$ ls -l
    total 68
    -rw-rw-r-- 1 rich rich   50 2010-09-13 07:49 file1.gz
    drwxrwxr-x 2 rich rich 4096 2010-09-03 15:12 test1
输出结果的 第一个字段 描述文件和目录权限的编码。这个字段的第一个字符表示对象的类型。
    -代表文件
    d代表目录
    l代表链接
    c代表字符设备
    b代表块设备
    p代表具名管道
    s代表网络套接字
3组三字符的编码。每一组定义了3种访问权限。
        r代表对象是可读的
        w代表对象是可写的
        x代表对象是可执行的
如果没有某种权限,则在该权限位会出现连字符。这3组权又限分别对应对象的3个安全级别。
    对象的属主
    对象的属组
    系统其他用户

在这里插入图片描述

7.3.2,umask 默认文件权限
touch 命令使用分配给当前用户的默认权限创建了新文件。umask命令可以显示和设置默认权限:
    $ touch newfile
    $ ls -al newfile
    -rw-r--r--    1 rich     rich            0 Sep 20 19:16 newfile
第一位代表一项特别的安全特性
后三位代表 对应三个安全级别(属主、属组和其他用户)的权限 rwx 000~111(0~7)
对文件而言,全权限值是666(所有用户都有读取和写入的权限);对目录而言,全权限值则是777(所有用户都有读取、写入和执行权限)。

查看掩码
    $ umask
    0022
例子中,文件一开始的权限是666,减去umask值022之后,剩下的文件权限就成了644。
    
umask值通常会被设置在/etc/profile启动文件中,可以使用umask命令指定其他的umask默认值.
使用umask命令指定其他的umask默认值:
    $ umask 026
    $ touch newfile2
    $ ls -l newfile2
    -rw-r-----    1 rich     rich            0 Sep 20 19:46 newfile2
将umask值设成026后,默认的文件权限变成了640.

umask值同样会作用在新创建的目录上
    目录的默认权限是777,因此umask作用后的目录权限不同于文件权限。umask值026会从777中减去,留下来751作为目录权限设置.

7.4,更改安全设置(文件权限…)

修改文件和目录的已有权限、默认属主以及默认属组。
7.4.1, chmod 修改权限
chmod命令可以修改文件和目录的安全设置
    chmod [OPTION]... MODE[,MODE]... FILE...
    chmod [OPTION]... OCTAL-MODE FILE...
    chmod [OPTION]... --reference=RFILE FILE...
-R选项能够以递归方式修改文件和目录的权限。可以使用通配符指定多个文件名,然后用单个命令批量修改权限。
mode 参数 允许使用八进制模式或符号模式来进行安全设置。八进制模式设置非常直观,直接用打算赋予文件的标准3位八进制权限编码即可:
     $ chmod 760 newfile
     $ ls -l newfile
     -rwxrw----    1 rich     rich            0 Sep 20 19:16 newfile

在符号模式下指定权限的格式
    chmod [ugoa...][[+-=][rwxXstugo...] FILE
        u   用户
        g   组
        o   其他用户
        a   所有
        
        +   增加权限
        -   移除权限
        =   设置权限
        
        r/w/x   读/写/执行
        X   仅当对象是目录或者已有执行权限时才赋予执行权限。
        s   在执行时设置SUID或SGID。
        t   设置粘滞位(sticky bit)。
        u   设置属主权限。
        g   设置属组权限。
        o   设置其他用户权限。

$ chmod o+r newfile
$ chmod u-x newfile
7.4.2,chown chgrp改变文件属主
chown 可以修改文件的属主, chgrp 可以修改文件的默认属组。
只有root用户能修改文件的属主。任何用户都可以修改文件的属组,但前提是该用户必须是原属组和新属组的成员。

格式:
    chown options owner[.group] file
修改属主     
     # chown dan newfile
     # ls -l newfile
     -rw-rw-r--    1 dan      rich            0 Sep 20 19:16 newfile
修改文件的默认属组
     # chown .rich newfile
     # ls -l newfile
     -rw-rw-r--    1 dan      rich            0 Sep 20 19:16 newfile
修改属主和属组
     # chown dan.shared newfile
     # ls -l newfile
     -rw-rw-r--    1 dan      shared             0 Sep 20 19:16 newfile
使用与用户登录名相同的组名,则可以同时修改二者 
     # chown test. newfile
     # ls -l newfile
     -rw-rw-r--    1 test    test             0 Sep 20 19:16 newfile
-R选项与通配符相配合可以递归地修改子目录和文件的所属关系。
-h选项可以修改文件的所有符号链接文件的所属关系。

chgrp命令可以方便地修改文件或目录的默认属组:
     $ chgrp shared newfile
     $ ls -l newfile
     -rw-rw-r--    1 rich     shared          0 Sep 20 19:16 newfile

7.5,共享文件

Linux为每个文件和目录存储了3个额外的信息位。
    SUID(set user ID):当用户执行该文件时,程序会 以文件属主的权限 运行。
    SGID(set group ID):对文件而言,程序会 以文件属组的权限 运行;对目录而言,该目录中创建的新文件会 以目录的属组 作为默认属组。
    粘滞位(sticky bit):应用于目录时,只有 文件属主 可以删除或重命名 该目录中的文件。

启用SGID位后,可以强制在共享目录中创建的新文件都属于该目录的属组,这个组也就成了每个用户的属组。
通过 chmod命令设置SGID,将其添加到标准3位八进制值之前(组成4位八进制值),或者在符号模式下用符号s。
SUID,SGID,粘滞位 000~111 (0~7)

使目录中的所有新文件都沿用目录的属组,只需设置该目录的SGID位
    $ mkdir testdir
    $ ls -l
    drwxrwxr-x    2 rich     rich         4096 Sep 20 23:12 testdir/
    $ chgrp shared testdir
    $ chmod g+s testdir
    $ ls -l
    drwxrwsr-x    2 rich     shared       4096 Sep 20 23:12 testdir/
    $ umask 002
    $ cd testdir
    $ touch testfile
    $ ls -l 
    total 0
    -rw-rw-r--    1 rich     shared          0 Sep 20 23:13 testfile

7.6 访问控制列表 (access control list,ACL)

Linux的基本权限方法有一个缺点:局限性。
    只能将文件或目录的权限分配给单个组或用户账户。
    !!!对于文件和目录,不同的组需要不同的权限,基本权限方法解决不了。
    
ACL允许指定包含 多个用户或组 的列表以及为其分配的权限。和基本安全方法一样,ACL权限使用相同的 读取、写入和执行权限位。
使用 setfacl 命令和 getfacl 命令在Linux中实现ACL特性。

getfacl命令能够查看分配给文件或目录的ACL:
    $ touch test
    $ ls -l
    total 0
    -rw-r----- 1 rich rich 0 Apr 19 17:33 test
    $ getfacl test
    # file: test    文件
    # owner: rich   属主
    # group: rich   属组
    user::rw-
    group::r--
    other::---

setfacl命令可以为用户或组分配权限:
    setfacl [options] rule filenames
    -m选项    修改分配给文件或目录的权限,
    -x选项    删除特定权限。
可以使用 3种格式定义规则:
    u[ser]:uid:perms
    g[roup]:gid:perms
    o[ther]::perms
-m 为用户分配权限,可以使用user格式;要为组分配权限,可以使用group格式;要为其他用户分配权限,可以使用other格式。对于uid或gid,可以使用数字值或名称:
    $ setfacl -m g:sales:rw test    == 为test文件添加了sales组的读写权限
    $ ls -l
    total 0
    -rw-rw----+ 1 rich rich 0 Apr 19 17:33 test
    $ getfacl test
    # file: test
    # owner: rich
    # group: rich
    user::rw-
    group::r--
    group:sales:rw-
    mask::rw-
    other::---
权限列的末尾多了一个加号(+),指明该文件 应用了ACL

-x 删除权限:
    $ setfacl -x g:sales test
    $ getfacl test
    # file: test
    # owner: rich
    # group: rich
    user::rw-
    group::r--
    mask::r--
    other::---
    
Linux允许对目录设置默认ACL,在该目录中创建的文件会自动继承。这个特性称为ACL继承。
设置目录的默认ACL,在规则定义前加上 d:
    $ sudo setfacl -m d:g:sales:rw /sales

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值