Linux值得学习的原因绝不仅仅是因为开源,而是因为Linux系统是一款非常优秀的产品
文件的特殊权限
在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有了SUID、SGID与SBIT的特殊权限位。
1. SUID
SUID可以让执行者临时获得所有人的权限
[root@linuxprobe ~]# ls -l /bin/passwd -rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd
命令:chmod -R u+s 目录 参数:-R 表示对目录使用
[root@localhost ~]# ls -ld /home/linuxprobe/ 查看/home/linuxprobe目录的权限 drwx------. 5 linuxprobe linuxprobe 4096 Feb 28 21:20 /home/linuxprobe/ [root@localhost ~]# chmod -R u+s /home/linuxprobe/ 为该目录设置SUID权限 [root@localhost ~]# ls -ld /home/linuxprobe/ 再次查看该目录权限 drws------. 5 linuxprobe linuxprobe 4096 Feb 28 21:20 /home/linuxprobe/
查看/home/linuxprobe目录属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。另外有读者会好奇,那么如果原本的权限是rw-呢?如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
2. SGID
SGID主要实现如下两种功能:
1)可以让执行者临时获得所有组的权限
2)可以对目录使用SGID,使目录内创建的文件全部继承所有组的属性(用于共享目录)
命令:chmod -R g+s 目录
[root@localhost ~]# ls -ld /home/linuxprobe/ 查看/home/linuxprobe目录的属性 drws------. 5 linuxprobe linuxprobe 4096 Feb 28 21:20 /home/linuxprobe/ [root@localhost ~]# chmod -R g+s /home/linuxprobe 为该目录设置SGID权限 [root@localhost ~]# ls -ld /home/linuxprobe/ drws--S---. 5 linuxprobe linuxprobe 4096 Feb 28 21:20 /home/linuxprobe/ [root@localhost ~]#
查看/home/linuxprobe目录属性时发现所有者的权限由---变成了--S,其中-改变成S就意味着该文件被赋予了SGID权限。另外有读者会好奇,那么如果原本的权限是--x呢?如果原先权限位已经存在x执行权限,那么被赋予特殊权限后将变成小写的s。
[root@localhost ~]# useradd zhangsan 创建用户张三 [root@localhost ~]# [root@localhost ~]# chmod -R 777 /home/linuxprobe 给/home/linuxprobe赋予一般权限777 [root@localhost ~]# [root@localhost ~]# ls -ld /home/linuxprobe/ 查看/home/linuxprobe目录 发现所有者所有组都是linuxprobe drwsrwsrwx. 5 linuxprobe linuxprobe 4096 Feb 28 21:20 /home/linuxprobe/ [root@localhost ~]# [root@localhost ~]# id zhangsan 查看张三的基本组和扩展组名称 uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan) [root@localhost ~]# [root@localhost ~]# su - zhangsan 切换为张三用户 [zhangsan@localhost ~]$ [zhangsan@localhost ~]$ touch /home/linuxprobe/zhangsan 在/home/linuxprobe目录下创建文件zhangsan [zhangsan@localhost ~]$ ls -l /home/linuxprobe/zhangsan 查看zhangsan文件的属性 -rw-rw-r--. 1 zhangsan linuxprobe 0 Feb 29 10:40 /home/linuxprobe/zhangsan 发现所有者为zhangsan,所有组为Linuxprobe(继承了目录所有组的属性)
3.SBIT
粘滞位:为了方便记忆我们暂且称之为保护位,主要是为了防止有人会误删你创建的文件
设置了SBIT之后,只有文件的所有者才能删除该文件
命令:chmod -R o+t 目录
[linuxprobe@localhost ~]$ cd /tmp 进入/tmp目录 [linuxprobe@localhost tmp]$ ls -ld /tmp 查看/tmp目录的属性 drwxrwxrwt. 13 root root 4096 Feb 29 11:07 /tmp [linuxprobe@localhost tmp]$ echo "hello world" > readme.txt 创建一个文件,随便写入一些内容 [linuxprobe@localhost tmp]$ ls -ld /tmp/readme.txt 查看该文件属性 -rw-rw-r--. 1 linuxprobe linuxprobe 12 Feb 29 11:07 /tmp/readme.txt [linuxprobe@localhost tmp]$ su - zhangsan 切换至zhangsan用户 Password: Last login: Sat Feb 29 11:04:42 CST 2020 on pts/0 [zhangsan@localhost ~]$ rm -f /tmp/readme.txt 试图删除readme.txt文件 rm: cannot remove ‘/tmp/readme.txt’: Operation not permitted [zhangsan@localhost ~]$ rm -rf /tmp/readme.txt 删除无效 rm: cannot remove ‘/tmp/readme.txt’: Operation not permitted
与前面所讲的SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T
文件的隐藏属性
Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限
使用传统的ls -al是无法查看到的,只能使用lsattr才可以查看到
命令:chattr 负责添加或者删除隐藏属性
lsattr 负责查看隐藏属性
[root@localhost ~]# echo "welcome to linuxprobe" > readme.txt 创建一个文件并随便写一些内容
[root@localhost ~]# ls -ld readme.txt 查看readme.txt的属性,并无任何异常 -rw-r--r--. 1 root root 22 Feb 29 11:19 readme.txt [root@localhost ~]# chattr +a readme.txt 使用chattr为该文件赋予隐藏属性 a:表示只能追加内容,不可以清空内容 +a:表示添加该属性 -a:表示移除该属性 [root@localhost ~]# lsattr readme.txt 使用lsattr发现了该文件的隐藏属性 -----a---------- readme.txt [root@localhost ~]# echo "111" >> readme.txt 此时发现可以追加内容 [root@localhost ~]# echo "111" > readme.txt 然而并不能清空内容 -bash: readme.txt: Operation not permitted
文件访问控制列表
前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了
只有root用户才能访问/root,其他用户是没有这个权限的,通过设置setfacl 可以实现Linuxprobe用户访问/root目录的操作
命令:setfacl 用于设置ACL
getfacl 用于查看ACL属性
[root@localhost ~]# setfacl -Rm u:linuxprobe:rwx /root 设置setfacl, -R:表示对目录 -m:表示对普通文件 u:表示针对用户 [root@localhost ~]# ls -ld /root 查看/root目录的属性,发现末尾的.变成了+ 代表设置了setfacl dr-xrwx---+ 14 root root 4096 Feb 29 11:19 /root [root@localhost ~]# su - linuxprobe 切换至linuxprobe用户 Last login: Sat Feb 29 11:30:15 CST 2020 on pts/0 [linuxprobe@localhost ~]$ ls /root 查看/root目录内容 anaconda-ks.cfg Downloads Pictures Templates Desktop initial-setup-ks.cfg Public Videos Documents Music readme.txt [linuxprobe@localhost ~]$ cd /root 进入/root目录 [linuxprobe@localhost root]$
红色标注操作在未使用setfacl时是无法操作的。
接下来通过getfacl来查看/root目录下的使用权限,发现user:一栏中 Linuxprobe用户拥有读写执行权限
linuxprobe@localhost root]$ getfacl /root getfacl: Removing leading '/' from absolute path names # file: root # owner: root # group: root user::r-x user:linuxprobe:rwx group::r-x mask::rwx other::--- [linuxprobe@localhost root]$
su命令与sudo服务
su
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从root管理员切换至普通用户
[linuxprobe@localhost ~]$ su linuxprobe Password: [linuxprobe@localhost ~]$ [linuxprobe@localhost ~]$ su root Password: [root@localhost linuxprobe]# [root@localhost linuxprobe]# su - linuxprobe Last login: Sat Feb 29 12:43:38 CST 2020 on pts/0 [linuxprobe@localhost ~]$
su 命令可以切换用户
su - 命令同样可以切换用户,并且将环境变量完全切换过来
sudo
sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务(适当放权),格式为“sudo [参数] 命令名称”
[linuxprobe@localhost ~] visudo
使用visudo命令进入编辑器
:set nu 命令显示行号
使用ESC键后输入:set nu,在99行左右的位置输入如下内容
99 linuxprobe ALL=(root) /usr/sbin/reboot
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
linuxprobe表示对谁进行放权
ALL表示主机地址来源为任意地址
(root)表示可以使用谁的权限,可以使用root或者ALL
最后/user/sbin/reboot为reboot命令的绝对路径,可以通过whereis reboot查看
这里注意必须要使用绝对路径
[root@localhost ~]# su - linuxprobe 切换为linuxprobe用户 Last login: Sat Feb 29 12:57:47 CST 2020 on :0 [linuxprobe@localhost ~]$ [linuxprobe@localhost ~]$ [linuxprobe@localhost ~]$ reboot 尝试重启,但是失败了 User root is logged in on seat0. Please retry operation after closing inhibitors and logging out other users. Alternatively, ignore inhibitors and users with 'systemctl reboot -i'. [linuxprobe@localhost ~]$ [linuxprobe@localhost ~]$ sudo reboot 使用sudo命令进行重启 [sudo] password for linuxprobe: 输入Linuxprobe用户的密码后即可重启