Linux的权限管理

在Linux系统中,权限管理是系统安全与资源控制的基石。无论是个人用户管理自己的文件,还是系统管理员维护多用户服务器,深入理解Linux的权限机制都至关重要。它决定了“谁”可以对“什么”资源执行“哪些”操作。本文将系统性地讲解Linux权限管理的核心概念、基本命令、高级特性以及实战应用,帮助你构建坚实的安全管理能力。

1. 权限基础:用户、组与文件类型

1.1 用户与组

Linux是一个多用户操作系统,每个用户都有一个唯一的用户ID(UID)和对应的用户名。用户可以被分配到一个或多个中,每个组也有唯一的组ID(GID)。这种设计便于对资源进行批量授权管理。

  • root用户:UID为0的超级用户,拥有系统的最高权限。
  • 系统用户:UID通常为1-999,用于运行系统服务,一般不用于登录。
  • 普通用户:UID从1000开始,由管理员创建,用于日常操作。

1.2 文件类型与权限标识

使用 ls -l 命令查看文件详细信息时,第一列显示10个字符,如 -rwxr-xr--

-rwxr-xr--  1 alice developers  4096 May 27 08:30 script.sh
↑ ↑↑↑ ↑↑↑ ↑↑↑
│ │││ │││ │││
│ │││ │││ └── 其他用户的权限 (r--)
│ │││ └─── 所属组的权限 (r-x)
│ └─── 文件所有者的权限 (rwx)
└── 文件类型 (- 表示普通文件)

文件类型标识符:

  • -:普通文件(文本、二进制、图片等)
  • d:目录
  • l:符号链接(软链接)
  • b:块设备文件(如硬盘)
  • c:字符设备文件(如终端)
  • p:命名管道
  • s:套接字文件

2. 传统权限模型:rwx与数字表示

2.1 权限位详解

每个文件或目录都有三组权限,分别对应三类用户:

  1. 所有者权限(user):文件创建者或当前所有者
  2. 所属组权限(group):文件所属用户组的成员
  3. 其他用户权限(others):系统中除所有者和组员外的其他用户

