简介
主要学习第五章节文件的权限和归属,文件的特殊属性,文件的隐藏属性,文件的访问控制列表以及su命令与sudo服务。
内容详情可参考:https://www.linuxprobe.com/chapter-05.html
命令行详解可参考:https://www.linuxcool.com
文件的权限和归属
Linux系统中一切都是文件,不同文件类型常见的字符如下:
-:普通文件
d:目录文件
l:链接文件
b:块设备文件
c:字符设备文件
p:管道文件
对于一般文件:
r “可读”表示能够读取文件的实际内容
w “可写”表示能够编辑、新增、修改、删除文件的实际内容
x “可执行”则表示能够运行一个脚本程序
对于目录文件:
r “可读”表示能够读取目录内的文件列表
w “可写”表示能够在目录内新增、删除、重命名文件
x “可执行”则表示能够进入该目录
文件权限的数字表示法:
文件的读、写、执行权限可以简写为rwx,亦可分别用数字4、2、1来表示.
文件的特殊权限
SUID
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。
如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
ls -l /etc/shadow
----------. 1 root root 1004 Jan 3 06:23 /etc/shadow
ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd
SGID
SGID主要实现如下两种功能:
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限,如ps命令
ls -l ps
-r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps
SGID的第二个功能,在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)
cd /tmp
mkdir testdir
ls -ald testdir/
drwxr-xr-x. 2 root root 6 Feb 11 11:50 testdir/
chmod -Rf 777 testdir/
chmod -Rf g+s testdir/
ls -ald testdir/
drwxrwsrwx. 2 root root 6 Feb 11 11:50 testdir/
# 切换至一个普通用户,尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称
su - linuxprobe
Last login: Wed Feb 11 11:49:16 CST 2017 on pts/0
cd /tmp/testdir/
echo "linuxprobe.com" > test
ls -al test
-rw-rw-r--. 1 linuxprobe root 15 Feb 11 11:50 test
chmod命令----能够用来设置文件或目录的权限
格式为“chmod [参数] 权限 文件或目录名称”
chown命令----设置文件或目录的所有者和所属组
格式为“chown [参数] 所有者:所属组 文件或目录名称”
chmod和chown命令二者针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内所有的文件进行整体操作.
SBIT
SBIT(Sticky Bit)特殊权限位(也可以称之为特殊权限位之粘滞位)或者“保护位”
确保用户只能删除自己的文件,而不能删除其他用户的文件.
即当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。
当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
SBIT特殊权限的设置:
chmod -R o+t linux/
ls -ld linux/
drwxr-xr-t. 2 root root 6 Feb 11 19:34 linux/
文件的隐藏属性
隐藏权限-----被隐藏起来的权限,默认情况下不能直接被用户发觉.
chattr命令
chattr命令----用于设置文件的隐藏权限
格式为“chattr [参数] 文件”
如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。
chattr命令中用于隐藏权限的参数及其作用:
参数 作用
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S 文件内容在变更后立即同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A 不再修改这个文件或目录的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用dump命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
x 可以直接访问压缩文件中的内容
lsattr命令
lsattr命令----用于显示文件的隐藏权限
格式为“lsattr [参数] 文件”
在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看,平时使用的ls之类的命令则看不出端倪:
[root@linuxprobe ~]# ls -al linuxprobe
-rw-r–r--. 1 root root 9 Feb 12 11:42 linuxprobe
一旦使用lsattr命令后,文件上被赋予的隐藏权限马上就会原形毕露。此时可以按照显示的隐藏权限的类型(字母),使用chattr命令将其去掉
文件访问控制列表
文件的访问控制列表(ACL)主要用于对某个指定的用户进行单独的权限控制
通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。
如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;
若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
setfacl命令
setfacl命令----用于管理文件的ACL规则
格式为“setfacl [参数] 文件名称”
文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。
其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。
setfacl -Rm u:linuxprobe:rwx /root
su - linuxprobe
Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1
cd /root
怎么去查看文件上有那些ACL呢?
常用的ls命令是看不到ACL表信息的,但是却可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL了。
ls -ld /root
dr-xrwx---+ 14 root root 4096 May 4 2017 /root
getfacl命令
getfacl命令----用于显示文件上设置的ACL信息
格式为“getfacl 文件名称”
Linux系统中的命令就是这么又可爱又好记。想要设置ACL,用的是setfacl命令;要想查看ACL,则用的是getfacl命令。下面使用getfacl命令显示在root管理员家目录上设置的所有ACL信息。
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::---
su命令与sudo服务
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从root管理员切换至普通用户:
id
uid=0(root) gid=0(root) groups=0(root)
su - linuxprobe
Last login: Wed Jan 4 01:17:25 EST 2017 on pts/0
id
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息,强烈建议在切换用户身份时添加这个减号(-)。
sudo命令----把特定命令的执行权限赋予给指定用户
既可保证普通用户能够完成特定的工作,也可以避免泄露root管理员密码.
合理配置sudo服务,以便兼顾系统的安全性和用户的便捷性
sudo服务的配置原则—在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
sudo命令----用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务
格式为“sudo [参数] 命令名称”
sudo服务中可用的参数以及相应的作用:
参数 作用
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或UID值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行sudo时需要再次进行密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语
sudo命令具有如下功能:
1.限制用户执行指定的命令
2.记录用户执行的每一条命令
3.配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数
4.验证密码的后5分钟内(默认值)无须再让用户再次验证密码
visudo命令----用来配置用户权限
该命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
只有root管理员才可以使用visudo命令编辑sudo服务的配置文件
visudo: >>> /etc/sudoers: syntax error near line 111 <<<
What now?
Options are:
(e)dit sudoers file again
(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
使用visudo命令配置sudo命令的配置文件时,在sudo命令的配置文件中,按照下面的格式将第99行(大约)填写上指定的信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL
注意可执行命令列表需要使用命令的绝对路径,多个命令的华使用逗号隔开
sudo -l命令查看到所有可执行的命令了
每次执行sudo命令后都会要求验证一下密码,这时可以添加NOPASSWD参数,使得用户执行sudo命令时不再需要密码验证:
whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz
visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff