linux权限管理总结


文件或目录的权限

目录和文件拥有:读r、写w、执行x权限。

// 使用 ls -l命令查看当前目录的文件权限信息
#ll
-rw-r--r-- 1 root root  161 Mar 20 20:39 test.txt // test文件所有者拥有读写权限、所属组和其他用户拥有读权限
drw-r--r-- 1 root root  248 Mar 23 21:03 download

权限对文件的作用

r :读取文件内容(cat、more、head、tail)
w:编辑、新增、修改文件内容(vi、echo),但不包含删除文件
x:可执行
对文件来讲:最高权限是执行权限(x),所以文件要少赋予执行权限。

权限对目录的作用

r:可以查询目录下文件名(ls)。
w: 具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名此目录下文件和目录,剪切此目录下文件或目录。(touch、rm、mv、cp)。
x:可以进入目录(cd)。
对目录来讲:最高权限是写权限(w),所以目录要少赋予写权限。
注:0没有任何权限,5(rx)可以查看和进入,7(rwx)拥有最高权限;1、4、6权限对目录没有意义。

分配文件基本权限时,核心原则:在最小权限情况下能够实现要求即可!

chmod 修改文件或目录的权限

/*使用[u、g、o、a][+、-、=]来设置文件或目录的权限[r、w、x]
u:user 所有者
g:group 所属组
o:other 其他
a:all 所有用户,包括所有者、所属组、其他
+:增加权限
-:减少权限
=:设置权限
*/
// 给test的拥有者u,文件增加某权限
#chmod u+x,g+r test
#chmod a+w test
#chmod u-x test
#chmod g=rwx test

/*使用数字设置文件或目录的权限
rwx在Linux下分别对应十进制4、2、1 即3bit二进制的111
*/
// 设置dir目录的所有者拥有所有权限,所属组和其他用户拥有读和执行的权限
#chmod 755 dir/

chown 改变文件或目录的所有者

格式:chown newUser 文件名
让其他人拥有最高权限的最佳做法是使用chown更改文件的所有者。

// 同时改变文件的所有者和所属组
chown user:group 文件名

chgrp 改变文件或目录的所属组

格式:chgrp newUser 文件名
注:linux创建文件时,默认其所有者为当前用户、其所属组为与当前用户名相同的组。

/* 用例
 *1 当前用户创建一个test目录
 *2 创建新的用户xm,并让他拥有test目录的所有权限
 *3 让组用户可以拥有查看权限
 *4 其他人没有这个目录的任何权限
*/
// 创建test目录 
#mkdir test
// 添加用户xm和密码 
#useradd xm
#passwd xm
// 创建用户user1、user2
#useradd user1 
#useradd user2
// 创建user组
#groupadd user
// 把user1、user2添加到user组
#gpasswd -a user1 user
#gpasswd -a user2 user
// 更改test目录的所有者和组
#chown xm:user test
// 更改test目录权限
#chmod 750 user

默认权限

umask 查看默认权限

#umask
0022 // 第一位0是特殊权限

umask值的修改

临时修改
umask 0033
永久修改
vi /etc/profile

文件的默认权限

文件默认不能建立为执行文件,必须手工赋予执行权限
所以文件默认权限最大为666
默认权限需要换算成字母再相减
建立文件之后的默认权限,为666减去umask值
例如:
666 - 022(umask值)
-rw-rw-rw- 减去 —–w–w- 等于 -rw-r–r–
666 - 033(umask值)
-rw-rw-rw- 减去 —–wx-wx 等于 -rw-r–r– (注:空减去某权限仍为空)

目录的默认权限

目录默认权限最大为777
默认权限需要换算成字母再相减
建立文件后的默认权限,为777减去umask值

ACL权限

ACL权限简介

Linux基本权限管理中是分为用户所有者、所属组和其他人,如果有人想拥有和基本权限中任何权限都不一样的时候,基本权限无法满足这种需求,这时候可以考虑使用ACL权限。

例如:
Linux中有一个test目录,它的所有者为xiaoming,拥有所有权限;文件夹所在组stu,也拥有所有权限;其他人没有任何权限。但是,要给一个新用户xiaowang对test目录拥有读和执行权限时,基本权限满足无法分配需求。

