linux特殊权限

特殊权限

suid

Linux中每个人都可以修改自己的密码,然而修改密码的操作需要更改/etc/shadow文件,而普通用户本来是没有对这个文件修改的权限的。那么我们为什么可以修改密码呢?

通过查看我们可以看到,我们的passwd命令权限中有一个s权限,这个权限表示用户在执行这个命令时,会以该命令的属主的身份去执行这个命令。然后这个命令的属主是root,root拥有最高权限,因此我们就可以去修改自己的密码了。

suid权限用数字表示是4000。

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

[root@VM-111-54-centos ~]# ll /usr/bin/passwd 
-rwsr-xr-x 1 root root 27832 Jun 10  2014 /usr/bin/passwd
[root@VM-111-54-centos ~]# ll /etc/shadow
---------- 1 root root 811 Feb 17 16:30 /etc/shadow

我们来验证一下:

当我们的普通用户使用passwd修改自己的密码时,我们去查看进程信息得到的消息如下:

[root@VM-111-54-centos ~]# ps aux |grep "passwd"
root      6649  0.0  0.0  70536  1984 pts/2    S+   10:29   0:00 passwd
root      6695  0.0  0.0  12160   688 pts/4    S+   10:29   0:00 grep --color=auto passwd


由上面的执行结果可以看出,passwd这个命令哪怕是被普通用户执行实质上也是被root这个用户执行的。

添加s权限的方法:

[root@VM-111-54-centos ~]# chmod 4755 /usr/bin/cat
或者
[root@VM-111-54-centos ~]# chmod u+s /usr/bin/cat

演示:
[root@VM-111-54-centos ~]# ll /usr/bin/cat
-rwxr-xr-x 1 root root 54048 Feb 10  2017 /usr/bin/cat
[root@VM-111-54-centos ~]# chmod 4755 /usr/bin/cat
[root@VM-111-54-centos ~]# ll /usr/bin/cat
-rwsr-xr-x 1 root root 54048 Feb 10  2017 /usr/bin/cat
[root@VM-111-54-centos ~]# chmod 755 /usr/bin/cat
[root@VM-111-54-centos ~]# ll /usr/bin/cat
-rwxr-xr-x 1 root root 54048 Feb 10  2017 /usr/bin/cat
[root@VM-111-54-centos ~]# chmod u+s /usr/bin/cat
[root@VM-111-54-centos ~]# ll /usr/bin/cat
-rwsr-xr-x 1 root root 54048 Feb 10  2017 /usr/bin/cat

sgid(使用极少)

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

sgid用数字的方式表示是2000。

与suid基本类似,区别在于sgid表示以属组身份去运行。

如果目录有用sgid权限,那么在其下创建的所有文件都将都与这个目录的属组保持一致。

方便我们去共享一个目录下的所有文件。

添加sgid权限的方法:

[root@VM-111-54-centos ~]# chmod 2755 /usr/bin/passwd
或者
[root@VM-111-54-centos ~]# chmod g+s /usr/bin/passwd

sbit

针对目录,表示粘滞位:

目录一旦被赋予了粘滞位,只有root可以删除所有的文件,其他用户就只能删除自己的文件。

作用:在我们要初始化mysql时,会创建一些临时文件到/tmp目录下,当初始化完毕后,自己会清理掉里面的数据,别人无法清理。(如果这个目录不是粘滞位,那么初始化mysql就会报错。)

sbit用数字的方式表示是1000。

[root@VM-111-54-centos ~]# ll /tmp/ -d
drwxrwxrwt. 10 root root 4096 Mar 17 09:19 /tmp/

添加sbit权限的方法:
[root@VM-111-54-centos ~]# chmod 1755 /tmp
或者
[root@VM-111-54-centos ~]# chmod o+t /tmp

文件属性(lsattr)

lsattr 表示查看文件的特殊属性。

chattr

用于修改文件的特殊属性,凌驾于rwx基础权限之上的授权。

