linux文件管理权限
一、文件权限管理之基本权限
1、基本权限介绍
# 基本权限类型:
r # 可读 ----> 4
w # 可写 ----> 2
x # 可执行 --> 1
# 权限的归属
属主:u
属组:g
其他用户:o
2、设置权限
- 修改属主、属组
[root@nice ~]# chown user02.hr a.txt # 改属主、属组
[root@nice ~]# chown user02 a.txt # 只改属主
[root@nice ~]# chown user02. a.txt # 同 user02.user02 (属组名默认与属主一样)
[root@nice ~]# chown .hr a.txt # 只改属组
[root@nice ~]# chown -R /test # 递归修改
- 修改u、g、o对应的权限
# 加减法
chmod u+x,g-w,o+r a.txt
# 赋值
chmod a=rwx a.txt
chmod a=- a.txt
chmod ug=rw,o=r file1
# 数字
chmod 644 file1
chmod -R 777 xxx/
注意:把某一个非属主用户添加到文件的属组里,他就拥有了该组(g)的权限,而不再是其他人(o)
3、权限对文件or目录的意义
# 文件:ls -l 文件名
r:可以cat读取文件内容
w:可以修改文件
x:可以执行文件代码,如果该文件的代码是编译好的结果,那么只有x权限即可执行,但如果该文件的代码是一个解释型的脚本程序,则需要配合r权限才可执行
# 目录:ls -dl 文件名
r: 可以ls浏览文件下的内容
w:可以在目录下创建新文件or目录
x:
- 可以执行目录下的程序,除了对目录有执行权限外,还要对程序文件有执行权限才行。
- 可以正常切换到目录下
- 涉及到多层目录如/a/b/c,需要对每一级都有x权限才可以正常走到下一级
## 一:对文件夹的操作(不操作文件内容),需要当前用户具备的权限
1、对沿途所有文件夹有x权限
2、对目标文件夹有r或w权限
r-》可以浏览
w-》可以创建、删除、移动子文件和子目录
## 二:对文件的操作(操作文件内容),需要当前用户具备的权限
1、对沿途所有文件夹有x权限
2、对目标文件有r或w权限
r-》可以读取文件内容
w-》可以修改文件内容
二、文件权限管理之特殊权限
1、SUID
普通用户不是root也不属于root组,于是它对/etc/shadow文件没有任何权限
[root@nice ~]# ll /etc/shadow
----------. 1 root root 1100 Nov 22 2020 /etc/shadow
但是普通用户却可以用passwd命令修改密码,而修改密码都是在修改/etc/shadow文件
[root@nice ~]# ll `which passwd`
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
可以看到一个s权限,s权限的特殊之处:
- SUID 权限仅对二进制可执行文件有效
- 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
- 本权限仅在执行该二进制可执行文件的过程中有效
了解:
# 1、在没有设置suid的情况下,我们登录了一个用户,来执行操作目标文件的命令
会依次比对当前登录用户是否是目标文件的属主、属组、其他人来确定是否拥有操作权限
# 2、在设置了suid的情况下,我们登录了一个用户,来执行操作目标文件的命令
当前用户会转换成命令文件的属主身份,然后拿着该身份去对应目标文件,如果该身份不是目标文件的主人,
那么就直接被归为其他人一栏,不会检索组
sgid一样
示例:
# 准备
mkdir /test
chmod 777 /test/
echo 1111 > /test/a.txt
chmod 000 /test/a.txt
chown user1.group1 /test/a.txt
chown egon.devops /usr/bin/cat
chmod u+s /usr/bin/cat
# 实验
[root@nice ~]# ll /test/a.txt # 目标文件的属主:user01,属组:group1
----------. 1 user01 group1 5 Nov 16 08:50 /test/a.txt
[root@nice ~]# ll /usr/bin/cat # cat命令文件的属主:cc,属组:devops
-rwsr-xr-x. 1 cc devops 54048 Nov 20 2015 /usr/bin/cat
[root@nice ~]# su - user02 -c 'cat /test/a.txt'
cat: /test/a.txt: Permission denied
# user02切换为cc用户执行,cc用户没有对上a.txt的属主user01,所以直接被当成其他人,没有任何权限
[root@nice ~]# chmod o+r /test/a.txt
[root@nice ~]# su - jason -c 'cat /test/a.txt'
1111
[root@nice ~]# chmod o-r,g+r /test/a.txt # 给文件的属组加上读权限
[root@nice ~]# ll /test/a.txt
----r-----. 1 user01 group1 5 Nov 16 08:50 /test/a.txt
[root@nice ~]# usermod -a -G group1 cc # 将cc加入附加组group1
[root@nice ~]# ll /usr/bin/cat # 确保suid还在
-rwsr-xr-x. 1 cc group1 54048 Nov 20 2015 /usr/bin/cat
[root@nice ~]# id cc
uid=1004(cc) gid=5555(cc) groups=5555(cc),5559(group1)
[root@nice ~]# id jason
uid=2001(jason) gid=2001(jason) groups=2001(jason)
[root@nice ~]# su - jason -c 'cat /test/a.txt'
cat: /test/a.txt: Permission denied
# jason--->cc,cc用户没有对上a.txt的属主,jason也不是group1的成员,所以直接被当成其他人,虽然此时cc属于文件a.txt的属组group1的成员,但是对suid来说那没用
[root@nice ~]# su - cc -c 'cat /test/a.txt'
1111
# 如果当前用户与suid的用户重叠,那么就无所谓用户转换,同样会按照:属主、属组、其他人的次序依次对照
# 注意:
sgid规则同于suid
同时设置suid与sgid的情况下,suid的优先级高于sgid(也就是说会优先匹配)
2、SGID
当SGID 作用于普通文件时,和 SUID 类似,在执行该文件时,用户将获得该文件所属组的权限。
当 SGID 作用于目录时,意义就非常重大了:
当一个用户对某一目录有写和执行权限时,该用户就可以在该目录下新建文件
如果该目录同时用 SGID 修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组
示例:
[root@nice ~]# mkdir /test
[root@nice ~]# chmod g+s /test/ # 等同于chmod 2755 /test/
[root@nice ~]# ll -dl /test/
drwxr-sr-x. 2 root cc 6 Nov 16 10:17 /test/
[root@nice ~]# chown .cc /test/ # 后面不管谁在此目录下新建文件or目录,属组都是cc
[root@nice ~]# touch /test/a.txt
[root@nice ~]# ll /test/a.txt
-rw-r--r--. 1 root cc 0 Nov 16 10:19 /test/a.txt
[root@nice ~]# mkdir -p /test/a/b/c
[root@nice ~]# ls -dl /test/a/b/c
drwxr-sr-x. 2 root cc 6 Nov 16 10:20 /test/a/b/c
3、SBIT
SBIT 是 the restricted deletion flag or sticky bit 的简称,有时也称为Sticky。与SUID和SGID的关系不大
SBIT 目前只对目录有效,用来阻止非文件的所有者删除文件。比较常见的例子就是 /tmp 目录:
[root@nice ~]# ls -dl /tmp
drwxrwxrwt. 7 root root 4096 Nov 16 03:40 /tmp
[root@nice ~]# ls -dl /test
drwxr-sr-x. 3 root root 26 Nov 16 10:20 /test
[root@nice ~]# chmod o+t /test/ # 等同于chmod 1755 /test/
[root@nice ~]# ls -dl /test
drwxr-sr-t. 3 root root 26 Nov 16 10:20 /test
权限信息中最后一位 t 表明该目录被设置了 SBIT 权限。SBIT 对目录的作用是:当用户在该目录下创建新文件或目录时,仅有用户自己和 root 才有权力删除,主要作用于一个共享的文件夹。
三、文件权限管理之umask
新建文件、目录的默认权限是由umask决定的
1、uid>199并且属主与数组相等的用户下,umask: 0002
文件 664
目录 775
2、除1之外的其他用户下,比如root用户,umask: 0022
文件 644
目录 755
linux中文件默认权限为666、目录权限默认为777,在umask的影响下
- 文件权限计算方法:偶数位直接相减,奇数位相减后加1
文件的初始权限值 | umask值 | 操作 | 计算后文件权限 |
---|---|---|---|
666 | 022 | 每位如果都是偶数,直接相减即可 | 644 |
666 | 033 | 每位如果有奇数或偶数,相减(奇数位相减后在其原奇数位加1) | 644 |
666 | 325 | 每位如果有奇数或偶数,相减(奇数位相减后在其原奇数位加1) | 442 |
- 目录权限计算方法:直接相减
目录的初始权限值 | umask值 | 操作 | 计算后文件权限 |
---|---|---|---|
777 | 022 | 相减 | 755 |
777 | 033 | 相减 | 744 |
777 | 325 | 相减 | 452 |
总结:umask设置的越小,权限越大,慎用
临时设置umask
[root@localhost ~]# umask 000 //设置umask权限
永久设置umask
[root@localhost tmp]# vim /etc/profile # 或者/etc/bashrc内容一样
......
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002 //表示uid大于等于199的默认umask值,表示普通用户
else
umask 022 //表示uid小于199的默认umask值,表示root
fi
四、文件权限管理之chattr
有的文件或目录具有可读写权限,但是使用root用户删除、修改时提示"Operation not permitted"的情况。可能是由于chattr设置了文件的隐藏保护权限导致。
通过chattr命令修改文件或目录属性能够提高系统的安全性。与chmod命令相比,chmod只是改变文件的读写、执行权限,更底层的属性控制是由chattr命令改变的。
说明:这两个命令在工作中用的比较少,经常用到的场景就是解决"Operation not permitted"问题。
至于它们语法,掌握最基本的就可以了。就是会查属性、会修改属性就可以了。
1、chattr
命令语法:
chattr[+-=] [ASacdistu] File/Directory
参数说明:
+-=:分别为 [+ 增加] [- 减少] [= 设定] 指定属性
A :当设定了 A 这个属性时,文件或目录的存取时间atime (access) 将不可被修改。
S :这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中!可以有效的避免数据流失!
a :文件将只能增加数据,而不能删除,只有 root 才能设定这个属性。
c :这个属性设定之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩出来,但是在储存的时候,将会先进行压缩之后再储存。
d :当 dump (备份)程序被执行的时候,设定 d 属性将可使该档案(或目录)具有 dump 功效!
i :指定文件不能被删除、改名、也无法写入或新增数据!对于系统安全性有相当大的帮助!
j :当使用 ext3 这个档案系统格式时,设定 j 属性将会使档案在写入时先记录在 journal 中! 但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了日志了,所以这个属性无效!
s :当文件设定了 s 参数时,他将会被完全的移除出这个硬盘空间。
u :与 s 相反的,当使用 u 来设定文件时,则数据内容其实还存在磁盘中,可以使用来 undeletion.
- 使用实例:
(1)设置指定文件的隐藏属性,使其无法删除、修改
chattr +i /home/config/config.conf # 添加"i"隐藏属性后,就无法更动config.conf这个文件了
(2)取消文件的删除、修改保护权限
chattr -i /home/config/config.conf # 解除“i”这个隐藏属性
2、lsattr命令
命令语法:
lsattr [-aR] File/Directory
参数说明:
-a : 将隐藏文件的属性也列出来
-R : 连同子目录的数据也一并列出来
- 使用实例:
lsattr file.txt
五、权限管理之su、sudo
1、介绍
因为root用户的权限太大,破坏力太强,安全风险极高,所以通常情况下公司的服务器对外都是禁止root用户直接登录的,但是在进行日常运维管理的过程中,经常需要获得某些root才有的管理权限才能完成任务,例如需要执行/sbin目录下的命令。
- su切换用户身份
特点:使用普通用户登录,然后使用su命令切换到root账户下
优点:简单粗暴
缺点:
1、需要知道root密码
2、权限控制不精细:每次都是获取所有root权限
- sudo提取部分管理员权限
特点:
1、使用普通用户登录,然后sudo命令提取root用户的部分管理权限,注意只是某部分,而不是全部。
2、不需要切换到root账户下
优点:相对复杂
缺点:
1、不需要知道root密码,输入的是用户自己的密码
2、权限控制更为精细:可以控制普通用户只获取部分root权限
2、su切换用户
- 储备知识
linux中shell可以分两类:
- 登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种
- 非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
shell使用方式有两种:
交互式,等待用户输入执行的命令(终端操作,需要不断提示)
非交互式,执行shell脚本, 脚本执行结束后shell自动退出
- bash shell配置文件介绍(文件主要保存用户的工作环境)
全局配置文件:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置文件:
~/.bash_profile
~/.bashrc
profile类文件, 设定环境变量, 登陆前运行的脚本和命令。
bashrc类文件, 设定本地变量, 定义命令别名
PS: 如果全局配置和个人配置产生冲突,以个人配置为准。
配置文件的应用顺序
# 如果执行的是登录式shell,那么配置文件执行顺序是:
/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc
# 如果执行的是非登录式shell,那么配置文件执行顺序是:
~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
PS: 验证使用echo在每行添加一个输出即可,注意,要把输出放在文件的第一行
- 执行登录与非登录shell
# 执行登录shell:身份与环境都切换
su - 用户
# 执行非登录shell:只切换用户身份
su 用户
# 补充:
1、从root往普通用户下切换无需输入密码,反之则需要
2、切换身份执行命令:su - 用户 -c “命令”
3、sudo提权
在日常的运维工作中,我们不应该把root的密码公开给所有人,因为,一方面,真那样做的话,安全风险就太高了,删库到跑路发生的概率估计会加大,另外一方面,小伙伴们大多数情况下只需要提取某一些权限来使用即可也并不是需要所全部的管理员权限,所以说sudo比su更为靠谱一些。
通过配置sudo,我们可以实现让普通用户输入自己的密码的情况下而获取我们为其配置的特定权限,这样,既保证了普通用户拥有他想要的特定权限,又不至于泄露管理root的密码。
4、配置
两种编辑方式:
- 1、 visudo(会提示语法错误,推荐使用)
[root@nice ~]# visudo -c # 检查配置是否正确
/etc/sudoers: parsed OK
- 2、vim /etc/sudoers
# sudo 语法
user MACHINE=COMMANDS
# 示如
# root ALL=(ALL) ALL
1、root:用户
2、ALL:代表用户可以在哪台机器上执行指令,通常设置为ALL,如果设置为localhost代表在本机上执行指令。
也可以设置为本机以外的其他IP地址或主机名,此时该/etc/sudoers虽然是在本机上配置的,但用户登录到本机后仍然是无法执行命令的,如果把/etc/sudoers这个配置文件赋值到指定ip或主机名的那台机器上,就可以用了
配置文件中讲到:
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
即/etc/sudoers文件可以在多个系统之间共享,如果我们设置成ALL的话就省事了,该文件复制到人任意一台机器上的完成的权限配置都一样
3、(All):表示允许用户以哪个用户的权限做事情
4、ALL:所有命令
最终解释:root用户可以在所有主机上以任意用户身份执行所有命令
root ALL=(ALL) ALL # root用户在任何机器上,可以以任何用户身份执行任何命令等同于root用户
jason ALL=(ALL) NOPASSWD:ALL # 免密
cc ALL=(ALL) /bin/cp,/bin/touch # 只允许cc用户以root用户的身份执行cp,touch命令
user02 All=(ALL) ALL,!/usr/bin/vim /test/a.txt # !代表取反(不能执行 vim /test/.txt)
egon02 ALL=(ALL) /usr/bin/passwd [a-zA-Z]*,/usr/bin/vim *,!/usr/bin/vim/test/a.txt # 可以编辑所有文件,除了/test/a.txt
测试
[root@nice ~]# su - jason
Last login: Mon Nov 16 10:09:42 CST 2020 on pts/0
[jason@nice ~]$ logout
[root@nice ~]# su - user02
Last login: Mon Nov 16 12:17:14 CST 2020 on pts/1
[user02@nice ~]$ vim /test/a.txt
[user02@nice ~]$ sudo vim /test/a.txt
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for user02:
user02 is not allowed to run sudo on nice. This incident will be reported. #不被允许执行
[user02@nice ~]$ logout
[root@nice ~]# su - cc
Last login: Mon Nov 16 12:07:53 CST 2020 on pts/1
[cc@nice ~]$ touch /test/b.txt # 没有权限
touch: cannot touch ‘/test/b.txt’: Permission denied
[cc@nice ~]$ sudo touch /test/b.txt # 使用sudo提权
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for cc: # 输入密码
[cc@nice ~]$ ll /test/b.txt
-rw-r--r--. 1 root root 0 Nov 16 12:10 /test/b.txt
ps: sudo 执行流程
1.普通用户执行sudo命令, 会检查/var/db/sudo是否存在时间戳缓存
2.如果存在则不需要输入密码, 否则需要输入用户与密码
3.输入密码会检测是否该用户是否拥有该权限
4.如果有则执行,否则报错退出
- sudo常用参数
-l : 登录用户下面,执行sudo -l 显示当前用户有哪些权限
-k :删除/var/db/sudo/下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码
--> 系统默认也是5分钟失效
--> 配置免密是另一种情况 NOPASSWD: ALL远程sudo(有条件限制的)