博文大纲:

  • 一、umask命令(默认权限)
  • 二、chattr及lsattr命令(隐藏权限)
  • 三、 SUID、SGID及SBIT的作用(特殊权限)

一、umask命令:

umask是chmod相关的东西,代表权限掩码,总共4位,以反掩码的形式表示,文件的原始权限是666,目录的原始权限是777,将相应的原始权限和umask值进行与运算,得出的结果就是默认新建的文件或目录的权限。具体如下:

[root@localhost ~]# umask     #执行umask命令
0022

可以查看出来四位数字,分别是“0022”,依次表示的是特殊权限、属主权限、属组权限以及其他人的权限,如上面查询出来的0022,那么现在新建一个文件,该文件的默认权限就是644,若新建一个目录,那么该目录的默认权限就是755,如下:

[root@localhost tmp]# touch test1.txt    #新建一个文件
[root@localhost tmp]# ll test1.txt     #可以看到默认的权限为644
-rw-r--r-- 1 root root 0 Aug 12 17:51 test1.txt
[root@localhost tmp]# mkdir test2  #新建一个目录
[root@localhost tmp]# ls -ld test2     #可以看到默认的权限为755
drwxr-xr-x 2 root root 6 Aug 12 17:51 test2

修改umask权限数字:

[root@localhost ~]# umask 0002        #直接在umask命令后输入权限数字即可
[root@localhost ~]# umask    #验证
0002

umask命令只能临时修改umask值,系统重启之后umask将还原成默认值。如果要永久修改umask值,需要修改/etc/profile文件或是修改/etc/bashrc文件,例如要将默认umask值设置为027,那么可以在文件中增加一行“umask 027”,并且使用source /etc/profile,使更改生效。

/etc/profile和/etc/bashrc都可以用于设置用户登录系统时自动执行某些操作,他们的区别是/etc/profile只在用户第一次登录时被执行,而/etc/bashrc则在用户每次登录加载Bash Shell时都会被执行。

因而,如果是修改/etc/profile文件,将只对新创建的用户生效;而如果是修改/etc/bashrc文件,则对所有用户都生效。

针对对某个特定用户,以上两种配置文件,.bashrc文件中的配置优先级更高。

二、chattr及lsattr命令

有时候我们会遇到这种情况,就是root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了。chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的linux系统都是2.6以上内核了。通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。lsattr命令是显示chattr命令设置的文件属性。

这两个命令是用来查看和改变文件、目录属性的,与chmod这个命令相比,chmod只是改变文件的读写、执行权限,更底层的属性控制(也就是特殊权限)是由chattr来改变的。

1、chattr命令用法:

[root@localhost ~]# chattr [+-=] [ASacdistu]   文件或目录名

各个选项含义如下:

  • + :在原有隐藏参数设定基础上,追加某一个或多个隐藏参数。
  • - :在原有隐藏参数设定基础上,移除某一个隐藏参数。
  • = :更新为指定隐藏参数。
  • A:当设置了A这个属性时,若你有重新存取此文件或目录时,该文件或目录本身的atime将不被修改,可避免I/O较慢的机器过度的存取磁盘(目前建议使用文件系统挂载参数处理这个项目)。
  • S:一般文件是非同步写入磁盘的,如果加上S这个属性,说明当你进行任何文件的修改,该更改会“同步”写入磁盘中。
  • a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
  • c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
  • d:即no dump,设定文件不能成为dump程序的备份目标。
  • i:就是锁定某一个文件或目录,设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件系统的安全设置有很大帮助。
  • j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
  • s:当文件设置了s属性时,如果这个文件被删除,它将完全的移除这个硬盘空间。所以如果误删除了,也就完全无法救回来了。
  • u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以使用数据恢复技术恢复其数据。

各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。

注:xfs文件系统仅支持AadiS参数。

2、lsattr命令语法:

[root@localhost ~]# lsattr [adR]  文件或目录

各个选项含义如下:
-a:将隐藏文件的属性也显示出来;
-d:如果查看的是目录,仅列出目录本身的属性而不是目录内的文件名;
-R:连同子目录的数据也一并列出来;

用法示例:

1、用chattr命令防止系统中某个关键文件被修改:

[root@localhost ~]# chattr +i /etc/resolv.conf

然后用mv /etc/resolv.conf等命令操作于该文件,都是得到Operation not permitted 的结果。vim编辑该文件时会提示W10: Warning: Changing a readonly file错误。要想修改此文件就要把i属性去掉: chattr -i /etc/resolv.conf

[root@localhost ~]# lsattr /etc/resolv.conf   #查看一下属性,会得到以下结果
----i-------- /etc/resolv.conf

2、让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:

