缺乏安全性的系统不是完整的系统. 系统中必须有一套能够保护文件免遭非授权用户浏览或修改的机制. 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
来源: http://www.bubuko.com/infodetail-3109711.html