(目录)

权限概念

文件权限

文件的拥有者对自己的文件具有所有权限,可以更改自己文件的权限

  • r 可以读文件的内容
  • w 可以编辑文件的内容
  • x 执行这个文件(脚本文件)

文件权限配置的结论:

  1. root用户对所有文件有绝对的权限,只要有了执行权限,root用户可以无敌存在
  2. 对于文件来说,写的权限和执行的权限,都需要有读权限配合
  3. 如何想对文件进行操作,必须对文件赋予读的权限

目录权限

  • r 读目录中的文件属性信息
  • w 可以在目录中添加或删除文件数据信息
  • x 是否可以进入到目录中

目录的权限只有3种组合才有意义:--- r-x rwx 目录权限配置的结论:

  1. root用户对目录信息有绝对权限
  2. 对于目录来说,写的权限和读的权限,都需要有执行权限配合
  3. 如何想对目录进行操作,必须对目录赋予执行的权限

权限的十进制表示法

r = 4,w =2,x =1

默认权限

一个普通文件默认权限: 644 保证属主用户对文件可以编辑 保证其他用户可以读取文件内容 一个目录文件默认权限: 755 保证属主用户对目录进行编辑 保证其他用户可以读取目录中的信息,可以进入到目录中

默认权限是怎么生成的?

默认权限受umask值影响,默认root用户的umask0022,普通用户的umask0002

默认文件权限: 666 - 022 = 644
umask数值是奇数  666 - 033 = 633 + 11 = 644
umask数值是偶数  666 - 022 = 644
+11的原因是
666=rw-rw-rw-
033=----wx-wx
666-033=rw-r--r-- (原本没有x权限,减掉x权限还是没权限)

默认目录权限: 777 - 022 = 755
umask数值是奇数  777 - 033 = 744
umask数值是偶数  777 - 022 = 755

如何修改默认权限

#临时修改
umask 033
#永久修改
vim /etc/profile
 if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
   umask 002
 else
   umask 022  #修改这部分就可以永久修改umask数值
 fi

文件数据读取原理

解释了ll时除文件名称外显示???的原因

文件读取顺序

文件的inode存放了文件的属性信息和指向block的指针信息 文件的block存放了文件的名称信息 文件读取时从根目录(/)开始读取

假设要查询/tmp/test/test_dir/中的内容
根目录/  具有r-x权限

2. 子目录/ rx
/ inode(555 r_x)--block(/tmp)
tmp inode(555 r_x)--block
test inode(7 rwx) 
test_dir inode (4 r--) --block (目录中的文件名称) 没有x权限,无法进入目录,目录中的文件inode信息文件无法获取,目录中文件的属性信息显示为???

设置权限

修改文件的属主,属组

# 修改属主和属组
chown user:group file
# 修改属主 
chown user file
# 修改属组
chown :group file
chgrp group file

设置普通权限

# 使用+-=设置权限
# u 属主,g 属组,o 其他用户
# = 设置权限 + 增加权限 - 减少权限
chmod u=r,g+x,o-w file

# 使用十进制数字设置权限
chmod 777 file
chmod 655 file

设置特殊权限位

特殊权限:

  • setuid 将文件属主拥有的能力分配给所有用户 一般赋予给可执行文件,在执行文件时可以临时获取文件属主的权限
  • setgid 将文件属组拥有的能力分配给所有用户
  • 粘滞位(sticky bit)设置共享目录
# set uid
chmod u+s file  
chmod 4755 file
# setgid 
chmod g+s  file
chmod 2755 file

# 粘滞位(sticky bit)
chmod o+t  dir
chmod 1777 dir

# 当目录权限为777时,所有用户都能对里面的文件进行修改,修改后属主变更,原始内容丢失,不安全
# 粘滞位可以将不同用户信息放置到共享目录中,实现不同用户数据可以互相查看,但是不可以随意修改
/tmp 是系统中的默认共享目录

给文件加锁

给文件加上锁头可以让root用户也不能修改文件

# 查看文件锁状态
[root@localhost ~]# lsattr /etc/passwd
---------------- /etc/passwd
# 加锁
[root@localhost ~]# chattr +i /etc/passwd
[root@localhost ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2502 Nov 24 23:05 /etc/passwd
# 加锁后第5位为i
[root@localhost ~]# lsattr /etc/passwd
----i----------- /etc/passwd
# 解锁
[root@localhost ~]# chattr -i /etc/passwd
[root@localhost ~]# lsattr /etc/passwd
---------------- /etc/passwd

ACL权限

ACL( Access Control List)访问控制列表 可以通过ACL让指定的某个用户或用户组对某个文件设置特别的权限 ACL是由上至下匹配的,匹配到之后就停止匹配

文件的ACL权限的设置

# 添加
setfacl -m u:user:--- file
setfacl -m g:group:r-- file
#删除
setfacl -x u:user file
# 删除后文件权限列中的+仍然存在,需要使用-b移除ACL权限
# 移除所有ACL设置 
setfacl -b

目录的ACL权限设置

针对目录设置ACL权限,不是用来进行访问控制的,而是设置目录中创建文件的权限继承

# 设置用户oth对文件test只有读权限
setfacl -m d:u:oth:r test

ACL权限的查看

权限列后面的+表示该文件具有ACL权限

# 查看文件的ACL权限
[root@localhost ~]# getfacl file
# file: file      # 文件名
# owner: mysql    # 所属用户
# group: mysql    # 所属组
user::rwx         # owner的权限
user:oth:---      # 用户oth的权限
group::rwx        # 所属组的权限
group:oth:r--     # 组oth的权限
mask::rwx         # 表示该文件acl的最大权限other::rwx #其他人的权限
# 查看文件夹的ACL权限
[root@localhost ~]# getfacl dir
# file: test_dir/
# owner: root
# group: root
user::rwx
group::r-x
mask::rwx
other::r-x
# default后面指定目录中新建文件的默认权限,default:mask表示目录中创建文件时最大的权限,即使其他默认权限比mask大,也不能超过mask的权限
default:user::rw-
default:user:hzz:r--
default:group::r-x
default:mask::rwx
default:other::r-x

权限提升 sudo

sudo允许普通用户临时使用root账号来执行命令,使用sudo command来进行权限提升,需要输入当前普通用户的密码。也可以设置为不需要输入密码。

设置sudo权限

visudo = vi /etc/sudoers visudo 有语法检查功能,也可以使用visudo -c检查配置文件是否有语法错误

[root@localhost ~]# grep root /etc/sudoers 
## the root user, without needing the root password.
## Allow root to run any commands anywhere 
root	ALL=(ALL) 	ALL
## cdrom as root


#user用户可以执行任何命令
user    ALL=(ALL)       ALL 
#group组内的用户可以执行任何命令
%group    ALL=(ALL)       ALL 
# /usr/sbin/* 授权目录下的多个命令
# !/user/sbin/visudo 排除指定命令
# NOPASSWD: 不需要输入密码 
user ALL=(ALL) NOPASSWD: /usr/sbin/*,!/user/sbin/visudo/usr/bin/rm

验证账号的sudo权限

sudo -l