格式:

chatrr [±=] 选项 文件或目录名

选项
	+ 增加权限 
	- 减少权限 
	= 等于某个权限
# a:让文件或目录仅可追加内容(一般用于日志类文件,如:sudo日志)
# i:不得任意更动文件或目录

lsattr[a选项]

1.配置一个文件,让其只能追加内容,不允许手动修改,也不允许删除 ( sudo -->日志-->设置为只能追加,不能修改,不能删除 )

[root@VM-111-54-centos /tmp]# touch /mnt/file_a
[root@VM-111-54-centos /tmp]# chattr +a /mnt/file_a
[root@VM-111-54-centos /tmp]# lsattr /mnt/file_a
-----a---------- /mnt/file_a

2.可以追加内容

[root@VM-111-54-centos /tmp]# echo "aaa" >> /mnt/file_a
[root@VM-111-54-centos /tmp]# echo "aaa" >> /mnt/file_a
[root@VM-111-54-centos /tmp]# echo "aaa" >> /mnt/file_a
[root@VM-111-54-centos /tmp]# cat /mnt/file_a
aaa
aaa
aaa

3.不能删除

[root@VM-111-54-centos /tmp]# rm -f /mnt/file_a
rm: 无法删除"/mnt/file_a": 不允许的操作	

ps:a属性一般作用于日志类文件,特别是 sudo 记录下来的日志

4.如果想删除特殊属性,需要使用root身份,先取消属性,然后删除

[root@VM-111-54-centos /tmp]# chattr -a /mnt/file_a
[root@VM-111-54-centos /tmp]# lsattr /mnt/file_a
---------------- /mnt/file_a
[root@VM-111-54-centos /tmp]# rm -f /mnt/file_a

lsattr[i选项]

#1.配置一个文件,不能改,不能追加,不能删除。 ( /etc/passwd 可能不需要删除、更改、追加。 )

[root@VM-111-54-centos /tmp]# touch /mnt/file_i
[root@VM-111-54-centos /tmp]# lsattr /mnt/file_i
---------------- /mnt/file_i

2.赋予权限

[root@VM-111-54-centos /tmp]# chattr  +i /mnt/file_i

3.验证权限

[root@VM-111-54-centos /tmp]# rm -f /mnt/file_i
rm: 无法删除"/mnt/file_i": 不允许的操作
[root@VM-111-54-centos /tmp]# echo "123" >> /mnt/file_i
-bash: /mnt/file_i: 权限不够

总结:

a:让文件或目录仅可追加内容(一般用于日志类文件,如:sudo日志)

i:不可任意变更文件或目录

umask默认权限

1.系统中默认创建的目录权限为什么是755,默认创建的文件权限是644呢?又是为什么默认创建一个用户,他的家目录权限是700呢?

要知道,系统默认的权限为: 目录 777 文件666

2.原因在于这些文件权限都是由umask来控制的。

假设我们的umask为0022,那么我们最终创建出来的文件和目录就是:

目录755 文件644

可以看出,我们创建文件或目录他们的默认权限就是系统默认的权限减去我们的umask值所得到的。

----------------UMASK表示要减掉的权限-------------------------------
			目录: 777 - 022  = 755	最终创建出来的目录权限
			文件: 666 - 022  = 644	最终创建出来的文件权限

umask涉及到的相关文件

1.默认创建普通用户家目录的权限,在哪个文件中控制的UMASK:

