用户账户
Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配唯一的用户账户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。
用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。UID是数值,每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。登录名是用户用来登录系统的最长八字符的字符串(字符可以是数字或字母),同时会关联一个对应的密码。
Linux系统使用特定的文件和工具来跟踪和管理系统上的用户账户。
/etc/passwd
Linux系统使用一个专门的文件来将用户的登录名匹配到对应的UID值。这个文件就是/etc/passwd文件,它包含了一些与用户有关的信息。
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
......
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
$
root用户账户是Linux系统的管理员,固定分配给它的UID是0。Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户叫作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。所有运行在后台的服务都需要用一个系统用户账户登录到Linux系统上。
Linux为系统账户预留了500以下的UID值。有些服务甚至要用特定的UID才能正常工作。为普通用户创建账户时,大多数Linux系统会从500开始,将第一个可用UID分配给这个账户(并非所有的Linux发行版都是这样)。
/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用户管理工具去执行这些用户管理功能就会安全许多。
/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日到当天的天数表示)
- 预留字段给将来使用
用户curd
useradd
用来向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
#
默认情况下,useradd命令不会创建HOME目录,但是-m命令行选项会使其创建HOME目录。要想在创建用户时改变默认值或默认行为,可以使用命令行参数
- -c comment 给新用户添加备注
- -d home_dir 为主目录指定一个名字(如果不想用登录名作为主目录名的话)
- -e expire_date 用YYYY-MM-DD格式指定一个账户过期的日期
- -f inactive_days 指定这个账户密码过期后多少天这个账户被禁用;0表示密码一过期就立即禁用,1表示禁用这个功能
- -g initial_group 指定用户登录组的GID或组名
- -G group ... 指定用户除登录组之外所属的一个或多个附加组
- -k 必须和-m一起使用,将/etc/skel目录的内容复制到用户的HOME目录
- -m 创建用户的HOME目录
- -M 不创建用户的HOME目录(当默认设置里要求创建时才使用这个选项)
- -n 创建一个与用户登录名同名的新组
- -r 创建系统账户
- -p passwd 为用户账户指定默认密码
- -s shell 指定默认的登录shell
- -u uid 为账户指定唯一的UID
userdel
默认情况下,userdel命令会只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。如果加上-r参数,userdel会删除用户的HOME目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。
在有大量用户的环境中使用-r参数时要特别小心。你永远不知道用户是否在其HOME目录下存放了其他用户或其他程序要使用的重要文件。记住,在删除用户的HOME目录之前一定要检查清楚!
修改用户
Linux提供了一些不同的工具来修改已有用户账户的信息
- usermod 修改用户账户的字段,还可以指定主要组以及附加组的所属关系
- passwd 修改已有用户的密码
- chpasswd 从文件中读取登录名密码对,并更新密码
- chage 修改密码的过期日期
- chfn 修改用户账户的备注信息
- chsh 修改用户账户的默认登录shell
usermod
usermod命令是用户账户修改工具中最强大的一个。它能用来修改/etc/passwd文件中的大部分字段,只需用与想修改的字段对应的命令行参数就可以了。参数大部分跟useradd命令的参数一样(比如,-c修改备注字段,-e修改过期日期,-g修改默认的登录组)。除此之外,还有另外一些可能派上用场的选项。
- -l修改用户账户的登录名。
- -L锁定账户,使用户无法登录。
- -p修改账户的密码。
- -U解除锁定,使用户能够登录。
-L选项尤其实用。它可以将账户锁定,使用户无法登录,同时无需删除账户和用户的数据。要让账户恢复正常,只要用-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、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命令用来帮助管理用户账户的有效期。你需要对每个值设置多个参数
- -d 设置上次修改密码到现在的天数
- -E 设置密码过期的日期
- -I 设置密码过期到锁定账户的天数
- -m 设置修改密码之间最少要多少天
- -W 设置密码过期前多久开始出现提醒信息
chage命令中有个好用的功能是设置账户的过期日期。有了它,你就能创建在特定日期自动过期的临时用户,再也不需要记住删除用户了!过期的账户跟锁定的账户很相似:账户仍然存在,但用户无法用它登录。
linux用户组
用户账户在控制单个用户安全性方面很好用,但涉及在共享资源的一组用户时就捉襟见肘了。为了解决这个问题,Linux系统采用了另外一个安全概念——组(group)。
组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限
每个组都有唯一的GID——跟UID类似,在系统上这是个唯一的数值。除了GID,每个组还有唯一的组名。Linux系统上有一些组工具可以创建和管理你自己的组。
/etc/group
与用户账户类似,组信息也保存在系统的一个文件中。/etc/group文件包含系统上用到的每个组的信息。下面是一些来自Linux系统上/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/group文件来添加用户到一个组,要用usermod命令
用户账户列表某种意义上有些误导人。你会发现,在列表中,有些组并没有列出用户。这并不是说这些组没有成员。当一个用户在/etc/passwd文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在/etc/group文件中。
用户组curd
groupadd
groupadd命令可在系统上创建新组。
# /usr/sbin/groupadd shared
# tail /etc/group
...
shared:x:505:
#
在创建新组时,默认没有用户被分配到该组。groupadd命令没有提供将用户添加到组中的选项,需要用usermod命令添加。
# /usr/sbin/usermod -G shared rich
# /usr/sbin/usermod -G shared test
# tail /etc/group
...
shared:x:505:rich, test
#
groupmod
groupmod命令可以修改已有组的GID(加-g选项)或组名(加-n选项)
# /usr/sbin/groupmod -n sharing shared
# tail /etc/group
...
sharing:x:505:test,rich
#
文件权限
文件权限符
- r代表对象是可读的
- w代表对象是可写的
- x代表对象是可执行的
若没有某种权限,在该权限位会出现单破折线。文件会有三组权限
-rwxrwxr-x 1 rich rich 4882 2010-09-18 13:58 myprog
文件myprog有下面3组权限。
- rwx:文件的属主(设为登录名rich)。
- rwx:文件的属组(设为组名rich)。
- r-x:系统上其他人。
对于每个组的rwx,使用0/1代表权限有无,每组转为八进制,如r-x为101=5,rwxrwxr-x为775
修改权限
chmod
chmod命令用来改变文件和目录的安全性设置。chmod options mode file
mode参数可以使用八进制模式或符号模式进行安全性设置。八进制模式设置非常直观,直接用期望赋予文件的标准3位八进制权限码即可。
$ chmod 760 newfile
$ ls -l newfile
-rwxrw---- 1 rich rich 0 Sep 20 19:16 newfile
$
与通常用到的3组三字符权限字符不同,chmod命令采用了另一种方法:[ugoa…][[+-=][rwxXstugo…]
u代表用户、g代表组、o代表其他、a代表上述所有,后面跟上+-=,最后应用权限符
$ chmod o+r newfile
改名属组
chown
chown命令用来改变文件的属主,chgrp命令用来改变文件的默认属组。
chown命令的格式如下:chown options owner[.group] file
可用登录名或UID来指定文件的新属主。
# chown dan newfile
chown命令也支持同时改变文件的属主和属组。
# chown dan.shared newfile
chgrp命令可以更改文件或目录的默认属组
$ chgrp shared newfile
内容来源
[1] [美] Richard Blum Christine Bresnahan.Linux命令行与shell脚本编程大全(第3版).北京人民邮电出版社,2016.