
思考如何实现如下的权限控制:
初步思路:
问题:
操作流程:
- #1,添加测试目录,用户,组,并将用户添加到组
- #创建一个目录
- [root@localhost ~]# mkdir /project
- #创建一个用户
- [root@localhost ~]# useradd swt
- [root@localhost ~]# useradd dhy
- #创建一个组
- [root@localhost ~]# groupadd tgroup
- #将swt加入到组中
- [root@localhost ~]# gpasswd -a swt tgroup
- 正在将用户“swt”加入到“tgroup”组中
- #将dhy加入到组中
- [root@localhost ~]# gpasswd -a dhy tgroup
- 正在将用户“dhy”加入到“tgroup”组中
- #可以查看组是否建立成功
- [root@localhost ~]# cat /etc/group
- root:x:0:
- bin:x:1:
- daemon:x:2:
- sys:x:3:
- adm:x:4:
- tty:x:5:
- disk:x:6:
- lp:x:7:
- mem:x:8:
- kmem:x:9:
- wheel:x:10:
- cdrom:x:11:
- mail:x:12:postfix
- man:x:15:
- dialout:x:18:
- floppy:x:19:
- games:x:20:
- tape:x:33:
- video:x:39:
- ftp:x:50:
- lock:x:54:
- audio:x:63:
- nobody:x:99:
- users:x:100:
- utmp:x:22:
- utempter:x:35:
- input:x:999:
- systemd-journal:x:190:
- systemd-network:x:192:
- dbus:x:81:
- polkitd:x:998:
- libstoragemgmt:x:997:
- ssh_keys:x:996:
- abrt:x:173:
- rpc:x:32:
- sshd:x:74:
- slocate:x:21:
- postdrop:x:90:
- postfix:x:89:
- chrony:x:995:
- ntp:x:38:
- tcpdump:x:72:
- stapusr:x:156:
- stapsys:x:157:
- stapdev:x:158:
- swt:x:1000:
- dhy:x:1001:
- tgroup:x:1002:swt,dhy
- #2,修改目录的所有者和所属组
- [root@localhost ~]# chown root:tgroup /project
- [root@localhost ~]# ll -d /project
- drwxr-xr-x. 2 root tgroup 6 3月 15 11:57 /project
- #3,设定权限
- [root@localhost ~]# chmod 770 /project
- [root@localhost ~]# ll -d /project
- drwxrwx---. 2 root tgroup 6 3月 15 11:57 /project
- #4,此时需要为临时用户进行分配权限,r-x
- # 添加临时用户
- [root@localhost ~]# useradd tempuser
- [root@localhost ~]# passwd tempuser
- 更改用户 tempuser 的密码 。
- 新的 密码:
- 无效的密码: 密码少于 8 个字符
- 重新输入新的 密码:
- 抱歉,密码不匹配。
- 新的 密码:
- 无效的密码: 密码少于 8 个字符
- 重新输入新的 密码:
- passwd:所有的身份验证令牌已经成功更新。
- # 为临时用户分配权限
- [root@localhost ~]# setfacl -m u:tempuser:rx /project
- [root@localhost ~]# 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::---
- # 查看目录权限,注意+,表示文件或目录由acl权限
- [root@localhost ~]# ll -d /project
- drwxrwx---+ 2 root tgroup 6 3月 15 11:57 /project
- #5,验证acl权限
- #切换到tempuser用户
- [root@localhost ~]# su tempuser
- # 进入到tempuser目录
- [tempuser@localhost root]$ cd /project
- # 创建一个test.txt文件,明显权限不够
- [tempuser@localhost project]$ touch test.txt
- touch: 无法创建"test.txt": 权限不够
- #切换到管理员
- [tempuser@localhost project]$ su root
- 密码:
- #6,控制组acl权限
- # 创建一个temp组
- [root@localhost project]# groupadd temp
- # 设置组的acl权限
- [root@localhost project]# setfacl -m g:temp:rx /project
- # 查看设置后的acl
- [root@localhost 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::---
- # 创建一个用户,并将该用户设置为temp组
- [root@localhost project]# useradd tempu02
- [root@localhost project]# passwd tempu02
- 更改用户 tempu02 的密码 。
- 新的 密码:
- 无效的密码: 密码少于 8 个字符
- 重新输入新的 密码:
- passwd:所有的身份验证令牌已经成功更新。
- # 将用户添加到temp组中
- [root@localhost project]# gpasswd -a tempu02 temp
- 正在将用户“tempu02”加入到“temp”组中
- # 验证
- [root@localhost project]# su tempu02
- # 可以进入目录
- [tempu02@localhost project]$ cd /project
- [tempu02@localhost project]$ ls
- # 不能创建文件
- [tempu02@localhost project]$ touch aa.txt
- touch: 无法创建"aa.txt": 权限不够
-
看下面的信息:
- [root@localhost ~]# 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::---
最大权限是什么?
如果给用户赋予了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不会影响文件所有者的权限
实验:
- #设置mask
- [root@localhost ~]# setfacl -m:rx /project
- # 查看mask
- [root@localhost ~]# getfacl /project
- getfacl: Removing leading '/' from absolute path names
- # file: project
- # owner: root
- # group: tgroup
- user::r-x
- user:tempuser:r-x
- group::rwx
- # 所属组虽然设置的权限为rwx,但实际的权限r-x
- group:temp:r-x
- # 修改之后的mask
- mask::rwx
- other::---
- # 删除指定acl其权限
- [root@localhost ~]# setfacl -x u:tempuser /project
- # 查看acl权限
- [root@localhost ~]# getfacl /project
- getfacl: Removing leading '/' from absolute path names
- # file: project
- # owner: root
- # group: tgroup
- user::r-x
- group::rwx
- group:temp:r-x
- mask::rwx
- other::---
-
- # 删除所有acl权限
- [root@localhost ~]# setfacl -b /project
- [root@localhost ~]# getfacl /project
- getfacl: Removing leading '/' from absolute path names
- # file: project
- # owner: root
- # group: tgroup
- user::r-x
- group::rwx
- other::---
-
- # 注意 权限没有+
- [root@localhost ~]# ll -d /project
- dr-xrwx---. 2 root tgroup 6 3月 15 11:57 /project
所属递归:指定目录下的所有文件及其子目录,都具体指定的ACL权限属性
注意:ACL权限只对已有的文件或目录起作用,对新加的不起作用
acl的默认值:如果希望新加的文件或目录都具有父目录所拥有的ACL权限属性,则需要设置默认值
- # 切换到project目录
- [root@localhost ~]# cd /project
- # 设置acl权限
- [root@localhost project]# setfacl -m u:tempuser:rx /project
- [root@localhost project]# ll -d
- dr-xrwx---+ 2 root tgroup 6 3月 15 11:57 .
- # project目录已经设置好了ACL权限,在该目录中添加一个文件,文件并不具有ACL权限,因为在设置ACL权限时并没有指定递归属性
- [root@localhost project]# touch abc.txt
- [root@localhost project]# ll
- 总用量 0
- -rw-r--r--. 1 root root 0 3月 15 18:35 abc.txt
- # 设置ACL权限可以递归,注意:R参数的位置在此处是固定的,这算是Linux中命令的一个特例,Linux中命令参数的位置一般是不敏感的
- [root@localhost project]# setfacl -m u:tempuser:rx -R /project
- [root@localhost project]# ll /project
- 总用量 0
- -rw-r-xr--+ 1 root root 0 3月 15 18:35 abc.txt
- # 在设置了project目录递归ACL权限属性后,再在该目录中创建一个新的文件,此时发现新的文件并没有ACL权限,这说明ACL权限只对已有的文件或目录起作用,对新加的不起作用
- [root@localhost project]# touch def.txt
- [root@localhost project]# ll
- 总用量 0
- -rw-r-xr--+ 1 root root 0 3月 15 18:35 abc.txt
- -rw-r--r--. 1 root root 0 3月 15 18:36 def.txt
- # 设置acl默认值,默认值的参数是d,可以和-R一起使用
- [root@localhost project]# setfacl -m d:u:tempuser:rx -R /project[root@localhost project]# getfacl /project
- getfacl: Removing leading '/' from absolute path names
- # file: project
- # owner: root
- # group: tgroup
- user::r-x
- user:tempuser:r-x
- group::rwx
- mask::rwx
- other::---
- default:user::r-x
- default:user:tempuser:r-x
- default:group::rwx
- default:mask::rwx
- default:other::---
-
- [root@localhost project]# touch www.txt
- [root@localhost project]# ll
- 总用量 0
- -rw-r-xr--+ 1 root root 0 3月 15 18:35 abc.txt
- -rw-r--r--. 1 root root 0 3月 15 18:36 def.txt
- # 该文件在设置规则之后,默认值之前创建,两头都不管,所以没有ACL权限属性
- -r--rw----+ 1 root root 0 3月 15 18:37 www.txt
什么是SUID?
为什么需要SUID?
Linux中具有suid权限的文件,如passwd
- [root@localhost ~]# whereis passwd
- passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
- [root@localhost ~]# ll /usr/bin/passwd
- -rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
- [root@localhost ~]#
注意:passwd的权限中在文件所有者的权限中有一个“s”,这说明:
为什么需要这么设置权限?
SBIT权限的特点:
- # Linux中的tmp目录是使用SBIT权限的典型目录,注意权限部分最后的t字母
- [root@localhost ~]# ll -d /tmp
- drwxrwxrwt. 10 root root 218 10月 2 16:05 /tmp
- # 创建一个新用户,并设置密码
- [root@localhost ~]# useradd test
- [root@localhost ~]# passwd test
- # 切换到lisen用户,在/tmp目录下创建文件
- [lisen@localhost root]$ touch /tmp/abcd.txt
- # 切换到test用户,删除/tmp/目录下的abcd.txt文件,因为tmp目录具有SBIT权限,且abcd.txt
- # 文件不是当前用户创建,所以无权删除。
- [test@localhost root]$ cd /tmp
- [test@localhost tmp]$ ls
- abcd.txt
- abc.txt
- systemd-private-a092fa5008e44207b2cdbcae85170c80-chronyd.service-WocDs1
- test
- vmware-root_665-3988687359
- [test@localhost tmp]$ rm abcd.txt
- rm:是否删除有写保护的普通空文件 "abcd.txt"?y
- rm: 无法删除"abcd.txt": 不允许的操作
- # ---- 设置SBIT权限 ----
- [root@localhost /]# mkdir /test
- # 创建的目录默认的权限是755
- [root@localhost /]# ll -d /test
- drwxr-xr-x. 2 root root 6 10月 2 17:33 /test
- # 设置SBIT权限
- [root@localhost /]# chmod 1755 /test
- [root@localhost /]# ll -d /test
- drwxr-xr-t. 2 root root 6 10月 2 17:33 /test
- # 上面的设置test的其他用户没有写入的权限,所以SBIT权限的没有什么含义
- [root@localhost ~]# chmod 1777 /test
- [root@localhost ~]# ll -d /test
- drwxrwxrwt. 2 root root 6 10月 2 17:33 /test
相对于SUID只能设置可执行的文件,SGID可以设置可执行文件,也可以设置目录,SGID有如下特征:
使用案例
- # 到根目录去
- [root@localhost /]# cd ~
- # centos7 默认没有安装locate 先执行安装
- [root@localhost ~]# yum install mlocate
- 已加载插件:fastestmirror, langpacks
- There are no enabled repos.
- Run "yum repolist all" to see the repos you have.
- To enable Red Hat Subscription Management repositories:
- subscription-manager repos --enable <repo>
- To enable custom repositories:
- yum-config-manager --enable <repo>
- [root@localhost ~]# updatedb
- [root@localhost ~]# locate inittab
- /etc/inittab
- /usr/share/augeas/lenses/dist/inittab.aug
- /usr/share/man/zh_CN/man5/inittab.5.gz
- /usr/share/vim/vim74/syntax/inittab.vim
- # 查看locate命令,注意权限 所属组部分的s,这个s即表示开启了SGID,在执行该
- # 命令时,会在执行期间临时将组身份升级为该文件的所属组
- [root@localhost ~]# ll /usr/bin/locate
- -rwx--s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate
- # locate命令需要使用mlocate.db文件,但该文件默认情况下普通用户是没有权限读的,当用户
- # 运行locate命令时,临时获取了SGID属性,组身份升级为了该文件的所属组,所以具有了对
- # mlocate文件的读权限。
- [root@localhost ~]# ll /var/lib/mlocate/mlocate.db
- -rw-r-----. 1 root slocate 855084 3月 15 18:51 /var/lib/mlocate/mlocate.db
- # ---- 为目录设置SGID的示例 -----
- # 查看当前目录
- [root@localhost ~]# pwd
- /root
- # 在tmp目录下创建一个目录
- [root@localhost ~]# mkdir /tmp/test
- # 给test赋予SGID的权限,(第一2表示SGID),如果需要清除SGID则可以使用 777
- # 也可以使用 chmod g+s 文件或目录名
- [root@localhost ~]# chmod 2777 /tmp/test
- # 权限所属组部分的s,表示拥有SGID权限
- [root@localhost ~]# ll -d /tmp/test
- drwxrwsrwx. 2 root root 6 10月 2 14:58 /tmp/test
- # 切换用户
- [root@localhost ~]# su lisen
- [lisen@localhost root]$ pwd
- /root
- # 普通用户无权在root目录下创建文件
- [lisen@localhost root]$ touch abc.txt
- touch: 无法创建"abc.txt": 权限不够
- # 在home目录下创建一个文件,文件的默认的所属组为,当前用户的所属组
- [lisen@localhost root]$ cd /home/lisen
- [lisen@localhost ~]$ touch abc.txt
- [lisen@localhost ~]$ ll
- 总用量 0
- -rw-rw-r--. 1 lisen lisen 0 10月 2 15:01 abc.txt
- # 在设置了SGID的目录中,创建文件,默认的所属组变成了目录的所属组,这是SGID的作用
- [lisen@localhost ~]$ cd /tmp/test
- [lisen@localhost test]$ touch bcd.txt
- [lisen@localhost test]$ ll
- 总用量 0
- -rw-rw-r--. 1 lisen root 0 10月 2 15:01 bcd.txt
- [lisen@localhost test]$
命令格式: chattr [+-=] [权限选项] 文件或目录, + 增加权限, -删除权限, =赋予权限
权限选项:
使用示例
- # 文件chattr属性示例
- # 文件的i属性
- # 创建一个文件,先不为其设置i属性,此时可以正常写入内容
- [root@localhost ~]# touch abc
- [root@localhost ~]# ll
- 总用量 4
- -rw-r--r--. 1 root root 0 3月 15 19:11 abc
- -rw-------. 1 root root 1284 3月 9 20:16 anaconda-ks.cfg
- drwxr-xr-x. 2 root root 6 3月 11 16:06 a.txt
- drwxr-xr-x. 2 root root 6 3月 11 16:05 sa
- [root@localhost ~]# echo 12345 > abc
- [root@localhost ~]# cat abc
- 12345
- # 为abc文件设置i属性
- [root@localhost ~]# chattr +i abc
- # 一般ls命令不能显示文件的i属性,需要使用lsattr命令
- [root@localhost ~]# lsattr -a abc
- ----i----------- abc
- # 设置了abc文件的i属性后,测试修改其内容,无权修改,删除也不行
- [root@localhost ~]# echo swt >> abc
- -bash: abc: 权限不够
- [root@localhost ~]# rm abc
- rm:是否删除普通文件 "abc"?y
- rm: 无法删除"abc": 不允许的操作
- # 目录的i属性示例
- [root@localhost ~]# mkdir /test
- mkdir: 无法创建目录"/test": 文件已存在
- [root@localhost ~]# cd /test
- [root@localhost test]# ll
- 总用量 0
- # 没有设置chattr属性之前,可以添加文件
- [root@localhost test]# touch a.txt
- [root@localhost test]# ls
- a.txt
- # 设置chattr属性之后,可以对原来的目录中有的文件进行修改,但不能在目录中
- # 添加或删除文件(报权限不够)
- [root@localhost test]# chattr +i /test
- [root@localhost test]# lsattr -a /test/
- ----i----------- /test/.
- ---------------- /test/..
- ---------------- /test/a.txt
- [root@localhost test]# echo asas >> /test/a.txt
- [root@localhost test]# touch /test/b.txt
- touch: 无法创建"/test/b.txt": 权限不够
- [root@localhost test]# touch a.txt
- [root@localhost test]# chattr +a a.txt
- # 将内容写入文件
- [root@localhost test]# echo 123 > a.txt
- -bash: a.txt: 不允许的操作
- # 将内容追加到文件
- [root@localhost test]# echo sad >> a.txt
- [root@localhost test]# cat a.txt
- asas
- sad
- [root@localhost test]# cd /
- #目录的a属性
- [root@localhost /]# mkdir swt
- [root@localhost /]# chattr +a swt
- [root@localhost /]# cd /swt
- [root@localhost swt]# touch a.txt
- [root@localhost swt]# rm a.txt
- rm:是否删除普通空文件 "a.txt"?y
- rm: 无法删除"a.txt": 不允许的操作
- [root@localhost swt]# mv a.txt b.txt
- mv: 无法将"a.txt" 移动至"b.txt": 不允许的操作
作用:
使用场景:
修改sudo的配置(/etc/sudoers):
- # 查看或修改sudo的配置,也可以直接编辑/etc/sudoers文件
- [root@localhost ~]# 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. 使用命令
- ## 的绝对路径
- 如果要退出的话就ctrl+z
注意事项:
主要不要将vim等编辑工具配置到sudo中去,如果在sudo的配置文件中配置了vim,则普通用户在运行vim中就拥有了超级用户的身份,这是很危险的,使用普通用户有权修改任何文件。
用户,用户组,其他人
由于Linux是一个多人多任务的系统,因此经常会出现同一台机器同时有多个人进行操作,为了考虑每个人的隐私权以及每个人喜好的工作环境,所以文件的权限归属就至关重要。
为了保障系统的安全性和文件的隐私性,一个文件针对不同权限的账户有着不同的权限,如下图
如图所示,文件权限是由一个字符串所表示,其所代表的含义为

其中,文档类型有如下表示方法:
d - 目录,例如上表档名为『.gconf』的那一行;
- - 文档,例如上表档名为『install.log』那一行;
l - 连结档(link file);
b - 装置文件里面的可供储存的接口设备(可随机存取装置);
c - 装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
权限由rwx三个字幕表示,分别表示为可读、可写、可执行,如果没有该权限,则用“ - ”表示,对于目录来说,必须有x权限,否则无法读取目录内容
如果文件名前面有“ . ”,则表示这个文档或目录是隐藏的
用户和用户组
/etc/group 存储当前系统中的用户组信息

注意:
1.当该组内只有一个用户,并且用户名和组名相同时,在组列表中,包含用户一列可以为空
2.系统中root分组的组编号一定为0
3.组号1~499为系统预留的组编号,一般是预留给系统安装的软件或者服务的编号,越早安装的软件或者服务的组编号约早。用户手动创建的用户组编号从500开始
4.组密码占位符,无一例外,全部用x表示
/etc/gshadow 存储当前系统中用户组的密码信息

注意:
1.如果组密码处为“*” “!”或者为空时候,则该组没有密码
2.如果组管理者为空,则表示该组内所有成员都可以管理该组
/ect/passwd 存储当前系统中所有的用户信息

注意:
在linux中,超级管理员root的用户编号一定为0
/ect/shadow 存储当前系统中所有用户的密码信息

注意:
密码是一个单向加密过的字符串
创建用户:
useradd xxx //创建一个名为xxx的用户
该命令执行后
1.会在/etc/passwd文件中添加xxx用户的信息
2.会在/etc/group文件中添加一个名为xxx的用户组信息
passwd xxx //为xxx用户设置密码
useradd可以使用的参数包含
-d 设置该用户的home目录
例如:useradd -d /home/helloworld hello //新建hello用户,并且将其home目录设置为/home/helloworld
-u 设置其userid
例如:useradd -u 668 hello //新建一个hello用户,将他的id设置为668
-g 设置其主组
例如:useradd -g root hello //新建一个hello用户,并将其假如root组
-m 生成home目录的文件夹
例如:useradd -m hello //新建一个hello用户,并且在默认位置申城一个hello文件夹(/home/hello),并且将/etc/skel下的文件复制到该目录下
修改用户信息
usermod 参数 用户名
该命令可以使用的参数包括
-l //修改新用户名
例如:usermod -l helloworld hello 将hello用户名改为helloworld,但其home目录不改变
-u //修改用户的userid
例如:usermod -u 888 hello 将hello的userid改为888
-d //修改用户的home目录
-g //修改用户的主用户组
-L //锁定用户,使其不能登录
-U //解除锁定
删除用户
userdel 参数 用户名
可使用参数
-r 删除用户的同时将其home目录也删掉
创建用户组
groupadd 组名
修改用户组
groupmod -n 新组名 旧组名 //修改组名
groupmod -g 新组id 旧组id 修改组ID
删除用户组
groupdel 组名
改变文档(目录)的所有者(所有组)
改变文档所有者 - chown命令(change owner),可使用参数 -R使得其子目录也同时修改
改编文档所有组 - chgrp命令 (change group),可使用参数 -R使得其子目录也同时修改
也可以使用
chown username:group 文件名 来同时修改文档或目录的拥有者和所在组 修改文档的执行权限 chmod命令 chmod 参数 文件名 可以使用如下方法直接设置文件的权限
1.直接设置代表权限的数字
chmod 777(对应权限的数字) 文件名
2.给文件添加或减去某些权限
chmod u+w 文件名 给user用户加上w权限
chmod g-r 文件名 将group中的r权限去掉
chmod a+x 文件名 给user、group、other全部加上x权限