Linux 安全与权限 -- 文件权限

文件权限是指对文件的访问权限,包括对文件的读、写、删除、执行。Linux 是一个多用户操作系统,所以对一个文件的访问权限设计的比较复杂与严谨。一个用户是否可以打开一个文件,对此文件是只读、可写还是可以执行之?都有有限制的。

1 基本文件权限

我们看一个基本的文件权限,使用ls -l查看一个目录,得

1
drwxr-x---  15 root root  4220 Oct  9 15:20 dev/

其中,第一个块中的解释d(文件类型,这个是目录) | rwx(owner权限) | r-x(组权限) | ---(其它用户的权限)。其中,r代表可读,w表示可写,x表示可执行。

所以,上面的这个权限就表示dev/这个是一个目录,其拥有着有着全权限,同组的用户可读可执行但是不可以更改些文件,其它组的用户对此目录即不可读、也不可写不可执行。

1.1 文件类型

文件标志 文件类型 例子
  • | 普通文件 | 普通文本文件、程序等
    d | 目录 | 普通目录
    c | 字符设备 | /dev/tty1
    b | 块设备 | /dev/sda1 硬盘设备
    s | 套接字 | /dev/log
    p | 命名管道 |
    l | 符号链接 | /usr/xx -> /usr/yy

1.2 修改文件权限

可以使用一些命令,修改文件的拥有者、组、及文件的权限

1
2
3
chown user:group file/dir
chgrp group file/dir
chmod 777 file/dir

2 suid和guid

SUID 就是Set User ID,当s这个标志出现在文件所有者的x权限上时,如/usr/bin/passwd这个文件的权限状态:-rwsr-xr-x,此时就被称为SUID

  • SUID权限仅对二进制程序(binary program)有效
  • 执行者对于该程序需要具有x的可执行权限
  • 本权限仅在执行该程序的过程中有效(run-time)
  • 执行者将具有该程序拥有者(owner)的权限

下面摘一段解释得比较到位的:

“suid意味着如果A用户对属于他自己的shell脚本文件设置了这种权限,那么其他用户在执行这个脚本的时候就拥有了A用户的权限。
所以,如果 root用户对某一脚本设置了这一权限的话则其他用户执行该脚本的时候则拥有了root用户权限。
同理,guid意味着执行相应脚本的用户则拥有了该文件所属用户组中用户的权限。

  • 如果希望设置suid,那么就将相应的权限位之前的那一位设置为 4;
  • 如果希望设置 guid,那么就将相应的权限位之前的那一位设置为2;
  • 如果希望两者都置位,那么将相应的权限位之前的那一位设置为4+2

一旦设置了这一位,一个s将出现在x的位置上,记住:在设置 suid或guid的同时,相应的执行权限位必须要被设置,否则可执行权限是关闭S将出现在x的位置上。”

2.1 设置suid

比如我们创建一个脚本,希望执行者拥有和我们一样的权限:

1
2
3
4
5
6
➜  touch test
➜ l test
-rw-r--r-- 1 luochenxun staff 0B 8 22 10:49 test
➜ chmod 4755 ./test
➜ l test
-rwsr-xr-x 1 luochenxun staff 0B 8 22 10:49 test

也可以这样,更易记:

1
2
3
chmod u+s test
chmod g+s test
chmod a+s test

2.2 suid在passwd上的应用

一般passwd权限示例
1
-rwsr-xr-x 1 root root 42824  /usr/bin/passwd
系统中的用户密码是保存在/etc/shadow中的,而这个文件的权限(ubuntu)
1
-rw-r----- 1 root shadow 1180 /etc/shadow

suid的应用,在/usr/bin/passwd中是一个示例。如上面所说,密码是存在 /etc/shadow中的,只有root用户才可以写。但是 /usr/bin/passwd 设置了suid, 所以超级用户和其它用户都可以执行之,并拥有root用户的权限。所以,当一个普通用户执行 passwd时,就拥有了root权限,就可以借助root权限,修改 /etc/shadow了!

3 引用

  1. 《linux文件的访问权限全解析,包括SUID,GUID》 对文件权限介绍得比较细
  2. 《文件的安全和权限–suid和guid》 对sid讲解得比较清楚