1. Linux的安全性
Linux 安全系统的核心是用户账户。每个能进入 Linux 系统的用户都会被分配唯一的用户账户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。
用户权限是通过创建用户时分配的用户 ID(User ID,通常缩写为 UID)来跟踪的。UID 是数值,每个用户都有唯一的 UID,但在登录系统时用的不是 UID,而是登录名。
1.1 etc/passwd 文件
Linux 系统使用一个专门的文件来将用户的登录名匹配到对应的 UID 值。这个文件就是 /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
....
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 系统上。
Linux 为系统账户预留了 500 以下的 UID 值。
/etc/passwd文件的字段包含了如下信息:
- 登录用户名
- 用户密码
- 用户账户的UID(数字形式)
- 用户账户的组ID(GID)(数字形式)
- 用户账户的文本描述(称为备注字段)
- 用户HOME目录的位置
- 用户的默认shell
/etc/passwd 文件中的密码字段都被设置成了 x,这并不是说所有的用户账户都用相同的密码。
绝大多数 Linux 系统都将用户密码保存在另一个单独的文件中(叫作 shadow 文件,位置在 /etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。
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 系统可以更好地控制用户密码。它可以控制用户多久更改一次密码,以及什么时候禁用该用户账户,
1.3 添加新用户
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
#
在创建新用户时,如果你不在命令行中指定具体的值,useradd 命令就会使用 -D 选项所显示的那些默认值。这个例子列出的默认值如下:
- 新用户会被添加到 GID 为100的公共组;
- 新用户的 HOME 目录将会位于 /home/loginname;
- 新用户账户密码在过期后不会被禁用;
- 新用户账户未被设置过期日期;
- 新用户账户将 bash shell 作为默认 shell;
- 系统会将 /etc/skel 目录下的内容复制到用户的 HOME 目录下;
- 系统为该用户账户在 mail 目录下创建一个用于接收邮件的文件;
可以用默认系统参数创建一个新用户账户,然后检查一下新用户的 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 目录。
要想在创建用户时改变默认值或默认行为,可以使用命令行参数,下图列出了这些参数。
在创建新用户账户时使用命令行参数可以更改系统指定的默认值。但如果总需要修改某个值的话,最好还是修改一下系统的默认值。
可以在 -D 选项后跟上一个指定的值来修改系统默认的新用户设置。参数列表如下图所示
更改默认值非常简单:
# 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。
1.4 删除用户
要删除用户可以使用 userdel 命令,默认情况下,userdel 命令会只删除 /etc/passwd 文件中的用户信息,而不会删除系统中属于该账户的任何文件。
如果加上 -r 参数,userdel 会删除用户的 HOME 目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。这在有些环境中会造成问题。
# /usr/sbin/userdel -r test
# ls -al /home/test
ls: cannot access /home/test: No such file or directory
#
1.5 修改用户
Linux提供了一些不同的工具来修改已有用户账户的信息。
-
usermod
usermod命令是用户账户修改工具中最强大的一个。它能用来修改/etc/passwd文件中的大部分字段,只需用与想修改的字段对应的命令行参数就可以了。参数大部分跟useradd命令的参数一样(比如,-c修改备注字段,-e修改过期日期,-g修改默认的登录组)。除此之外,还有另外一些可能派上用场的选项。
-l 修改用户账户的登录名。
-L 锁定账户,使用户无法登录。
-p 修改账户的密码。
-U 解除锁定,使用户能够登录。 -
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 #
-
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. #
如果在使用 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 #
chage 命令用来帮助管理用户账户的有效期。
chage命令的日期值可以用下面两种方式中的任意一种:- YYYY-MM-DD格式的日期
- 代表从1970年1月1日起到该日期天数的数值
chage 命令中有个好用的功能是设置账户的过期日期。有了它,你就能创建在特定日期自动过期的临时用户,再也不需要记住删除用户了!过期的账户跟锁定的账户很相似:账户仍然存在,但用户无法用它登录。
2. 使用Linux组
组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。
每个组都有唯一的 GID——跟 UID 类似,在系统上这是个唯一的数值。除了 GID,每个组还有唯一的组名。
/etc/group文件包含系统上用到的每个组的信息。
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
和 UID 一样,GID 在分配时也采用了特定的格式。系统账户用的组通常会分配低于 500 的 GID值,而用户组的 GID 则会从 500 开始分配。/etc/group 文件有 4 个字段:
* 组名
* 组密码
* GID
* 属于该组的用户列表
组密码允许非组内成员通过它临时成为该组成员。这个功能并不很普遍,但确实存在。
说明 用户账户列表某种意义上有些误导人。你会发现,在列表中,有些组并没有列出用户。这并不是说这些组没有成员。当一个用户在 /etc/passwd 文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在 /etc/group 文件中。多年以来,被这个问题难倒的系统管理员可不是一两个呢。
2.1 创建新组
groupadd 命令可在系统上创建新组。
# /usr/sbin/groupadd shared
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
gdm:x:42:
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
shared:x:505:
#
在创建新组时,默认没有用户被分配到该组。groupadd 命令没有提供将用户添加到组中的选项,但可以用 usermod 命令来弥补这一点。
# /usr/sbin/usermod -G shared rich
# /usr/sbin/usermod -G shared test
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
gdm:x:42:
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
shared:x:505:rich, test
#
shared 组现在有两个成员:test和rich。usermod 命令的 -G 选项会把这个新组添加到该用户账户的组列表里。
说明 如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更改才能生效。
警告 为用户账户分配组时要格外小心。如果加了 -g 选项,指定的组名会替换掉该账户的默认组。-G 选项则将该组添加到用户的属组的列表里,不会影响默认组。
2.2 修改组
groupmod 命令可以修改已有组的 GID(加-g选项)或组名(加-n选项)。
# /usr/sbin/groupmod -n sharing shared
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
gdm:x:42:
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
sharing:x:505:test,rich
#
# 修改组名时,GID和组成员不会变,只有组名改变。
3. 理解文件权限
待续
4. 改变安全性设置
待续