Linux之权限管理
一、文件基本权限
1) 基本权限的修改
第一位“-”为文件类型(-代表文件;d代表目录;l代表软链接文件即快捷方式),后面每3位一组。
-rw-r--r--
rw- u所有者
r-- g所属组(相同身份、相同权限)
r-- o其他人
r读 w写 x执行
1、 chmod命令
chmod [选项] 模式 文件名
选项
-R:递归
模式
[ugoa][+-=][rwx]
[mode=421]
2、 修改权限的方式
chmod u+x test.txt(给所有者执行权限)
chmod g+w,o+w test.txt(给所属组和其他人写权限。)
chmod a=rwx text.txt(给所有全部的人读、写、执行权限。)
chmod u-x cangls.av(取消所有者的执行权限。)
chmod g-w,o-w cangls.av(取消所属组和其他人的写权限。)
3、 权限的数字表示
r----4
w----2
x----1
rwxr-xr-x
7 5 5
拓展:
000 ---:无权限(换算成八进制就是0)
001 --x:执行(换算成八进制就是1)
010 -w-:写(换算成八进制就是2)
011 -wx:写和执行(换算成八进制就是3)
100 r--:只读(换算成八进制就是4)
101 r-x:读和执行(换算成八进制就是5)
110 rw-:读写(换算成八进制就是6)
111 rwx:读写执行(换算成八进制就是7)
计算机只识别0和1,有电信号代表1,无电信号代表0,三个短横线(---),无非就是一个短横线上有值或者没值,都没值就用000代表,如上表示。2位相当于4进制,3位相当于8进制,4位相当于16进制。
2) 权限的作用
1、权限对文件的作用
r:读取文件内容(cat more tail head)
w:编辑、新增、修改文件内容(vi echo)
#但是不包括删除文件
x:可执行
注:
为什么文件有写权限不代表有删权限?因为文件名存在目录储存块(block)里(Linux中一切皆文件),文件数据存在文件储存块里,要删除文件数据,意味着要删除文件名,而文件名储存位置在更高一级(目录中),所以没有删除权限。要想进行删除操作,必须对目录储存块进行操作。
文件夹<----文件<----文件数据
2、权限对目录的作用
r:可以查询目录下文件名 (ls)
w:具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名此目录下文件和目录,剪切(touch rm mv cp)
x: 可以进入目录 (cd)
总结:
对文件来讲 最高权限是x
对目录来讲 最高权限是w
例如:图片中tomcat-7所属组和其他人是没有w(写)权限的。
因此可以看出在此目录下创建文件或者目录都是没有权限的,被提示:Permission Denied(权限被拒绝)
但是tomcat-7子目录logs的所属组是有w权限,进入logs目录下创建文件或者目录是被允许的。
注:对目录来讲赋予权限,就只有0,5,7,赋其他的权限没有意义。因为只有执行权限才可以进入这个目录,不赋予执行权限其他权限都没有意义,例如:赋4,1,6都是没有意义的权限
3) 其他权限命令
1、 修改文件的所有者
chown 用户名 文件名
例如:chown ds abc.txt
2、 修改文件的所属组
chgrp 组名 文件名
例如:chgrp group1 abc.txt
chown root:root 123
等价于
chown root 123 chgrp root 123
分配文件基本权限时,核心原则:在最小权限情况下能够实现要求即可。
二、文件默认权限
1) 查看默认权限的命令
umask
查看默认权限
0022
第一位0:文件特殊权限
022:文件默认权限
2) 文件的默认权限
#文件默认不能建立为执行文件,必须手工赋予执行权限
#所以文件默认权限最大为666
#默认权限需要换算成字母再相减
#建立文件之后的默认权限,为666减去umask值
例如:
文件默认最大权限666 umask值022
-rw-rw-rw- 减去 -----w--w- 等于 -rw-r--r--
例如:
文件默认最大权限666 umask值033
-rw-rw-rw- 减去 -----wx-wx 等于 -rw-r--r--
3) 目录的默认权限
#目录默认权限最大为777
#默认权限需要换算成字母再相减
#建立文件之后的默认权限,为777减去umask值
例如:
文件默认最大权限777 umask值022
-rwxrwxrwx 减去 -----w--w- 等于 -rw-r--r--
4) 修改umask值
临时修改
[root@localhost ~]# umask 0002
永久修改
[root@localhost ~]# vi /etc/profile(该文件称为环境变量配置文件)
三、ACL权限
1) ACL权限简介与开启
1、 ACL权限简介
在linux中文件和文件夹的用户身份就这三个:
所有者、所属组、其他权限。
有时候三个身份不够用,这时候就需ACL权限用来解决用户身份不足的问题。
2、 查看分区ACL权限是否开启
首先我们查看有哪些分区
[zm@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 16G 2.4G 13G 16% /
tmpfs 935M 228K 935M 1% /dev/shm
/dev/sda1 291M 37M 240M 14% /boot
/dev/sda2 251M 45M 165M 23% /home
其中tmpfs是一种基于内存的文件系统。根分区是sda3
[root@localhost ~]# dumpe2fs -h /dev/sda3
#dumpe2fs命令时查询指定分区详细文件系统信息的命令
选项:
-h 仅显示超级块中信息,而不显示磁盘块的详细信息。
执行中该命令,显示出来的超级块中可以看到有一行
Default mount option :user_xattr acl
从中可以看到包含了acl权限,说明分区支持ACL权限,可以使用ACL命令
3、 临时开启分区ACL权限
[root@localhost ~]# mount -o remount,acl /
#重新挂载根分区,并挂载加入acl权限
4、 永久开启分区ACL权限
[root@localhost ~]# vi /etc/fstab
#该文件会影响linux系统的启动,千万谨慎修改。
UUID=c2ca6f57-b15c-43ea=bca0-f239083d8bd2 / ext4
Defaults,acl 1(启动是否需要检测) 1(启动是否需要备份)
#加入acl
[root@localhost ~]# mount -o remount /
#重新挂载文件系统或重启系统,使修改生效
2) 查看与设定ACL权限
1、 查看ACL命令
[root@localhost ~]# getfacl 文件名 //查看acl权限
# file:av
# owner:tony
# group:stu
user::rwx(所有者)
user:lw:r-x
group::rwx(所属组)
mask::rwx
other::---(其它人)
2、 设定ACL权限的命令
[root@localhost ~]# setfacl 选项 文件名 //设定ACL权限的命令;
选项:
-m:设定ACL权限;
-x:删除指定的ACL权限;
-b:删除所有的ACL权限;
-d:设定默认ACL权限;
-k:删除默认ACL权限;
-R:递归设定ACL权限;
3、 给用户设定ACL权限
[root@localhost ~]# useradd tony
[root@localhost ~]# groupadd stu
[root@localhost ~]# mkdir /av
[root@localhost ~]# chown tony:stu /av
[root@localhost ~]# chmod 770 /av
[root@localhost ~]# useradd lw
[root@localhost ~]# setfacl –m u:lw:rx /av
#给用户st赋予r-x权限,使用“u:用户名:权限”格式
4、 给用户组设定ACL权限
[root@localhost ~]# groupadd tgroup2(添加一个组)
[root@localhost ~]# setfacl -m g:tgroup2:rwx /av
#为组tgroup2分配ACL权限。使用“g:组名:权限”格式
3) 最大有效权限与删除ACL权限
1、 最大有效权限mask
mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和
mask的权限“相与”(逻辑与运算)才能得到用户的真正权限
#逻辑与运算:
A |
B |
and |
r |
r |
r |
r |
- |
- |
- |
r |
- |
- |
- |
- |
2、 修改最大有效权限
[root@localhost ~]# setfacl -m m:rx 文件名
#设定mask权限为r-x。使用“m:权限”格式
3、 删除ACL权限
[root@localhost ~]# setfacl -x u:用户名 文件名
#删除指定用户的ACL权限
[root@localhost ~]# setfacl -x g:组名 文件名
#删除指定用户组的ACL权限
[root@localhost ~]# setfacl -b 文件名
#删除文件所有的ACL权限
4) 默认ACL权限和递归ACL权限
1、 递归ACL权限
① 递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。
② setfacl -m u:用户名:权限 -R 目录名。
③ 递归权限仅能赋予目录,不能赋予文件。
2、 默认ACL权限
① 默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限。
② setfacl -m d:u:用户名:权限 -R目录名。
四、文件特殊权限
1) SetUID
1、 功能
#只有可以执行的二进制程序才能设定SUID权限
#命令执行者对该程序拥有x(执行)权限
#命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件属主)
#SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
#如果对这个文件没有执行权限,然后赋予SetUID权限,s会变成大S。
[root@localhost ~]# chmod 4644 abc
[root@localhost ~]# ll
-rwSr--r--. 1 root root 1498 7月 1 12:02 abc
#在SetUID权限里,大S是不能正确使用的。
2、 设定SetUID的方法
- 4代表SUID
#chmod 4755 文件名
#chmod u+s 文件名(u代表所有者,s代表SetUID)
#chmod 0755 文件名(取消SUID权限)
#chmod u-s 文件名
- u所有者
g所属组(相同身份、相同权限)
o其他人
u+s:SUID权限
g+s:GUID权限
o+s:SBIT
3、 举例
[root@localhost ~]# ll /etc/shadow (保存所有用户密码的文件)
----------. 1 root root 1498 7月 1 12:02 /etc/shadow
#权限都为零,可见只有root用户和超级用户才能查看、修改这个文件。
#但普通用户可以修改自己的密码,shadow权限又是零,是怎么做到的呢?
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root /usr/bin/passwd
#原因就是passwd这个指令有SetUID权限,权限范围可以看出任何用户都有执行权限。任何用户在执行该命令的时候,会以root身份或者所有者身份来执行。
#也就是说,只有文件具有SetUID权限,命令执行时当前用户身份才会切换到文件的所有者身份(类似灵魂附体)
#既然这样,那不就能修改其他用户的密码了吗?
#实际上linux限制了 passwd后面不能加其他参数,只有根用户才能指定用户名称。普通用户输入passwd 直接回车,修改当前用户的密码
#cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容
[root@localhost ~]# ll /bin/cat
-rwxr-xr-x 1 root root 47976 6月 22 2017 / bin/cat
4、 危险的SetUID
#关键目录应严格控制写权限。比如“/”、“/usr”等
#用户的密码设置要严格遵守密码三原则(复杂性、易记忆性、时效性)
#对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限
参考下面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
#比对这个文件名是否在模板文件中
if[ "$?" != "0" ]
#检测上一个命令的返回值,如果不为0,证明上一个命令报错
then
echo "$i isn't in listfile!" >> /root/suid_log_$(data+%F)
#如果文件名不在模板文件中,则输出错误信息,并把错误写到日志中
fi
done
rm -rf /tmp/setuid.check
#删除临时文件
2) SetGID
1、 SetGID针对文件的作用
只有可执行二进制程序才能设定SGID权限
命令执行者要对该程序拥有x(执行)权限
命令执行执行程序时,组身份升级为该程序文件的属组
SetGID权限只在程序执行过程中有效
[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x 1 root slocate /usr/bin/locate
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate /var/lib/mlocate/mlocate.db
#/usr/bin/locate是可执行二进制程序,可以赋予SGID
#执行用户lamp对/usr/bin/locate命令拥有执行权限
#执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对
/var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库
#命令结束,lamp用户的组身份返回为lamp组
2、 SetGID针对目录的作用
普通用户必须对此目录必须拥有r和x权限,才能进入此目录
普通用户在此目录中的有效组会变成此目录的属组
若普通用户对此目录拥有w权限,新建的文件的默认属组是这个目录的属组
3、 设定SetGID
- 2代表SGID
chmod g+s 文件名
chmod 2755 文件名
4、 取消SetGID
chmod g-s 文件名
chmod 0755 文件名
3) Sticky BIT
1、 SBIT粘着位作用
- 粘着位目前只对目录有效
- 普通用户对该目录拥有w和x权限,即普通用户可以在此目录有写入权限
- 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
2、 设置粘着位
chmod 1755 目录名
chmod o+t 目录名
3、 取消粘着位
chmod 0777 目录名
chmod o-t 目录名
注:如果没有特殊需求,特殊权限尽量少修改,特别是SetUID和SetGID。
五、不可改变位权限
1) chattr命令
charrt [+-=] [选项] 文件名或目录名
[+-=]
+:增加权限
-:删除权限
=:等于某权限
[选项]:常用的选项包括i和a
i(insert):将此文件锁定
如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不能建立和删除文件。
a(append):冻结此文件
如果对文件设置a属性,那么只能在文件中增加数据,但不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但不允许删除。(添加内容只能用 echo >>输出重定向到文件中;禁止用vi,因为不能判断是修改还是增删内容)
2) 查看文件系统属性
lsattr 选项 文件名
选项:
-a 显示所有文件和目录
-d 若目标是目录,仅列出目录本身的属性,而不是子文件的
六、sudo权限
1) sudo权限
1、root把本来只能超级用户执行的命令赋予普通用户执行
2、sudo的操作对象是系统命令
2) sudo使用
1、[root@localhost ~]# visudo
#实际修改的是/etc/sudoers文件
2、运行上述命令,其中有这么一句话
##Allow root to run any commands anywhere
##Allows people in group wheel to run all commands
root ALL=(ALL) ALL
#用户名 被管理主机的地址=(可使用的身份)授权命令(绝对路径)
3、 举例1
普通用户(如usr1)是不能执行shutdown命令的。授权普通用户可以重启服务器
[root@localhost ~]# visudo
#在最后面添加以下命令,保存退出
user1 ALL=(ALL) /sbin/shutdown –r now(写的越详细,权限越小)
[root@localhost ~]# su -user1
[root@localhost ~]$ sudo -l(查看可用的sudo命令)
[user1@localhost ~]$ sudo /sbin/shutdown -r now
#普通用户执行sudo赋予的命令
举例2
授权普通用户可以添加其它用户
[root@localhost ~]# visudo
#在最后面添加以下命令,保存退出。授予用户设定密码的权限
user1 ALL=(ALL) /usr/sbin/useradd
user1 ALL=(ALL) /usr/sbin/passwd
[user1@localhost ~]$ sudo /usr/sbin/useradd 用户名
[user1@localhost ~]$ sudo /usr/sbin/passwd 用户名
这样授予的权限是很危险的,如果passwd后面不加用户名会以root身份执行
命令,需写详细点,如:
user1 All=/usr/bin/passwd
[A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
#该命令中间注意空格,顺序不能颠倒。第一个是正则表达式,第二个感叹号是
取反的意思,双引号里面空格是表达passwd后面不能有空格。
4、# %wheel ALL=(ALL) ALL
#%组名 被管理主机的地址=(可使用的身份)授权命令(绝对路径)