Linux 权限管理笔记
一、文件基本权限
1. 查看权限
1-1.基本权限的修改
-rw-r--r--
- 第一个"-"表示文件类型(- 文件,d 目录,l 软链接文件)
- rw- r-- r--
u所有者 g所属组 o其它人
其中r读,w写,x执行
2. 修改权限
(1).chmod [选项] 模式 文件名
- 选项
. -R 递归 (当前目录下所有文件递归赋予权限)
- 模式
[ugoa] [+-=] [rwx]
[mode=421]
栗子:
1. chmod u+x cangls.av # u --> 所有者, x --> 执行
2. chmod g+w,o+w furong.av # g --> 所属组 o --> 其他人
3. chmod g-w,o-w furong.av
4. chmod u=rwx,g=rw furong.av
5. chmod a=rw furong.av # 所有人都有rw权限
权限的数字表示(用二进制转的数)
r---4; w----2; x ----1; 常用组合:777 644 755
如rwxr-xr-x,则对应7 5 5
# chmod 755 furong.av
3. 权限对文件的作用
r: 读取文件内容(cat more head tail)
w: 编辑、新增、修改文件内容(vi echo) # echo 1111 >> abc.txt
- 但是不包含删除文件,因为文件名和文件数据存放位置不同
x: 可进入目录
注意:
对文件来讲:最高权限是 x
对目录来讲:最高权限是 w
head:默认是查看文件的前10行
tail:默认是查看文件的最后10行 , -n 指定查看多少行 # tail -f -n 20 abc.log
more:显示满一页时暂停,按空格/Ctrl+F继续显示下页,Ctrl+B 返回上一屏 或按Q停止显示。
4. 权限对目录的作用
r: 可以查询目录下的文件名(ls)
w: 具有修改目录结构的权限,如新建文件和目录, 删除此目录下的文件和目录,
重命名次目录下文件和目录,剪切(touch, rm , mv ,cp )
x: 可以进入目录 (cd)
对文件来讲, 最高权限是 x
对目录来讲: 最高权限是w --> 0 5(rx) 7(rwx) 只有这三种有有意义
chomd 755 <目录名>
(1) chown 用户名:组名 <文件or目录>
(2) chown: 修改文件的所有者
格式:chown 用户名 文件名
例:chown user1 test
(3) chgrp:修改文件的所属组
格式:chgrp 组名 文件名
例:chgrp user1 test
实例要求
- 拥有一个test目录
- 让testuser拥有所有的权限
- 让用户组有查看的权限
- 其他所有人不许查看这个目录
1. sudo groupadd [用户组] 增加用户组
2. sudo gpasswd -a vagrant docker 将vagrant用户添加到docker用户组
3. groups [username]:查看该用户所属用户组
4. sudo adduser [username]:添加新用户
5. sudo usermod -G [用户组] [username]:把用户添加到用户组
6. sudo usermod -G sudo Kobe:把科比添加到 sudo 用户组
7. sudo deluser [username]:删除用户,如果同名用户组没有其它成员,同时该用户组也没了
8. sudo gpasswd -d [username] [用户组]:从用户组中删除用户
9. su [username]:切换用户到当前目录
10. su -l [username]:切换用户到用户家目录
11. Ctrl D】 / exit:退出当前用户
12. sudo su:使当前用户进入 root
[python] view plain copy
# 拥有一个test目录
changwen@ubuntu:~$ ll -d test
drwxrwxr-x 3 changwen changwen 4096 Jul 24 05:41 test/
# 添加一个testuser用户
changwen@ubuntu:~$ sudo useradd testuser
# 设置该用户的密码
changwen@ubuntu:~$ sudo passwd testuser
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
# 在用户组里添加两个用户
changwen@ubuntu:~$ sudo useradd -g usergroup user1
changwen@ubuntu:~$ sudo useradd -g usergroup user2
# 设置test目录的所有者:所属组
changwen@ubuntu:~$ sudo chown testuser:usergroup test
changwen@ubuntu:~$ ll -d test
drwxrwxr-x 3 testuser usergroup 4096 Jul 24 05:41 test/
# 按实例要求设置权限
changwen@ubuntu:~$ sudo chmod 750 test
changwen@ubuntu:~$ ll -d test
drwxr-x--- 3 testuser usergroup 4096 Jul 24 05:41 test/ ```
二、文件默认权限
unmak: 查看默认权限
如0022
- 第一位0: 文件特殊权限
- 022 : 文件默认权限
临时修改: umask 0002
永久修改: vi /etc/profile
1. 文件默认权限
1) 文件默认不能建立执行文件,必须手工赋予执行权限
2) 所以文件默认权限最大为666
3) 默认权限需要换算成字母再相减
4) 建立文件之后的默认权限,为666减去umask值
例如:
- 文件默认最大权限是666, umask值为022
- -rw-rw-rw- 减去 -----w--w- 等于 -rw-r--r--
2. 目录的默认权限
1).目录默认权限最大为777
2).默认权限需要换算成字母再相减
3).建立文件之后的默认权限,为777减去umask值
例如:
- 目录默认权限最大为777, umask值为022
- -rwxrwxrwx 减去 -----w--w- 等于 -rwxr-xr-x
三、ACL简介
ACL就是用来解决用户身份不足的问题
查看分区ACL权限是否开启
dupe2fs 命令是查询指定分区详细文件系统信息的命令
dupe2fs -h /dev/sda5
-h 仅显示超级块中信息,而不是磁盘块的详细信息
临时开启分区ACL权限
重新挂载根分区,并挂载加入acl权限
mount -o remount, acl /
永久开启分区ACL权限(不建议修改)
vi /etc/fstab
加入acl
然后修改UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defalults acl 1 1
1. 查看与设定ACL权限
查看acl权限
getfacl 文件名
设定acl权限
setfacl 选项 文件名
-m 设定ACL权限
-x 删除指定的ACL权限
-b 删除所有的ACL权限
-d 设定默认ACL权限
-k 删除默认ACL权限
-R 递归设定ACL权限
栗子:
changwen@ubuntu:~$ mkdir av
# 增加所有者和用户组,并设置av目录的权限
changwen@ubuntu:~$ sudo useradd tony
changwen@ubuntu:~$ sudo groupadd stu
changwen@ubuntu:~$ sudo chown tony:stu av
# 设置av权限
changwen@ubuntu:~$ sudo chmod 770 av
# 添加老王用户并设置密码
changwen@ubuntu:~$ sudo useradd lw
changwen@ubuntu:~$ sudo passwd lw
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
# 给用户lw赋予r-x权限,使用 "u:用户名:权限" 格式
changwen@ubuntu:~$ sudo setfacl -m u:lw:rx /home/changwen/av
# 为用户组tgroup2分配ACL权限。使用 "g:组名:权限" 格式
setfacl -m g:tgroupt2:rwx /home/changwen/av
可以看到用户lw不属于用户组,也不属于其它组,这就是ACL权限
2. 最大有效权限与删除
上面getfacl av可以看到有一个mask
mask:是用来指定最大有效权限的。如果我给用户赋予ACL权限,是需要和mask的权限”相与”才能得到用户的真正权限。
[laowang@localhost home]$ getfacl av
# file: av
# owner: tony
# group: stu
user::rwx
user:laowang:r-x
group::rwx
mask::rwx
other::---
# 修改最大有效权限
setfacl -m m:rx 文件名
- 设定mask权限为r-x。使用"m:权限"格式
删除ACL权限
# 删除指定用户的ACL权限
setfacl -x u:用户名 文件名
# 删除指用户组的ACL权限
setfacl -x g:组名 文件名
# 删除文件的所有的ACL权限
setfacl -b 文件名
3. 默认ACL权限与递归ACL权限
1).递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。递归权限仅能赋予目录,不能赋予文件。
setfacl -m u:用户名:权限 -R 文件名
-R 如果不加R,那么该目录下创建的文件没有ACL权限
但加R,会有权限溢出
所以建议少用ACL权限
2).默认ACL权限的作用是如果给们目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限。
setfacl -m d:u:用户名:权限 文件名
四、sudo权限
1. sudo权限的概念
root把本来只能超级用户执行的命令赋予普通用户执行。
sudo的操作对象是系统命令。
2. sudo权限的使用
// 查看sudo配置文件
//man 5 sudoers查看配置文件详细
#visudo // 实际修改的是/etc/sudoers文件
// 用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
root ALL=(ALL) ALL
// 组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
%wheel ALL=(ALL) ALL
// 栗子一:普通用户不能执行shutdown命令
1 visudo //编辑/etc/sudoers文件
2 增加user1 ALL=(ALL) /sbin/shutdown -r now配置。
注:命令写的越简单,user1用户得到的权限越大,命令写的越详细,user1用户得到的权限就越小;系统命令要写成绝对路径,以兼容其他版本。
3 保存退出
// 登陆普通用户账号user1,执行系统命令
#su - user1
$ sudo -l // 要求输入user1密码,才能查看可执行的系统命令
$ sudo /sbin/shutdown -h now // 执行关机命令不被允许
$ sudo /sbin/shutdown -r now //执行重启命令
//栗子二: 给普通用户执行添加用户和密码的权限
# visudo
// 添加 user1 ALL=/usr/sbin/useradd 配置
// 添加 user1 ALL=/usr/bin/passwd 配置注:这使user1可以更改root的密码
// user1 ALL=/usr/bin/passwd [A-Za-z]*, !/usr/binpasswd "", !/usr/bin/passwd root,则user1无法更改root密码
// 添加 user1 ALL=/bin/vi 注:这使user1可以编辑/etc/shadow文件,更改root用户等密码
五、文件特殊权限
1. SetUID权限
- 只有可执行的二进制程序才能设定SetUID权限
- 命令执行者要对该程序拥有x(执行)权限
- 命令这行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
如: passwd命令,其他用户都可以使用passwd更改自己的密码[user1@localhost root]$ ll /usr/bin/passwd -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
- SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效;
2. 设置和取消SetUID权限
/*设置SetUID权限,4代表设置SetUID、2代表SetGID、1代表stickyBIT
u+s :代表给文件加上SetUID权限
g+s :代表给目录加上SetGID权限
o+s :代表给文件加上STICKBIT权限
*/
#ll
-rwxr-xr-x .... test
#chmod 4755 test // 或chmod u+s test
-rwsr-xr-x ... test
// 若文件没有执行权限,但设置SetUID时,执行位显示大S,这没有意义。
// 取消SetUID权限
#chmod u-s test
#chmod 0755 test
3. 危险的SetUID权限
关键目录应严格控制写权限,比如”/”、”/usr” 等
用户的密码设置要严格最受密码三原则
对系统中默认应该具有SetUID权限的文件作以列表,定时检查有没有这之外的文件被设置了SetUID权限
不能对vi等编辑器赋予SetUID权限,这样vi就能编辑/etc/shadow文件而更改root密码。
#!/bin/bash
# 搜索系统中所有拥有SUID和SGID的文件, 并保存到临时文件中
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
# 做循环,每次循环取出临时文件中的文件名
for i in $(cat /tmp/setuid.check)
do
# 比对这个文件是否再模板文件中
grep $i /root/suid.log > /dev/null
# 检测上一个命令的返回值,如果不为0,证明上一个命令报错
if ["$?" != "0"]
then
# 如果文件名不在模板文件中,则输出错误信息,并把报错输出到日志中
echo "$i is not in listfle" >> /root/sudi_log_$(date +%F)
fi
done
# 删除临时文件
rm -rf /tmp/setuid.check
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本