1 Linux用户账号和组账号
- Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
- 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
- 每个用户账号都拥有一个唯一的用户名和各自的口令。p用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
- 实现用户账号的管理,要完成的工作主要有如下几个方面:
- 用户账号的添加、删除与修改
- 用户口令的管理
- 用户组的管理
1.1 用户账号和组账号概述
与 Windows 操作系统相比,Linux操作系统中的用户账号和组账号的作用在本质上是一样的,同样都是基于用户身份来控制对资源的访问,只不过在表现形式及个别细节方面存在一些差异。
1.2 用户账号
在 Linux 操作系统中,根据系统管理的需要将用户账号分为不同的类型,各类型拥有的权限、担任的角色也各不相同。
- 超级用户root
- root 用户是 Linux 操作系统中默认的超级用户账号,对本主机拥有至高无上的权限,类似于Windows操作系统中的 Administrator 用户。
- 只有当进行系统管理、维护任务时,才建议使用root 用户登录系统,日常事务处理建议只使用普通用户账号。
- 普通用户
- 普通用户账号需要由root 用户或其他管理员用户创建,拥有的权限受到一定限制,一般只在用户自己的宿主目录中拥有完整权限。
- 程序用户
- 在安装 Linux 操作系统及部分应用程序时,会添加一些特定的低权限用户账号,这些用户一般不允许登录到系统,而仅用于维持系统或某个程序的正常运行,如 bin、daemon、ftp、mail 等
1.3 组账号
- 基于某种特定联系将多个用户集合在一起,即构成一个用户组,表示该组内所有用户的账号称为组账号。
- 每一个用户账号至少属于一个组,这个组称为该用户的基本组(或私有组);若该用户同时还包含在其他的组中,则这些组称为该用户的附加组(或公共组)。
- 对组账号设置的权限将适用于组内的每一个用户账号。
1.4 UID号
- Linux 操作系统中的每一个用户账号都有一个数字形式的身份标记,称为UID(UserIDentity,用户标识号),对于操作系统核心来说,UID是区分用户的基本依据,原则上每个用户的UID 号应该是唯一的。
- root 用户账号的 UID 号为固定值0,而程序用户账号的 UID号默认为 1~499,500~60000的UID号默认分配给普通用户使用。
1.5 GID号
- 与 UID 类似,每一个组账号也有一个数字形式的身份标记,称为 GID(Group IDentity,组标识号)。
- root 组账号的 GID 号为固定值0,而程序组账号的GID 号默认为 1~499,500~60000的GID号默认分配给普通组使用。
2 Linux用户账号管理
Linux 操作系统中的用户账号、密码等信息均保存在相应的配置文件中,直接修改这些文件或者使用用户管理命令都可以对用户账号进行管理。
2.1 用户账号文件
- 与用户账号相关的配置文件主要有两个,分别是
- /etc/passwd:用于保存用户名称、宿主目录、登录Shell 等基本信息
- /etc/shadow:用于保存用户的密码、账号有效期等信息
- 在这两个配置文件中,每一行对应一个用户账号,不同的配置项之间使用“:”(冒号)进行分隔。
2.1.1 passwd 文件
- 在 passwd 文件开头的部分,包括超级用户root及各程序用户的账号信息,系统中新增加的用户账号信息将保存到 passwd 文件的末尾。
- passwd 文件的每一行内容中包含了七个用“:”(冒号)分隔的配置字段,从左到右各配置字段的含义分别如下所述:
- 第 1 字段:用户账号的名称,也是登录系统时使用的识别名称
- 第 2 字段:经过加密的用户密码字串,或者密码占位符“x”
- 第 3 字段:用户账号的 UID 号
- 第 4 字段:所属基本组账号的GID 号
- 第 5 字段:用户全名,可填写与用户相关的说明信息
- 第 6 字段:宿主目录,即该用户登录后所在的默认工作目录
- 第 7 字段:登录 Shell 等信息,用户完成登录后使用的Shell
2.1.2 shadow文件
- shadow 文件又被称为“影子文件”,其中保存有各用户账号的密码信息,因此对shadow文件的访问应该进行严格限制。
- 默认只有 root 用户能够读取shadow文件中的内容,且不允许直接编辑该文件中的内容。
- shadow 文件的每一行内容中包含了九个用“:”(冒号)分隔的配置字段,从左到右各配置字段的含义分别如下所述:
- 第 1 字段:用户账号名称
- 第 2 字段:使用 SHA-512(哈希算法中的一种)加密的密码字串信息,当为“*”或“!!”时表示此用户不能登录到系统。若该字段内容为空,则该用户无须密码即可登录系统
- 第 3 字段:上次修改密码的时间,表示从 1970 年 01 月 01 日算起到最近一次修改密码时间隔的天数
- 第 4 字段:密码的最短有效天数,自本次修改密码后,必须至少经过该天数才能再次修改密码。默认值为 0,表示不进行限制
- 第 5 字段:密码的最长有效天数,自本次修改密码后,经过该天数以后必须再次修改密码。默认值为99999,表示不进行限制
- 第 6 字段:提前多少天警告用户密码将过期,默认值为 7
- 第 7 字段:在密码过期之后多少天内禁用此用户
- 第 8 字段:账号失效时间,此字段指定了用户作废的天数(从 1970 年01 月01日起计算),默认值为空,表示账号永久可用
- 第 9 字段:保留字段,目前没有特定用途
2.2 添加、修改、删除用户账号
2.2.1 useradd 命令
useradd 命令用于添加用户账号,其如下:
- 基本的命令格式:useradd [选项] 用户名
- 用户名:指定新账号的登录名
- 常用选项:
- -m:如果主目录不存在,则自动创建
- -s Shell文件 指定用户的登录Shell
- -g 用户组 指定用户所属的用户组
- -G 用户组 指定用户所属的附加组
- -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
- -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
- -c comment 指定一段注释性描述。
- -M:不创建用户主目录
- -e:设置用户过期时间
- 示例
# 创建用户
useradd user
# 创建用户,并创建家目录
useradd -m user
# 创建用户,并指定基本组和附加组
useradd -g user1 -G user2 user
# 创建用户,指定登录shell
useradd -s /bin/bash user
# 创建用户设置过期时间
useradd -e 2025-12-31 user
2.2.2 adduser命令
- adduser 命令用于在Linux 系统中添加新用户,并自动创建用户的主目录、设置默认shell、分配UID(用户 ID)、GID(组ID)以及其他必要的账户信息。
- 相比 useradd,adduser 提供了更友好的交互方式,适用于 Debian 系列(如Ubuntu)和部分其他发行版。
- 语法:adduser [选项] <用户名>
- <用户名>:要创建的用户账户名称
- 实例
# 创建用户,并交互式设置密码、用户信息等
adduser user
# 创建系统用户:不分配登录shell,默认禁用密码
adduser --system user
# 创建用户并指定主目录
adduser --home /mnt/user user
# 创建用户但不创建主目录
adduser --no-create-home user
# 创建用户并指定默认shell
adduser --shell /bin/zsh user
# 创建用户但不允许登录
adduser --disabled-login user
# 创建用户并加入额外的用户组
adduser --extra-groups sudo,docker user
2.3 设置/更改用户口令passwd
- 用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。
- 超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。
- 命令格式:passwd [选项] 用户名
- 可使用的选项:
- -l 锁定口令,即禁用账号
- -u 口令解锁
- -d 使账号无口令
- 默认用户名,则修改当前用户的口令。
- 示例
# 修改当前用户密码
passwd
# 修改指定用户密码
passwd user
# 锁定账户
passwd -l user
# 解锁用户
passwd -u user
# 取消口令
passwd -d user
- 注意
- root 用户可以指定用户名作为参数,对指定账号的密码进行管理。
- 普通用户只能执行单独的“passwd”命令修改自己的密码;且需要先输入旧的密码进行验证。
- 对于普通用户自行设置的密码,要求具有一定的复杂性(如不要直接使用英文单词,长度保持在六位以上),否则系统可能拒绝进行设置。
2.4 usermod 命令
usermod 命令用于修改用户账号属性
- 命令格式:usermod [选项] 用户名
- 常用选项
- -g:修改用户的基本组名(或使用 GID 号)
- -G:修改用户的附加组名(或使用 GID 号)
- -a :追加用户的附加组,不改变原本的附加组,和选项G一起使用
- -u:修改用户的 UID 号
- -d:修改用户的宿主目录位置
- -e:修改用户的账户失效时间,可使用 YYYY-MM-DD 的日期格式
- -s:修改用户的登录 Shell
- -l:更改用户账号的登录名称(Login Name)(某些系统可用)
- -L:锁定用户账户
- -U:解锁用户账户
- -C:更改用户的备注信息
- 示例
# 修改用户的基本组
usermod -g groupname username
# 修改用户的附加组
usermod -G groupname username
# 追加用户的附加组
usermod -aG groupname username
2.5 userdel 命令
userdel 命令用于删除用户账号
- 基本格式:userdel [选项] 用户名
- 常用选项
- -r:删除用户的同时删除用户的主目录和邮件spool目录
- -f:强制删除用户,即使用户当前已登录或拥有正在运行的进程
- 示例
# 删除用户
userdel user
# 删除用户及家目录
userdel -r user
# 强制删除
userdel -f user
2.6 组账号管理
- 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。
- 不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
- 每一个用户账号可以是多个组账号的成员,但是其基本组账号只有一个。
2.6.1 常见用户组
- users:普通用户组,新创建的用户默认属于该组
- sudo:该组的成员被授予了使用sudo命令的权限,可以执行需要管理员权限的操作
- shadow:影子口令组,用于管理用户密码的加密和存储
- adm:系统管理员组,成员可以访问系统日志等管理功能
- www-data:Nginx和Apache等Web服务器默认使用的用户组,用于运行Web服务进程,确保Web服务器对文件和目录有适当的访问权限
- audio:音频设备访问组,允许组内用户访问音频设备
- cdrom:光驱访问组,允许组内用户访问光驱设备
- plugdev:允许组内用户使用U盘等可移动设备
- video:视频设备访问组,允许组内用户访问视频设备
2.6.2 特殊用户组wheel和sudo
- Linux中的wheel组是一个特殊的用户组,通常用于给予用户以执行管理任务的权限,这些任务通常需要root权限。
- 在Red Hat及其衍生版本(如CentOS和Fedora)中,wheel组的GID为10。
- 在Ubuntu系统中,默认情况下是没有wheel用户组的。取而代之的是,Ubuntu使用一个名为“sudo”的用户组来实现类似的管理功能。
- sudo组作用
- 权限控制:sudo组的成员被授权可以使用sudo命令来执行需要管理员权限的操作。
- 安全性:通过将用户添加到sudo组,而不是直接以root用户登录,可以减少系统被未授权访问的风险。
2.7 组账号文件
- 组账号相关的配置文件也有两个,分别是/etc/group 和/etc/gshadow。
- 前者用于保存组账号名称、GID号、组成员等基本信息
- 后者用于保存组账号的加密密码字串等信息(但是很少使用到)
- 某一个组账号包含哪些用户成员,将会在group文件内最后一个字段中体现出来(基本组对应的用户账号默认可能不会列出),多个组成员之间使用“,”(逗号)分隔。
2.8 添加、管理、删除组账号
2.8.1 gpasswd命令
- gpasswd 命令——添加、设置、删除组成员
- gpasswd 命令本来是用于设置组账号的密码,但是该功能极少使用,实际上该命令更多地用来管理组账号的用户成员。
- 需要添加、删除成员用户时,可分别使用“-a”和“-d”选项。
- 基本格式:gpasswd [选项] 组名
- 示例
# 向sudo组中添加用户user
gpasswd -a user sudo
# 将sudo组的user用户移除
gpasswd -d user sudo
2.8.1 groupdel命令
- groupdel 命令当系统中的某个组账号已经不再使用时,可以使用 groupdel 命令将该组账号删除。
- 基本格式:groupdel 组名
- 示例
# 删除指定组
groupdel group
2.9 查询账号信息
- 在用户管理工作中,虽然直接查看用户账号、组账号的配置文件也可以查询相关信息,但是并不是很直观。
- 在 Linux 操作系统中,还可以使用几个常用的查询命令工具,如 id、groups、finger、users 等。
2.9.1 groups命令
- groups 命令用于查询用户账号所属的组
- 基本语法:groups [选项] [用户名]
- 示例
# 显示当前用户所属的用户组
groups
# 显示指定用户所属的用户组
groups username
2.9.2 id命令
- id命令用于查询用户账号的身份标识
- 基本格式:id [选项] [用户名]
- 示例
# 查看用户ID 号、组 ID 号,以及所在的附加组ID号
id username
2.9.3 finger命令
- finger 命令用于查询用户账号的登录属性
- 使用 finger 命令可以查询指定的用户账号的登录属性等详细信息,包括登录名称、完整名称、宿主目录、登录 Shell 等。
- 基本格式:finger [选项] [用户名]
- 常用选项
- -l 或 --long:显示用户的详细信息,包括主目录、登录Shell、邮件状态等
- -s 或 --short:显示用户的简要信息,包括登录名、真实姓名、终端和登录时间
- 示例
# finger是一个外部程序需要先安装
apt install finger
finger username
2.9.4 w命令
- 查询当前主机的用户登录情况
- 使用 w 命令可以查询当前主机中的用户登录情况,列出登录账号名称、所在终端、登录时间、来源地点等信息
3 Linux管理目录和文件的属性
- 在 Linux 文件系统的安全模型中,系统中的文件(或目录)具有两个属性:访问权限和文件所有者,简称权限和归属。
- 其中,访问权限包括读取、写入、可执行三种基本类型,归属包括属主(拥有该文件的用户账号)、属组(拥有该文件的组账号)。
- Linux 操作系统根据文件或目录的访问权限、归属来对用户访问数据的过程进行控制。
- 注意:由于 root 用户是系统的超级用户,拥有完全的管理权限,因此在练习相关命令操作时建议不要以root用户作为限制对象,否则可能看不到效果。
3.1 查看目录和文件的属性
- 在 Linux 中可以使用ll 或者ls –l 命令来显示一个文件的属性以及文件所属的用户和组。
- 每个文件的属性由左边第一部分的10个字符(如“drwxr-xr-x ”)来确定。
- 0位:确定文件类型
- 1-3位:确定该文件的所有者对文件的权限owner
- 4-6位:确定所有者的同组用户拥有该文件的权限group
- 7-9位:确定其他用户拥有该文件的权限others
- 第一个字符:代表这个文件的类型,是目录、文件,还是一个链接等等
- [ d ] 目录
- [ - ] 文件
- [ l ] 链接文档(link file)
- [ b ] 可供储存的接口设备(可随机存取装置)
- [ c ] 串行端口设备,例如键盘、鼠标(一次性读取装置)
- 接下来的字符:以三个一组分成三组,用r、w、x三个参数的组合表示
- [ r ] 代表可读(read)
- [ w] 代表可写(write)
- [ x ] 代表可执行(execute)
- [ - ] 没有权限
- 用户只要对目录有写入权限,就可以删除该目录下任何文件或子目录,而不管这些文件或子目录是否属于该用户。
3.2 设置目录和文件的权限
chmod 命令:设置文件或者目录的权限
- 语法:chmod [选项] [ugoa][±=][rwx] file
- 常用选项
- -R:修改目录下所有子目录及文件权限
- 参数说明
- u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o表示其他以外的人,a 表示这三者皆是。
- +表示增加权限、-表示取消权限、=表示唯一设定权限。
- r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
- 在设置针对每一类用户的访问权限时,可以采用两种形式的权限表示方法:
- 符号模式
- 数字形式
3.2.1 符号模式
使用符号模式可以设置多个项目:
- who(用户类型)
- operator(操作符)
- permission(权限)
每个项目的设置可以用逗号隔开。
命令chmod将修改who 指定的用户类型对文件的访问权限,用户类型由一个或者多个字母在who 的位置来说明。
- who的符号模式表
who 用户类型 说明 u user 文件所有者 g group 文件所有者所在的组 o others 其它用户 a all 所有用户,相当于ugo - operator的符号模式表
operator 说明 + 为指定的用户类型增加权限 - 为指定的用户类型去除权限 = 为指定的用户类型设置权限 - permission的符号模式表
permission 名字 说明 r 读 可读权限 w 写 可写权限 x 执行 可执行权限 X 特殊执行权限 只有当文件为目录,或其它类型的用户有可执行权限时,才将文件设置为可执行 - 示例
chmod u+x 1.txt
chmod g-x 1.txt
chmod o=x 1.txt
chmod u=rwx,g=rw,o=r 1.txt
chmod ug=rwx,o=rw 1.txt
chmod a=rw 1.txt
chmod a=rw 1.txt 2.txt
3.2.2 数字模式
- chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。
- 历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。
- 数字权限表
数字 对应符号 权限 二进制 7 rwx 读+写+执行 111 6 rw 读+写 110 5 rx 读+执行 101 4 r 读 100 3 wx 写+执行 011 2 w 写 010 1 x 执行 001 0 - 无 000 - 语法:chmod [num][num][num] file
- 示例
chmod 755 file1
chmod 644 1.txt
chmod -R 775 file1
3.3 设置目录和文件的归属
- 通过chown命令,设置文件或者目录的归属时。可以只设置属主或属组,也可以同时设置属主、属组。
- chown需要超级用户root 的权限才能执行此命令。
- 语法:chown [选项] [user][:group] file
- 常用选项
- -R:处理指定目录以及其子目录下的所有文件
- -c : 显示更改的部分的信息
- -f : 忽略错误信息
- -h :修复符号链接
- -v : 显示详细的处理信息
- 参数说明
- user : 新的文件拥有者的ID或用户名
- group:新的文件所属组的ID或组名
- 同时设置属主、属组时,用户名和组名之间用“:”进行分隔。
- 若只设置属组,则需使用“:组名”的形式。
- 如果只需要设置目录或文件的属主,直接以“用户名”表示归属即可
- 示例
# 只修改属主
chown user1 1.txt
# 只修改属组
chown :user2 1.txt
# 属主和属组都修改
chown user1:user2 file1
# 修改目录下所有文件
chown -R user1:user2 file1
3.4 目录和文件的默认权限
- 在Linux系统中,umask(用户文件创建掩码,UserFile Creation Mask)是一种用于决定新创建文件和目录的默认权限的设置。
- umask定义了文件系统创建文件和目录时默认应该屏蔽掉的权限位。
3.4.1 权限掩码umask
- 工作原理
umask设置了一个默认的权限掩码,这个掩码与文件系统的默认权限组合,决定了新创建文件和目录的实际权限。
文件的默认权限是666(即rw-rw-rw-)
目录的默认权限是777(即rwxrwxrwx) - 计算方式
umask值以八进制表示,每一位分别对应文件的owner、group和其他用户的权限。
umask的每一位取值范围是0到7,数值越小,实际权限越大
新创建文件或目录的权限计算公式为:默认权限 - umask值 - 格式:umask [umask值]
- 直接执行“umask”命令就是查看当前系统的默认权限:0022
- setUid/setGid/粘着位(sticky)、属主权限、组权限、其他用户的权限
- 对umask来说,有效的设定值只有后三位数。在bash中,虽然可带入四位数字,但第一个数字,必须为 0。
- 第一个 0 表示
- 第二个 0 表示用户的权限不受影响
- 第一个 2 表示同组用户的权限不受影响
- 第二个 2 表示其他用户不能写入
- 示例
# 查看当前系统的默认权限
umask
# 临时修改umask值
umask 0044
# 永久修改umask值,
# .bashrc文件只对当前用户有效
echo "0044" >> ~/.bashrc
source ~/.bashrc
# /etc/profile文件对所有用户都有效
echo "0044" >> /etc/profile
source /etc/profile
- umask只影响新创建的文件权限,不会改变已存在文件权限。