账号与权限管理
前言
Linux作为多用户操作系统的典范,其强大的账号与权限管理机制是系统安全的基石。通过精细的用户划分和权限控制,既能保障系统资源的安全隔离,又能实现高效的协同工作。掌握用户管理、组策略配置及文件权限设置,不仅是系统管理员的核心技能,更是构建安全、稳定IT环境的必备知识。本文将从基础概念到实践操作,系统介绍Linux账号与权限管理的完整体系。
一、用户管理
1. 用户账号和组账号概述
Linux系统中的三类用户角色:超级用户、普通用户和程序用户。
- 超级用户,也称为root用户,是系统的最高管理者,拥有无限的权限。其UID为0,可以执行任何操作,包括修改系统核心文件、管理所有用户账户、安装卸载软件等。由于权限过大,日常操作中应避免直接使用root账户,仅在进行系统管理时临时切换,以防止误操作导致系统故障。
- 普通用户是由管理员创建的日常操作账户,权限受到严格限制。其UID从1000开始,只能完整操作自己的家目录,可以查看但无法修改系统文件和其他用户的私有文件。这类账户用于运行一般应用程序、处理个人文档等常规任务,是保障系统安全的基础,遵循了“最小权限”的安全原则。
- 程序用户是系统或应用程序专用的特殊账户,主要用于运行后台服务、守护进程等非交互式任务。其UID范围为1-999,通常被设置为禁止登录系统。例如MySQL、Nginx等服务都有对应的程序用户,通过权限隔离来提高系统的安全性,防止服务被入侵后危及整个系统。
| 角色 | UID范围(CentOS 7) | 说明 |
|---|---|---|
| 超级用户 | 0 | root,拥有全部权限 |
| 普通用户 | 1000+ | 受限权限,仅对家目录有完全控制 |
| 程序用户 | 1–999 | 用于运行服务,不可登录系统 |
2.组账号的分类
Linux 系统通过将用户分配到不同的组来实现权限的管理。每个用户至少属于一个组,这个组是用
户的基本组(或私有组)。用户还可以属于多个附加组,用于共享文件和服务。
-
基本组,也称为主组或私有组,是用户创建时自动归属的默认组。每个用户有且仅有一个基本组,通常与用户名同名。当用户创建文件时,该文件的默认属组就是用户的基本组,它决定了用户新建对象的初始权限归属。
-
附加组,也称为补充组,是用户除基本组外额外加入的组。一个用户可以属于零个或多个附加组。其主要目的是为了方便地授予用户额外的权限,例如,将用户加入
wheel组以获得sudo权限,或加入ftpusers组以访问FTP服务,从而实现灵活的权限共享与管理。
创建用户并查看初始状态# 创建用户 zhangsan,系统会同时创建同名的基本组 [root@server ~]# useradd zhangsan # 使用 id 命令查看用户所属组 [root@server ~]# id zhangsan uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan)输出解读:
gid=1001(zhangsan)表示他的基本组是zhangsan。groups=后列出的是他所有的组,目前只有基本组。
将用户加入附加组**# 将 zhangsan 加入到 wheel 组(使其能使用sudo)和 ftpusers 组 [root@server ~]# usermod -aG wheel,ftpusers zhangsan # 再次查看用户所属组 [root@server ~]# id zhangsan uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan),10(wheel),300(ftpusers)输出解读:现在
groups=后面列出了三个组。第一个zhangsan是他的基本组,后面的wheel和ftpusers就是他的附加组。 -
UID:即每个用户的身份标示,类似于每个人的身份证号码.
系统用户 UID:1-999(centos7 版本) 1-499(centos6 版本) -
GID 是每个用户组的唯一标识符。每个用户都属于至少一个组,该组的 GID 用来标识该组。用户
组用于管理一组具有相同权限的用户,文件和目录的访问权限通常由文件的 GID 来决定。
系统组:1-499(CentOS6), 1-999(CENTOS7)
普通组:500+(CentOS6), 1000+(CENTOS7)
3.用户账号文件详解
核心文件:/etc/passwd
- 权限:所有用户可读,仅root可写
- 格式:每行7个字段,用冒号分隔:
用户名:密码占位符:UID:GID:描述:家目录:登录Shell
字段说明与实例
# 查看示例
[root@server ~]# grep -E "^(root|zhangsan):" /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1001:1001:张三是新员工:/home/zhangsan:/bin/bash
-
用户名:登录标识
- 例:
root,zhangsan
- 例:
-
密码占位符:历史遗留字段,现固定为
x- 重要:真实密码存储在
/etc/shadow,删除x将导致无需密码即可登录
- 重要:真实密码存储在
-
UID:用户身份唯一标识
0=超级用户,1-999=程序用户,1000+=普通用户
-
GID:基本组标识
- 对应
/etc/group中的组ID
- 对应
-
描述:用户全名或备注信息
- 例:
张三是新员工
- 例:
-
家目录:用户初始工作目录
- 例:
/root,/home/zhangsan
- 例:
-
登录Shell:默认命令解释器
/bin/bash=可登录,/sbin/nologin=禁止登录(程序用户专用)
相关命令
cat /etc/passwd # 查看所有用户
grep zhangsan /etc/passwd # 查找特定用户
getent passwd $USER # 查看当前用户信息
wc -l /etc/passwd # 统计用户数量
4. 添加用户账号 (useradd)
基本语法:useradd [选项] 用户名
常用选项:
-u:指定UID-d:指定家目录路径-g:指定基本组-G:指定附加组(多个组用逗号分隔)-s:指定登录Shell-M:不创建家目录-e:设置账户过期时间(YYYY-MM-DD)
应用示例:
# 创建普通用户
useradd zhangsan
# 创建系统用户(不创建家目录,指定Shell为nologin)
useradd -r -M -s /sbin/nologin mysql
# 创建完整信息的用户
useradd -u 1500 -d /opt/lisi -g users -G wheel,ftp -s /bin/bash lisi
# 验证创建结果
id zhangsan
tail -1 /etc/passwd
ls /home
5.设置/修改用户口令 (passwd)
基本语法:passwd [选项] [用户名]
| 选项 | 功能说明 |
|---|---|
--stdin | 从标准输入读取密码(用于脚本) |
-l | 锁定用户账户 |
-u | 解锁用户账户 |
-d | 清空用户密码 |
-S | 显示账户状态信息 |
应用示例:
# 交互式设置密码
passwd zhangsan
# 非交互式设置密码(用于脚本)
echo "123456" | passwd --stdin zhangsan
# 账户状态管理
passwd -l zhangsan # 锁定账户
passwd -S zhangsan # 查看状态
passwd -u zhangsan # 解锁账户
6.删除用户账号 (userdel)
基本语法:userdel [-r] 用户名
选项说明:
- 无选项:仅删除用户,保留家目录
-r:同时删除家目录和邮件池
应用示例:
# 删除用户但保留家目录
userdel zhangsan
ls -ld /home/zhangsan # 目录仍然存在
# 彻底删除用户及相关文件
userdel -r lisi
ls -ld /home/lisi # 目录已被删除
7. 用户账号的初始配置文件
配置文件来源:新建用户时,系统自动从 /etc/skel 模板目录复制文件到用户家目录。
主要配置文件:
| 配置文件 | 作用时机 | 主要功能 |
|---|---|---|
~/.bash_profile | 用户登录时执行 | 设置环境变量、启动程序 |
~/.bashrc | 每次启动bash时执行 | 设置别名、函数、局部变量 |
~/.bash_logout | 用户退出登录时执行 | 清理临时文件、记录日志 |
配置示例:
# 查看模板目录内容
ls -la /etc/skel/
# 查看具体用户的配置文件
ls -la /home/zhangsan/
# 立即生效配置文件
source ~/.bashrc
# 或
. ~/.bashrc
全局配置文件(影响所有用户):
/etc/bashrc:系统级bash配置/etc/profile:系统级环境配置
应用示例:
# 为所有用户设置命令别名
echo "alias ll='ls -lhtr'" >> /etc/bashrc
# 立即生效全局配置
source /etc/bashrc
# 测试别名
ll /home
配置读取顺序:用户登录 → 读取 /etc/profile → 读取 ~/.bash_profile → 调用 ~/.bashrc → 调用 /etc/bashrc
二、组管理
1.组管理详细解释
1.1组账号文件理解
组信息存储文件:
/etc/group- 存储所有组的基本信息/etc/gshadow- 存储组密码(很少使用)
查看组文件内容:
# 查看组文件的最后几行,了解格式
[root@server ~]# tail -3 /etc/group
wheel:x:10:
docker:x:981:
zhangsan:x:1001:
# 格式说明:组名:密码占位符:GID:组成员列表
搜索特定组信息:
# 查找wheel组的信息
[root@server ~]# grep "^wheel" /etc/group
wheel:x:10:
# 查找包含zhangsan用户的组
[root@server ~]# grep "zhangsan" /etc/group
zhangsan:x:1001:
2. 创建新组 (groupadd命令)
命令语法:groupadd [-g GID] 组名
实际操作演示:
# 1. 创建一个名为developers的普通组
[root@server ~]# groupadd developers
[root@server ~]# grep "developers" /etc/group
developers:x:2001:
# 2. 创建指定GID为3000的admins组
[root@server ~]# groupadd -g 3000 admins
[root@server ~]# grep "admins" /etc/group
admins:x:3000:
# 3. 查看所有新创建的组
[root@server ~]# tail -5 /etc/group
wheel:x:10:
zhangsan:x:1001:
developers:x:2001:
admins:x:3000:
3. 删除组 (groupdel命令)
命令语法:groupdel 组名
删除操作演示:
# 1. 删除刚才创建的developers组
[root@server ~]# groupdel developers
[root@server ~]# grep "developers" /etc/group
# 没有输出,说明组已删除
# 2. 尝试删除用户的基本组(会失败)
[root@server ~]# groupdel zhangsan
groupdel: cannot remove the primary group of user 'zhangsan'
# 3. 删除admins组
[root@server ~]# groupdel admins
4. 管理组成员
创建测试环境:
# 先创建需要的组和用户
[root@server ~]# groupadd developers
[root@server ~]# groupadd testers
[root@server ~]# useradd zhangsan
[root@server ~]# useradd lisi
[root@server ~]# useradd wangwu
使用gpasswd命令(推荐)
# 添加用户到组(不会影响用户已有的其他组)
[root@server ~]# gpasswd -a zhangsan developers
Adding user zhangsan to group developers
[root@server ~]# gpasswd -a lisi developers
Adding user lisi to group developers
[root@server ~]# gpasswd -a lisi testers
Adding user lisi to group testers
# 查看添加结果
[root@server ~]# grep "^developers" /etc/group
developers:x:2001:zhangsan,lisi
[root@server ~]# grep "^testers" /etc/group
testers:x:2002:lisi
使用usermod命令(谨慎使用)
# 添加wangwu到developers组(使用-aG参数,不会覆盖原有组)
[root@server ~]# usermod -aG developers wangwu
# 查看结果
[root@server ~]# grep "^developers" /etc/group
developers:x:2001:zhangsan,lisi,wangwu
从组中移除用户:
# 从developers组中移除wangwu
[root@server ~]# gpasswd -d wangwu developers
Removing user wangwu from group developers
# 验证移除结果
[root@server ~]# grep "^developers" /etc/group
developers:x:2001:zhangsan,lisi
5.查看组和用户关系
查看用户属于哪些组:
# 查看lisi用户的所有组
[root@server ~]# groups lisi
lisi : lisi developers testers
# 使用id命令查看更详细的信息
[root@server ~]# id lisi
uid=1002(lisi) gid=1002(lisi) groups=1002(lisi),2001(developers),2002(testers)
# 查看zhangsan用户的组信息
[root@server ~]# id zhangsan
uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan),2001(developers)
查看组中有哪些用户:
# 查看developers组的所有成员
[root@server ~]# grep "^developers" /etc/group
developers:x:2001:zhangsan,lisi
# 查看testers组的所有成员
[root@server ~]# grep "^testers" /etc/group
testers:x:2002:lisi
完整工作流程示例
# 完整演示:从创建到删除的完整流程
echo "=== 步骤1: 创建组和用户 ==="
[root@server ~]# groupadd -g 5001 sales
[root@server ~]# groupadd -g 5002 marketing
[root@server ~]# useradd user1
[root@server ~]# useradd user2
echo "=== 步骤2: 添加用户到组 ==="
[root@server ~]# gpasswd -a user1 sales
[root@server ~]# gpasswd -a user2 sales
[root@server ~]# gpasswd -a user1 marketing
echo "=== 步骤3: 验证组成员关系 ==="
[root@server ~]# echo "sales组成员:"; grep "^sales" /etc/group
[root@server ~]# echo "marketing组成员:"; grep "^marketing" /etc/group
[root@server ~]# echo "user1的组:"; groups user1
[root@server ~]# echo "user2的组:"; groups user2
echo "=== 步骤4: 清理 ==="
[root@server ~]# gpasswd -d user1 sales
[root@server ~]# gpasswd -d user2 sales
[root@server ~]# gpasswd -d user1 marketing
[root@server ~]# groupdel sales
[root@server ~]# groupdel marketing
[root@server ~]# userdel -r user1
[root@server ~]# userdel -r user2
重要提醒:
- 创建组:
groupadd 组名 - 删除组:
groupdel 组名(确保组内无用户) - 添加用户到组:
gpasswd -a 用户名 组名或usermod -aG 组名 用户名 - 从组移除用户:
gpasswd -d 用户名 组名 - 查看用户组:
groups 用户名或id 用户名 - 查看组成员:
grep "^组名" /etc/group
三、 查询账号信息命令详解
1. groups 命令 - 查询用户所属的组
命令语法:groups [用户名]
功能:显示用户所属的所有组
使用示例:
# 查看当前用户所属的组
[root@server ~]# groups
root
# 查看指定用户所属的组
[root@server ~]# groups zhangsan
zhangsan : zhangsan developers
# 查看多个用户的组信息
[root@server ~]# groups zhangsan lisi
zhangsan : zhangsan developers
lisi : lisi developers testers
输出说明:第一个组是用户的基本组,后面的是附加组
2 id 命令 - 查询用户身份标识
命令语法:id [用户名]
功能:显示用户的UID、GID和所有组信息
使用示例:
# 查看当前用户身份信息
[root@server ~]# id
uid=0(root) gid=0(root) groups=0(root)
# 查看指定用户身份信息
[root@server ~]# id zhangsan
uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan),2001(developers)
# 查看lisi用户信息(属于多个组)
[root@server ~]# id lisi
uid=1002(lisi) gid=1002(lisi) groups=1002(lisi),2001(developers),2002(testers)
# 只显示用户UID
[root@server ~]# id -u zhangsan
1001
# 只显示基本组GID
[root@server ~]# id -g lisi
1002
# 显示所有组的GID
[root@server ~]# id -G lisi
1002 2001 2002
3 .finger 命令 - 查询用户详细信息(需安装)
安装命令:
# CentOS/RHEL 系统安装finger
[root@server ~]# yum install -y finger
# Ubuntu/Debian 系统安装
# apt-get install -y finger
命令语法:finger [用户名]
功能:显示用户的详细信息,包括登录时间、家目录、Shell等
使用示例:
# 查看当前用户信息
[root@server ~]# finger root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Wed May 22 10:30 (CST) on pts/0 from 192.168.1.100
No mail.
No Plan.
# 查看指定用户信息
[root@server ~]# finger zhangsan
Login: zhangsan Name: Zhang San
Directory: /home/zhangsan Shell: /bin/bash
Never logged in.
No mail.
No Plan.
# 查看所有已登录用户信息
[root@server ~]# finger
Login Name Tty Idle Login Time Office Office Phone
root root pts/0 May 22 10:30 (192.168.1.100)
4. 系统登录用户查询命令w 命令 - 显示已登录用户及活动
命令语法:w [选项]
功能:显示当前登录用户及其正在执行的进程
使用示例:
[root@server ~]# w
10:35:15 up 2:30, 2 users, load average: 0.05, 0.10, 0.15
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.1.100 10:30 5.00s 0.10s 0.02s w
zhangsan pts/1 192.168.1.101 10:32 1:30 0.05s 0.01s vim file.txt
输出字段说明:
USER:登录用户名TTY:终端类型(pts/0表示远程连接,tty1表示本地控制台)FROM:登录来源IP地址LOGIN@:登录时间IDLE:空闲时间JCPU:该终端所有进程占用CPU时间PCPU:当前进程占用CPU时间WHAT:用户当前执行的命令
who 命令 - 显示已登录用户
命令语法:who [选项]
功能:显示当前登录系统的用户信息
使用示例:
[root@server ~]# who
root pts/0 2024-05-22 10:30 (192.168.1.100)
zhangsan pts/1 2024-05-22 10:32 (192.168.1.101)
# 显示更详细的信息
[root@server ~]# who -Hu
NAME LINE TIME IDLE PID COMMENT
root pts/0 May 22 10:30 . 1234 (192.168.1.100)
zhangsan pts/1 May 22 10:32 01:30 5678 (192.168.1.101)
users 命令 - 显示登录用户名
命令语法:users
功能:简洁地显示当前登录系统的用户名
使用示例:
[root@server ~]# users
root zhangsan
# 结合其他命令使用
[root@server ~]# users | wc -w
2
四、su命令切换用户
su命令用于在Linux系统中切换用户身份。其基本格式为su - 目标用户,其中连字符-代表完全切换,它会将工作环境、目录及变量都切换到目标用户的配置,如同该用户重新登录一样。若省略-,则仅切换用户身份,但保持当前的工作目录和环境变量不变。
切换时的密码验证规则很简单:从root用户切换到任何其他用户都无需密码,拥有最高权限;而从普通用户切换到其他用户(包括root)时,则必须输入目标用户的密码进行验证。这种机制既保证了系统管理的灵活性,又确保了操作的安全性。
#从zhangsan切换到root
[zhangsan@server ~]$ su - root
密码:xxx
# 从root用户切换到普通用户zhangsan(无需密码)
[root@server ~]# su - zhangsan
[zhangsan@server ~]$ # 环境已完全切换至zhangsan用户
五、文件权限
Linux系统中每个文件和目录都有三组权限,分别对应三种用户身份
三种权限类型:
- r(读取):允许查看文件内容、列出目录内容
- w(写入):允许修改文件内容、在目录中创建/删除文件
- x(执行):允许执行程序、允许进入目录
- 三种用户身份:
- 属主(user):文件的所有者
- 属组(group):文件所属组的成员
- 其他用户(other):既不是属主也不在属组的其他用户
使用 ls -l 命令查看详细权限信息:
# 查看文件权限详情
[root@server ~]# ls -l install.log
-rw-r--r--. 1 root root 34298 Apr 2 00:23 install.log
# 查看目录权限详情
[root@server ~]# ls -ld /home/zhangsan
drwxr-xr-x. 2 zhangsan zhangsan 4096 May 22 10:00 /home/zhangsan
权限字段解析