/etc/login.defs 这个文件可以修改创建用户的家目录的默认权限,在这个文件中我们可以看到umask值为077,因此我们的家目录的权限默认就是700。如果我们想修改用户的家目录的默认权限,我们只需要修改这个文件中的umask值就可以。

		1.默认创建的用户家目录为啥是 700,是哪个文件控制的UMASK   
			[root@VM-111-54-centos /tmp]# vim /etc/login.defs
			UMASK           077		#创建用户时,设定的UMASK为077

		2.假设去创建一个用户那么如何计算这个家目录的权限呢?
			777 - 077 = 700
			[root@VM-111-54-centos /tmp]# ll -d /home/oldboy/
			drwx------. 2 oldboy oldboy 62 3月  17 11:33 /home/oldboy/
 
		3.如果我希望创建出来的目录权限是755,我该怎么做呢?
			777 - 755 = 022  (将/etc/login.defs 中UMASK设置为022,那么我们的目录是不是在创建初就为755了)
						
			[root@VM-111-54-centos /tmp]# ll -d /home/olgirl/
			drwxr-xr-x. 2 olgirl olgirl 62 3月  17 11:36 /home/olgirl/

2.默认情况下 root用户创建的文件权限,和普通用户创建的文件权限是不一样的?为什么?

/etc/profile 这个文件可以修改用户创建的文件或目录的默认权限,文件中与umask相关的代码如下图:

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
   	 	umask 002
	else
    		umask 022
	fi

我们都知道,我们创建的用户无论是普通用户还是系统用户,他们的uid都是大于199的,因此分析上面的代码可以看出,我们创建的用户所创建的文件的默认umask值为022,而系统默认就有的用户如root创建的文件的默认的umask值为002。

#root创建的文件,默认是644
[root@VM-111-54-centos /tmp]# ll root_file
-rw-r--r--. 1 root root 0 3月  17 11:39 root_file

#普通用户创建的文件,默认是664
[root@VM-111-54-centos /tmp]$ ll
-rw-rw-r--. 1 oldxu oldxu 0 Mar 17 11:39 oldxu_file

?????

root执行	666 - 022 = 644
[root@VM-111-54-centos /tmp]# umask
0022

普通用户执行 666 - 002 =664
[root@VM-111-54-centos /tmp]$ umask
0002

		
#当一个用户登陆系统时,会去加载一些环境变量,来初始化我们的工作目录。
/etc/profile    <--umask就在这里面给控制了????

ps:这里的umask值可以进行修改,但是生产过程中没有这样的必要。

文件和目录的默认权限都是授UMASK控制,而UMASK是用户在登陆系统时,通过 /etc/profile 中的一个公式来进行的分别设定。

umask使用

UMASK扩展:

如何去临时修改UMASK,来验证我们的权限的说法:

如果我们要临时修改umask值可以使用umask命令来进行修改。

使用示例如下:
[root@VM-111-54-centos ~]# umask 045
直接使用umask查看值

#1.假设umask值为:022(所有位为偶数)
#文件的起始权限值
6 6 6  -  0 2 2  = 6 4 4 
7 7 7  -  0 2 2 =  7 5 5


#2.假设umask值为:045(其他用户组位为奇数)
#计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
6 6 6  -   0 4 5 = 6 2 1  + 1   = 622
7 7 7  -   0 4 5 = 7 3 2
 
#umask所有位全为偶数时
# umask 044
# mkdir d044   目录权限为 777 - 044 = 733
# touch f044   文件权限为 666 - 044 = 622

#umask部分位为奇数时
# umask 023
# mkdir d023   目录权限为777 - 023 = 754
# touch f023   文件权限为666 - 023 = 643 + 001 = 644

#umask部分位为奇数时
# umask 032
# mkdir d032   目录权限为777 - 032 = 745
# touch f032   文件权限为666 - 032 = 634 + 010 = 644


#umask值的所有位为奇数时
# umask 035
# mkdir d035   目录权限为777 - 035 = 742
# touch f035   文件权限为666 - 035 = 631 + 011  = 642

注意:在使用umask计算文件权限时,如果存在奇数位的umask值,那么正常计算后需要给对应的位置+1,如果没有奇数位的umask值,那么直接计算即可。在计算目录权限时,则直接计算即可。

posted @ 2022-04-13 00:26  小迷茫c  阅读(201)  评论(0)    收藏  举报