目录
关于sudo提权——visudo或vim /etc/sudoers
权限掩码
umask
是一个在 Unix 和 Linux 系统中用于设置权限掩码的命令或环境变量。它决定了新创建的文件和目录的默认权限,通过限制默认权限,确保系统安全。权限掩码通过减法方式工作,定义哪些权限不能赋予新创建的文件和目录。
umask
的作用
- 限制默认权限:
umask
规定了新文件和目录的权限范围,通过减法方式限制权限。 - 确保安全:通过减少默认权限,
umask
有助于防止过度赋权,确保文件和目录的安全。
如何查看 umask
要查看当前的权限掩码,使用 umask
命令:
[root@localhost dev-shell]# umask
0022
[root@localhost dev-shell]# su -l lzz
上一次登录:六 4月 27 00:32:53 CST 2024pts/2 上
[lzz@localhost ~]$ umask
0002
输出结果是一个八进制值,表示权限掩码。例如,如果 umask
的输出是 0022
,这意味着新创建的文件和目录的默认权限将受到掩码的限制,即用默认权限减去当前用户的umask,就可以得到创建的文件或者目录的权限数字。
umask
的工作原理
umask
使用八进制数来定义权限掩码。它的值决定了新创建的文件和目录的默认权限。以下是 umask
与文件/目录权限的关系:
- 文件的权限:
0666
是文件的默认权限,因此umask
的值会从0666
中减去,决定最终权限。 - 目录的权限:
0777
是目录的默认权限,同样,umask
的值会从0777
中减去。
例如,umask
为 0022
时,意味着:
- 文件的最终权限将是
0666 - 0022 = 0644
,即所有者可以读写,其他人只能读取。 - 目录的最终权限将是
0777 - 0022 = 0755
,即所有者可以读、写、执行,其他人和组可以读、执行。
设置全局 umask
在全局配置文件中设置 umask
,影响所有用户和进程:
- 对于 Bash Shell,可以在
/etc/profile
或/etc/bash.bashrc
中设置。 - 对于系统服务,可以在
/etc/init.d/
或其他服务启动脚本中设置。
设置用户级 umask
在用户级配置文件中设置 umask
,只影响当前用户:
- 在用户的
~/.bashrc
或~/.profile
中设置。
或使用命令
# 为当前用户设置 umask 为 0022
[root@localhost dev-shell]# su -l lzz
上一次登录:六 4月 27 00:32:53 CST 2024pts/2 上
[lzz@localhost ~]$ umask
0002
[lzz@localhost ~]$ umask 022
[lzz@localhost ~]$ umask
0022
特殊权限的类型:
suid
、sgid
和 sticky bit
是传统 Unix/Linux 文件系统中的特殊权限位。
1. suid
(Set User ID)
它允许可执行文件以文件所有者的身份运行,常用于系统工具。
常见用途:/bin/passwd
是典型的 setuid
文件,它允许用户更改自己的密码而无需拥有超级用户权限。
例:
chmod u+s /usr/bin/rm
#这时给这个rm命令的文件加上suid后,执行者将具有该程序拥有者(owner)的权限,普通用户相当于root用户(即提权)
chmod u-s /usr/bin/rm #取消提权
2. sgid
(Set Group ID)
它在可执行文件上允许程序以文件所属组的身份运行;在目录上则让新文件继承目录的所属组。
常见用途:共享目录,如果目录设置了 setgid
,那么所有在该目录中创建的文件会继承目录的组。
例:
把s放到文件的所属用户组的x位置上的话,就是SGID。那么SGID的功能是什么呢?和SUID一样,只是SGID是继承该程序的所属组。
SGID主要用在目录上-----如果用户在此目录下具有w权限的话,使用者在此目录下建立新文件,则创建的这个文件的群组与此目录的群组相同。
chmod g+s /opt/dir1/ #给dir1设置啦sgid权限,则在其目录下创建的所有文件都具有dir1的一样的权限
3. sticky bit
(粘滞位)
它主要用于目录,确保目录中的文件只有所有者或目录所有者可以删除或移动
常见用途:/tmp
目录通常设置了 sticky bit
,确保只有文件所有者才能删除自己的文件。
例:
chmod +t /path/to/directory
这个就是针对others来设置的了,和上面两个一样,只是功能不同而已。
SBIT(Sticky Bit)目前只针对目录有效,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。
注意:
特权风险:setuid
和 setgid
可以赋予程序特权,因此要谨慎使用,避免安全风险。确保设置这些权限的文件和程序没有安全漏洞。
权限优先级:特殊权限与传统权限组合使用时,要注意权限的优先级和继承关系。
简单理解来讲:
suid ==== 4 ==== 提权 (只对二进制命令文件生效,其他不管用)
sgid ==== 2 ==== 继承属组权限 (只能对目录设置)
sticky ==== 1 ==== (t权限) 权限控制
在以上例子中使用chmod字母参数来设置,当然同样可以使用数字方式创建,如下举例:
chmod u+s /path/to/file
# 设置文件权限为 4755,表示所有者有读、写、执行权限,组和其他人有读、执行权限,并设置了 `setuid`
chmod 4755 /path/to/file
chmod g+s /path/to/directory
# 设置目录权限为 2775,表示所有者和组有读、写、执行权限,其他人有读、执行权限,并设置了 `setgid`
chmod 2775 /path/to/directory
chmod +t /path/to/directory
# 设置目录权限为 1777,表示所有者、组、其他人都有读、写、执行权限,并设置了 `sticky bit`
chmod 1777 /path/to/directory
组合使用
chmod ug+s /path/to/file
# 设置权限为 6755,表示同时设置了 `setuid` 和 `setgid`
chmod 6755 /path/to/file
ACL权限
Access Control Lists (ACL) 是一种用于在 Unix 和 Linux 系统中实现细粒度权限控制的机制。它允许你为文件和目录指定特定用户或组的权限,不仅限于传统的所有者、所属组、和其他人。这种灵活性对于复杂的权限设置非常有用,尤其是在团队协作和多用户环境中。
ACL 的主要特性
- 细粒度控制:ACL 允许为特定用户和组设置权限,超越传统的权限模型。
- 兼容传统权限:ACL 与传统的 Unix 权限模型兼容,可以结合使用。
- 继承和默认 ACL:在目录上,ACL 可以定义默认权限,确保新创建的文件和子目录继承指定的权限。
使用 ACL 的命令
主要有两个命令用于管理 ACL:setfacl
和 getfacl
。
setfacl
:用于设置或修改文件和目录的 ACL。getfacl
:用于查看文件和目录的当前 ACL。
1.setfacl
的使用
常见用法示例:
为用户设置权限
# 为用户 alice 设置读、写权限
setfacl -m u:alice:rw /path/to/file
为组设置权限
# 为组 developers 设置读、写、执行权限
setfacl -m g:developers:rwx /path/to/directory
设置默认 ACL
# 为目录设置默认 ACL,确保新创建的文件继承这些权限
setfacl -m d:u:alice:rw /path/to/directory
递归设置 ACL
# 递归设置 ACL,应用到目录及其所有子文件和子目录
setfacl -R -m u:alice:rw /path/to/directory
以下是参数与对应示例:
#-m 或 --modify: 修改现有的 ACL,添加或更改权限。
setfacl -m u:alice:rw /path/to/file # 为用户 alice 设置读写权限
#-x 或 --remove: 移除指定的 ACL。
setfacl -x u:alice /path/to/file # 移除用户 alice 的 ACL
#-b 或 --remove-all: 移除文件或目录的所有 ACL。
setfacl -b /path/to/file # 移除所有 ACL
#-k 或 --remove-default: 移除目录的所有默认 ACL。
setfacl -k /path/to/directory # 移除目录的默认 ACL
#-R 或 --recursive: 递归应用 ACL 更改到目录及其所有子文件和子目录。
setfacl -R -m u:alice:rw /path/to/directory # 递归为 alice 设置读写权限
#-n 或 --no-mask: 在修改 ACL 时,不更改权限掩码。
setfacl -n -m u:alice:rw /path/to/file # 设置 ACL 不影响权限掩码
#-d 或 --default: 设置默认 ACL,主要用于目录,确保新创建的文件和子目录继承指定的权限。
setfacl -m d:u:alice:rw /path/to/directory # 为目录设置默认 ACL
指定特定用户、组、或其他实体:
- u: 指定用户权限。
- g: 指定组权限。
- o: 指定其他人的权限。
- r: 读权限。
- w: 写权限。
- x: 执行权限。
2.getfacl
的使用
查看文件或目录的当前 ACL:
# 查看文件的 ACL,这里换成你想看的文件路径
getfacl /path/to/file
#-a 或 --all:显示所有权限,包括默认 ACL 和文件系统的基本权限。
getfacl --all /path/to/file
#-d 或 --default:仅显示默认 ACL。默认 ACL 主要用于目录,指示在该目录中创建的新文件和子目录应#继承的权限。
getfacl --default /path/to/directory
#-R 或 --recursive:递归显示目录及其所有子文件和子目录的 ACL。
getfacl -R /path/to/directory
#-n 或 --no-name:使用用户和组的数字 ID 显示,而不是将其解析为用户和组的名称。对于大型用户/组数据库或疑难解答时很有用。
getfacl -n /path/to/file
# --tabular:以表格形式输出 ACL 信息。对于脚本处理和数据提取非常有用。
#getfacl --tabular /path/to/file
#显示文件的 ACL
#最简单的用法是直接查看某个文件或目录的 ACL:
getfacl /path/to/file
#这将显示文件的所有者、组,以及当前的 ACL 权限。
#显示默认 ACL
#要查看目录的默认 ACL,可以使用 -d 参数:
getfacl -d /path/to/directory
#这会显示目录的默认 ACL,即在该目录中新创建的文件和子目录继承的权限。
#递归显示 ACL
#递归显示某个目录及其所有子目录和子文件的 ACL:
getfacl -R /path/to/directory
特殊权限与ACL的比较
- 用途:特殊权限用于赋予文件和目录特定行为特性,满足特定场景需求;ACL 用于细粒度的权限控制。
- 灵活性:ACL 更灵活,可以为不同用户和组设置特定权限;特殊权限通常针对特定行为,如
setuid
、setgid
和sticky bit
。 - 配置方法:特殊权限通过
chmod
设置;ACL 通过setfacl
设置。 - 应用场景:特殊权限在系统级别和共享环境中使用;ACL 在复杂的权限设置和团队协作中使用。
suid
、sgid
、sticky bit
是文件系统的特殊权限位,定义了文件或目录的特定行为。而 ACL 是一种扩展的权限模型,允许为特定用户或组设置精细的权限。两者在概念和用途上不同,ACL 提供更灵活的权限控制,而特殊权限位用于特定场景中的特殊需求。
关于sudo提权——visudo或vim /etc/sudoers
在 Linux 系统中,/etc/sudoers
文件是配置 sudo
行为的核心文件。这个文件规定了哪些用户或组可以使用 sudo
命令、在什么条件下使用,以及拥有何种权限。由于这个文件非常关键,编辑它时要特别小心。对于这个文件的编辑,最推荐的工具方式是 visudo。
使用visudo相对使用vim /etc/sudoers的方式具有的优点如下:
- 独占锁定:
visudo
在编辑sudoers
文件时,确保没有其他进程同时编辑文件,避免竞争条件和损坏。 - 语法检查:在保存之前,
visudo
会检查sudoers
文件的语法,确保没有错误。这样可以防止由于语法错误导致的权限问题。 - 文本编辑器:
visudo
默认使用vi
或vim
等编辑器,但可以通过设置环境变量EDITOR
来指定使用其他编辑器。
用法命令:
visudo
或
vim /etc/sudoers
直接运行 即可,将打开 sudoers
文件,供你编辑。通常需要管理员或 root
权限才能执行。
编辑 sudoers
文件的注意事项
- 安全性:
sudoers
文件控制着谁可以使用sudo
以及如何使用。错误的配置可能导致严重的安全风险。 - 遵循原则:不要在
sudoers
文件中给予过多权限,遵循最小权限原则。 - 使用别名:
sudoers
文件支持用户、组和命令的别名,便于管理复杂权限。 - 测试新配置:在添加或修改权限后,测试
sudo
行为,以确保配置正确。
举例:
使用 visudo 添加 sudo 权限:
# 允许用户 alice 使用 sudo 不需要密码
alice ALL=(ALL) NOPASSWD: ALL
添加特定命令权限:
bob ALL=(ALL) NOPASSWD: /usr/bin/apt-get
#bob 是目标用户。
#ALL 表示可以在任何主机上使用 sudo。
#NOPASSWD: 指示不需要密码。
#/usr/bin/apt-get 是允许的命令
使用 visudo 给组赋予 sudo 权限:
# 允许组 wheel 的所有成员使用 sudo #wheel组是系统默认自带的,其组中用户可以切换root用户
%wheel ALL=(ALL) ALL
#假设你想允许组 developers 中的所有成员使用 sudo,并且需要输入密码。这样的设置通常用于开发团队,#以便他们可以执行需要特权的操作。%developers 指的是组 developers 中的所有成员。ALL=(ALL) ALL 表#示这个组可以以任何用户身份执行任何命令,但需要输入密码。
%developers ALL=(ALL) ALL
修改的位置如下图: 在箭头指向行添加即可。
visudo命令参数如下:
更多使用man visudo命令查阅
选项 | 说明 |
-c, --check | 纯检查模式 |
-f, --file=sudoers | 指定 sudoers 文件的位置 |
-q, --quiet | 较简略(安静)的语法错误信息 |
-s, --strict | 严格语法检查 |
-V, --version | 显示版本信息并退出 |
这里提供一个往期遇到的例子以供扩展理解: Liunx中禁止普通用户切换root的解决方法_限制 linux 用户切换root-CSDN博客
隐藏权限
lsattr
是 Linux 系统中用于查看文件或目录的特殊属性的命令。这些属性属于 Linux 文件系统的扩展属性,常见于 ext2、ext3 和 ext4 文件系统。它们有时被称为"隐藏"权限,因为它们可以影响文件的行为和操作,超越了传统的读、写、执行权限的概念。
常见的隐藏权限
lsattr
列出的属性是通过单个字母表示,这些属性影响文件和目录的特定行为。以下是一些重要的属性以及它们的意义:
a
(Append Only):只能追加。文件只能追加内容,无法删除或修改现有内容。常用于日志文件,以防止篡改。c
(Compressed):文件在磁盘上是压缩存储的。d
(No Dump):文件不会被备份工具(如dump
)备份。e
(Extent Format):文件使用 extent 格式进行存储,通常用于 ext4 文件系统。i
(Immutable):不可更改。文件无法被修改、删除、重命名或链接。常用于保护重要的系统文件。j
(Data Journaling):数据日志记录。文件中的所有数据变更都记录在日志中。s
(Secure Deletion):安全删除。文件在删除后会被填充随机数据,防止恢复。t
(No Tail-Merging):关闭尾部合并。尾部合并是某些文件系统优化存储空间的方法。u
(Undeletable):删除后可恢复。文件在删除后可以通过某些工具恢复。A
(No Access Time Update):文件访问时不更新访问时间(atime)。D
(Synchronous Directory Updates):目录更新时同步操作,确保目录的变更立即写入磁盘。
使用 lsattr
# 查看文件或目录的属性
lsattr /path/to/file
# 查看目录中的所有文件的属性,递归遍历,意味着不仅会查看指定目录,还会查看其所有子目录和文件
lsattr -R /path/to/directory
使用 chattr
修改属性
要设置或移除这些属性,可以使用 chattr
命令。操作这些属性通常需要超级用户权限。
# 设置不可变属性
chattr +i /path/to/file
# 移除不可变属性
chattr -i /path/to/file
# 设置追加属性
chattr +a /path/to/file