Bug:Linux用户拥有r权限但无法打开文件【Linux权限体系】
0 问题描述&解决
问题描述:
- 通过go编写了一个程序,产生的/var/log/xx日志文件发现普通用户无权限打开
- 查看文件权限发现该文件所有者、所有者组、其他用户均有r权限
- 查看该日志文件的父目录,普通用户是否有权限打开,发现也有权限打开
- 因为文件是在/var/log目录下,担心是selinux(linux的一个安全机制)导致没有权限,执行setenforce 0
临时关闭,再通过getenforce查看是否关闭成功。发现关闭之后依然没有权限访问/var/log/日志。解决:
- 给文件添加x执行权限,让其可以cd进入对应目录。
1 Linux权限rwx&用户、用户组
1.1 查看文件、目录权限信息
# 查看权限 ls -l 文件名/目录名
ls -l xx
①r/4读权限:读取文件内容、浏览目录信息
Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
②w/2写权限:修改文件内容、删除移动目录内的文件
Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
③x/1执行权限:执行文件、进入目录
execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
④—表示不具有该项权限
拥有者 拥有者所在组 其他用户
- 拥有者:rw权限
- 拥有者所在组:无读写执行权限
- 其他用户:无读写执行权限
⑤特殊执行权限s:可执行文件是否支持提权
针对可执行文件而言,除了x,还有s权限
当s权限在user的x时,也就是类似 -r - s - - x - - x,称为Set UID,简称为SUID,这个UID表示User的ID,而User表示这个程序(/usr/bin/passwd)的拥有者(root)。那么,我们就可以知道,当test用户执行 /usr/bin/passwd时,它就会“暂时”得到文件拥有者root的权限。
让普通用户以该文件拥有者的权限执行命令
1.2 用户、用户组
①用户:普通用户、超级用户(root)
1.超级用户:可以再linux系统下做任何事情,不受限制在linux下做有限的事情命令提示符是"#”。
2.普通用户:普通用户权限就没有超级用户那么高会受到限制 .普通用户的命令提示符是"$”。
从普通用户切换到超级用户root:
# 切换到root用户
su root
# 以root权限临时执行某个操作(短暂提权执行某个操作)
sudo rm -f 1.txt
# id查看当前用户(uid、gid)
id
添加用户:
# 指定userid并分配给指定
# group useradd testuser -u 1003 -g 1005
# 指定用户名为testuser,并指定用户家目录/usr/testhome
useradd -d /usr/testhome -m testuser
# 修改test用户密码
passwd testuser
# 新建testGroup工作组,并指定gid为2000
groupadd testGroup -g 2000
# 将用户添加进工作组
usermod -G testGroup testuser
# 将用户testuser加入到nobody(gid一般为65534)组
gpasswd -a testuser nobody
# 查看testuser用户属于哪些组
groups testuser
# 查看所有组
groups
# 删除用户
userdel testuser
②用户组
在某个组里的用户,拥有该组所拥有的权限
# 新建testGroup工作组,并指定gid为2000
groupadd testGroup -g 2000
# 将用户添加进工作组
usermod -G testGroup testuser
# 将用户testuser加入到nobody(gid一般为65534)组
gpasswd -a testuser nobody
# 查看testuser用户属于哪些组
groups testuser
# 查看所有组
groups
2 权限相关命令:chmod、chown
2.1 chmod:修改权限
# chmod概述
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项:
R -> 递归修改目录文件的权限说明:只有文件的拥有者和root才可以改变文件的权限
chmod使用
① 用户表示符+/-=权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
案例:
给文件所有者添加执行权限
# 添加hello.sh文件所有者的执行权限
chmod u+x hello.sh
# 给所有用户添加文件的执行权限x
chmod +x hello.sh
2.2 chown:修改拥有者
chown
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
# chown test:test hello.sh
chgrp
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
# chgrp root hello.sh
3 umask
1.查看或修改文件掩码
2.新建文件夹默认权限=0666
3.新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到
umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask
- 格式:umask 权限值说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用
户默认为0002。
# 查看权限掩码
umask
# 修改权限掩码(不建议)
umask 0000
4 目录权限:rwx(ls查看、创建删除文件、cd进目录)
1.可执行权限x: 如果目录没有可执行权限, 则无法cd到目录中.
2.可读权限r: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
3.可写权限w: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
5 粘滞位:chmod +t
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除
echo 111 > xx
chmod +t xx
ll xx
rm -rf xx
# 提权删除
sudo rm -rf xx
6 sudoers:决定该用户能否执行sudo提权操作
/etc/sudoers文件中配置哪些用户能够执行sudo提权操作。
# 给test用户添加sudo执行权限,如果提示只读,则chmod u+w添加写权限
sudo vim /etc/sudoers
# 找到 ## Allow root to run any commands anywhere不分,添加
test ALL=(ALL) ALL
# 保存退出,重新以test身份执行sudo
/etc/sudoers:
参考文章:https://blog.csdn.net/qq_56999918/article/details/123647390