五、理解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中形式,与八进制转二进制的前八中组合对应

参数 二进制值 八进制值 权限描述
--- 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文件权限)