读书笔记《Linux命令行与shell脚本编程大全》第七章
- 2023-03-08 10:00:00
- 王肖蒙
- 原创 651
7.1 Linux的安全性
Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配唯一的用户账户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。
用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。UID是数值,每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。登录名是用户用来登录系统的最长八字符的字符串(字符可以是数字或字母),同时会关联一个对应的密码。
7.1.1 /etc/password文件
Linux系统使用专门的文件来将用户的登录名匹配到对应的UID值。这个文件就是 /etc/passwd文件,它包含了一些与用户有关的信息。
Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户叫作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。
/etc/passwd文件的字段包含了如下信息:
1. 登录用户名
2. 用户密码
3. 用户账户的UID(数字形式)
4. 用户账户的组ID(GID)(数字形式)
5. 用户账户的文本描述(称为备注字段)
6. 用户HOME目录的位置
7. 用户的默认shell
用户密码保存在另一个单独的文件中(叫作shadow文件,位置在/etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。
/etc/passwd是一个标准的文本文件。
7.1.2 /etc/shadow
/etc/shadow文件对Linux系统密码管理提供了更多的控制。
在/etc/shadow文件的每条记录中都有9个字段:
1. 与/etc/passwd文件中的登录名字段对应的登录名
2. 加密后的密码
3. 自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
4. 多少天后才能更改密码
5. 多少天后必须更改密码
6. 密码过期前提前多少天提醒用户更改密码
7. 密码过期后多少天禁用用户账户
8. 用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)
9. 预留字段给将来使用
7.1.3 添加新用户
用来向Linux系统添加新用户的主要工具是useradd。
系统默认值被设置在/etc/default/useradd文件中。可以使用加入了-D选项的useradd命令查看所用Linux系统中的这些默认值。
说明 一些Linux发行版会把Linux用户和组工具放在/usr/sbin目录下,这个目录可能不在PATH环境变量里。如果你的Linux系统是这样的话,可以将这个目录添加进PATH环境变量,或者用绝对文件路径名来使用这些工具。
useradd命令允许管理员创建一份默认的HOME目录配置,然后把它作为创建新用户HOME目录的模板。这样就能自动在每个新用户的HOME目录里放置默认的系统文件。
/etc/skel目录下的文件
useradd命令不会创建HOME目录,但是-m命令行选项会使其创建HOME目录。
useradd命令行参数
参数 |
描述 |
-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 |
useradd更改默认值的参数
参数 |
描述 |
-b default_home |
更改默认的创建用户HOME目录的位置 |
-e expiration_date |
更改默认的新账户的过期日期 |
-f inactive |
更改默认的新用户从密码过期到账户被禁用的天数 |
-g group |
更改默认的组名称或GID |
-s shell |
更改默认的登录shell |
7.1.4 删除用户
userdel命令会只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。
如果加上-r参数,userdel会删除用户的HOME目录以及邮件目录。
7.1.5 修改用户
用户账户修改工具
命令 |
描述 |
usermod |
修改用户账户的字段,还可以指定主要组以及附加组的所属关系 |
passwd |
修改已有用户的密码 |
chpasswd |
从文件中读取登录名密码对,并更新密码 |
chage |
修改密码的过期日期 |
chfn |
修改用户账户的备注信息 |
chsh |
修改用户账户的默认登录shell |
1.usermod
-c修改备注字段
-e修改过期日期
-g修改默认的登录组
-l修改用户账户的登录名。
-L锁定账户,使用户无法登录。
-p修改账户的密码。
-U解除锁定,使用户能够登录。
-L选项尤其实用。它可以将账户锁定,使用户无法登录,同时无需删除账户和用户的数据。要让账户恢复正常,只要用-U选项就行了。
2.passwd和chpasswd
passwd命令,它会改你自己的密码。系统上的任何用户都能改自己的密码,但只有root用户才有权限改别人的密码。
-e选项能强制用户下次登录时修改密码。你可以先给用户设置一个简单的密码,之后再强制在下次登录时改成他们能记住的更复杂的密码。
为系统中的大量用户修改密码,chpasswd命令可以事半功倍。chpasswd命令能从标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密,然后为用户账户设置。
3.chsh、chfn和chage
chsh、chfn和chage工具专门用来修改特定的账户信息。chsh命令用来快速修改默认的用户登录shell。使用时必须用shell的全路径名作为参数,不能只用shell名。
chfn命令提供了在/etc/passwd文件的备注字段中存储信息的标准方法。chfn命令会将用于Unix的finger命令的信息存进备注字段,而不是简单地存入一些随机文本(比如名字或昵称之类的),或是将备注字段留空。finger命令可以非常方便地查看Linux系统上的用户信息。
说明 出于安全性考虑,很多Linux系统管理员会在系统上禁用finger命令,不少Linux发行版甚至都没有默认安装该命令。
chage命令参数
参数· |
描述 |
-d |
设置上次修改密码到现在的天数 |
-E |
设置密码过期的日期 |
-I |
设置密码过期到锁定账户的天数 |
-m |
设置修改密码之间最少要多少天 |
-W |
设置密码过期前多久开始出现提醒信息 |
chage命令的日期值可以用下面两种方式中的任意一种:
1. YYYY-MM-DD格式的日期
2. 代表从1970年1月1日起到该日期天数的数值
7.2 使用Linux组
组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。
每个组都有唯一的GID——跟UID类似,在系统上这是个唯一的数值。除了GID,每个组还有唯一的组名。
7.2.1 /etc/group 文件
/etc/group文件包含系统上用到的每个组的信息。
/etc/group文件有4个字段:
1. 组名
2. 组密码
3. GID
4. 属于该组的用户列表
说明 用户账户列表某种意义上有些误导人。你会发现,在列表中,有些组并没有列出用户。
这并不是说这些组没有成员。当一个用户在/etc/passwd文件中指定某个组作为默认组时,
用户账户不会作为该组成员再出现在/etc/group文件中。多年以来,被这个问题难倒的系
统管理员可不是一两个呢。
7.2.2 创建新组
groupadd命令可在系统上创建新组。
usermod命令的-G选项会把这个新组添加到该用户账户的组列表里。
说明 如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更改才能生效。
警告 为用户账户分配组时要格外小心。如果加了-g选项,指定的组名会替换掉该账户的默认组。-G选项则将该组添加到用户的属组的列表里,不会影响默认组。
7.2.3 修改组
groupmod命令可以修改已有组的GID(加-g选项)或组名(加-n选项)。
修改组名时,GID和组成员不会变,只有组名改变。由于所有的安全权限都是基于GID的,你可以随意改变组名而不会影响文件的安全性。
7.3 理解文件权限
7.3.1 使用文件权限符
ls命令可以用来查看Linux系统上的文件、目录和设备的权限。
输出结果的第一个字段就是描述文件和目录权限的编码。这个字段的第一个字符代表了对象的类型:
1. -代表文件
2. d代表目录
3. l代表链接
4. c代表字符型设备
5. b代表块设备
6. n代表网络设备
之后有3组三字符的编码。每一组定义了3种访问权限:
1. r代表对象是可读的
2. w代表对象是可写的
3. x代表对象是可执行的
若没有某种权限,在该权限位会出现单破折线。这3组权限分别对应对象的3个安全级别:
1. 对象的属主
2. 对象的属组
3. 系统其他用户
7.3.2 默认文件权限
umask命令用来设置所创建文件和目录的默认权限。
touch命令用分配给我的用户账户的默认权限创建了这个文件。umask命令可以显示和设置这个默认权限。
第一位代表了一项特别的安全特性,叫作粘着位(sticky bit)。后面的3位表示文件或目录对应的umask八进制值。
Linux文件权限码
权限 |
二进制值 |
八进制值 |
描述 |
--- |
000 |
0 |
没有任何权限 |
--x |
001 |
1 |
只有执行权限 |
-w- |
010 |
2 |
只有写入权限 |
-wx |
011 |
3 |
有写入和执行权限 |
r-- |
100 |
4 |
只有读取权限 |
r-x |
101 |
5 |
有读取和执行权限 |
rw- |
110 |
6 |
有读取和写入权限 |
rwx |
111 |
7 |
有全部权限 |
umask值只是个掩码。它会屏蔽掉不想授予该安全级别的权限。
要把umask值从对象的全权限值中减掉。对文件来说,全权限的值是666(所有用户都有读和写的权限);而对目录来说,则是777(所有用户都有读、写、执行权限)。
umask值通常会设置在/etc/profile启动文件中,不过有一些是设置在/etc/login.defs文件中的(如Ubuntu)。
7.4 改变安全性设置
7.4.1 改变权限
chmod命令用来改变文件和目录的安全性设置。该命令的格式如下:
chmod options mode file
1. u代表用户
2. g代表组
3. o代表其他
4. a代表上述所有
在现有权限基础上增加权限(+),还是在现有权限基础上移除权限(),或是将权限设置成后面的值(=)。 X:如果对象是目录或者它已有执行权限,赋予执行权限。
1. s:运行时重新设置UID或GID。
2. t:保留文件或目录。
3. u:将权限设置为跟属主一样。
4. g:将权限设置为跟属组一样。
5. o:将权限设置为跟其他用户一样。
o+r添加读取权限。
x移除了属主已有的执行权限。注意ls命令的-F选项,它能够在具有执行权限的文件名后加一个星号。
7.4.2 改变所属关系
chown命令用来改变文件的属主,chgrp命令用来改变文件的默认属组。
chown命令的格式如下。
chown options owner[.group] file
-R选项配合通配符可以递归地改变子目录和文件的所属关系。-h选项可以改变该文件的所有符号链接文件的所属关系。
说明 只有root用户能够改变文件的属主。任何属主都可以改变文件的属组,但前提是属主必须是原属组和目标属组的成员。
7.5 共享文件
Linux还为每个文件和目录存储了3个额外的信息位。
1. 设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。
2. 设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中
创建的新文件会以目录的默认属组作为默认属组。
3. 粘着位:进程结束后文件还驻留(粘着)在内存中。
SGID位对文件共享非常重要。启用SGID位后,你可以强制在一个共享目录下创建的新文件都属于该目录的属组,这个组也就成为了每个用户的属组。
chmod SUID、SGID和粘着位的八进制值
二进制值 |
八进制值 |
描述 |
000 |
0 |
所有位都清零 |
001 |
1 |
粘着位置位 |
010 |
2 |
SGID位置位 |
011 |
3 |
SGID位和粘着位都置位 |
100 |
4 |
SUID位置位 |
101 |
5 |
SUID位和粘着位都置位 |
110 |
6 |
SUID位和SGID位都置位 |
111 |
7 |
所有位都置位 |
用mkdir命令来创建希望共享的目录。chgrp命令将目录的默认属组改为包含所有需要共享文件的用户的组(你必须是该组的成员)。最后,将目录的SGID位置位,以保证目录中新建文件都用shared作为默认属组。