第一位文件类型标识:
-:普通文件d:目录l:符号链接b:块设备文件c:字符设备文件
1.权限的数字表示法
权限可以用三位八进制数字表示:
| 权限 | 字符表示 | 数字值 |
|---|---|---|
| 读 | r | 4 |
| 写 | w | 2 |
| 执行 | x | 1 |
权限计算示例:
rwx= 4+2+1 = 7rw-= 4+2+0 = 6r-x= 4+0+1 = 5r--= 4+0+0 = 4
# 常见权限组合:
rw-r--r-- = 644
rwxr-xr-x = 755
rwx------ = 700
2. 设置文件权限 (chmod命令)
数字方式设置权限:
# 将文件设置为属主可读写,属组和其他用户只读
[root@server ~]# chmod 644 file.txt
# 将目录设置为属主有全部权限,属组和其他用户可读和执行
[root@server ~]# chmod 755 mydir/
# 递归设置目录及其内容权限
[root@server ~]# chmod -R 755 /home/zhangsan/
符号方式设置权限:
# 为属主添加执行权限
[root@server ~]# chmod u+x script.sh
# 为属组添加写权限
[root@server ~]# chmod g+w file.txt
# 移除其他用户的读权限
[root@server ~]# chmod o-r document.txt
# 设置特定权限组合
[root@server ~]# chmod u=rwx,g=rx,o= mydir/
3. 设置文件归属 (chown命令)
# 更改文件属主
[root@server ~]# chown zhangsan file.txt
# 更改文件属组
[root@server ~]# chown :developers file.txt
# 同时更改属主和属组
[root@server ~]# chown zhangsan:developers file.txt
# 递归更改目录归属
[root@server ~]# chown -R zhangsan:developers /project/
4. 权限实践示例
# 创建测试文件并查看初始权限
[root@server ~]# touch testfile
[root@server ~]# ls -l testfile
-rw-r--r--. 1 root root 0 May 22 11:00 testfile
# 添加执行权限(数字方式)
[root@server ~]# chmod 755 testfile
[root@server ~]# ls -l testfile
-rwxr-xr-x. 1 root root 0 May 22 11:00 testfile
# 移除组和其他的执行权限(符号方式)
[root@server ~]# chmod go-x testfile
[root@server ~]# ls -l testfile
-rwxr--r--. 1 root root 0 May 22 11:00 testfile
# 更改文件归属
[root@server ~]# chown zhangsan:developers testfile
[root@server ~]# ls -l testfile
-rwxr--r--. 1 zhangsan developers 0 May 22 11:00 testfile
建议:
- 普通文件通常设置为 644 或 755
- 目录通常设置为 755
- 敏感文件设置为 600(仅属主可读写)
- 脚本文件需要执行权限(添加 x 权限)
总结
Linux账号与权限管理是系统安全的核心基石。通过用户与组的精细划分、权限的精确控制,实现了多用户环境下的资源隔离与安全共享。从用户创建、密码管理到组权限分配,从身份切换再到文件权限设置,这一整套机制确保了"最小权限原则"的落实。掌握用户与组的关系、理解权限数字表示法、熟练使用相关管理命令,是每一个Linux系统管理员的必备技能。正确的权限配置不仅能保障系统安全,更能提升运维效率,为构建稳定可靠的系统环境奠定坚实基础。
3314

被折叠的 条评论
为什么被折叠?



