Linux权限扩展

     在LINUX中我们创建文件或文件夹的时候系统总会为我们创建的对象分配一个默认的权限,那么今天我们就了解一下这个默认权限是怎么得来的?以及我们如何来改变系统的默认权限设置?

    在LINUX系统中我们打开每一个终端都会拥有一个umask属性,这个umask属性使用数字方式来表示,如:002或022,这个属性也是用来确定新建文件夹、新建文件的默认权限的。需要注意的是普通用户和root用户的umask值有可能是不同的,所以普通用户和root用户下创建对象的默认权限也有可能是不同的。

[oracle@std ~]$ umask
0022
[oracle@std ~]$ su -
Password: 
[root@std ~]# umask
0022

 备注:可以看到umask值为4为,其中最前面一位表示特殊权限为

    文件夹和文件是用不同的计算方式来确定默认权限:

    目录的默认权限是:777-umask

    文件的默认权限是:666-umask

  通常情况下在LINUX中,普通用户的umask值为002,root用户的默认umask值为022

     新建目录的默认权限是:777-umask

     新建文件的默认权限是:666-umask

  利用上面的公式,我们也就知道了----

    对于普通用户来说:----------------------------

     新建目录的默认权限是:777-002=775

     新建文件的默认权限是:666-002=664

    对于root用户来说:-----------------------------

     新建目录的默认权限是:777-022=755

     新建文件的默认权限是:666-022=644

[root@std ~]# umask
0022
[root@std ~]# mkdir test
[root@std ~]# ls -ld test
drwxr-xr-x 2 root root 4096 Jan 23 09:13 test
[root@std ~]# touch aa
[root@std ~]# ls -l aa
-rw-r--r-- 1 root root 0 Jan 23 09:14 aa


 

可以通过umask命令查看/更改umask的值,这样的更改只是对当前终端有效,对其他终端是没有效果的,我们可以把这个命令写到当前用户的.bash_profile中

[oracle@std ~]$ umask
0022
[oracle@std ~]$ umask 002
[oracle@std ~]$ umask
0002

LINUX的特殊权限 setuid/setgid/sticky

我们知道在LINUX中文件都有所有者及所有组,文件的所有者表示了该文件是谁创建的,文件的所有组表示这个文件所有者所属的组。结合文件或目录的权限位-rwxrwxrwx就能够知道这个用户及属于该组里的用户对这个文件或目录能够拥有什么样的具体权限。了解这个我们就来说说LINUX中的特殊权限。

setuid:具有setuid权限的文件能够以文件的所属用户身份执行,而非执行文件的用户

[root@std ~]# which passwd
/usr/bin/passwd
[root@std ~]# ll /usr/bin/passwd
-rwsr-xr-x 1 root root 22960 Jul 17  2006 /usr/bin/passwd
[root@std ~]# ll /etc/shadow
-r-------- 1 root root 1101 Dec 17  2013 /etc/shadow

例如上面我们看到passwd命令是用来更改用户密码的,普通用户也可以使用这个命令更改自己的密码,
该命令需要把密码保存在/etc/shadow文件中,可以看到/etc/shadow的权限是除了root用户其他任何用户
都无权限写的。那么一个普通用户如何怎么还可能使用passwd命令更改密码那,。。。原因就在于/usr/bin/passwd
文件具有一个setuid权限,如上,-rwsr-xr-x 1 root root 22960 Jul 17  2006 /usr/bin/passwd
注意setuid权限只对文件有效,对目录没效

setgid:具有setgid权限的文件以文件所属组运行,该目录中创建的任何新文件的所属组与该目录的所属组相同

sticky: 对目录拥有写入权限的用户仅可以删除其拥有的文件,无法删除其他用户所拥有的文件。

例如在tmp文件里,所有用户都有读写权限,但用户只能删除属于自己的文件,删除不了别的用户的文件