ACL权限用来解决用户身份不够的情况。windows系统给文件分配权限时,不用考虑文件的所有者和所属组,可以给任何用户分配相应的权限;ACL权限和windows系统一样,可以分配任何用户相应的权限而不考虑文件所有者和所属组的权限,这解决基本权限无法分配复杂权限的问题。

开启、查看和设置ACL权限

// 查看分区ACL权限是否开启
// df 查看分区情况
// dumpe2fs命令是查询指定分区详细文件系统信息命令;-h仅显示超级块中信息,而不显示磁盘块组的详细信息
#dumpe2fs -h  /dev/sda5 

// 临时挂载 根分区/ 的ACL权限
#mount -o remount,acl  / 

// 永久开启分区ACL权限
#vi /etc/fstab 
// defaults权限默认包括挂载ACL权限,如果没有ACL权限,在defaults后添加即可
UUID=6634633e-001d-43ba-8fab-202f1df93339 / ext4 defaults,barrier=0,acl 1 1
//重新挂载文件系统或重启动系统,使修改生效
#mount -o remount /

// 查看acl权限
#getfacl 文件名 

// 设置acl权限
setfacl [option] 文件名
options:
-m 设定acl权限     
   给用户赋予文件(或目录)acl权限,使用"u:用户名:权限"格式 
   例子:给用户lw赋予文件test读执行权限:setfacl -m u:lw:rx test
   给组分配acl权限使用"g:组名:权限"格式
-x 删除指定的acl权限
-b 删除所有的acl权限
-d 设定默认的acl权限
-k 删除默认的acl权限
-R 递归设定acl权限
// 解决上面提到的问题
#useradd xiaoming
#groupadd stu
#mkdir /home/test
#chmod 770 /home/test
#chown xiaoming:stu /home/test
#useradd xiaowang
// 设置acl权限
#setfacl -m u:xiaowang:rx /home/test
// 查看acl权限
#getfacl /home/test
# file: /home/test
# owner: xiaoming
# group: stu
user::rwx
user:xiaowang:r-x
group::rwx
mask:rwx  //????
other::---

最大有效权限与删除ACL权限

最大有效权限mask

mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限。

user::xiangwang:r-x
mask::rwx 
// xiaowang的权限与mask值相与,得到xiaowang的真实权限
// r-x 与 rwx得到有效权限r-x

删除ACL权限

// 删除指定用户的acl权限
#setfacl -x u:用户名 文件名
// 删除指定用户组的acl权限
#setfacl -x g:组名 文件名
// 删除指定文件的所有的acl权限
#setfacl -b 文件名

默认ACL权限和递归ACL权限

递归ACL权限

递归是父目录在设定ACL权限时,当前所有的子文件和子目录也拥有相同的ACL权限。递归ACL权限赋予文件会报错。

// 格式:setfacl -m u:用户名:权限 -R 目录名
#cd test
#touch file1
#touch file2
// 赋予用户lw拥有test目和test目录下文件的rx权限
// 使用 -R 参数设置递归权限,lw用户对file1和file2文件拥有了x权限,造成了权限溢出
#setfacl -m u:lw:rx -R test/ 
#touch file3 // 新建file3,没有acl权限
#getfacl file3 

默认ACL权限

默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限。

// 格式:setfacl -m d:u:用户名:权限 -R 目录名

sudo权限

sudo权限的概念

root把本来只能超级用户执行的命令赋予普通用户执行。
sudo的操作对象是系统命令。

sudo权限的使用

// 查看sudo配置文件
//man 5 sudoers查看配置文件详细
#visudo // 实际修改的是/etc/sudoers文件
// 用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
root ALL=(ALL)   ALL
// 组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
%wheel ALL=(ALL)  ALL


// 普通用户不能执行shutdown命令
#visudo
/* 编辑/etc/sudoers文件
1 增加user1 ALL=(ALL) /sbin/shutdown -r now配置。
注:命令写的越简单,user1用户得到的权限越大,命令写的越详细,user1用户得到的权限就越小;系统命令要写成绝对路径,以兼容其他版本。
2 保存退出
*/
// 登陆普通用户账号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用户等密码

