理解Linux文件权限
缺乏安全性的系统不是完整的系统。系统中必须有一套能够保护文件免遭非授权用户浏览或修改的机制。 Linux沿用了Unix文件权限的办法,即允许用户和组根据每个文件和目录的安全性设置来访问文件。本文将介绍如何在必要时利用Linux文件安全系统保护和共享数据。
一、Linux 的安全性
Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配唯一的用户账户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。
用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。 UID是数
值,每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。登录名是用户用来登录系统的最长八字符的字符串(字符可以是数字或字母),同时会关联一个对应的密码。
Linux系统使用特定的文件和工具来跟踪和管理系统上的用户账户。在我们讨论文件权限之前,先来看一下Linux是怎样处理用户账户的。
1.1 /etc/passwd 文件
Linux系统使用一个专门的文件来将用户的登录名匹配到对应的UID值。这个文件就是/etc/passwd文件,它包含了一些与用户有关的信息。下面是Linux系统上典型的/etc/passwd文件的一个例子。
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
...
root用户账户是Linux系统的管理员,固定分配给它的UID是0。就像上例中显示的, Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户叫作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。所有运行在后台的服务都需要用一个系统用户账户登录到Linux系统上。
你可能已经注意到/etc/passwd文件中还有很多用户登录名和UID之外的信息。/etc/passwd文件的字段包含了如下信息:
- 登录用户名
- 用户密码
- 用户账户的UID(数字形式)
- 用户账户的组ID(GID)(数字形式)
- 用户账户的文本描述(称为备注字段)
- 用户HOME目录的位置
- 用户的默认shell
/etc/passwd文件中的密码字段都被设置成了x,这并不是说所有的用户账户都用相同的密码。在早期的Linux上, /etc/passwd文件里有加密后的用户密码。但鉴于很多程序都需要访问/etc/passwd文件获取用户信息,这就成了一个安全隐患。随着用来破解加密密码的工具的不断演进,用心不良的人开始忙于破解存储在/etc/passwd文件中的密码。 Linux开发人员需要重新考虑这个策略。
现在,绝大多数Linux系统都将用户密码保存在另一个单独的文件中(叫作shadow文件,位置在/etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。
/etc/passwd是一个标准的文本文件。你可以用任何文本编辑器在/etc/password文件里直接手动
进行用户管理(比如添加、修改或删除用户账户)。但这样做极其危险。如果/etc/passwd文件出现损坏,系统就无法读取它的内容了,这样会导致用户无法正常登录(即便是root用户)。用标准的Linux用户管理工具去执行这些用户管理功能就会安全许多。
1.2 /etc/shadow 文件
/etc/shadow文件对Linux系统密码管理提供了更多的控制。只有root用户才能访问/etc/shadow文件,这让它比起/etc/passwd安全许多。/etc/shadow文件为系统上的每个用户账户都保存了一条记录。记录就像下面这样:
zlkj:$6$ent2PPuZ$9LREDRvRo8IpPiWcp:18029:0:99999:7:::
在/etc/shadow文件的每条记录中都有9个字段:
- 与/etc/passwd文件中的登录名字段对应的登录名
- 加密后的密码
- 自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
- 多少天后才能更改密码
- 多少天后必须更改密码
- 密码过期前提前多少天提醒用户更改密码
- 密码过期后多少天禁用用户账户
- 用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)
- 预留字段给将来使用
使用shadow密码系统后, Linux系统可以更好地控制用户密码。它可以控制用户多久更改一次密码,以及什么时候禁用该用户账户,如果密码未更新的话。
1.3 添加新用户
用来向Linux系统添加新用户的命令是useradd,可以一次性创建新用户账户及设置用户HOME目录结构。 useradd命令使用系统的默认值以及命令行参数来设置用户账户。系统默认值被设置在/etc/default/useradd文件中。可以使用加入了-D选项的useradd命令查看所用Linux系统中的这些默认值。
$ useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
在创建新用户时,如果你不在命令行中指定具体的值, useradd命令就会使用-D选项所显示的那些默认值。上面例子列出的默认值如下:
- 新用户会被添加到GID为100的公共组;
- 新用户的HOME目录将会位于/home/loginname;
- 新用户账户密码在过期后不会被禁用;
- 新用户账户未被设置过期日期;
- 新用户账户将sh shell作为默认shell;
- 系统会将/etc/skel目录下的内容复制到用户的HOME目录下;
- 系统不会为该用户账户在mail目录下创建一个用于接收邮件的文件。
可以用默认系统参数创建一个新用户账户,然后检查一下新用户的HOME目录。
$ sudo useradd -m test
$ ll /home/test/
总用量 32
drwxr-xr-x 2 test test 4096 6月 28 17:50 ./
drwxr-xr-x 6 root root 4096 6月 28 17:50 ../
-rw-r--r-- 1 test test 220 4月 9 2014 .bash_logout
-rw-r--r-- 1 test test 3637 4月 9 2014 .bashrc
-rw-r--r-- 1 test test 8980 10月 4 2013 examples.desktop
-rw-r--r-- 1 test test 675 4月 9 2014 .profile
生成的这些文件是bash shell环境的标准启动文件。系统会自动将这些默认文件复制到你创建的每个用户的HOME目录。
默认情况下,useradd命令不会创建HOME目录,但是-m命令行选项会使其创建HOME目录。你能在此例中看到, useradd命令创建了新HOME目录,并将/etc/zlkj目录中的文件复制了过来。
要想在创建用户时改变默认值或默认行为,可以使用命令行参数。下表列出了这些参数。
参 数 | 描 述 |
---|---|
-d homeDir | 为主目录指定一个名字(如果不想用登录名作为主目录名的话) |
-m | 创建用户的HOME目录 |
-M | 不创建用户的HOME目录(当默认设置里要求创建时才使用这个选项) |
-p passwd | 为用户账户指定默认密码 |
-s shell | 指定默认的登录shell |
-u uid | 为账户指定唯一的UID |
你会发现,在创建新用户账户时使用命令行参数可以更改系统指定的默认值。但如果总需要
修改某个值的话,最好还是修改一下系统的默认值。
1.4 删除用户
如果你想从系统中删除用户, userdel可以满足这个需求。默认情况下, userdel命令会只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。如果加上-r参数, userdel会删除用户的HOME目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。
下面是用userdel命令删除已有用户账户的一个例子。
$ userdel -r test
$ ll /home/test
ls: cannot access /home/test: No such file or directory
加了-r参数后,用户先前的那个/home/test目录已经不存在了。
1.5 修改用户
Linux提供了一些不同的工具来修改已有用户账户的信息。下面将具体介绍这些工具。
1. usermod
usermod命令是用户账户修改工具中最强大的一个。它能用来修改/etc/passwd文件中的大部分字段,只需用与想修改的字段对应的命令行参数就可以了。参数大部分跟useradd命令的参数一样。除此之外,还有另外一些可能派上用场的选项。
- -l 修改用户账户的登录名。
- -L 锁定账户,使用户无法登录。
- -p 修改账户的密码。
- -U 解除锁定,使用户能够登录。
2. passwd
改变用户密码的一个简便方法就是用passwd命令。
$ passwd zlkj
更改 zlkj 的密码。
(当前)UNIX 密码:
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:
passwd:已成功更新密码
如果只用passwd命令,它会改你自己的密码。系统上的任何用户都能改自己的密码,但只有root用户才有权限改别人的密码。
二、理解文件权限
2.1 使用文件权限符
使用ls命令可以用来查看Linux系统上的文件、目录和设备的权限。
$ ls –l
总用量 6
-rw-rw-r-- 1 zlkj zlkj 50 2010-09-13 07:49 file1.gz
-rw-rw-r-- 1 zlkj zlkj 23 2010-09-13 07:50 file2
-rwxrwxr-x 1 zlkj zlkj 4882 2010-09-18 13:58 myprog
-rw-rw-r-- 1 zlkj zlkj 237 2010-09-18 13:58 myprog.c
drwxrwxr-x 2 zlkj zlkj 4096 2010-09-03 15:12 test1
drwxrwxr-x 2 zlkj zlkj 4096 2010-09-03 15:12 test2
输出结果的第一个字段就是描述文件和目录权限的编码。这个字段的第一个字符代表了对象的类型:
- - 代表文件
- d 代表目录
- l 代表链接
- c 代表字符型设备
- b 代表块设备
- n 代表网络设备
之后有3组三字符的编码。每一组定义了3种访问权限:
- r 代表对象是可读的
- w 代表对象是可写的
- x 代表对象是可执行的
若没有某种权限,在该权限位会出现单破折线。这3组权限分别对应对象的3个安全级别:
- 对象的属主
- 对象的属组
- 系统其他用户
讨论这个问题的最简单的办法就是找个例子,然后逐个分析文件权限。
-rwxrwxr-x 1 zlkj zlkj 4882 2010-09-18 13:58 myprog
这些权限说明登录名为zlkj的用户可以读取、写入以及执行这个文件(可以看作有全部权限)。类似地, zlkj组的成员也可以读取、写入和执行这个文件。然而不属于zlkj组的其他用户只能读取和执行这个文件: w被单破折线取代了,说明这个安全级别没有写入权限。
2.2 默认文件权限
你可能会问这些文件权限从何而来,答案是umask。 umask命令用来设置所创建文件和目录的默认权限。
$ umask
0002
$ touch newfile
$ ls -al newfile
-rw-rw-r-- 1 zlkj zlkj 0 6月 28 18:02 newfile
touch命令用分配给我的用户账户的默认权限创建了这个文件。 umask命令可以显示和设置这个默认权限。
在大多数Linux发行版中, umask值通常会设置在/etc/profile启动文件中,不过有一些是设置在/etc/login.defs文件中的(如Ubuntu)。可以用umask命令为默认umask设置指定一个新值。
$ umask 026
$ touch newfile2
$ ls -l newfile2
-rw-r----- 1 zlkj zlkj 0 6月 28 18:05 newfile2
在把umask值设成026后,默认的文件权限变成了640,因此新文件现在对组成员来说是只读的,而系统里的其他成员则没有任何权限。
三、改变安全性设置
如果你已经创建了一个目录或文件,需要改变它的安全性设置,在Linux系统上有一些工具能够完成这项任务。本文将告诉你如何更改文件和目录的已有权限、默认文件属主以及默认属组。
3.1 改变权限
chmod命令用来改变文件和目录的安全性设置。该命令的格式如下:
chmod options mode file
mode参数可以使用八进制模式或符号模式进行安全性设置。八进制模式设置非常直观,直
接用期望赋予文件的标准3位八进制权限码即可。
$ chmod 760 newfile
$ ls -l newfile
-rwxrw---- 1 zlkj zlkj 0 6月 28 18:05 newfile2
符号模式的权限就没这么简单了。 下面是在符号模式下指定权限的格式。
[ugoa…][[+-=][rwxXstugo…]
第一组字符定义了权限作用的对象:
- u 代表用户
- g 代表组
- o 代表其他
- a 代表上述所有
下一步,后面跟着的符号表示你是想在现有权限基础上增加权限(+),还是在现有权限基础
上移除权限(-),或是将权限设置成后面的值(=)。
最后,第三个符号代表作用到设置上的权限。你会发现,这个值要比通常的rwx多。额外的
设置有以下几项。
- x:如果对象是目录或者它已有执行权限,赋予执行权限。
- s:运行时重新设置UID或GID。
- t:保留文件或目录。
- u:将权限设置为跟属主一样。
- g:将权限设置为跟属组一样。
- o:将权限设置为跟其他用户一样。
示例如下:
$ chmod o+r newfile
$ ls -l newfile
-rwxrw-r-- 1 zlkj zlkj 0 6月 28 18:02 newfile
o+r给"其他用户"这一级别添加读取权限。
options为chmod命令提供了另外一些功能。 -R选项可以让权限的改变递归地作用到文件和子目录。你可以使用通配符指定多个文件,然后利用一条命令将权限更改应用到这些文件上。
3.2 改变所属关系
有时你需要改变文件的属主,比如有人离职或开发人员创建了一个在产品环境中需要归属在系统账户下的应用。 Linux提供了 chown命令来改变文件的属主。
chown命令的格式如下:
chown options owner[.group] file
可用登录名或UID来指定文件的新属主。
$ chown dan newfile
$ ls -l newfile
-rw-rw-r-- 1 dan zlkj 0 6月 20 19:16 newfile
chown命令也支持同时改变文件的属主和属组。
$ chown dan.shared newfile
$ ls -l newfile
-rw-rw-r-- 1 dan shared 0 6月 20 19:16 newfile