一、基本权限管理
1.ll命令之后的文件:
-rw-r--r--
- 文件类型 (-文件 d目录 l软链接)
u 所有者 g 所属组 o 其他人 (所有者可以不属于所属组)
r 读 w 写 x 执行
2.chmod命令:
使用+、-、r、w、x
格式:chmod [选项] 模式 文件名 (-R 递归)
命令 | 说明 |
---|---|
chmod u+x 文件名 | 给所有者赋予执行权限 |
chmod g+w,o+w 文件名 | 给所属组和其他人增加写权限 |
chmod g-w,o-w 文件名 | 删除权限 |
chmod u=rwx,g=rw 文件名 | 清除原始权限,赋予指定权限 |
chmod a=rw | 给所有人赋予指定权限 |
权限的数字表示
r ---- 4
w ---- 2
x ---- 1
rwx:7 rx:5 rw:6 r:4
644: rw-r--r--
777:
755: rwxr-xr-x
chmod 777 文件
其他命令
chown 用户名 文件名 //改变文件的所有者
chgrp 所属组 文件名 //改变所属组
chown 所有者:所属组 文件名 //同时修改所有者和所属组
3.sudo权限:
root把本来只能超级用户执行的命令赋予普通用户执行。
sudo的操作对象是《系统命令》
visudo命令实际修改的是/etc/sudoers文件
root ALL=(ALL) ALL
用户名 被管理主机的地址=(切换的身份) 授权命令(绝对路径)
user1 ALL=(ALL) /sbin/shutdown -r now
user1 ALL=/usr/sbin/useradd
user1 ALL=/usr/sbin/passwd ***********可以更改root命令
解决:
user1 ALL=/usr/sbin/passwd [a-zA-Z]*, !/usr/sbin/passwd "", !/usr/sbin/passwd root
注意:不要赋予普通用户vi权限。不然会有权限(以root身份)修改所有配置文件。
%wheel ALL=(ALL) ALL
%组名 被管理主机的地址=(切换的身份) 授权命令(绝对路径)
sudo -l 查看所有被允许的命令
sudo 命令 //执行命令,之前会要求输入当前用户的密码,必须是绝对路径
4.权限的作用:
权限对文件的作用:
r:读取文件内容(cat more head tail)
w:编辑、新增、修改文件内容(vi echo)
但是不包括删除。
文件夹保存文件,文件保存数据。删除文件需要对文件夹有写权限,理解:文件夹和文件都有自己的数据块,
x:可执行
对文件来讲,最高权限是执行x
权限对目录的作用:
r:可以查询目录下的文件名(ls)
w:具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名、剪切(touch rm mv cp)
x:可以进入目录(cd)
对目录来讲,最高权限是写w。
有效的权限:0 5(rx) 7(rwx)
无效的权限:4 1 6...(原因:没有x,就没有进入目录的权限,其他操作没有意义)
二、特殊权限介绍
1.默认权限:
window中默认权限继承至上一级文件,
Linux中umask查看默认权限
umask //0022,0文件的特殊权限,022文件默认权限
文件默认值计算:
文件默认不能建立为执行文件,必须手工赋予执行权限。
文件默认权限最大666
默认权限需要换算成字母再相减
建立文件之后的默认权限,为666减去umask值。
666 rw-rw-rw- 默认权限最高值
022 ----w--w- umask //修改umask值来改变最终默认权限
644 rw-r--r-- 结果
文件夹默认值计算:
目录权限最大为777
换算成字母后减去umask值。
临时修改umask值:
umask 0000
永久修改umask值:
vi /etc/profile 环境变量配置文件
2.特殊权限:
安全性考虑,若非必须,不要使用这些权限
s代表可执行的SUID,S代表不可执行的SUID
SetUID:仅能作用于文件
ll /usr/bin/passwd 用户修改自身密码
只有可以执行的二进制程序才能设定SUID权限
命令执行者要对该程序拥有x权限
命令执行者在执行该程序时获得该程序属主的身份(在执行程序的过程中灵魂附体为文件的属主)
SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。
增加方法:
chmod 4775 文件名
chmod u+s 文件名
rwsrwxr-x
取消方法:
chmod 0775 文件名
chmod u-s 文件名
rwxrwxr-x
危险的SetUID:
chmod 4755 /bin/vi *************给vi设定SUID,执行vi时身份是root。
关键目录应严格控制写权限,比如"/","/usr"
用户密码设置要严格遵守密码三原则
对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件设置了SetUID权限
SetGID:能作用于文件和目录
locate命令:
用户对/usr/bin/locate命令有执行权限,/usr/bin/locate所属组为slocate,并设置了SGID。用户执行locate时,组身份会升级为slocate,而slocate对/var/lib/mlocate/mlocate.db拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库。命令结束后用户身份返回为原组。
只有可执行文件的二进制程序才能设置SGID
命令执行者要对该程序拥有x权限
命令执行者在执行该程序时,组身份升级为该程序文件的属组
SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效。
给目录设置SGID权限:
用户在此目录下新建文件默认的所属组为目录的组,而不是用户本身的组
设定SGID:
chmod 2755 文件名 //0755
chmod g+s 文件名 //g-s删除
一个监控系统中所有拥有SUID和SGID文件的脚本
#!bin/bash
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
#搜索系统中所有拥有SUID和SGID的文件,保存到临时文件中
for i in $(cat /tmp/setuid.check)
#每次循环取出临时文件中的文件名
do
grep $i /root/suid.log > /dev/null
#suid.log为预先保存的所有合法的拥有suid文件的模板,查看文件是否在模板中
#suid.log的创建命令:find / -perm -4000 -o -perm -2000 > /root/suid.log
if("$?" != "0")
#检测上一个命令的返回值,若不为0,证明上一个命令报错
then
echo "$i isn't in listfile!" >> /root/suid.log.$(date+%F)
#若文件名不在模板文件中,输出错误信息到日志文件
fi
done
rm -rf /tmp/setuid.check
Sticky BIT:粘着位权限,仅能对目录有效
普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限。(7)
要求目录给其他人的权限为7,除了系统自带的,不建议给其他目录增加SBIT权限。
如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有的文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。
应用场景:共享目录,每个用户上传文件,但禁止删除其他用户的文件。
设置:
chmod 1755 目录
chmod o+t 目录
删除:
chmod 0755 目录
chmod o-t 目录
/tmp 临时目录拥有777,默认拥有SBIT权限
3.不可改变位权限:(chattr权限)
chattr [+-=] [选项] 文件名或目录名
+增加 -删除 =等于某权限
SBIT选项: i和a
a等价于append , i等价于insert
文件设置i属性:不允许对文件进行删除、改名,也不能添加和修改数据;
锁定,有此属性时,root都不可修改,但root可以去掉此属性
chattr +i 文件名
目录设置i属性:只能修改目录下文件的数据,但不允许建立和删除文件。
文件设置a属性:只能在文件中增加数据,不能删除和修改数据;
禁止vi增加数据(很难判断是否增加还是删除),只能输出重定向。
目录设置a属性:只允许在目录中建立和修改文件,不允许删除文件。
lsattr 文件名
lsattr -d 目录名
4.ACL权限
Access Control list,解决文件权限控制中,用户身份不足的问题。
查看分区ACL权限是否开启:(ACL权限是挂载权限,属于分区的)
df //查看分区
dumpe2fs -h /dev/sda5 查询指定分区详细文件系统信息的命令。-h 仅显示超级块中信息,而不显示磁盘块组的详细信息。
临时开启ACL,重新挂载:
mount -o remount,acl / //重新挂载根目录,增加acl权限。
永久开启:
vi /etc/fstab //在分区表中修改:defaults,acl
mount -o remount /
查看ACL权限:
getfacl 文件名 //查看文件的ACL权限,+表示有ACL权限。
设定ACL权限的命令:
setfacl 选项 文件名
-m 增加:
setfacl -m u:user1:rx 文件名 //给用户user设置rx权限
setfacl -m g:group1:rx 文件名 //给用户组group1设置rx权限
setfacl -m m:rx 文件名 //指定最大有效权限
mask :指定最大有效权限,给用户赋予的ACL权限需要和mask的权限相与才能得到用户的真正权限。
-x 删除指定:
setfacl -x u:用户名 文件名
-b 删除所有acl权限:
setfacl -b 文件名
-d 默认acl权限:给父目录设定了默认ACL权限“之后”,在父目录中建立的所有子文件都会继承父目录的ACL权限。
setfacl -m d:u:用户名:权限 文件名
-R 递归设置acl权限:
setfacl -m u:user1:rx -R 文件名 //递归,只能赋予目录。给父目录设定权限时,给“已有的”子文件和目录赋予相同的权限
递归时注意权限溢出:
执行权限对目录的作用和文件的作用是不一样的。目录需要执行权限来进入目录,但文件应尽量少给执行权限。