[root@std ~]# ll -ld /tmp
drwxrwxrwt 24 root root 4096 Jan 23 10:00 /tmp
[root@std ~]# ll /tmp
total 124
-rw-r----- 1 oracle oinstall  1170 Jan 16 10:14 cpuinfo.txt
drwx------ 2 oracle oinstall  4096 Jan 21 17:38 gconfd-oracle
-rw-r----- 1 oracle oinstall    14 Jan 16 10:12 glibc.txt
drwx------ 2 oracle oinstall  4096 Sep  9 09:12 keyring-fNMrwn
drwx------ 2 oracle oinstall  4096 Aug 28 09:13 keyring-g5tA5I
drwx------ 2 oracle oinstall  4096 Sep 24 09:03 keyring-GbCSBP
drwx------ 2 oracle oinstall  4096 Nov 16 16:52 keyring-IbMKsk
drwx------ 2 oracle oinstall  4096 Sep 22 14:18 keyring-VXqxii
-rw-r----- 1 oracle oinstall    20 Jan 16 10:14 LinuxVendor_output.txt
srwxr-xr-x 1 oracle oinstall     0 Jan 21 09:29 mapping-oracle
srwxr-xr-x 1 root   root         0 Oct 11 10:56 mapping-root
drwxrwx--- 2 oracle oinstall  4096 Jan 15 16:32 OraInstall2015-01-15_04-32-22PM
drwxrwx--- 2 oracle oinstall  4096 Jan 15 16:34 OraInstall2015-01-15_04-34-21PM
drwxrwx--- 2 root   root      4096 Jan 15 16:47 OraInstall2015-01-15_04-47-48PM
drwxr-xr-x 7 root   root      4096 Jan 15 16:48 OraInstall2015-01-15_04-47-59PM
drwxr-xr-x 7 root   root      4096 Jan 15 16:49 OraInstall2015-01-15_04-49-29PM
drwxr-xr-x 7 root   root      4096 Jan 15 16:50 OraInstall2015-01-15_04-50-27PM
drwxrwx--- 2 oracle oinstall  4096 Jan 15 16:50 OraInstall2015-01-15_04-50-38PM
drwxrwx--- 2 oracle oinstall  4096 Jan 16 10:22 OraInstall2015-01-16_10-22-44AM
-rw-r----- 1 oracle oinstall 32742 Jan 16 10:12 pkginfo.txt
srw------- 1 oracle oinstall     0 Jan 21 09:29 scim-panel-socket:0-oracle
srw------- 1 root   root         0 Oct 11 10:56 scim-panel-socket:0-root
-rw-r----- 1 oracle oinstall   102 Jan 16 10:14 swapinfo.txt
-rw-r----- 1 oracle oinstall    11 Jan 16 10:14 tmpFileKernelParms.txt
drwxrwxrwt 2 root   root      4096 Jan 15 15:46 VMwareDnD
drwx------ 2 oracle oinstall  4096 Jan 21 09:29 vmware-oracle
drwxr-xr-x 2 root   root      4096 Jan 23 08:54 vmware-root
drwx------ 2 root   root      4096 Jan 23 08:54 vmware-root-2779267766

设置setuid/setgid/sticky权限可以通过chmod命令:

--用权限位表示
chmod u+s aa -- 为aa文件加上setuid标志. (setuid 只对文件有效)
chmod g+s test -- 为test目录加上setgid标志 (setgid 只对目录有效)
chmod o+t aa -- 为aa文件加上sticky标志 (sticky只对文件有效)

[root@std ~]# ll aa
-rw-r--r-- 1 root root 0 Jan 23 09:14 aa
[root@std ~]# chmod u+s aa
[root@std ~]# ll aa
-rwSr--r-- 1 root root 0 Jan 23 09:14 aa
[root@std ~]# ll -ld test
drwxr-xr-x 2 root root 4096 Jan 23 09:13 test
[root@std ~]# chmod g+s test
[root@std ~]# ll -ld test
drwxr-sr-x 2 root root 4096 Jan 23 09:13 test
[root@std ~]# chmod o+t aa
[root@std ~]# ll aa
-rwSr--r-T 1 root root 0 Jan 23 09:14 aa

--用数字位表示

使用八进制方式在原先的数字前加一个数字,三个权限所代表的进制数与一般权限的方式类似,如下:

suid   guid    stick bit

  1        1          1

所以这一组八进制数字三位的意义如:

suid的二进制串为:100,换算十进制为:4

guid的二进制串为:010,换算:2

stick bit 二进制串:001,换算:1

chmod 4755 aa -- 为aa文件加上setuid标志. (setuid 只对文件有效)

chmod 2755 test -- 为test目录加上setgid标志 (setgid 只对目录有效)

chmod 1755 aa -- 为aa文件加上sticky标志 (sticky只对文件有效)

[root@std ~]# rm -rf aa test
[root@std ~]# touch aa
[root@std ~]# ll aa
-rw-r--r-- 1 root root 0 Jan 23 10:19 aa
[root@std ~]# chmod 4755 aa
[root@std ~]# ll aa
-rwsr-xr-x 1 root root 0 Jan 23 10:19 aa
[root@std ~]# mkdir test
[root@std ~]# ll -ld test
drwxr-xr-x 2 root root 4096 Jan 23 10:21 test
[root@std ~]# chmod 2755 test
[root@std ~]# ll -ld test
drwxr-sr-x 2 root root 4096 Jan 23 10:21 test
[root@std ~]# chmod 1755 aa
[root@std ~]# ll aa
-rwxr-xr-t 1 root root 0 Jan 23 10:19 aa

通过两次测试我们发现原来的执行标志x没有了且两次测试权限位有大小写区别。这是因为系统是这样规定的,
如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)

原文地址:https://www.cnblogs.com/myrunning/p/4242845.html