每组权限包含三个位:

  • r(读):对于文件,允许读取内容;对于目录,允许列出目录内容(如 ls
  • w(写):对于文件,允许修改内容;对于目录,允许在目录中创建、删除、重命名文件
  • x(执行):对于文件,允许作为程序执行;对于目录,允许进入该目录(如 cd

2.2 数字表示法(八进制)

每个权限位可以用数字表示:

  • r = 4
  • w = 2
  • x = 1
  • 无权限 = 0

将每组权限的三个数字相加,得到该组的权限值:

  • rwx = 4+2+1 = 7
  • rw- = 4+2+0 = 6
  • r-x = 4+0+1 = 5
  • r-- = 4+0+0 = 4
  • --- = 0+0+0 = 0

因此,rwxr-xr-- 可以表示为 754

  • 所有者:rwx = 7
  • 所属组:r-x = 5
  • 其他用户:r-- = 4

3. 核心权限管理命令

3.1 chmod:修改文件权限

chmod(change mode)命令用于修改文件或目录的权限。

语法:

chmod [选项] 权限模式 文件...

使用数字模式:

# 将script.sh设置为所有者可读写执行,组员可读执行,其他人无权限
chmod 750 script.sh

# 递归修改目录及其下所有文件的权限
chmod -R 755 /var/www/html/

使用符号模式:符号模式更直观,格式为 [用户类别][操作符][权限]

  • 用户类别:u(所有者)、g(组)、o(其他人)、a(所有人)
  • 操作符:+(添加)、-(移除)、=(设置精确权限)
  • 权限:r、w、x
# 为所有者添加执行权限
chmod u+x script.sh

# 为组员移除写权限
chmod g-w document.txt

# 为其他人设置只读权限
chmod o=r config.ini

# 为所有人添加读权限
chmod a+r public_file.txt

# 设置精确权限:所有者读写执行,组员读执行,其他人无权限
chmod u=rwx,g=rx,o= script.sh

3.2 chown:修改文件所有者与组

chown(change owner)命令用于修改文件的所有者和所属组。

语法:

chown [选项] [所有者][:组] 文件...

示例:

# 将file.txt的所有者改为alice
chown alice file.txt

# 将file.txt的所有者和组都改为alice
chown alice:alice file.txt

# 只修改所属组为developers
chown :developers file.txt

# 递归修改目录的所有权
chown -R alice:developers /project/

# 使用UID和GID(当用户名/组名不存在时有用)
chown 1001:1002 file.txt

3.3 chgrp:修改文件所属组

chgrp(change group)是chown的简化版,专门用于修改文件所属组。

# 将file.txt的组改为developers
chgrp developers file.txt

# 递归修改
chgrp -R www-data /var/www/

4. 特殊权限位:SUID、SGID与Sticky Bit

除了基本的rwx权限,Linux还有三个特殊权限位,用于实现更精细的访问控制。

4.1 SUID(Set User ID)

当可执行文件设置了SUID位时,任何用户执行该文件时,都会以文件所有者的身份运行,而不是执行者的身份。

设置与查看:

# 设置SUID(数字模式在最高位加4)
chmod 4755 /usr/bin/passwd
# 或使用符号模式
chmod u+s /usr/bin/passwd

# 查看:所有者执行位变为s(如果原来有x)或S(如果原来无x)
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root 59976 Nov 24  2022 /usr/bin/passwd

典型应用:

  • /usr/bin/passwd:普通用户需要修改/etc/shadow文件(只有root可写),通过SUID以root身份运行
  • /bin/ping:需要原始套接字权限

4.2 SGID(Set Group ID)

对文件:与SUID类似,但以文件所属组的身份运行。对目录:在该目录中创建的新文件,其所属组会自动继承目录的组,而不是创建者的主要组。

设置与查看:

# 设置SGID(数字模式在最高位加2)
chmod 2755 /usr/local/bin/special_cmd
chmod g+s /shared_directory/

# 查看:组执行位变为s或S
ls -ld /shared_directory/
# drwxr-sr-x 2 root developers 4096 May 27 09:00 /shared_directory/

典型应用:

  • 协作目录:多个用户(属于同一组)共享一个目录,确保新建文件属于共享组

4.3 Sticky Bit(粘滞位)

仅对目录有效。设置了Sticky Bit的目录,用户只能删除或重命名自己创建的文件,不能删除其他用户的文件(即使目录有写权限)。

设置与查看:

# 设置Sticky Bit(数字模式在最高位加1)
chmod 1777 /tmp
chmod o+t /shared_upload/

# 查看:其他人执行位变为t或T
ls -ld /tmp
# drwxrwxrwt 15 root root 4096 May 27 09:05 /tmp

典型应用:

  • /tmp目录:所有用户都可读写,但只能删除自己的文件
  • 公共上传目录

5. 默认权限与umask

5.1 文件创建时的默认权限

  • 普通文件:666 (rw-rw-rw-)
  • 目录:777 (rwxrwxrwx)

5.2 umask的作用

umask(user mask)是一个掩码,用于从默认权限中“减去”某些权限,得到文件创建时的实际权限。

查看当前umask:

umask          # 符号表示
umask -S       # 符号表示(更易读)
umask          # 数字表示(常见输出:0022)

umask计算示例:

# 假设umask=022
文件默认权限:666 (rw-rw-rw-)
减去umask:   022 (-----w--w-)
实际权限:    644 (rw-r--r--)

目录默认权限:777 (rwxrwxrwx)
减去umask:   022 (-----w--w-)
实际权限:    755 (rwxr-xr-x)

设置umask:

# 临时设置(仅当前Shell会话有效)
umask 027

# 永久设置:添加到~/.bashrc或/etc/profile
echo "umask 027" >> ~/.bashrc
source ~/.bashrc

常用umask值:

  • 022:文件644,目录755(宽松,默认)
  • 027:文件640,目录750(组内可读,其他人无权限)
  • 077:文件600,目录700(仅所有者可访问,最严格)

6. 访问控制列表(ACL):精细权限控制

传统权限模型只能定义所有者、组和其他人三类用户的权限。ACL(Access Control List)提供了更精细的权限控制,可以为任意用户或组设置权限。

6.1 检查与启用ACL支持

# 检查文件系统是否支持ACL
tune2fs -l /dev/sda1 | grep acl  # 对于ext文件系统

# 挂载时启用ACL(如果未默认启用)
mount -o remount,acl /

# 在/etc/fstab中永久启用
# 添加"acl"到挂载选项
# UUID=xxxx /data ext4 defaults,acl 0 2

6.2 ACL基本命令

getfacl:查看ACL权限

getfacl file.txt
# 输出示例:
# # file: file.txt
# # owner: alice
# # group: developers
# user::rw-
# group::r--
# group:project_team:rwx
# user:bob:r--
# mask::rwx
# other::r--

setfacl:设置ACL权限

# 为用户bob添加读写权限
setfacl -m u:bob:rw file.txt

# 为组project_team添加读执行权限
setfacl -m g:project_team:rx directory/

# 设置默认ACL(对新创建的文件/目录生效)
setfacl -d -m u:charlie:r shared_dir/

# 删除特定ACL条目
setfacl -x u:bob file.txt

# 删除所有ACL条目,恢复传统权限
setfacl -b file.txt

# 递归设置ACL
setfacl -R -m u:david:rwX project/
# 注意:X(大写)表示仅对目录设置执行权限,对文件不设置

6.3 ACL权限掩码(mask)

mask是ACL中的有效权限上限。即使给用户授予了rwx权限,如果mask只有r-x,那么用户实际只有r-x权限。

# 修改mask
setfacl -m m::rx file.txt

7. 实战场景与应用技巧

场景一:Web服务器目录权限配置

# 假设Web根目录为/var/www/html,运行用户为www-data
sudo chown -R www-data:www-data /var/www/html/
sudo chmod -R 755 /var/www/html/

# 确保上传目录可写但安全
sudo mkdir -p /var/www/html/uploads
sudo chown www-data:www-data /var/www/html/uploads
sudo chmod 775 /var/www/html/uploads
# 或使用Sticky Bit确保用户只能删除自己的文件
sudo chmod 1777 /var/www/html/uploads

# 配置文件应只读
sudo chmod 644 /var/www/html/config.php

场景二:团队协作项目目录

# 创建项目目录
sudo mkdir /shared/project
sudo chown root:dev_team /shared/project

# 设置SGID,使新建文件自动继承dev_team组
sudo chmod 2775 /shared/project

# 设置ACL,允许特定用户访问
sudo setfacl -m u:alice:rwx /shared/project
sudo setfacl -m u:bob:rx /shared/project
sudo setfacl -d -m u:alice:rwx /shared/project  # 默认ACL

# 验证
ls -ld /shared/project
# drwxrwsr-x+ 2 root dev_team 4096 May 27 10:00 /shared/project

场景三:安全脚本与SUID

#!/bin/bash
# backup_script.sh - 需要root权限读取所有用户文件

# 1. 创建脚本
cat > /usr/local/bin/backup_all.sh << 'EOF'
#!/bin/bash
# 备份所有用户主目录
BACKUP_DIR="/backups/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
for user in /home/*; do
    if [ -d "$user" ]; then
        tar -czf "$BACKUP_DIR/$(basename $user).tar.gz" "$user"
    fi
done
echo "Backup completed to $BACKUP_DIR"
EOF

# 2. 设置权限(root所有,SUID启用)
sudo chown root:root /usr/local/bin/backup_all.sh
sudo chmod 4750 /usr/local/bin/backup_all.sh  # root可读写执行,组可读执行,其他人无权限

# 3. 现在普通用户也可以运行此脚本进行备份
# (但实际以root身份执行,可以访问所有用户目录)

场景四:调试权限问题

# 1. 查看详细权限
ls -la /path/to/file
stat /path/to/file

# 2. 检查用户和组信息
id username
groups username

# 3. 检查ACL
getfacl /path/to/file

# 4. 使用strace跟踪系统调用
strace -e trace=open,access,stat ls /path/to/file 2>&1 | grep -i denied

# 5. 临时切换用户测试权限
sudo -u otheruser ls /path/to/file

8. 权限管理最佳实践

  1. 最小权限原则:只授予完成工作所必需的最小权限。
  2. 定期审计:使用工具检查异常权限设置:
  3. 使用组进行权限管理:将用户添加到功能组,通过组权限管理资源。
  4. 谨慎使用SUID/SGID:只有绝对必要时才使用,并定期审查。
  5. 合理设置umask:根据环境安全要求配置适当的umask值。
  6. 记录权限变更:重要文件的权限变更应有记录。
  7. 测试权限变更:在生产环境应用前,先在测试环境验证。

9. 高级主题:SELinux与AppArmor

除了传统的DAC(自主访问控制),Linux还提供了更强大的MAC(强制访问控制)系统:

9.1 SELinux(Security-Enhanced Linux)

  • 标签机制:为每个进程和文件分配安全上下文标签
  • 策略驱动:根据策略规则决定访问权限
  • 常用命令

9.2 AppArmor

  • 路径名访问控制:基于路径的访问控制
  • 配置文件:每个受保护程序有单独的配置文件
  • 常用命令

总结

Linux权限管理是一个层次化的安全体系:

  1. 基础层:传统rwx权限与用户/组模型,满足大多数日常需求。
  2. 增强层:特殊权限位(SUI
全部评论

相关推荐

26年2月,我匆匆从LX离职,着急忙慌地入职了某大厂旗下的游戏子公司。加上各类补贴,年薪接近19万。当时觉得总算攀上了一棵大树,心里还暗自庆幸——谁想到,这才是噩梦的开始。入职第一天,我就察觉到了不对劲。我的直属领导是一位年近四十、至今未婚的女性。别的组的大厂员工私下评价她“很努力”——但在这个行业里,“努力”二字有时并不是褒义。我们组的外包人数是全部门最多的,需求排期像一团乱麻,她对需求也是一笔糊涂账,经常前后矛盾、对不清楚。更离谱的是,同一个需求她会分配好几台设备,配置完全一样,而测试本身就需要漫长的游戏时间,跑完一轮还得写测试报告。于是,加班变成了毫无意义的消耗战——不是因为项目紧急,而是因为流程冗余、管理混乱。第一天走进工位,我看到组里那位外包兄弟嘴唇发白,脸上没有一丝血色。我当时还以为他生病了,心里嘀咕了一句“要不要问问他怎么了”。后来在组里呆了大约两个月,我才真正体会到他的痛苦——那种被反复折腾、又无处可说的绝望。有一件事让我彻底寒了心。那天,女领导让我跟着组里一个干了多年的外包一起做一个需求。她原话是:“你跟他一块儿干,他熟悉流程。”我照做了。结果那个外包自己把需求理解错了,从头到尾都没弄清楚到底要测什么。我还没来得及找他确认,吃饭途中就被女领导一个电话叫上去,劈头盖脸训了一顿。更让我憋屈的是,那个外包随后跑到领导面前,反过来告诉我:“以后有什么需求,你要直接问领导,别光跟着我。”——我当时就愣住了:明明是你让我跟着他干,现在出错了,倒成了我的责任?后来,我从上一个子公司离职的小伙伴那里听说,他也曾被这个女领导叫进会议室,当面说了一句让人至今难忘的话:“你连我们组的外包都不如。”听到这话,我反而释然了——原来不是我一个人被这样对待,这就是她的管理方式。两个月,足够看清一个地方。我开始后悔当初的“着急忙慌”,也终于明白,有些坑,不是大厂的名字能填平的。目前,正在积极投递简历,整个测试环境没那么糟糕。但是,只能说都是命,万般不由人。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 15:37
1、这群人晚上&nbsp;11&nbsp;点发朋友圈:"凌晨&nbsp;11&nbsp;点,三环的灯还亮着。"&nbsp;实际下班时间:19:30。2、什么是嘉豪呀?我最近在字节实习,没什么时间上网3、同龄人:学校社团、酒吧蹦迪;我:acm、字节/腾讯实习4、别人朋友圈发:“今天不想上课”;我朋友圈发:“今天的班就上到这里啦”,定位:字节跳动5、别人的朋友圈都是到处旅游的定位,我的朋友圈天天都是“字节定位”,还一定要是在【公司的健身房】里拍张照片,实际只练了10分钟,其中凹造型5分钟6、mentor布置任务的时候,别人都是:”好的收到“,我:”是不是要xxxx,xxxx这么做也可以吧,这个技术方案会不会更好些“7、别人书包里装的:王道408、轻薄本、四六级真题。我书包里面装的:显存24GB4090独显gpu(24小时开机运行,屏幕上贴着“字节/腾讯等贴纸”)、速效救心丸(代码报错用)、电棍(熬夜写代码困了用),就很……你们懂吧8、入职大厂第一件事:发朋友圈、发小红书,晒工牌,985计算机硕|字节实习生|可以接咨询|有偿改简历,9、别人的社交软件简介:25岁|男|希望遇见有趣的灵魂;嘉豪的社交软件简介:25岁|程序员|字节跳动工程师|一张佩戴工牌的自拍照大厂嘉豪标配:1.&nbsp;挂胸前的工牌(地铁里只挂不收,怕你看不见&nbsp;logo)2.&nbsp;降噪耳机(不放音乐也戴着,避免别人跟自己说话)3.&nbsp;印&nbsp;logo&nbsp;的电脑包(字节红&nbsp;/&nbsp;腾讯蓝&nbsp;/&nbsp;阿里橙&nbsp;/&nbsp;美团黄)4.&nbsp;手表(最好显示心率,午饭后必发"步数已破&nbsp;6,000")
牛客30247842...:因为不好进啊要是大厂随便进哪来这么多人装逼
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务