18文件权限管理
一. 文件权限概述
尽管在Linxu系统中一切都是文件,但是每个文件的类型不尽相同,因此Linux系统使用了不同的字符来加以区分。
- 普通文件
d 目录文件
l 链接文件
b 块设备文件
c 字符设备文件
p 管道文件
Linux 中规定义了文件的所有者、所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。
对于一般文件来说,权限比较容易理解:“可读”表示能够读取文件的内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。
但是,对于目录文件来说,其权限设置就不那么容易了。
可读 表示能够读取目录内的文件列表
可写 表示能够在目录内新增、删除、重命名文件
可执行 表示能够进入该目录
[root@rockman 0620]# ls -l
total 8
#文件类型为:普通文件;所有者权限:读写执行;同组权限:读;其他人权限:读
-rw-r--r--. 1 root root 28 Jun 20 09:32 atcopy.txt
二. 文件的特殊权限
主要包括SUID、SGID与SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。
- SUID
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属猪的权限。
- SGID
SGID主要实现如下两种工能:
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中常见的文件自动继承该目录的用户组(只可以对目录进行设置);
- SBIT
SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。
三. 文件的隐藏权限
隐藏权限,指被隐藏起来的权限,默认情况下不能直接被用户发觉。(不是隐藏文件的权限!!!)
- chattr 命令
chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。
如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。
chattr命令中可供选择的隐藏权限参数:
i 无法对文件进行修改;若对目录设置了改参数,则仅能膝盖其中的子文件内容而不能新建或者删除文件
a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S 文件内容在变更后立刻同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘)
A 不在修改这个文件或目录的最后访问时间(atime)
b 不在修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用dump命令备份时忽略忽略本文件/目录
c 默认将文件或者目录进行压缩
u 当删除改文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并
X 可以直接访问压缩文件中的内容
#创建一个普通文件,可以直接删除掉
[root@localhost 0623]# echo "for test file" > test.txt
[root@localhost 0623]# rm test.txt
rm: remove regular file ‘test.txt’? y
[root@localhost 0623]# ls
#创建一个普通文件,加上 a 隐藏属性(只允许追加),则无法删除
[root@localhost 0623]# echo "for test file" > test.txt
[root@localhost 0623]# chattr +a test.txt
[root@localhost 0623]# rm test.txt
rm: remove regular file ‘test.txt’? y
rm: cannot remove ‘test.txt’: Operation not permitted
#创建一个普通文件,移出 a 隐藏属性,则可以删除
[root@localhost 0623]# chattr -a test.txt
[root@localhost 0623]# rm test.txt
rm: remove regular file ‘test.txt’? y
[root@localhost 0623]# ls
[root@localhost 0623]#
- lsattr 命令
lsattr命令用于显示文件的隐藏属性,格式为“lsattr [参数] 文件”。Linux系统中,文件的隐藏权限必须使用lsattr命令查看,平时使用的ls之类的命令则看不出端倪。
[root@localhost 0623]# ls -al test.txt
-rw-r--r--. 1 root root 10 Jun 23 11:03 test.txt
[root@localhost 0623]# chattr +a test.txt
[root@localhost 0623]# lsattr -al test.txt
test.txt Append_Only
[root@localhost 0623]# lsattr test.txt
-----a---------- test.txt
[root@localhost 0623]#
四. su命令与sudo 服务
- su 命令
在学习中,使用root更加方便,但是在生产环境中还是要对安全多一份敬畏之心,不要用root管理员去做所有事情。因为一旦执行了错误的命令,可能会直接到时系统崩溃。
尽管Linux系统为了安全考虑,使得许多系统命令和服务只能被root管理员使用,但是这也让普通用户受到了更多的权限束缚,从而导致无法顺利完成特定的工作任务。
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户。
[root@localhost 0623]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
#su命令之后的减号(-),意味着完全切换到新用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。
[root@localhost 0623]# su - hk
Last login: Fri Jun 8 09:55:59 CST 2018 on tty1
[hk@localhost ~]$ id
uid=1000(hk) gid=1000(hk) groups=1000(hk) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[hk@localhost ~]$
尽管像上面这样使用su命令之后,普通用户完全可以切换到root管理员身份来完成相应工作,但是这将暴露root管理员密码,从而增大了系统密码被黑客获取的几率,这病不是最安全的方案。
- sudo 服务
sudo命令把特定命令的执行权限赋予给指定用户,这样既可以保证普通用户能够完成特定的工作,也可以皮面泄露root管理员密码。我们要做的就是合理配置sudo服务,以便兼顾系统的安全性和用户的便捷性。
sudo 命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为“sudo [参数] 命令名称”。
总的来说,sudo命令具有如下功能:
限制用户执行指定的命令
记录用户执行的每一条命令
配置文件(/etc/sudoers)提供集中的用户管理、权限主机等参数
验证密码后的5分钟内(默认值)无需再让用户再次验证密码
当然,如果担心直接修改配置文件会出现问题,则可以使用sudo命令提供的visudo命令来配置用户权限。