System Security and Permissions

用户

计算机启动时的密码输入界面就是通常的用户登录界面。以什么用户登录计算机,我们就只能以该用户的身份创建文件、访问该用户能访问文件。每个Linux操作系统都会有一个超级用户rootroot用户拥有对所有文件的访问权限,并且能够执行普通用户无法执行的“特权”命令。不过,Linux也为我们提供了除重新登陆外的切换用户身份的方式。

su:Switch User,以其他用户身份运行shell

1
su [options] [-] [USER [arg]...]

su命令允许我们在正确输入目标用户的登录密码的情况下以该用户的身份启动shell。若su后面的用户选项为空,则会默认切换为root用户:

1
2
3
4
5
6
7
8
9
[meme@localhost Playground]$ su
Password:
[root@localhost Playground]# exit
exit
[meme@localhost Playground]$ su bob
Password:
[bob@localhost Playground]$ exit
exit
[meme@localhost Playground]$

输入exit后我们将退出目标用户并恢复原用户身份。

若我们只是想以其他用户的身份执行一个命令,我们也可以使用su -c 'command'来传递命令:

1
2
3
4
[meme@localhost Playground]$ su -c 'ls'
Password:
foo.txt
[meme@localhost Playground]$

执行完命令后,我们将立马返回原用户。需要注意的是,传递的命令必须用引号括起。

sudo:以另一个用户身份执行命令

1
sudo [command]

sudo在一定程度上很像su -c 'command',都是使得我们能以其他用户的身份执行命令。但是sudo通常只用于执行root用户的命令,且能够执行的命令也只能由root用户配置,因而是一种比su更加安全可控的方式:

1
2
3
4
[meme@localhost Playground]$ sudo ls
[sudo] password for meme:
foo.txt
[meme@localhost Playground]$

可用sudo -l查看所有sudo能够执行的命令(的库地址)。一次sudo后,系统会信任用户几分钟,使得后续的sudo不用再输入密码。

拥有者,组成员,其他人

在Linux的安全架构下,用户对文件的访问权限分为三个层次:拥有者(owner)、组成员(groups)、其他人(others)。一般来说,文件拥有者的访问权限最高,它不仅可以更改不同层次的用户对本文件的访问范围,也可以以更改文件所属组的形式授予新的用户以组成员访问权限。

1
2
[meme@localhost Playground]$ ls -l ./foo.txt
-rw-rw-r--. 1 meme meme 0 Jul 27 20:01 ./foo.txt

对于上面的foo.txt文件,其拥有者和访问组依次为memememe

除了以组成员的形式赋予其他用户权限,文件拥有者还可以单独为某个用户赋予权限。

Linux用一串数字来标记不同的用户和组。使用id命令可以查看当前用户的用户标识和组标识:

1
2
[meme@localhost Playground]$ id
uid=1001(meme) gid=1001(meme) groups=1001(meme),10(wheel)

其中,uid是当前用户的用户标识,gid是组标识,此处显示的gid当前用户所在组(即当前用户创建文件时文件所属的组)的标识,最后的groups则是所有包含了当前用户的组及其标识。使用groups同样可以查询所有包含当前用户的组:

1
2
[meme@localhost Playground]$ groups
meme wheel

使用newgrp [-] [group]可以切换当前用户的工作组为指定组:

1
2
3
[meme@localhost Playground]$ newgrp wheel
[meme@localhost Playground]$ id
uid=1001(meme) gid=10(wheel) groups=10(wheel),1001(meme)

为了方便权限分配,Linux会为每个用户创建一个独一无二的组作为默认工作组,如上面的10001(meme)。所有的用户信息被保持在了文件/etc/passwd中,组信息则被保持在了/etc/group中,这两个文件随着/etc/shadow的变动而修改,/etc/shadow包含了前面两个文件没有的用户信息,如用户密码的信息等。

常用组命令

只有root用户能够创建和管理组,因此对于组的管理都要在root用户下进行。

groupadd:新建组

1
groupadd [options] GROUP

groupadd允许我们创建指定名称的组:

1
2
3
4
5
6
[meme@localhost Playground]$ sudo groupadd photo
[meme@localhost Playground]$ cat /etc/group
root:x:0:
...
music:x:1002:meme,bob
photo:x:1003:

组一旦被创建,其信息就会被加入到/etc/group中。

gpasswd:Group Password,组管理

1
gpasswd [options] groupname

gpasswd命令是Linux下/etc/group/etc/shadow的管理工具,实际上起着管理组的作用。其常用选项-a用于为指定组增加用户,-d用于为指定组删减用户:

1
2
3
4
5
6
7
8
[meme@localhost Playground]$ sudo gpasswd -a bob photo
Adding user bob to group photo
[meme@localhost Playground]$ sudo gpasswd -a meme photo
Adding user meme to group photo
[meme@localhost Playground]$ cat /etc/group
root:x:0:
...
photo:x:1003:bob,meme

权限

Linux系统的文件通常有三种基本访问权限:读r、写w和执行x

对于普通文件,这些权限很清晰明了地定义了不同用户能对其进行的操作,但是对于目录文件,则有些许不同:

  • r表示可以用ls列出该目录下的文件,即可以读取目录列表;
  • w表示可以在目录中增加或者删减文件;
  • x表示允许用户在目录中查找,且可以以cd命令切换到该目录。

说白了,rwx都表示的是对文件内容的使用权力。

当我们用ls -l列出文件的详细元数据时,前面的10个字符是文件的属性,后面的2个字符串分别是文件的拥有者和访问组,然后是文件的大小、文件的修改时间以及文件名称。

