Linux账——号与权限管理(四)

账号与权限管理


前言

Linux作为多用户操作系统的典范,其强大的账号与权限管理机制是系统安全的基石。通过精细的用户划分和权限控制,既能保障系统资源的安全隔离,又能实现高效的协同工作。掌握用户管理、组策略配置及文件权限设置,不仅是系统管理员的核心技能,更是构建安全、稳定IT环境的必备知识。本文将从基础概念到实践操作,系统介绍Linux账号与权限管理的完整体系。

一、用户管理

1. 用户账号和组账号概述

Linux系统中的三类用户角色:超级用户、普通用户和程序用户。

  • 超级用户,也称为root用户,是系统的最高管理者,拥有无限的权限。其UID为0,可以执行任何操作,包括修改系统核心文件、管理所有用户账户、安装卸载软件等。由于权限过大,日常操作中应避免直接使用root账户,仅在进行系统管理时临时切换,以防止误操作导致系统故障。
  • 普通用户是由管理员创建的日常操作账户,权限受到严格限制。其UID从1000开始,只能完整操作自己的家目录,可以查看但无法修改系统文件和其他用户的私有文件。这类账户用于运行一般应用程序、处理个人文档等常规任务,是保障系统安全的基础,遵循了“最小权限”的安全原则。
  • 程序用户是系统或应用程序专用的特殊账户,主要用于运行后台服务、守护进程等非交互式任务。其UID范围为1-999,通常被设置为禁止登录系统。例如MySQL、Nginx等服务都有对应的程序用户,通过权限隔离来提高系统的安全性,防止服务被入侵后危及整个系统。
角色UID范围(CentOS 7)说明
超级用户0root,拥有全部权限
普通用户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) 表示他的基本组zhangsangroups= 后列出的是他所有的组,目前只有基本组。
    将用户加入附加组**

    # 将 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 是他的基本组,后面的 wheelftpusers 就是他的附加组

  • 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
  1. 用户名:登录标识

    • 例:root, zhangsan
  2. 密码占位符:历史遗留字段,现固定为 x

    • 重要:真实密码存储在 /etc/shadow,删除 x 将导致无需密码即可登录
  3. UID:用户身份唯一标识

    • 0=超级用户,1-999=程序用户,1000+=普通用户
  4. GID:基本组标识

    • 对应 /etc/group 中的组ID
  5. 描述:用户全名或备注信息

    • 例:张三是新员工
  6. 家目录:用户初始工作目录

    • 例:/root, /home/zhangsan
  7. 登录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.权限的数字表示法

权限可以用三位八进制数字表示:

权限字符表示数字值
r4
w2
执行x1

权限计算示例:

  • rwx = 4+2+1 = 7
  • rw- = 4+2+0 = 6
  • r-x = 4+0+1 = 5
  • r-- = 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系统管理员的必备技能。正确的权限配置不仅能保障系统安全,更能提升运维效率,为构建稳定可靠的系统环境奠定坚实基础。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值