文件特殊权限

SetUID权限

只有可执行的二进制程序才能设定SetUID权限

命令执行者要对该程序拥有x(执行)权限

命令这行者在执行改程序时获得该程序文件属主的身份

SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效;如passwd命令,其他用户都可以使用passwd更改自己的密码

设置和取消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

危险的SetUID权限

关键目录应严格控制写权限,比如”/”、”/usr” 等
用户的密码设置要严格最受密码三原则
对系统中默认应该具有SetUID权限的文件作以列表,定时检查有没有这之外的文件被设置了SetUID权限

不能对vi等编辑器赋予SetUID权限,这样vi就能编辑/etc/shadow文件而更改root密码。

SetGID权限

SetGID针对文件的作用

只有可执行的二进制程序才能设置SetGID权限

命令执行者要对该程序拥有x(执行)权限

命令执行在执行程序的时候,组身份升级为改程序文件的属组

SetGID权限同样只在改程序执行过程中有效,也就是说组身份改变只在程序执行过称重有效。注:与SetUID作用相似

// locate命令
#ll /usr/bin/locate
-rwx--s--x 1 root slocate ...  /usr/bin/locate
// locate 搜索数据库/var/lib/mlocate.db
#ll /var/lib/mlocate.db
-rw-r----- 1 root slocate ... /var/lib/mlocate.db // 普通用户时没有权限搜索这个数据库
// locate属于slocate组且设置了SetGID权限,slocate组拥有对mlocate.db读的权限,所以普通用户使用locate时组身份自动升级为slocate组则可以使用locate命令查询mlocate.db数据库。命令结束后,用户user身份返回user组身份。

SetGID针对目录的作用

普通用户必须对此目录拥有r和x权限,才能进入此目录

普通用户在此目录中的有效组会变成此目录的属组

若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组

// 在root用户在/tmp目录创建test目录,并更改目录权限为777
#cd /tmp
#mkdir test
#ll
drwxr-xr-x 2 root root ... test
#chmod 777 test
#ll
drwxrwxrwx 2 root root ... test

// user用户在/tmp/test目录创建file1
$cd /tmp/test
$touch file1
$ll
-rw-rw-r-- 1 user user ... file1

// root用户更改test目录为2777即设置SetGID
#chmod 2777 test
#ll
drwxrwsrwx 2 root root ... test
// user用户在/tmp/test目录创建file2
$touch file2
$ll
-rw-rw-r-- 1 user user ... file1
-rw-rw-r-- 1 user root... file2 // 新建file2文件所属组为root组

设置和取消SetGID权限

// 设置SetGID权限
#chmod 2755 test/
#chmod g+s test/
// 取消SetGID权限
#chmod 0755 test/
#chmod g-s test/

Sticky BIT

SBIT粘着位作用

黏着位目前只针对目录有效

普通用户对目录拥有w和x权限,若普通用户可以拥有此目录的w权限

如果该目录没有黏着位,普通用户因为拥有所有权限,可以删除该目录所有的文件,包括其他用户建立的文件;该目录赋予黏着位后,普通用户就算拥有目录的w权限,也只能删除自己建立的文件,不能删除其他用户建立的文件。

如/tmp 目录即拥有黏着位

设置与取消黏着位

// 设置黏着位
#chmod o+t dir
#chmod 1777 dir
// 取消黏着位
#chmod o-t dir
#chmod 0777 dir

不可改变位权限

chattr [+-=] [option] 文件名或目录名
+ : 增加权限
- :删除权限
=:等于某权限
options:
i:如果对文件设置i属性,那么不允许对文件进行删除,改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。

a:如果对文件设置a属性,那么只能在文件中增加数据,但不能删除也不嗯呢该修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但不允许删除。:不允许使用vi增加文件数据,因为无法判断vi是增加还是修改或删除文件数据,所以只能使用echo data>> file来追加数据。

chattr对文件或目录都生效

#chattr +i file
#lsattr file
----i-------e- file
#vim abc // 不允许修改
#rm -rf file //不允许删除
// 删除i属性
#chattr -i file

参考

慕课网教程linux权限管理

相关内容