佛山网站建设公司有哪些?,上虞做网站,wordpress全屏广告插件,湖北正规网站建设质量保障前言#xff1a;
在Linux系统中#xff0c;文件和目录的权限管理是一项至关重要的任务。它决定了哪些用户或用户组可以对文件或目录执行读、写或执行等操作。传统的Linux权限模型基于用户、组和其他的概念#xff0c;但随着时间的推移#xff0c;这种模型在某些情况下显得…前言
在Linux系统中文件和目录的权限管理是一项至关重要的任务。它决定了哪些用户或用户组可以对文件或目录执行读、写或执行等操作。传统的Linux权限模型基于用户、组和其他的概念但随着时间的推移这种模型在某些情况下显得不够灵活。为了解决这个问题Linux引入了访问控制列表ACL权限提供了更细粒度的权限控制。
除了ACL权限Linux文件系统中还隐藏着一些特殊位和属性它们对文件和目录的行为有着深远的影响。这些特殊位和属性包括执行位、设置用户ID位、设置组ID位等。了解并正确使用这些特殊位和属性对于Linux系统管理员和开发者来说是必不可少的技能。
在本文中我们将深入探讨Linux的ACL权限、特殊位和隐藏属性以及如何在日常工作中利用它们来增强系统的安全性和灵活性。无论您是Linux新手还是经验丰富的系统管理员相信本文都会为您带来宝贵的启示和实用的技巧。
一.关于ACL权限的介绍
1.1 什么是ACL
ACL是Access Control List的缩写即访问控制列表。可以通过下列的实例来理解ACL的作用 思考如何实现如下的权限控制
每个项目成员在有一个自己的项目目录对自己的目录有完全权限项目组中的成员对项目目录也有完全权限其他人对项目目录没有任何权限对于被分配进入项目的临时人员只有读和执行权限不能修改
如何实现
初步思路
创建一个临时组例如temp并将临时组的权限设置位 r-w将临时组也作为项目目录的所属组对于临时用户作为临时组的成员即可
问题
Linux基本权限中文件和目录同时只能有一个分组使用ACL来解决上面的问题 1.2 操作步骤 # 1. 添加测试目录用户组并将用户添加到组 -------------------[rootlocalhost ~]# mkdir /project
[rootlocalhost ~]# useradd zs
[rootlocalhost ~]# useradd ls
[rootlocalhost ~]# groupadd tgroup
[rootlocalhost ~]# gpasswd -a zs tgroup
正在将用户“zs”加入到“tgroup”组中
[rootlocalhost ~]# gpasswd -a ls tgroup
正在将用户“ls”加入到“tgroup”组中
# 可以查看组是否正常建立[rootlocalhost ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
...tgroup:x:1003:zs,ls✨# 2. 修改目录的所有者和所属组 -----------------------------[rootlocalhost ~]# chown root:tgroup /project
[rootlocalhost ~]# ll -d /projectdrwxr-xr-x. 2 root tgroup 6 8月 23 13:07 project# 3. 设定权限 ----------------------------[rootlocalhost ~]# chmod 770 /project
[rootlocalhost ~]# ll -d /project
drwxrwx---. 2 root tgroup 6 8月 23 13:07 /project
# 4. 此时需要为临时用户进行分配权限 r-x -----------------# 4.1 添加临时用户[rootlocalhost ~]# useradd tempuser
[rootlocalhost ~]# passwd tempuser
# 4.2 为临时用户分配特定权限[rootlocalhost ~]# setfacl -m u:tempuser:rx /project
[rootlocalhost ~]# getfacl /project
getfacl: Removing leading / from absolute path names
# file: project
# owner: root
# group: tgroup
user::rwx
user:tempuser:r-x✨group::rwx
mask::rwx
other::---
# 4.3 查看目录权限注意表示文件或目录有acl权限[rootlocalhost ~]# ll -d /project
drwxrwx--- 2 root tgroup 6 8月 23 13:07 /project
# 5. 验证acl权限 --------------------------------------# 5.1 切换到tempuser用户[rootlocalhost ~]# su tempuser
[tempuserlocalhost root]$
# 5.2 验证可以进入project目录[tempuserlocalhost project]$ cd /project
[tempuserlocalhost project]$
# 5.3 验证不能在project中创建文件[tempuserlocalhost project]$ touch test.txt
touch: 无法创建test.txt: 权限不够
# 6. 控制组的ACL权限 ---------------------------------# 6.1 创建一个temp组[rootlocalhost project]# groupadd temp
# 6.2 设置组的ACL[rootlocalhost project]# setfacl -m g:temp:rx /project
# 6.3 查看设置后ACL[rootlocalhost project]# getfacl /project
getfacl: Removing leading / from absolute path names
# file: project
# owner: root
# group: tgroup
user::rwx
user:tempuser:r-x
group::rwx
group:temp:r-x✨mask::rwx
other::---
# 6.4 创建一个用户并将该用户设置为temp组[rootlocalhost project]# useradd tempu02
[rootlocalhost project]# passwd tempu02
更改用户 tempu02 的密码 。
新的 密码
# 6.5 将用户添加到temp组中[rootlocalhost project]# gpasswd -a tempu02 temp
正在将用户“tempu02”加入到“temp”组中
# 6.6 验证 ----------------------------[rootlocalhost project]# su tempu02
# 可以进入目录[tempu02localhost project]$ cd /project
[tempu02localhost project]$ ls
# 不能创建文件[tempu02localhost project]$ touch aa.txt
touch: 无法创建aa.txt: 权限不够 1.3 ACL中mask修改最大权限 getfacl /project 最大权限是指 如果给用户赋予了ACL权限则用户所获取的权限并不是ACL时所附的权限而是赋予的ACL权限 与 mask权限 进行 与 操作 之后的权限。例如user:tempuser:r-x 第一位是r mask的第一位也是r 则与操作后用户则有 r 的权限 user:tempuser:r-x 第二位是 - mask的第二位是 w则与操作后用户则没有 w 的权限。
最大权限的作用mask的默认值为rwx即最大权限任何其他的权限值和mask相“与”都会得到其自身 可以通过调整mask的方式来控制分配给用户的最大权限例如 mask值调整为 r-x 则不管是否给用户分配”w”权限用户都没有“w”的权限。mask可以用来避免权限分配不当而给系统带来的风险。
注意mask不会影响文件所有者的权限
实例
setfacl -m m:rx /project # 所属组虽然设置的权限为rwx但其实际的权限 r-x ✨group:temp:r-x
mask::r-x# 修改之后的mask
1.4 ACL权限的删除
# 删除指定ACL权限
setfacl -x u:tempuser /project# 删除所有ACL权限
setfacl -b /project # 注意 权限没有 [rootlocalhost ~]# ll -d /project
drwxrwx---. 2 root tgroup 6 8月 23 13:07 /project 1.5 ACL权限的递归及默认值
所谓递归是指指定目录下的所有文件及其子目录都具体指定的ACL权限属性
注意ACL权限只对已有的文件或目录起作用对新加的不起作用
ACL的默认值如果希望新加的文件或目录都具有父目录所拥有的ACL权限属性则需要设置默认值
# 设置ACL权限[rootlocalhost project]# setfacl -m u:tempuser:rx /project
[rootlocalhost project]# ll -d
drwxrwx--- 2 root tgroup 6 8月 23 13:07 .
# project目录已经设置好了ACL权限在该目录中添加一个文件文件并不具有ACL权限因为在设置ACL权限时并没有指定递归属性[rootlocalhost project]# touch abc.txt
[rootlocalhost project]# ll
总用量 0
-rw-r--r--. 1 root root 0 8月 23 17:29 abc.txt
# 设置ACL权限可以递归注意R参数的位置在此处是固定的这算是Linux中命令的一个特例Linux中命令参数的位置一般是不敏感的[rootlocalhost ~]# setfacl -m u:tempuser:rx -R /project[rootlocalhost project]# ll /project
总用量 0
-rw-r-xr-- 1 root root 0 8月 23 17:29 abc.txt
# 在设置了project目录递归ACL权限属性后再在该目录中创建一个新的文件此时发现新的文件并没有ACL权限这说明ACL权限只对已有的文件或目录起作用对新加的不起作用[rootlocalhost project]# touch def.txt
[rootlocalhost project]# ll
总用量 0
-rw-r-xr-- 1 root root 0 8月 23 17:29 abc.txt
-rw-r--r--. 1 root root 0 8月 23 17:43 def.txt
# 设置ACL默认值默认值的参数是d可以和-R结合使用[rootlocalhost project]# setfacl -m d:u:tempuser:rx -R /project
[rootlocalhost project]# getfacl /project
getfacl: Removing leading / from absolute path names
# file: project
# owner: root
# group: tgroup
user::rwx
user:tempuser:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:tempuser:r-x
default:group::rwx
default:mask::rwx
default:other::---[rootlocalhost project]# touch www.txt
[rootlocalhost project]# ll
总用量 0
-rw-r-xr-- 1 root root 0 8月 23 17:29 abc.txt
-rw-r--r--. 1 root root 0 8月 23 17:43 def.txt# 该文件在设置规则之后默认值之前创建两头都不管所以没有ACL权限属性-rw-rw---- 1 root root 0 8月 23 17:51 www.txt
[rootlocalhost project]#
2. 特殊位
2.1 SUID
什么是suid
SUID是对二进制可执行的文件才有效 普通文件设置之后是没有意义的执行者对该程序有x权限当程序具有suid时程序执行者在执行程序期间会暂时获得该程序所有者的身份程序执行者所获取的属主身份只在程序运行过程中有效
为什么需要suid
Linux中具有suid权限的文件如passwd
[rootlocalhost ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
[rootlocalhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
[rootlocalhost ~]#
注意passwd的权限中在文件所有者的权限中有一个“s”这说明
passwd执行程序具有suid权限在passwd执行期间会获取root权限同时所属组和其他用户是用户r和x权限
为什么需要这么设置权限
passwd修改的实际上是/etc/shadow的内容但该文件只有root超级管理员才能修改一般用户不可以但一般用户应该可以修改自己的账户密码这是正当的需求在passwd执行期间让普遍用户暂时获取root用户的权限以便于修改shadow文件执行完成临时赋予的权限消失这即满足了用户可以修改自己密码的需求也照顾到了系统安全性。
怎么设置suid
字母方式 chmod us 文件名u代表设置的是suid数字方式 chmod 4755 文件名最前方的4表示设置的是suid后面的755分别代码 所有者所属组其他人的权限
怎样移除suid
设置设置权限 chmod 755 文件名字符方式 chmod u-s 文件名
2.2 SGID
什么是SGID
相对于SUID只能设置可执行的文件SGID可以设置可执行文件也可以设置目录SGID有如下特征
如果设置的对象是文件则只能是可执行的二进制文件且命令的执行者需要对文件有 x 权限命令执行过程中组身份升级为该文件的所属组只有在程序执行的过程中才有效
使用案例
# centos7默认没有安装locate先执行安装[rootlocalhost ~]# yum install mlocate[rootlocalhost ~]# updatedb[rootlocalhost ~]# locate inittab
/etc/inittab
/usr/share/vim/vim74/syntax/inittab.vim
# 查看locate命令注意权限 所属组部分的s这个s即表示开启了SGID在执行该# 命令时会在执行期间临时将组身份升级为该文件的所属组[rootlocalhost ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate
# locate命令需要使用mlocate.db文件但该文件默认情况下普通用户是没有权限读的当用户# 运行locate命令时临时获取了SGID属性组身份升级为了该文件的所属组所以具有了对# mlocate文件的读权限。[rootlocalhost test]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 1123834 10月 2 15:06 /var/lib/mlocate/mlocate.db
# ---- 为目录设置SGID的示例 -----# 查看当前目录[rootlocalhost ~]# pwd
/root
# 在tmp目录下创建一个目录[rootlocalhost ~]# mkdir /tmp/test
# 给test赋予SGID的权限第一2表示SGID如果需要清除SGID则可以使用 777# 也可以使用 chmod gs 文件或目录名[rootlocalhost ~]# chmod 2777 /tmp/test
# 权限所属组部分的s表示拥有SGID权限[rootlocalhost ~]# ll -d /tmp/test
drwxrwsrwx. 2 root root 6 10月 2 14:58 /tmp/test
# 切换用户[rootlocalhost ~]# su lisen
[lisenlocalhost root]$ pwd
/root
# 普通用户无权在root目录下创建文件[lisenlocalhost root]$ touch abc.txt
touch: 无法创建abc.txt: 权限不够
# 在home目录下创建一个文件文件的默认的所属组为当前用户的所属组[lisenlocalhost root]$ cd /home/lisen
[lisenlocalhost ~]$ touch abc.txt
[lisenlocalhost ~]$ ll
总用量 0
-rw-rw-r--. 1 lisen lisen 0 10月 2 15:01 abc.txt
# 在设置了SGID的目录中创建文件默认的所属组变成了目录的所属组这是SGID的作用[lisenlocalhost ~]$ cd /tmp/test
[lisenlocalhost test]$ touch bcd.txt
[lisenlocalhost test]$ ll
总用量 0
-rw-rw-r--. 1 lisen root 0 10月 2 15:01 bcd.txt
[lisenlocalhost test]$
2.3 SBIT粘着位权限
SBIT权限的特点
SBIT权限只能针对目录有效普通用户对目录拥有w和x权限即普通用户对目录有写入权限若没有SBIT则普通用户可以删除目录下的所有文件包括其他用户创建的文件若目录有SBIT权限则只用root用户可以删除所有文件普通用户就算拥有w权限也只能删除自己建立的文件对于其他用户创建的文件则无权删除。SBIT权限的设置只能是root用户其他用户不可以
# Linux中的tmp目录是使用SBIT权限的典型目录注意权限部分最后的t字母[rootlocalhost ~]# ll -d /tmp
drwxrwxrwt. 10 root root 218 10月 2 16:05 /tmp
# 创建一个新用户并设置密码[rootlocalhost ~]# useradd test
[rootlocalhost ~]# passwd test# 切换到lisen用户在/tmp目录下创建文件[lisenlocalhost root]$ touch /tmp/abcd.txt
# 切换到test用户删除/tmp/目录下的abcd.txt文件因为tmp目录具有SBIT权限且abcd.txt# 文件不是当前用户创建所以无权删除。[testlocalhost root]$ cd /tmp
[testlocalhost tmp]$ ls
abcd.txt
abc.txt
systemd-private-a092fa5008e44207b2cdbcae85170c80-chronyd.service-WocDs1
test
vmware-root_665-3988687359
[testlocalhost tmp]$ rm abcd.txt
rm是否删除有写保护的普通空文件 abcd.txty
rm: 无法删除abcd.txt: 不允许的操作
# ---- 设置SBIT权限 ----[rootlocalhost /]# mkdir /test
# 创建的目录默认的权限是755[rootlocalhost /]# ll -d /test
drwxr-xr-x. 2 root root 6 10月 2 17:33 /test
# 设置SBIT权限[rootlocalhost /]# chmod 1755 /test
[rootlocalhost /]# ll -d /test
drwxr-xr-t. 2 root root 6 10月 2 17:33 /test
# 上面的设置test的其他用户没有写入的权限所以SBIT权限的没有什么含义[rootlocalhost ~]# chmod 1777 /test
[rootlocalhost ~]# ll -d /test
drwxrwxrwt. 2 root root 6 10月 2 17:33 /test3. 文件系统属性chattr权限
命令格式 chattr [-] [权限选项] 文件或目录 增加权限 -删除权限 赋予权限
权限选项
i 如果文件被设置i属性则不允许文件进行删除改名文件内容也不允许改动 如果目录被设置了i选项则只能修改目录下的文件数据但不允许建立和删除文件。需要注意的是该属性对root用户也同样有效a 如果对文件设置了a属性则只能在文件中增加数据但不能修改也不能删除数据 如果对目录设置了a属性那么只能在目录中建立或修改文件但不能删除
使用示例
# ------ 文件的chattr属性示例 ---------# 文件的i属性 # 创建一个文件先不为其设置 i 属性 此时可以正常写入内容[rootlocalhost ~]# touch abc
[rootlocalhost ~]# ll
总用量 116
-rw-r--r--. 1 root root 0 10月 3 18:51 abc
-rw-------. 1 root root 1396 2月 8 2021 anaconda-ks.cfg
-rw-r--r--. 1 root root 2381 8月 17 14:58 index.html
-rw-r--r--. 1 root root 102052 8月 17 15:02 index.html.1
-rw-r--r--. 1 root root 1612 3月 19 2021 index.html.2
-rw-r--r--. 1 root root 2381 8月 17 15:21 index.html.3
[rootlocalhost ~]# echo 1234345 abc
[rootlocalhost ~]# cat abc
1234345
[rootlocalhost ~]# # 为abc文件设置i属性[rootlocalhost ~]# chattr i abc
# 一般的ls命令不能显示文件的i属性需要使用lsattr命令[rootlocalhost ~]# lsattr -a abc
----i----------- abc
[rootlocalhost ~]#
# 设置了abc文件的i属性后测试修改其内容无权修改删除也不行[rootlocalhost ~]# echo efefe abc
-bash: abc: 权限不够
[rootlocalhost ~]#
[rootlocalhost ~]# rm abc
rm是否删除普通文件 abcy
rm: 无法删除abc: 不允许的操作
[rootlocalhost ~]#
# 目录的i属性示例 [rootlocalhost ~]# mkdir /test
[rootlocalhost ~]# cd /test
[rootlocalhost test]# ll
总用量 0
# 没有设置chattr属性之前可以添加文件[rootlocalhost test]# touch a.txt
[rootlocalhost test]# ls
a.txt
# 设置chattr属性之后可以对原来的目录中有的文件进行修改但不能在目录中# 添加或删除文件报权限不够[rootlocalhost test]# chattr i /test
[rootlocalhost test]# lsattr -a /test/
----i----------- /test/.
---------------- /test/..
---------------- /test/a.txt
[rootlocalhost test]# echo avaavv /test/a.txt
[rootlocalhost test]# touch /test/b.txt
touch: 无法创建/test/b.txt: 权限不够
[rootlocalhost test]#
# 文件的a属性 [rootlocalhost test]# touch a.txt[rootlocalhost test]# chattr a a.txt
# 将内容写入文件[rootlocalhost test]# echo 123 a.txt
-bash: a.txt: 不允许的操作
# 将内容追加到文件[rootlocalhost test]# echo 12345 a.txt
[rootlocalhost test]# cat a.txt
12345
# 目录的a属性 [rootlocalhost /]# mkdir test02
[rootlocalhost /]# chattr a test02
[rootlocalhost /]# cd /test02
[rootlocalhost test02]# touch a.txt
[rootlocalhost test02]# rm a.txt
rm是否删除普通空文件 a.txty
rm: 无法删除a.txt: 不允许的操作
[rootlocalhost test02]# mv a.txt b.txt
mv: 无法将a.txt 移动至b.txt: 不允许的操作
[rootlocalhost test02]# 4. sudo
作用:
root把本来只能由超级用户使用的命令赋予普通用户使用sudo的操作对象是系统命令
使用场景
在需要将超级管理员的某些功能权限临时下方与普通用户时可以使用使用尚方宝剑
修改sudo的配置/etc/sudoers
修改格式 root ALL(ALL) ALL用户名 被管理主机IP(可使用的身份) 授权命令绝对路径%wheel ALL(ALL) ALL组名 被管理主机IP(可使用的身份) 授权命令 (绝对路径)
# 查看或修改sudo的配置也可以直接编辑/etc/sudoers文件[rootlocalhost ~]# visudo
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL(ALL) ALL## 增加lisen用户可以执行服务器重启命令lisen ALL/sbin/shutdown -r now
## 切换到到lisen用户后可以使用上面的命令但是需要注意两个地方1. 和sudo一起用2. 使用命令## 的绝对路径
注意事项
主要不要将vim等编辑工具配置到sudo中去如果在sudo的配置文件中配置了vim则普通用户在运行vim中就拥有了超级用户的身份这是很危险的使用普通用户有权修改任何文件。