Linux系统的权限管理是保障系统安全的重要机制,以下详细讲解权限相关概念及操作指令:
一、基础权限机制
1. 权限的三元组,读(r)、写(w)、执行(x)
每个文件或目录有三组权限,分别对应三类用户:
- 所有者(User):文件/目录的创建者或当前所有者。
- 所属组(Group):文件/目录所属的用户组。
- 其他用户(Others):非所有者且不属于所属组的用户。
每组权限由三个字符组成:r
(读)、w
(写)、x
(执行)。
权限的作用
权限 | 对文件的作用 | 对目录的作用 |
---|---|---|
r |
允许读取文件内容 | 允许列出目录中的文件名(如 ls ) |
w |
允许修改文件内容 | 允许在目录中创建、删除、重命名文件 |
x |
允许执行文件(如脚本或程序) | 允许进入目录并访问子文件(如 cd ) |
示例1 :drwxr-xr--
d
:目录类型。rwx
:所有者拥有读、写、执行权限。r-x
:组用户有读和执行权限。r--
:其他用户仅有读权限。
示例2:
bash
-rwxr-xr-- 1 root dev 1024 Jan 1 10:00 script.sh
- 所有者(root) :拥有
rwx
(读、写、执行)。 - 所属组(dev) :拥有
r-x
(读和执行,不可写)。 - 其他用户 :仅有
r--
(仅读)。
二、权限设置指令
1. chmod
:修改文件/目录权限
-
符号模式(操作对象 + 权限):
bashchmod [用户类别][操作符][权限] 文件
-
用户类别 :
u
(所有者)、g
(组)、o
(其他)、a
(所有)。 -
操作符 :
+
(添加)、-
(移除)、=
(覆盖)。 -
示例 :
bashchmod u+x file # 给所有者添加执行权限 chmod g-w,o=rx dir # 移除组的写权限,设置其他用户为rx chmod a+r file # 所有人添加读权限
-
-
数字模式(三位八进制数):
bashchmod 755 file # 所有者rwx(7),组和其他rx(5)
- 计算方式 :r=4,w=2,x=1,相加得权限值(如
rwx=4+2+1=7
)。
- 计算方式 :r=4,w=2,x=1,相加得权限值(如
2. chown
:修改所有者和所属组
bash
chown 用户:组 文件 # 同时修改所有者和组
chown 用户 文件 # 仅修改所有者
chown :组 文件 # 仅修改所属组
-
示例 :
bashchown root:admin /data # 设置所有者为root,组为admin chown alice file.txt # 设置所有者为alice
-
递归修改 (目录及其子项):
bashchown -R user:group dir/
3. chgrp
:修改所属组
bash
chgrp 组名 文件
- 等效于
chown :组名 文件
,逐渐被chown
替代。
三、特殊权限
1. SUID(Set User ID)
-
作用:执行文件时,以所有者身份运行。
-
设置 :
bashchmod u+s file # 符号模式 chmod 4755 file # 数字模式(4表示SUID)
-
示例 :
/usr/bin/passwd
允许普通用户修改密码(临时获得root权限)。
2. SGID(Set Group ID)
-
作用 :
- 对文件:执行时以所属组身份运行。
- 对目录:新建文件继承目录的所属组。
-
设置 :
bashchmod g+s dir # 符号模式 chmod 2770 dir # 数字模式(2表示SGID)
3. 粘滞位(Sticky Bit)
-
作用 :目录中文件仅所有者可删除(如
/tmp
)。 -
设置 :
bashchmod +t dir # 符号模式 chmod 1777 dir # 数字模式(1表示粘滞位)
四、默认权限与umask
-
umask
:决定新建文件/目录的默认权限。bashumask 022 # 默认设置(目录权限755,文件644) umask -S # 查看当前符号格式的umask
- 计算 :
默认权限 = 最大权限 - umask
- 目录最大权限为
777
,文件为666
(无默认执行权限)。
- 目录最大权限为
- 计算 :
五、ACL(访问控制列表)
提供更细粒度的权限控制(需文件系统支持):
-
setfacl
:设置ACL规则。bashsetfacl -m u:alice:rwx file # 授予alice对文件的rwx权限 setfacl -m g:dev:rx dir # 授予dev组对目录的rx权限
-
getfacl
:查看ACL规则。bashgetfacl file
六、注意事项
- 目录的执行权限 :无
x
权限则无法进入目录或访问子项。 - 递归修改权限 :使用
-R
时谨慎操作,避免开放敏感目录。 - 特殊权限风险:不当的SUID/SGID可能导致提权漏洞。
- root用户:不受普通权限限制,可访问所有文件。
七、示例汇总
-
设置SUID并查看 :
bashchmod u+s /usr/bin/script ls -l /usr/bin/script # 显示 -rwsr-xr-x
-
设置目录SGID :
bashchmod g+s /shared_dir ls -ld /shared_dir # 显示 drwxr-sr-x
通过掌握这些权限机制和指令,可以有效管理Linux系统的文件安全与共享需求。
好的!Linux 的权限机制是系统安全的核心组成部分,其设计目的是控制用户和进程对文件及目录的访问。以下是 权限的机制和作用 的详细解析:
二、特殊权限机制
除了基础权限,Linux 还支持三种特殊权限,用于更复杂的场景。
1. SUID(Set User ID)
-
机制 :当用户执行一个设置了
SUID
的文件时,程序会以文件所有者的身份运行。 -
作用:允许普通用户临时获得文件所有者的权限(常用于需要特权操作的工具)。
-
示例 :
/usr/bin/passwd
(修改密码需要修改/etc/shadow
,普通用户无权限,但passwd
设置了 SUID 并属于 root)。 -
设置方式 :
bashchmod u+s file # 符号模式 chmod 4755 file # 数字模式(4 表示 SUID)
-
显示 :权限中的
x
变为s
(如-rwsr-xr-x
)。
2. SGID(Set Group ID)
-
机制 :
- 对文件:执行时以文件所属组的身份运行。
- 对目录:在目录中新建的文件会继承目录的所属组(而非用户默认的组)。
-
作用 :
- 文件:共享工具以组权限运行(类似 SUID)。
- 目录:便于团队协作(确保新建文件属于同一组)。
-
设置方式 :
bashchmod g+s dir # 符号模式 chmod 2770 dir # 数字模式(2 表示 SGID)
-
显示 :组权限的
x
变为s
(如drwxr-sr-x
)。
3. 粘滞位(Sticky Bit)
-
机制 :设置后,目录中的文件仅允许文件所有者 或 root 删除。
-
作用 :防止用户误删他人文件(常见于共享目录如
/tmp
)。 -
设置方式 :
bashchmod +t dir # 符号模式 chmod 1777 dir # 数字模式(1 表示粘滞位)
-
显示 :其他用户的
x
变为t
(如drwxrwxrwt
)。
三、默认权限与 umask
1. 默认权限规则
- 目录 :默认最大权限为
777
(rwxrwxrwx)。 - 文件 :默认最大权限为
666
(rw-rw-rw-),且默认不赋予执行权限(需手动设置)。
2. umask
的作用
-
机制 :
umask
是一个掩码值,用于从最大权限中"扣除"权限,得到文件/目录的实际默认权限。 -
计算方式 :
bash实际权限 = 最大权限 - umask
-
示例 :
umask 022
:- 目录默认权限:
777 - 022 = 755
(rwxr-xr-x)。 - 文件默认权限:
666 - 022 = 644
(rw-r--r--)。
- 目录默认权限:
-
查看与设置 :
bashumask # 显示当前值(如 0022) umask -S # 显示符号格式(如 u=rwx,g=rx,o=rx) umask 027 # 设置新的 umask 值
四、ACL(访问控制列表)
1. 作用
- 提供更细粒度的权限控制,允许为特定用户/组单独设置权限,突破三元组的限制。
- 典型场景:允许用户A读写文件,同时禁止用户B访问,而无需修改文件所属组。
2. 设置与查看
-
设置 ACL :
bashsetfacl -m u:alice:rwx file # 授予用户 alice 对文件的 rwx 权限 setfacl -m g:dev:r-- dir # 授予组 dev 对目录的读权限
-
查看 ACL :
bashgetfacl file # 输出示例: # user::rw- # user:alice:rwx # group::r-- # mask::rwx # other::r--
五、权限机制的核心原则
- 最小权限原则:用户仅获得完成任务所需的最小权限。
- 继承规则 :
- 新建文件继承目录的所属组(若目录设置 SGID)。
- 权限受
umask
影响。
- 优先级顺序 :
- 用户身份匹配顺序:所有者 > 所属组 > 其他用户。
- root 的超级权限:root 用户可无视权限限制,直接访问或修改任何文件。
六、典型应用场景
1. 共享目录协作
-
目标 :团队(组
dev
)共享目录/project
。 -
设置 :
bashchmod 2770 /project # SGID 确保新建文件继承组 dev chown root:dev /project # 所有者 root,组 dev
-
效果 :所有组成员可在目录中创建文件,且文件自动属于组
dev
。
2. 防止误删文件
-
目标 :共享目录
/shared
允许用户创建文件,但仅允许所有者删除。 -
设置 :
bashchmod 1777 /shared # 粘滞位生效
3. 特权工具
-
目标 :允许普通用户执行需 root 权限的命令(如
ping
)。 -
设置 :
bashchmod u+s /bin/ping # SUID 使 ping 以 root 身份运行
七、注意事项
- SUID/SGID 风险:若程序存在漏洞,攻击者可能利用 SUID/SGID 提权。
- 目录的执行权限 :无
x
权限的目录无法被访问(即使有r
)。 - 递归修改权限 :使用
chmod -R
时需谨慎,避免过度开放敏感目录。
补充
dialout用户组
在 Linux 系统中,dialout
用户组是一个与串行端口(Serial Port)访问权限 相关的特殊用户组。它的存在主要是为了管理用户对串口设备(如 /dev/ttyS0
、/dev/ttyUSB0
等)的访问权限。
1. 作用与背景
- 历史背景:名称 "dialout" 源于早期通过调制解调器(Modem)"拨号"(dial-out)上网的时代。该用户组允许普通用户直接操作调制解调器等串口设备。
- 现代用途 :如今,
dialout
组主要用于控制对串行端口设备 的访问权限,例如:- 物理串口(如
/dev/ttyS0
)。 - USB 转串口设备(如
/dev/ttyUSB0
)。 - 嵌入式开发板(如 Arduino、树莓派)的通信接口。
- 物理串口(如
2. 权限管理
-
设备文件权限 :串口设备的默认权限通常为
crw-rw----
,所有者是root
,所属组是dialout
:bash$ ls -l /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 0 Jun 10 15:30 /dev/ttyUSB0
- 只有
root
用户和dialout
组成员有读写权限。
- 只有
-
为何需要加入该组 :普通用户若未加入
dialout
组,访问串口时会报错Permission denied
。
crw-rw----解释
-
c:表示这是一个 字符设备文件(Character Device)。
-
字符设备以流式数据传输为特征(如键盘、串口、终端),与块设备(如硬盘,标识为 b)不同。
-
例如:/dev/ttyS0(串口)、/dev/ttyUSB0(USB转串口)等。
-
bash
c rw- rw- ---
│ │ │ │
│ │ │ └─ 其他人(others)的权限:无权限(`---`)
│ │ └─ 所属组(group)的权限:读 + 写(`rw-`)
│ └─ 所有者(owner)的权限:读 + 写(`rw-`)
└─ 文件类型标识符:字符设备文件(`c`)
3. 将用户添加到 dialout 组
-
命令 :
bashsudo usermod -aG dialout 你的用户名
或
bashsudo gpasswd -a 你的用户名 dialout
-
生效方式:注销后重新登录,或重启系统。
4. 安全注意事项
- 最小权限原则:仅将需要访问串口的用户加入该组,避免不必要的权限分配。
- 潜在风险:串口设备可能连接敏感硬件(如工业控制器),不当操作可能导致系统不稳定或数据泄露。
5. 替代方案
-
临时权限 :使用
sudo
临时获取 root 权限访问设备(不推荐长期使用):bashsudo minicom -D /dev/ttyUSB0
-
udev 规则 :通过自定义 udev 规则永久修改设备权限(更安全且灵活):
-
创建规则文件
/etc/udev/rules.d/99-serial.rules
:SUBSYSTEM=="tty", ATTRS{idVendor}=="abcd", ATTRS{idProduct}=="1234", GROUP="users", MODE="0666"
-
重新加载 udev 规则:
bashsudo udevadm control --reload-rules
-
6. 不同发行版的差异
-
Ubuntu/Debian :默认使用
dialout
组管理串口。 -
Arch Linux :可能使用
uucp
或lock
组。 -
检查当前系统 :查看设备文件的所属组:
bashls -l /dev/ttyUSB0
7. 常见使用场景
- 嵌入式开发:通过串口与开发板通信(如 Arduino 上传程序)。
- 工业设备调试:连接 PLC、传感器等设备的串口。
- 网络设备配置:通过 Console 线管理路由器、交换机。
总结
dialout
用户组是 Linux 中管理串口设备访问权限的关键组。通过合理分配组成员或使用 udev 规则,可以在便利性和安全性之间找到平衡。处理硬件设备时,请始终遵循最小权限原则。