权限的概念
在 Linux 系统的架构里,权限是构建安全堡垒的基石,精准界定了不同用户对文件与目录的操作边界,对系统安全的维护以及数据完整性的保障起着决定性作用。Linux 将权限归纳为读(r)、写(w)和执行(x)这三种基础类别,它们各司其职,共同守护系统资源。
1.读权限(r):对于文件,拥有读权限的用户宛如拥有了一把打开知识宝库的钥匙,能够毫无阻碍地查看文件的具体内容,无论是文本文件中的文字信息,还是配置文件里的参数设置,都能一览无余。切换到目录场景下,读权限就如同赋予了用户进入一间仓库并查看库存清单的权力,用户凭借它可以运用ls命令,清晰罗列目录中的所有文件与子目录,对目录结构与内容分布做到心中有数。
2.写权限(w):当用户对文件持有写权限时,便如同手握一支神奇的笔,能够自由修改文件内容,无论是增添新的文字段落,还是修正既有数据,都能随心操作。值得注意的是,若要删除文件,除了对文件本身有写权限,还需对文件所在目录具备写权限。把目光转向目录,写权限如同给予用户在一片空地上建造房屋的许可,用户可在目录中创建全新的文件与子目录,还能删除目录里已有的文件与子目录,自由规划目录内的资源布局。
3.执行权限(x):若文件属于可执行文件,比如常见的脚本文件或二进制程序,执行权限就像点燃引擎的钥匙,用户得以运行该文件,让程序中的指令依序执行,实现各种功能。在目录方面,执行权限则如同打开一扇门的钥匙,允许用户运用cd命令顺利进入该目录,深入探索目录内部的资源。
权限的查看及读取
权限的查看
ls -l 文件 ##查看文件权限
ls -ld 目录 ##查看目录权限
文件权限的种类
文件的属性被叫做文件的元数据(meta data),一种元数据用1个byte来记录内容
#文件权限信息#
- | rw-r--r-- | . | 1 | root | root | 0 | Apr 12 10:57 | lee
[1] [2] [3] [4] [5] [6] [7] [8] [9]
【1,文件2,权限3,开启4,文件被记录数5,所有人6,所有组7,文件大小8,最后修改时间9,名称】
#目录权限信息#
d | rw-r--r-- | . | 2 | root | root | 0 | Apr 12 10:57 | timinglee
[1] [2] [3] [4] [5] [6] [7] [8] [9]
【4,目录的子目录数7,子目录大小】
[1]文件类型
# - 普通文件 # d 目录 # l 软连接 # b 快设备 # c 字符设备 # s socket套接字
# p 管道 |
[2]文件权限说明
##用户权限 ##rw-|r--|r-- # u g o
[3]文件安全上下文标记
##系统的selinux开启,那么在此位会出现“.”
[4]文件副本标记或目录中子目录标记
##对文件:文件内容被系统记录的次数(硬链接个数)。##对目录:目录中子目录的个数
[5-6]文件的归属
##文件拥有者 ##文件拥有组
[7]文件容量统计
##对于文件:文件内容大小 ##对于目录:目录中子文件的元数据大小
[8]文件时间戳
##文件内容被修改的时间
[9]文件名称
文件名称中一个英文字符占用一个字节,一个中文字符占用三个字节
用户对于文件的身份识别及设定
用户对文件的身份
u: #user 文件的拥有者,ls -l 看到的第五列信息
g: #group 文件拥有组, ls -l 看到的第六列信息
o: #other 既不是拥有者也不是拥有组成员的其他用户的通称
权限位
rwx|r- -|r- -
u g o
文件用户用户组管理 【watch -n 1 ls -lR /mnt/】监控目录
chown lee lee1 // chown lee timinglee/ ##更改文件拥有者(lee用户,文件//目录)
chgrp lee timinglee/ // chgrp -R lee timinglee/ ##更改文件拥有组
chown lee:lee lee2 ##同时更改文件的拥有者和拥有组
运行前
运行后
chown|chgrp -R lee timinglee/ ##更改目录本身及目录中内容的拥有者或者拥有组
运行前
运行后
设定普通权限的方法
Chmod ##设定文件权限
#chmod 复制权限#
chmod --reference=/tmp /mnt/lee #复制/tmp目录的权限到/mnt/lee上
chmod -R --reference=/tmp /mnt/westosdir #复制/tmp目录的权限到/mnt/westosdir及
#目录中的子文件上 -R 代表第归操作
#chmod 字符方式设定权限
Chmod - -reference=timinglee/lee1 ##复制文件权限到lee1上
chmod <a|u|g|o> <+|-|=> <r|w|x> lee ##用字副方式设定文件权限
rwx|r- -|r- -
u g o
示例:
chmod u-rw /mnt/lee2
chmod u-rw,g+x,o+wx /mnt/lee3
chmod a-rwx /mnt/lee4
chmod u=rwx,g=rx,o=--- /mnt/lee5
chmod -R u=rwx,g=rx,o=--- /mnt/timinglee
更改位置
#chmod 数字方式设定权限#
权限波尔指表示方式
rwx = 111 ,- - - = 000
三位二进制可以表示的最大范围为8进至数
rwx=111=7 最大权限
rw-=110=6
r-x=101=5
r--=100=4 =r 所有人可读
-wx=011=3
-w-=010=2 =w 写权限
--x=001=1 =x 可执行权限
- - -=000=0
#示例:
chmod 600 /mnt/lee1 【所有者可读可写,组用户和其他用户无权限】
运行结果:rw - - - - - - -
755可读可写可执行
练习
1,# groupadd -g 2000 shengcan , 2,# groupadd -g 2001 caiwu , 3,# groupadd -g 2001 jishu
4-6,# mkdir /cw /sc /js /pub ——建立文件目录
# chgrp shengchan /sc , # chgrp caiwu /cw , # chgrp jishu /js ——设置储存目录
# chmod 770 (/sc,/cw,/js) ——770其他用户没有权限
7,# chmod 777 /pub
系统默认权限设定
系统本身存在的意义共享资源
从安全角度讲系统共享的资源越少,开放的权力越小系统安全性越高
既要保证系统安全,又要系统创造价值,于是把应该开放的权力默认开放把不安全的权力默认保留
如何保留权力
# umask表示系统保留权力
umask #查看保留权力
umask 权限值 #临时设定系统预留权力
#文件默认权限 = 777-umask-111
#目录默认权限 = 777-umask
#umask值越大系统安全性越高
#umask临时更改
umask 077 ##=777-077-111=600
#永久更改
vim /etc/bashrc ##shell系统配置文件【进入后输入: set nu】
74 if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
75 umask 002 #普通用户的umask
76 else
77 umask 022 -- 077 #root用户的umask
78 fi
vim /etc/profile ##系统环境配置文件
59 if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
60 umask 002 #普通用户的umask
61 else
62 umask 022 -- 077 #root用户的umask
63 fi
source /etc/bashrc ##source作用时使我们更改的内容立即被系统识别 source /etc/profile
系统中的特殊权限
在 Linux 系统中,常规的文件权限包括读(r)、写(w)和执行(x),分别对应数字 4、2 和 1。通过这些权限的组合,我们可以灵活地控制用户对文件和目录的访问。然而,在某些特定场景下,常规权限无法满足需求,这时就需要借助特殊权限来实现更精细的访问控制。
SUID(Set UID) 【以拥有者身份运行】
当一个设置了 SUID 权限的程序被执行时,内核会将进程的有效用户 ID(Effective User ID)临时设置为文件所有者的用户 ID,而实际用户 ID(Real User ID)保持不变。这样,在程序执行期间,该进程就具有了文件所有者的权限。
【监控代码:watch -n 1 "ps ax -o user,group,comm | grep cat ;ls -l /bin/cat"】
chmod 4_ _ _原属性 file 【代码进程更改不了拥有者u,g后o可改】
chmod u+s file
实验: #用root用户身份 chmod u+s /bin/watch
su - lee su - lee
/bin/cat /bin/cat
ps ax -o user,group,comm | grep cat ps ax -o user,group,comm | grep cat
显示结果:lee lee cat ——> root lee cat
u g o
SGID(Set GID) 【以组文件运行】
对于可执行文件,当设置了 SGID 权限的程序被执行时,进程的有效组 ID(Effective Group ID)会临时被设置为文件所属组的组 ID。对于目录,设置了 SGID 权限后,在该目录下创建的新文件和子目录将自动继承该目录的组,而不是创建者的默认组。
#sgid 强制位
#针对目录: 目录中新建的文件自动归属到目录的所属组中 【当目录开启sgid权限,那在这个目录中建立的新文件都属于目录拥有组,对设定权限前文件不生效】
设定:
chmod 2_ _ _源文件权限 dir 【如果UID也开2改成6】
chmod g+s dir
编译: # chmod g+s /bin/cat
运行结果:
实验
groupadd test
mkdir /mnt/public
chgrp test /mnt/public
chmod 777 /mnt/public
lee ---> touch /mnt/public/file ##是谁建立的文件组就是谁的 chmod g+s /mnt/timinglee
lee ---> touch /mnt/public/file1 ##file1自动复制了/mnt/public目录组 #只针对二进制的可执行文件(c程序),当开启sgid的二进制可执行文件被任何用户调用,产生的进程都属于二进制可执行文件的所有组,和执行者组身份没关系。
实验: 用root用户身份
su - lee
/bin/cat
watch -n 1 "ps ax -o user,group,comm | grep cat"
显示结果:lee lee cat
chmod g+s /bin/cat
su - lee
/bin/cat
ps ax -o user,group,comm | grep cat
显示结果:lee root cat 和执行者组身份没关系了
Sticky Bit
Sticky Bit 权限通过在目录权限上设置一个特殊标志来实现上述功能。它限制了用户对目录中文件的删除和重命名操作,只有满足特定条件的用户才能执行这些操作
#stickyid 粘制位 【T权限】
#针对目录: #如果一个目录stickyid开启,那么这个目录中的文件只能被文件所有人删除
chmod 1_ _ _原始权限 dir
chmod o+t dir
实验:
mkdir /pub
chmod 777 /pub
su - lee ---->$ touch /pub/leefile
exit
su - timinglee --------> $ touch /pub/timingleefile
rm -fr /pub/leefile #可以删除
rm -fr /pub/timingleefile #不属于自己的文件也可以删除
如何解决此问题:
chmod 1777 /pub
chmod o+t /pub
以上两条命令都可以开启pub目录的t权限【当一个日录other位开启T权限那么这个目录中的文件只能被文件所有人删除】
su - timinglee ----> $ touch /pub/timingleefile
exit
su - lee --------> $ touch /pub/leefile
rm -fr /pub/leefile #可以删除
rm -fr /pub/timingleefile #不属于自己的文件不能删除
显示结果:rm: cannot remove 'timingleefile': Operation not permitted
或是
ACL权限列表
ACL简介
ACL(Access Control Lists,访问控制列表)是一种灵活的权限管理机制,用于在 Linux 系统中对文件和目录设置更细致的权限。传统的 Linux 文件权限模型基于所有者(owner)、所属组(group)和其他用户(others)进行权限分配,分别对应读(r)、写(w)、执行(x)权限。然而,这种模型在一些复杂的场景下显得不够灵活。例如,当需要给特定用户或组超出传统权限模型的权限时,ACL 就派上了用场。通过 ACL,可以针对单个用户或组设置独立的读、写、执行权限,从而实现更精细的访问控制。
ACL权限列表的读取
ACL权限开启标识
#acl列表开启标识 【watch -n 1 "ls -lR /mnt/;getfacl /mnt/timinglee"】
-rw-rw---- 1 root caiwu 0 Apr 18 09:03 lee
^ 没有"+"代表acl列表未开启
-rw-rw----+ 1 root caiwu 0 Apr 18 09:03 lee
^ acl列表功能开启
acl列表的控制 【 : 目标 : 用户 : 更改的设定 u和g是更改目标
setfacl -m u:lee:rw /mnt/timinglee/ # m设定更改,lee为更改的用户
setfacl -m g:root:0 /mnt/timinglee/ # root和lee只能存在一个组
setfacl -m u::rwx /mnt/timinglee/
setfacl -m g::0 /mnt/timinglee/
setfacl -x u:lee /mnt/timinglee/ ## x删除列表中的lee
setfacl -b /mnt/timinglee/ #关闭
更改的位置: u:: 改的是user g::改的是group