五、理解Linux文件权限

学习到这里,我发现我的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中形式,与八进制转二进制的前八中组合对应

参数二进制值八进制值权限描述
0000无任何权限
–x0011可执行
-w-0102可写
-wx0113可写可执行
r–1004可读
r-x1015可读可执行
rw-1106可读可写
rwx1117可读可写可执行

结合上面的介绍,上面那句话的意思是
登录名为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位后,可以强制在一个目录下创建的文件都属于该目录的属组,这样就达到了共享的目的

    原文作者:Miridescent
    原文地址: https://www.jianshu.com/p/b22cce62c512
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