Linux 的安全性

Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配唯一的用户账 户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。

/etc/passwd 文件

Linux系统使用一个专门的文件来将用户的登录名匹配到相应的UID 。这个文件就是 /etc/passwd文件,它包含了一些与用户有关的信息。下面是Linux系统上典型的/etc/passwd文件的一个例子。

root❌0:0:root:/root:/bin/bash

root用户账户是Linux系统的管理员,固定分配给它的UID是0。Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户叫作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。所有运行在后 台的服务都需要用一个系统用户账户登录到Linux系统上。

在安全成为一个大问题之前,这些服务经常会用root账户登录.遗憾的是,如果有非授权的用户攻陷了这些服务中的一个,他立刻就能作为root用户进入系统。为了防止发生这种情况,现在运行在Linux服务器的后台的所有的服务都是用自己的账户。这样的话即使有人攻入了某个服务,也无法访问整个系统。

Linux为系统账户预留了500以下的UID 。有些服务甚至要用特定的UID能正常工作。为普通用户创建账户时,大多数Linux系统会从500开始,将第一个可用UID分配这个账户(并非所有的Linux发行版都是这样).

你可能已经注意到/etc/passwd文件中还有很多用户登录名和UID之外的信息。/etc/passwd文件 的字段包含了如下信息:

/etc/passwd文件中的密码字段都被设置成了x,这并不是说所有的用户账户都用相同的密码。绝大多数Linux系统都将用户密码保存在另一个单独的文件中(叫作shadow文件,位置 在/etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。

/etc/shadow 文件

/etc/shadow文件对Linux系统密码管理提供了更多的控制。只有root用户才能访问/etc/shadow 文件,这让它比起/etc/passwd安全许多。

/etc/shadow文件为系统上的每个用户账户都保存了一条记录。记录就像下面这样:

rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::

在/etc/shadow文件的每条记录中都有9个字段:

使用shadow密码系统后,Linux系统可以更好地控制用户密码。它可以控制用户多久更改密码,以及什么时候禁用该用户账户,如果密码未更新的话。

添加新用户

用来向Linux系统添加新用户的主要工具是useradd。这个命令简单快捷,可以一次性创建 新用户账户及设置用户HOME目录结构。useradd命令使用系统的默认值以及命令行参数来设置用户账户。系统默认值被设置在/etc/default/useradd文件中。可以使用加入了-D选项的useradd 命令查看所用Linux系统中的这些默认值。

在创建新用户时,如果你不在命令行中指定具体的值,useradd命令就会使用-D选项所显示 的那些默认值。这个例子列出的默认值如下:

倒数第二个值很有意思。useradd命令允许管理员创建一份默认的HOME目录配置,然后把它作为创建新用户HOME目录的模板。这样就能自动在每个新用户的HOME目录里放置默认的系统文件。它们是bash shell环境的标准启动文 件。

默认情况下,useradd命令不会创建HOME目录,但是-m命令行选项会使其创建HOME目录。 useradd命令创建了新HOME目录,并将/etc/skel目录中的文件复制了过来。

要想在创建用户时改变默认值或默认行为,可以使用命令行参数。

但如果总需要修改某个值的话,最好还是修改一下系统的默认值。可以在-D选项后跟上一个指定的值来修改系统默认的新用户设置。

useradd -D -s /bin/tsch

删除用户

如果你想从系统中删除用户,userdel可以满足这个需求。默认情况下,userdel命令会只 删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。

如果加上-r参数,userdel会删除用户的HOME目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。这在有些环境中会造成问题。

修改用户

1. usermod

usermod命令是用户账户修改工具中最强大的一个。它能用来修改/etc/passwd文件中的大部分字段,只需用与想修改的字段对应的命令行参数就可以了。参数大部分跟useradd命令的参数 一样(比如,-c修改备注字段,-e修改过期日期,-g修改默认的登录组)。除此之外,还有另外 一些可能派上用场的选项。

  1. -l修改用户账户的登录名。
  2. -L锁定账户,使用户无法登录。  -p修改账户的密码。
  3. -U解除锁定,使用户能够登录。

-L选项尤其实用。它可以将账户锁定,使用户无法登录,同时无需删除账户和用户的数据。 要让账户恢复正常,只要用-U选项就行了。

2. passwd和chpasswd

改变用户密码的一个简便方法就是用passwd命令。

如果只用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系统上的用户信息。

如果在使用chfn命令时没有参数,它会向你询问要将哪些适合的内容加进备注字段。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 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
Directory: /home/test
Office: Director of Technology
Name: Ima Test
Shell: /bin/csh
Office Phone: (123)555-1234
Home Phone: (123)555-9876
    Never logged in.
    No mail.
    No Plan.
#

查看/etc/passwd文件中的记录,你会看到下面这样的结果。

1
2
3
4
 # grep test /etc/passwd
 test❌504:504:Ima Test,Director of Technology,(123)555-
 1234,(123)555-9876:/home/test:/bin/csh
 #

所有的指纹信息现在都存在/etc/passwd文件中了。

最后,chage命令用来帮助管理用户账户的有效期。你需要对每个值设置多个参.

chage命令的日期值可以用下面两种方式中的任意一种:

  1. YYYY-MM-DD格式的日期
  2. 代表从1970年1月1日起到该日期天数的数值

chage命令中有个好用的功能是设置账户的过期日期。有了它,你就能创建在特定日期自动 过期的临时用户,再也不需要记住删除用户了!过期的账户跟锁定的账户很相似:账户仍然存在,但用户无法用它登录。

使用Linux组

用户账户在控制单个用户安全性方面很好用,但涉及在共享资源的一组用户时就捉襟见肘了。为了解决这个问题,Linux系统采用了另外一个安全概念——组(group)。

/etc/group 文件

与用户账户类似,组信息也保存在系统的一个文件中。/etc/group文件包含系统上用到的每个组的信息。

bin❌1:root,bin,daemon
mysql❌27:

和UID一样,GID在分配时也采用了特定的格式。系统账户用的组通常会分配低于500的GID 值,而用户组的GID则会从500开始分配。/etc/group文件有4个字段:

  1. 组名
  2. 组密码
  3. GID
  4. 属于该组的用户列表

组密码允许非组内成员通过它临时成为该组成员。这个功能并不很普遍,但确实存在。

千万不能通过直接修改/etc/group文件来添加用户到一个组,要用usermod命令。在添加用户到不同的组之前,首先得创建组。

用户账户列表某种意义上有些误导人。你会发现,在列表中,有些组并没有列出用户。 这并不是说这些组没有成员。当一个用户在/etc/passwd文件中指定某个组作为默认组时, 用户账户不会作为该组成员再出现在/etc/group文件中.

创建新组

groupadd命令可在系统上创建新组。

在创建新组时,默认没有用户被分配到该组。groupadd命令没有提供将用户添加到组中的 选项,但可以用usermod命令来弥补这一点。

# /usr/sbin/usermod -G shared rich

usermod命令的-G选项会把这个新组添加到该用 户账户的组列表里。

为用户账户分配组时要格外小心。如果加了-g选项,指定的组名会替换掉该账户的默认 组。-G选项则将该组添加到用户的属组的列表里,不会影响默认组。

如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更 改才能生效。

修改组

在/etc/group文件中可以看到,需要修改的组信息并不多。groupmod命令可以修改已有组的 GID(加-g选项)或组名(加-n选项)。

修改组名时,GID和组成员不会变,只有组名改变。由于所有的安全权限都是基于GID的, 你可以随意改变组名而不会影响文件的安全性。