1
2
[meme@localhost Playground]$ ls -l foo.txt
-rw-rw-r--. 1 meme meme 6 Jul 27 22:22 foo.txt
  • 第1个字符表文件的类型-表普通文件,d表目录文件;
  • 第2~10个字符的每三个字符依次表明文件拥有组、访问组和其他用户对该文件的访问权限,顺序为rwx

chmod:Change Mode,更改文件权限

1
chmod [OPTION]... MODE[,MODE]... FILE...

chmod以3个八进制数字来分别代表文件拥有者、访问组和其他用户的目标访问权限,如6表示110,权限为rw-4表示100,权限为r--0表示000,权限为---

1
2
3
[meme@localhost Playground]$ chmod 600 foo.txt
[meme@localhost Playground]$ ls -l foo.txt
-rw-------. 1 meme meme 6 Jul 27 22:22 foo.txt

除了以数字来直接代表目标权限,chmod也支持符号形式的表示:

  • ugo分别表示文件拥有者、访问组和其他用户;
  • +-=分别表示添加、减少和指定权限;
  • rwx分别表示3种权限。
  • 如:
1
2
3
[meme@localhost Playground]$ chmod u-r,go=rw foo.txt
[meme@localhost Playground]$ ls -l foo.txt
--w-rw-rw-. 1 meme meme 6 Jul 27 22:22 foo.txt

umask:User File-Creation Mode Mask,设置默认权限

1
umask [-p] [-S] [mode]

umask让我们能够设置在当前用户下创建文件时,各用户的初始权限:

1
2
3
4
5
6
7
8
[meme@localhost Playground]$ umask 002
[meme@localhost Playground]$ touch f.txt
[meme@localhost Playground]$ ls -l f.txt
-rw-rw-r--. 1 meme meme 0 Jul 27 22:50 f.txt
[meme@localhost Playground]$ umask 022
[meme@localhost Playground]$ touch d.txt
[meme@localhost Playground]$ ls -l d.txt
-rw-r--r--. 1 meme meme 0 Jul 27 22:51 d.txt

其中每位数字(依次代表文件拥有者、访问组和其他用户)都代表一个二进制形式的掩码,即2等价于010,表示遮盖rwx中的第二位w

此处x也被遮盖的原因是.txt文件无法被执行,也就是说它没有x操作。
umask设置的掩码不是永久的,它只在当前的shell上生效。

chown:Change Owner,更改文件所有者和访问组

1
chown [options] owner[:group] file...

如:

1
2
3
4
5
6
7
8
9
10
[meme@localhost Playground]$ sudo chown bob:photo foo.txt
[sudo] password for meme:
[meme@localhost Playground]$ ls -l foo.txt
--w-rw-rw-. 1 bob photo 6 Jul 27 22:22 foo.txt
[meme@localhost Playground]$ sudo chown meme:photo foo.txt
[meme@localhost Playground]$ ls -l foo.txt
--w-rw-rw-. 1 meme photo 6 Jul 27 22:22 foo.txt
[meme@localhost Playground]$ chown :meme foo.txt
[meme@localhost Playground]$ ls -l foo.txt
--w-rw-rw-. 1 meme meme 6 Jul 27 22:22 foo.txt

其中,若文件的所有者是自己且要将该文件的访问组改回自己,则无需root权限,如最后一个命令所示。

特殊权限

除了上面的3种权限rwx,Linux还提供另外3种特殊权限setuidsetgidsticky

setuid & setgid

setuidsetgid的符号均为s,只不过前者只存在于文件拥有者,而后者只存在于文件的访问组。它们的作用相似:当拥有s权限的可执行文件被运行时,该可执行文件会以拥有s权限的文件拥有者或者拥有s权限的访问组的身份运行,即,若文件夹dir(文件夹是一种特殊的可执行文件)的访问组photo没有s权限,meme用户在dir下创建文件的访问组仍然是meme

1
2
3
4
5
6
[meme@localhost dir]$ touch foo.txt
[meme@localhost dir]$ ls -al
total 0
drwxr-xr-x. 2 meme photo 21 Jul 27 23:12 .
...
-rw-r--r--. 1 meme meme 0 Jul 27 23:12 foo.txt

反之,若赋予dir的访问组以s权限(要在root下才能赋予成功),则meme用户在dir下创建的文件的访问组仍然是photo

1
2
3
4
5
6
7
8
9
10
11
12
13
[meme@localhost dir]$ sudo chmod g+s .
[meme@localhost dir]$ ls -al
total 0
drwxr-sr-x. 2 meme photo 21 Jul 27 23:17 .
...
-rw-r--r--. 1 meme meme 0 Jul 27 23:12 foo.txt
[meme@localhost dir]$ touch ff.txt
[meme@localhost dir]$ ls -al
total 0
drwxr-sr-x. 2 meme photo 35 Jul 27 23:22 .
...
-rw-r--r--. 1 meme photo 0 Jul 27 23:22 ff.txt
-rw-r--r--. 1 meme meme 0 Jul 27 23:12 foo.txt

在上面的代码框中,当前文件夹dir的访问组权限由r-x变为了r-s。之后新创建的ff.txt的访问组也相应地变成了dir的访问组。

sticky

为文件附加sticky(标识t)位的操作为:

1
chmod +t FILE

这个权限用处不大,一般只用于目录文件,它能阻止用户删除或重命名该目录下的文件,除非用户是这个目录的所有者,或者是文件所有者,或是是超级用户root

passwd:修改用户密码

1
passwd [user]

我们可以使用该命令修改指定用户的登陆密码

参考