[root@localhost ~]# chattr +a /var/log/messages

三、 SUID、SGID及SBIT的作用

1、SUID的作用

其实SUID和SGID的作用跟sudo是相似的。当用户A想执行一个原本属于用户B的可执行文件时,若B的文件设置了suid位,则A在执行时是以用户 B的身份来执行。

SUID是Set UID的简称,翻译过来是设置用户ID,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。例如,使用如下命令:

[root@localhost ~]# ls -ld /usr/bin/passwd     #查询passwd命令
-rwsr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd

可以看到,在文件拥有者的执行位上出现为s而不是x,所以说passwd这个程序是具有SUID权限的。我们在修改用户密码的时候,用的就是passwd这个命令,这是系统默认给了passwd这个命令的SUID权限,因为总不能说用户改自己的密码还需要提权吧?

我们都知道密码是保存在/etc/shadow中的,但是这个文件,只有root可以写入,那么我们普通用户是怎么将新密码写入的呢?这就和SUID有关了,当我们使用passwd命令时,就获得了passwd的所有者也就是root的权限,进而可以对shadow文件进行写入操作。

SUID的特点:
1.SUID只对二进制文件有效;
2.调用者对该文件(如/usr/bin/passwd)有执行权,也就是“x”权限
3.在执行过程中,调用者会暂时获得该文件的所有者权限
4.该权限只在程序执行的过程中有效

下图可以生动的表示SUID的作用:

Linux之权限设置(默认权限、隐藏权限及特殊权限)_第1张图片

2、SGID的作用

SGID即Set GID的缩写,它出现在文件所属组权限的执行位上面,它对普通二进制文件和目录都有效。当它作用于普通文件时,和SUID类似,在执行该文件时,用户将获得该文件所属组的权限。当SGID作用于目录时,意义就非常重大了。当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录有SGID的特殊权限,则该用户在这个目录下建立的文件都是属于这个目录所属的组。

SGID的特点:
1、SGID对二进制程序、文件或目录都有效;
2、程序执行者对于该程序来说,需具备“x”权限;
3、执行者在执行过程中将会获得该程序群组的支持;

3、SBIT

SBIT即Sticky Bit,它出现在其他用户权限的执行位上,它只能在一个目录上设置。当某一个目录拥有SBIT权限时,则任何一个能够在这个目录下建立文件的用户,该用户在这个目录下所建立的文件,只有该用户自己和root可以删除,其他用户均不可以。/tmp就是很好的例子,例如:

[lv@localhost tmp]$ touch a.txt    #用户“lv”在tmp目录下创建一个文件
[lv@localhost tmp]$ ls -ld /tmp    
#确认/tmp目录的权限为777,并且有“t”权限
drwxrwxrwt. 16 root root 4096 8月  13 16:27 /tmp
[lv@localhost tmp]$ chmod 777 a.txt    #将新建的文件改为777权限
[lv@localhost tmp]$ ls -ld a.txt    #确认一下
-rwxrwxrwx 1 lv lv 0 8月  13 16:27 a.txt
#至此,在一般目录下,所有人都可以删除这个a.txt文件了
#但由于/tmp目录有“t”的特殊权限,所以并不可以,来验证一下
[lv@localhost tmp]$ su lvjianzhao  #切换至另一个用户
密码:
[lvjianzhao@localhost tmp]$ rm -rf a.txt     #进行强制删除,会提示以下
rm: 无法删除"a.txt": 不允许的操作

这就是SBIT的作用。

修改SUID、SGID及SBIT有两种方法,都是使用chmod这个命令,chmod既可以修改普通权限,也可以修改这三个特殊权限,

这三个特殊权限分别对应的权限数字为:
suid=4
sgid=2
sbit=1

如,想要给/tmp目录一个sbit的权限,那么执行以下两种命令其中之一即可:

[root@localhost /]# chmod o+t /tmp
                                   或
[root@localhost /]# chmod 1777 /tmp   #其中权限数字中的第一位就是特殊权限位

注:u=用户;g=组;o=其他人,一般推荐使用权限数字方法修改权限,方便些!!!

使用举例:

[root@localhost /]# chmod o-t /tmp  #将/tmp目录去掉“t”的权限
[root@localhost /]# ls -ld /tmp    #查看,“t”的权限没有了,刚才的a.txt谁也可以删除了
drwxrwxrwx. 16 root root 4096 8月  13 16:30 /tmp
[root@localhost /]# chmod 1777 /tmp   #使用数字权限加上“t”的权限
[root@localhost /]# ls -ld /tmp
drwxrwxrwt. 16 root root 4096 8月  13 16:30 /tmp

———————— 本文至此结束,感谢阅读 ————————