五、理解Linux文件权限

作者: Miridescent | 来源:发表于2017-08-16 18:34 被阅读62次

    学习到这里,我发现我的macOS系统已经不够用了,又不想在自己的电脑上装Linux系统,所以是时候真正的搞个Linux系统来练习了,于是我就在京东云上申请了个免费的云服务器,系统是CentOS 7.2 64位(新用户免费一个月)继续学习😆

    命令 作用
    useradd 创建一个账户
    userdel 删除账户
    usermod 修改账户
    passwd 修改密码
    chpasswd 批量修改密码
    chsh 修改用户登录的默认shell
    chage 命令配合参数修改各种账户的有效期
    groupadd 创建组
    groupmod 修改组
    umask 修改文件默认权限
    chmod 已创建文件权限修改
    chown 改变文件属主或属组
    chgrp 改变文件的属组

    1.Linux的安全性

    Linux安全系统的核心用户账户,每一个进入Linux系统的用户都会有一个唯一分配的账户,用户对各种对象的访问权限取决于他们登录系统时用的账户
    每个账户有唯一的UID,有自己的密码,有自己的登录名,系统只要控制每个账户的权限,就可以控制整个系统的安全

    passwd文件 将登录名和UID匹配的文件
    做下面的操作 cat /etc/passwd,查看passwd文件内容

    [root@jdu4e00u53f7 ~]# cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
    systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
    systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:997:995:User for polkitd:/:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    centos:x:1000:1000:Cloud User:/home/centos:/sbin/nologin
    nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
    ntp:x:38:38::/etc/ntp:/sbin/nologin
    

    文件中列出了各种账户,这些账户叫做系统账户,主要作用是各种进程之间访问资源,就像前面说的,所有运行的服务都要有一个系统账户登录到Linux系统上,才会拿到系统资源

    *注意 上面第二行的root账户是Linux的系统管理员,他的UID固定是0

    下面以root账户为例介绍一下上面的文件中的内容都代表什么

    root:x:0:0:root:/root:/bin/bash
    
    信息(以:分隔) 描述
    root 用户登录名
    x 用户密码
    0 用户账户的UID
    0 用户账户的组ID(GID)
    root 用户账户的文本描述
    /root 用户HOME目录的位置
    /bin/bash 用户的默认shell

    *注意 大家会发现密码都是x,其实不是的,为了安全起见,密码被单独保存在另外一个叫shadow的文件中,下面介绍一下这个文件

    做如下操作 cat /etc/shadow

    [root@jdu4e00u53f7 ~]# cat /etc/shadow
    root:$6$Z9Jjj18u77$70syd1z4TXOBY1O1I9z.:17393:0:99999:7:::
    bin:*:16659:0:99999:7:::
    daemon:*:16659:0:99999:7:::
    adm:*:16659:0:99999:7:::
    lp:*:16659:0:99999:7:::
    sync:*:16659:0:99999:7:::
    shutdown:*:16659:0:99999:7:::
    halt:*:16659:0:99999:7:::
    mail:*:16659:0:99999:7:::
    operator:*:16659:0:99999:7:::
    games:*:16659:0:99999:7:::
    ftp:*:16659:0:99999:7:::
    nobody:*:16659:0:99999:7:::
    avahi-autoipd:!!:17151::::::
    systemd-bus-proxy:!!:17151::::::
    systemd-network:!!:17151::::::
    dbus:!!:17151::::::
    polkitd:!!:17151::::::
    tss:!!:17151::::::
    postfix:!!:17151::::::
    sshd:!!:17151::::::
    centos:!!:17345:0:99999:7:::
    nscd:!!:17382::::::
    ntp:!!:17382::::::
    

    下面还是以root账户为例介绍一下上面的文件中的内容都代表什么

    root:$6$Z9Jjj18u77$70syd1z4TXOBY1O1I9z.:17393:0:99999:7:::
    
    信息(以:分隔) 描述
    root 和passwd文件对应的用户名
    $6$Z9Jjj18u77$70syd1z4TXOBY1O1I9z. 加密后的用户密码
    17393 距离上次修改密码后的天数(自1970.1.1开始计算)
    0 多少天后才能更改密码
    99999 多少天后必须更改密码
    7 密码过期前提前多少天提醒用户更改密码

    *注意 后面还有两个::他们中间的信息分别是
    密码过期后多少天禁用用户账户
    用户账户被禁用日期
    预留字段给将来使用

    添加新用户 useradd

    useradd命令会创建一个账户,他有许多参数,这里有个链接useradd命令详解
    创建时可以根据对应的参数,设置账户的具体信息

    如果不填写这些参数,系统会为新用户默认添加一些信息,这些信息可以用命令/usr/sbin/useradd -D查看,如下
    例:

    [root@jdu4e00u53f7 ~]# /usr/sbin/useradd -D
    GROUP=100
    HOME=/home
    INACTIVE=-1
    EXPIRE=
    SHELL=/bin/bash
    SKEL=/etc/skel
    CREATE_MAIL_SPOOL=yes
    

    这些信息从上到下分别是账户组ID(GID)、账户的HOME目录位置、密码过期后不会被禁用、账户未设置账户过期日期、新账户的默认shell、系统会将/etc/skel的文件复制到用户的HOME目录下、创建一个用于接收邮件的文件

    *注意 SKEL=/etc/skel意识是将/etc/skel的文件复制到用户的HOME目录下,实际上这些复制的文件就是bash shell的标准启动文件
    *注意 useradd默认不会创建HOME目录,必须添加参数-m才可以

    下面是创建一个默认账户的例子

    [root@jdu4e00u53f7 ~]# useradd -m test
    [root@jdu4e00u53f7 ~]# ls -al /home/test
    总用量 12
    drwx------  2 test test  59 8月  15 15:47 .
    drwxr-xr-x. 4 root root  30 8月  15 15:47 ..
    -rw-r--r--  1 test test  18 12月  7 2016 .bash_logout
    -rw-r--r--  1 test test 193 12月  7 2016 .bash_profile
    -rw-r--r--  1 test test 231 12月  7 2016 .bashrc
    

    *注意 不传参数创建的账户的默认信息也是可以更改的,例如useradd -D -s /bin/tsch就会将创建的账户的默认shell更改为tsch

    下面是更改默认值的参数介绍

    参数 描述
    -b 更改默认HOME目录位置
    -e 更改默认新账户的过期日期
    -f 更改默认新用户从密码过期到禁用的天数
    -g 更改默认组
    -s 更改默认登录shell

    删除用户 userdel

    userdel只是删除passwd文件中的关于该账户的信息,而不会删除其他该账户的文件
    例:userdel test

    加上-r参数会删除用户的HOME目录以及邮件目录,但是系统上仍有可能存在删除账户的其他文件
    例:userdel -r test

    *注意 使用-r参数时要小心,因为你不知道在删除账户的HOME目录下是否存放着其他用户的重用文件

    修改用户

    下面是一些修改用户的常用命令

    参数 描述
    usermod 修改用户账户的字段,还可以指定主要组以及附加组的所属关系
    passwd 修改密码
    chpasswd 从文件中读取登录名密码对,更新密码
    chage 修改密码过期日期
    chfn 修改账户的备注信息
    chsh 修改默认登录shell

    下面介绍一下这几个命令

    usermod能够修改/etc/passwd文件中的大部分字段,参数和useradd差不多,例如: -c修改备注字段、-e修改过去日期等,除此之外有几个很有用的参数
    -l 修改用户账户的登录名
    -L锁定账户
    -p修改账户密码
    -U解除锁定

    例:

    usermod -l test1 test
    

    将账户test的登录名改为test1

    passwd修改密码,看下面的例子:

    [root@jdu4e00u53f7 ~]# passwd test
    更改用户 test 的密码 。
    新的 密码:
    无效的密码: 密码少于 8 个字符
    重新输入新的 密码:
    抱歉,密码不匹配。
    新的 密码:
    重新输入新的 密码:
    passwd:所有的身份验证令牌已经成功更新。
    

    *注意 从修改失败的提示可以看出,密码是有要求的,必须不少于8个字符另外还不可以是纯数字
    *注意 只有root用户和用户本省可以修改自己的密码

    chpasswd可批量修改用户密码,该命令能够从标准输入读取用户名和密码对列表,分别修改

    chsh修改用户登录的默认shell
    例:

    [root@jdu4e00u53f7 ~]# chsh -s /sbin/nologin test
    Changing shell for test.
    Shell changed.
    

    chfn会将用于finger命令的信息存储进备注字段

    [root@jdu4e00u53f7 ~]# chfn test
    Changing finger information for test.
    名称 []: This is a test
    办公 []: test
    办公电话 []: 12344445555
    住宅电话 []: 12344445555
    
    Finger information changed.
    

    *注意 由于finger命令可以简单的查到用户信息,所以很多Linux发行版上都没有默认安装该命令

    经过上面的一系列修改,现在查看test账户是这样的

    test:x:1001:1001:This is a test,test,12344445555,12344445555:/home/test:/sbin/nologin
    

    chage命令配合参数修改各种账户的有效期

    参数 描述
    -d 设置上次修改密码到现在的天数
    -E 设置密码过期的天数
    -I 设置密码过期到锁定账户的天数
    -m 设置修改密码之间最少要多少天
    -w 设置密码过期前多久出现提醒信息

    *注意 输入日期的格式有两种,一种是YYYY-MM-DD的格式,一种是1970年1月1日到该日期的天数

    2.使用Linux组(GID)

    当多个账户要共享资源时,组的存在就很有用了,每个组有自己的权限,每个组下有多个用户,这些用户共享组的权限

    查看组信息 /etc/group文件中
    例:查看组信息 cat /etc/group

    [root@jdu4e00u53f7 ~]# cat /etc/group
    root:x:0:
    bin:x:1:
    daemon:x:2:
    sys:x:3:
    adm:x:4:centos
    tty:x:5:
    test:x:1001:
    

    adm:x:4:centos组为例介绍下信息

    信息(以:分隔) 描述
    adm 组名
    x 组密码
    4 组ID(GID)
    centos 属于该组的用户列表

    *注意 添加用户到组可以用usermod命令,不能直接通过修改文件操作
    *注意 组的用户列表信息会误导人,列表中有很多组后面没有这个信息,不代表该组下没有用户,当用户在/etc/passwd文件中指出默认组的时候,该成员就不会出现在这个信息中

    创建组 groupadd

    例:创建一个叫test_group的组

    /usr/sbin/groupadd test_group
    

    例: 将test用户添加到test_group组中

    /usr/sbin/usermod -G test_group test
    

    这时查看test_group的信息为

    test_group:x:1002:test
    

    *注意 只能用户添加到组中,不能组主动添加某个用户
    *注意 更改登录系统用户所属的用户组,必须登录用户登出在登录后才会生效
    *注意 -G参数的作用是将用户添加到组的列表中,还有一个参数-g是将账户的默认组设定为指定的组名

    修改组 groupmod

    groupmod有两个有用的参数
    -g修改组的GID
    -n修改组名

    例: 将组名test_group改为test_group1

    /usr/sbin/groupmod -n test_group1 test_group
    

    *注意 改组名不会影响组的权限,应为权限是根据GID来的

    3.文件权限

    首先用ls -l命令查看下系统上的文件,取出其中一条,介绍下文件权限
    以下面这条信息为例:

    dr-xr-xr-x.  2 root root 20480 8月   8 18:40 bin
    

    其中第一个参数dr-xr-xr-x就表示了文件的权限

    这是一个10个字符的字符串,第一位代表对象的类型
    上例中的d代表目录,还有其他的

    参数 代表
    - 代表文件
    d 代表目录
    l 代表连接
    c 代表字符型设备
    b 代表块设备
    n 代表网络设备

    后面的9个字符分为三组,从前往后分别表示文件属主的权限、属组成员的权限和其他用户的权限

    每组由三个字符构成,每个字符分别代表不同的意思

    参数 代表
    - 无操作
    r 可读
    w 可写
    x 可执行

    这三个字符的组合会有8中形式,与八进制转二进制的前八中组合对应

    参数 二进制值 八进制值 权限描述
    --- 000 0 无任何权限
    --x 001 1 可执行
    -w- 010 2 可写
    -wx 011 3 可写可执行
    r-- 100 4 可读
    r-x 101 5 可读可执行
    rw- 110 6 可读可写
    rwx 111 7 可读可写可执行

    结合上面的介绍,上面那句话的意思是
    登录名为root的用户可以读可以执行,root组的成员可读可执行,不属于root组的用户可读可执行

    文件默认权限修改 umask

    首先我们创建一个文件

    [root@jdu4e00u53f7 ~]# touch newfile
    [root@jdu4e00u53f7 ~]# ls -al newfile
    -rw-r--r-- 1 root root 0 8月  16 15:34 newfile
    

    这个文件的默认权限是-rw-r--r--
    这个默认的权限对应的就是umask的权限

    查看umask命令

    [root@jdu4e00u53f7 ~]# umask
    0022
    

    对于输出结果我们可能已经懵逼了,到底什么意思,似乎和想象的不太一样

    首先第一位代表的是安全特性,叫做粘着位,后面会介绍,后面三位代表的是权限,但是似乎和应该的八进制数不太吻合,正常rw-r--r--对应的二进制应该是110100100对应的八进制应该是644为什么这里显示的是022
    实际上这里显示的是掩码,对于文件来说,全权限值是666(可读可写可执行),减掉对应的644就是022

    *注意 对于目录来说,全权限值是777

    可以用umask命令设置umask的默认值
    例如umask 026,就将默认的文件权限变成了640,默认的目录权限751

    上面介绍的是改变默认的文件权限,下面介绍一下已经创建好的文件权限

    已创建文件权限修改 chmod
    例:

    [root@jdu4e00u53f7 ~]# chmod 660 newfile
    [root@jdu4e00u53f7 ~]# ls -al newfile
    -rw-rw---- 1 root root 0 8月  16 15:34 newfile
    

    修改权限相对来说就比较友好,后面直接跟八进制的数字就好

    除了上面的直接修改,还有一种符号模式的修改,相对来说复杂一些,格式是
    [ugoa][+-=][rwxXstugo]
    其中第一个中括号中代表要修改的目标

    参数 目标
    u 代表用户
    g 代表组
    o 代表其他
    a 代表上诉所有

    第二个中括号中的参数代表增加减少或者直接设置成后面的权限

    第三个中括号是权限,会发现比普通的rwx多,增加参数的权限描述如下

    参数 目标
    X 如果对象是目录或者它已有执行权限,赋予执行权限
    s 运行时重新设置UID或GID
    t 保留文件或目录
    u 将权限设置为跟属主一样
    g 将权限设置为跟属组一样
    o 将权限设置为跟其他用户一样

    用例子解释:

    [root@jdu4e00u53f7 ~]# chmod o+r newfile
    [root@jdu4e00u53f7 ~]# ls -al newfile
    -rw-rw-r-- 1 root root 0 8月  16 15:34 newfile
    

    上面的例子就是为newfile文件的其他用户增加可写权限

    改变文件所属关系 chown chgrp

    chown改变文件属主或属组

    将newfile文件的属主设定为test用户
    例:

    [root@jdu4e00u53f7 ~]# chown test newfile
    [root@jdu4e00u53f7 ~]# ls -l newfile
    -rw-rw-r-- 1 test root 0 8月  16 15:34 newfile
    

    chown命令还可以同时改变文件的属主和属组
    例:

    [root@jdu4e00u53f7 ~]# chown test.test newfile
    [root@jdu4e00u53f7 ~]# ls -l newfile
    -rw-rw-r-- 1 test test 0 8月  16 15:34 newfile
    

    chown命令改变文件的属组
    例:

    [root@jdu4e00u53f7 ~]# chown .root newfile
    [root@jdu4e00u53f7 ~]# ls -l newfile
    -rw-rw-r-- 1 test root 0 8月  16 15:34 newfile
    

    如果属主和属组名字相同可用下面的写法将其同时修改
    例:

    [root@jdu4e00u53f7 ~]# chown test. newfile
    [root@jdu4e00u53f7 ~]# ls -l newfile
    -rw-rw-r-- 1 test test 0 8月  16 15:34 newfile
    

    *注意 只有root用户才能改变文件的属主

    chown改变默认属组
    例:

    [root@jdu4e00u53f7 ~]# chgrp root newfile
    [root@jdu4e00u53f7 ~]# ls -l newfile
    -rw-rw-r-- 1 test root 0 8月  16 15:34 newfile
    

    4.共享文件

    文件共享是通过GID来实现的,我们知道,新建的文件,都会分配默认的UID和GID,要想让其他人能够使用该文件,要么改变其他用户的所在组的访问权限,要么就给文件分配一个包含其他用户的新默认属组

    下面用例子说明
    例:
    创建一个文件夹,作为要共享的文件夹

    [root@jdu4e00u53f7 ~]# mkdir testdir
    [root@jdu4e00u53f7 ~]# ls -l
    总用量 0
    drwxr-xr-x 2 root root 6 8月  16 18:08 testdir
    

    将文件夹的默认属组改成包含要用这个文件夹的用户的组test

    [root@jdu4e00u53f7 ~]# chgrp test testdir/
    [root@jdu4e00u53f7 ~]# ls -l
    总用量 0
    drwxr-xr-x 2 root test 6 8月  16 18:08 testdir
    

    保证目录中新建的文件都用test组作为默认属组

    [root@jdu4e00u53f7 ~]# chmod g+s testdir/
    [root@jdu4e00u53f7 ~]# ls -l
    总用量 0
    drwxr-sr-x 2 root test 6 8月  16 18:08 testdir
    [root@jdu4e00u53f7 ~]# cd testdir/
    [root@jdu4e00u53f7 testdir]# touch testfile
    [root@jdu4e00u53f7 testdir]# ls -l
    总用量 0
    -rw-rw-r-- 1 root test 0 8月  16 18:10 testfile
    

    这样操作后,不管是谁在该目录下创建新文件,新文件的属组都是目录的默认属组,而不是用户的默认属组,这样,test组下所有的用户都能访问这个文件了

    *注意 上面用到了前面介绍的改变权限的一个属性s运行时重新设置UID或GID
    *注意 其实共享文件涉及到Linux为文件或目录存储的额外三个信息SUID(设置用户ID)、SGID(设置组ID)和粘着位,但是这里不想过多的介绍,那样容易乱,感兴趣的同学可自行了解
    *注意 上面的例子主要用的就是SGID,启用SGID位后,可以强制在一个目录下创建的文件都属于该目录的属组,这样就达到了共享的目的

    相关文章

      网友评论

      本文标题:五、理解Linux文件权限

      本文链接:https://www.haomeiwen.com/subject/xxsmrxtx.html