Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配唯一的用户账
户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。
用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。UID是数
值,每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。登录名是用户用来
登录系统的最长八字符的字符串(字符可以是数字或字母),同时会关联一个对应的密码。
Linux系统使用特定的文件和工具来跟踪和管理系统上的用户账户。在我们讨论文件权限之
前,先来看一下Linux是怎样处理用户账户的。本节会介绍管理用户账户需要的文件和工具,这
样在处理文件权限问题时,你就知道如何使用它们了。
7.1.1 /etc/passwd 文件
Linux系统使用一个专门的文件来将用户的登录名匹配到对应的UID值。这个文件就是
/etc/passwd文件,它包含了一些与用户有关的信息。下面是Linux系统上典型的/etc/passwd文件的
一个例子。
$ 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
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
rpm:x:37:37::/var/lib/rpm:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi daemon:/:/sbin/nologin
hsqldb:x:96:96::/var/lib/hsqldb:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
rich:x:500:500:Rich Blum:/home/rich:/bin/bash
mama:x:501:501:Mama:/home/mama:/bin/bash
katie:x:502:502:katie:/home/katie:/bin/bash
jessica:x:503:503:Jessica:/home/jessica:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
root用户账户是Linux系统的管理员,固定分配给它的UID是0。就像上例中显示的,Linux系
统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户叫作系统账
户,是系统上运行的各种服务进程访问资源用的特殊账户。所有运行在后台的服务都需要用一个
系统用户账户登录到Linux系统上。
在安全成为一个大问题之前,这些服务经常会用root账户登录。遗憾的是,如果有非授权的
用户攻陷了这些服务中的一个,他立刻就能作为root用户进入系统。为了防止发生这种情况,现
在运行在Linux服务器后台的几乎所有的服务都是用自己的账户登录。这样的话,即使有人攻入
了某个服务,也无法访问整个系统。
Linux为系统账户预留了500以下的UID值。有些服务甚至要用特定的UID才能正常工作。为
普通用户创建账户时,大多数Linux系统会从500开始,将第一个可用UID分配给这个账户(并非
所有的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用户管理工具去执行这些用户管理功能就会安全许多。
7.1.2 /etc/shadow 文件
/etc/shadow文件对Linux系统密码管理提供了更多的控制。只有root用户才能访问/etc/shadow
文件,这让它比起/etc/passwd安全许多。
/etc/shadow文件为系统上的每个用户账户都保存了一条记录。记录就像下面这样:
rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::
在/etc/shadow文件的每条记录中都有9个字段:
- 与/etc/passwd文件中的登录名字段对应的登录名
- 加密后的密码
- 自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
- 多少天后才能更改密码
- 多少天后必须更改密码
- 密码过期前提前多少天提醒用户更改密码
- 密码过期后多少天禁用用户账户
- 用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)
- 预留字段给将来使用
使用shadow密码系统后,Linux系统可以更好地控制用户密码。它可以控制用户多久更改一
次密码,以及什么时候禁用该用户账户,如果密码未更新的话。
7.1.3 添加新用户
用来向Linux系统添加新用户的主要工具是useradd。这个命令简单快捷,可以一次性创建
新用户账户及设置用户HOME目录结构。useradd命令使用系统的默认值以及命令行参数来设置
用户账户。系统默认值被设置在/etc/default/useradd文件中。可以使用加入了-D选项的useradd
命令查看所用Linux系统中的这些默认值。
/usr/sbin/useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
说明 一些Linux发行版会把Linux用户和组工具放在/usr/sbin目录下,这个目录可能不在PATH环
境变量里。如果你的Linux系统是这样的话,可以将这个目录添加进PATH环境变量,或者
用绝对文件路径名来使用这些工具。
在创建新用户时,如果你不在命令行中指定具体的值,useradd命令就会使用-D选项所显示
的那些默认值。这个例子列出的默认值如下:
- 新用户会被添加到GID为100的公共组;
- 新用户的HOME目录将会位于/home/loginname;
- 新用户账户密码在过期后不会被禁用;
- 新用户账户未被设置过期日期;
- 新用户账户将bash shell作为默认shell;
- 系统会将/etc/skel目录下的内容复制到用户的HOME目录下;
- 系统为该用户账户在mail目录下创建一个用于接收邮件的文件。
倒数第二个值很有意思。useradd命令允许管理员创建一份默认的HOME目录配置,然后把
它作为创建新用户HOME目录的模板。这样就能自动在每个新用户的HOME目录里放置默认的系
统文件。在Ubuntu Linux系统上,/etc/skel目录有下列文件:
$ ls -al /etc/skel total 32
drwxr-xr-x 2 root root 4096 2010-04-29 08:26 .
drwxr-xr-x 135 root root 12288 2010-09-23 18:49 ..
-rw-r—r— 1 root root 220 2010-04-18 21:51 .bash_logout
-rw-r—r— 1 root root 3103 2010-04-18 21:51 .bashrc
-rw-r—r— 1 root root 179 2010-03-26 08:31 examples.desktop
-rw-r—r— 1 root root 675 2010-04-18 21:51 .profile
$
根据第6章的内容,你应该能知道这些文件是做什么的。它们是bash shell环境的标准启动文
件。系统会自动将这些默认文件复制到你创建的每个用户的HOME目录。
可以用默认系统参数创建一个新用户账户,然后检查一下新用户的HOME目录。
useradd -m test
ls -al /home/test
total 24
drwxr-xr-x 2 test test 4096 2010-09-23 19:01 .
drwxr-xr-x 4 root root 4096 2010-09-23 19:01 ..
-rw-r—r— 1 test test 220 2010-04-18 21:51 .bash_logout
-rw-r—r— 1 test test 3103 2010-04-18 21:51 .bashrc
-rw-r—r— 1 test test 179 2010-03-26 08:31 examples.desktop
-rw-r—r— 1 test test 675 2010-04-18 21:51 .profile
默认情况下,useradd命令不会创建HOME目录,但是-m命令行选项会使其创建HOME目录。
你能在此例中看到,useradd命令创建了新HOME目录,并将/etc/skel目录中的文件复制了过来。
说明 运行本章中提到的用户账户管理命令,需要以root用户账户登录或者通过sudo命令以root用户账户身份运行这些命令。
要想在创建用户时改变默认值或默认行为,可以使用命令行参数。表7-1列出了这些参数。
你会发现,在创建新用户账户时使用命令行参数可以更改系统指定的默认值。但如果总需要
修改某个值的话,最好还是修改一下系统的默认值。
可以在-D选项后跟上一个指定的值来修改系统默认的新用户设置。这些参数如表7-2所示。
更改默认值非常简单:
useradd -D -s /bin/tsch
useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/tsch
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
现在,useradd命令会将tsch shell作为所有新建用户的默认登录shell。
7.1.4 删除用户
如果你想从系统中删除用户,userdel可以满足这个需求。默认情况下,userdel命令会只
删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。
如果加上-r参数,userdel会删除用户的HOME目录以及邮件目录。然而,系统上仍可能存
有已删除用户的其他文件。这在有些环境中会造成问题。
下面是用userdel命令删除已有用户账户的一个例子。
/usr/sbin/userdel -r test
ls -al /home/test
ls: cannot access /home/test: No such file or directory
加了-r参数后,用户先前的那个/home/test目录已经不存在了。
警告 在有大量用户的环境中使用-r参数时要特别小心。你永远不知道用户是否在其HOME目
录下存放了其他用户或其他程序要使用的重要文件。记住,在删除用户的HOME目录之
前一定要检查清楚!
7.1.5 修改用户
Linux提供了一些不同的工具来修改已有用户账户的信息。表7-3列出了这些工具。
每种工具都提供了特定的功能来修改用户账户信息。下面的几节将具体介绍这些工具。
1. usermod
usermod命令是用户账户修改工具中最强大的一个。它能用来修改/etc/passwd文件中的大部
分字段,只需用与想修改的字段对应的命令行参数就可以了。参数大部分跟useradd命令的参数
一样(比如,-c修改备注字段,-e修改过期日期,-g修改默认的登录组)。除此之外,还有另外
一些可能派上用场的选项。
- -l 修改用户账户的登录名。
- -L 锁定账户,使用户无法登录。
- -p 修改账户的密码。
- -U 解除锁定,使用户能够登录。
-L选项尤其实用。它可以将账户锁定,使用户无法登录,同时无需删除账户和用户的数据。
要让账户恢复正常,只要用-U选项就行了。
2. passwd和chpasswd
改变用户密码的一个简便方法就是用passwd命令。
passwd test
Changing password for user test.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
如果只用passwd命令,它会改你自己的密码。系统上的任何用户都能改自己的密码,但只
有root用户才有权限改别人的密码。
-e选项能强制用户下次登录时修改密码。你可以先给用户设置一个简单的密码,之后再强制
在下次登录时改成他们能记住的更复杂的密码。
如果需要为系统中的大量用户修改密码,chpasswd命令可以事半功倍。chpasswd命令能从
标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密,然后为用户账户设置。你
也可以用重定向命令来将含有userid:passwd对的文件重定向给该命令。
chpasswd < users.txt
3. chsh、chfn和chage
chsh、chfn和chage工具专门用来修改特定的账户信息。chsh命令用来快速修改默认的用
户登录shell。使用时必须用shell的全路径名作为参数,不能只用shell名。
chsh -s /bin/csh test
Changing shell for test.
Shell changed.
chfn命令提供了在/etc/passwd文件的备注字段中存储信息的标准方法。chfn命令会将用于
Unix的finger命令的信息存进备注字段,而不是简单地存入一些随机文本(比如名字或昵称之
类的),或是将备注字段留空。finger命令可以非常方便地查看Linux系统上的用户信息。
finger rich
Login: rich Name: Rich Blum
Directory: /home/rich Shell: /bin/bash
On since Thu Sep 20 18:03 (EDT) on pts/0 from 192.168.1.2
No mail.
No Plan.
说明 出于安全性考虑,很多Linux系统管理员会在系统上禁用finger命令,不少Linux发行版
甚至都没有默认安装该命令。
如果在使用chfn命令时没有参数,它会向你询问要将哪些适合的内容加进备注字段。
chfn test
Changing finger information for test.
Name []: Ima Test
Office []: Director of Technology
Office Phone []: (123)555-1234
Home Phone []: (123)555-9876
Finger information changed.finger test
Login: test Name: Ima Test
Directory: /home/test Shell: /bin/csh
Office: Director of Technology Office Phone: (123)555-1234 Home Phone: (123)555-9876
Never logged in.
No mail.
No Plan.
查看/etc/passwd文件中的记录,你会看到下面这样的结果。
grep test /etc/passwd
test:x:504:504:Ima Test,Director of Technology,(123)555-
1234,(123)555-9876:/home/test:/bin/csh
所有的指纹信息现在都存在/etc/passwd文件中了。
最后,chage命令用来帮助管理用户账户的有效期。你需要对每个值设置多个参数,如表7-4
所示。
chage命令的日期值可以用下面两种方式中的任意一种:
- YYYY-MM-DD格式的日期
- 代表从1970年1月1日起到该日期天数的数值
chage命令中有个好用的功能是设置账户的过期日期。有了它,你就能创建在特定日期自动
过期的临时用户,再也不需要记住删除用户了!过期的账户跟锁定的账户很相似:账户仍然存在,
但用户无法用它登录。