l21.Linux系统权限知识及应用实践(二)

1,047 阅读16分钟

“ 本文正在参加「金石计划 . 瓜分6万现金大奖」 ”

12.4 设置及更改文件及目录权限命令chmod

12.4.1 命令说明

【命令星级】 ★★★★★

【功能说明】

chmod命令是用来改变文件或目录权限的命令,但只有文件的属主和超级用户root才能够执行这个命令。

【语法格式】

chmod [option] [mode] [file]
chmod [选项] [模式] [<文件或目录>]

说明: 通过chmod改变文件或目录的权限有两种方法,一种是使用数字方法(常用)来设置权限;另一种是通过字母和操作符表达式的方法来设置权限。

【选项说明】

表12-3针对chmod命令的参数选项进行了说明。

表12-3 chmod命令的参数选项及说明

b12-3.png

【chmod命令数字权限知识与实践】(推荐)

chmod使用数字权限设置权限的命令格式如下:

chmod [数字组合] 文件名

chmod的数字语法简单直观,表12-4中列出了用数字表示权限的组合,该组合由3位八进制数来表示文件的3类用户的权限组合。

表12-4 数据权限表

b12-4.png

我们可以根据表12.4所示的数字列表来组合权限,比如,想让属主拥有rwx(所对应的数字是7),属组拥有--x(所对应的数字是1),其他用户拥有---(所对应的数字是0),这样讲各组的权限组合起来就是rwx--x---(对应的数字是710)。

【chmod的数字方法计算说明】

可读r对应的数字为4,可写w对应的数字为2,可执行x对应的数字为1,“-”对应的数字为0。

例如,文件权限为rwxr-xr-x,其中,前三位相加4+2+1=7,中三位相加4+0+1=5,后三位相加4+0+1=5,那么rwxr-xr-x对应的完整数字权限就是755.

下面来看看一下字符权限表示的数字权限:

rw-rw-r-x 代表的数字权限为655

--xr-x-wx 代表的数字权限为153

-wx--x--x 代表的数字权限为311

而以下数字权限表示的字符权限如下:

755 代表的字符权限为rwxr-xr-x

644 代表的字符权限为rw-r--r--

134 代表的字符权限为--x-wxr--

需要特别强调的是,在字符权限排序中rwx的绝对位置是不能变的,没有权限时就用-替代。

下面是实践数字权限的范例。

范例12-1: 将neteagle目录权限设置为r-xrw-rwx。

分析:r-xrw-rwx权限的前三位相加即4+0+1=5,中三位相加即4+2+0=6,后三位相加即4+2+1=7,因此对应的数字权限为567,操作的最终命令如下:

[root@centos7 ~]# chmod 567 /neteagle/  #实际数字权限的设置命令。
[root@centos7 ~]# ll -d /neteagle/
dr-xrw-rwx. 2 neteagle incahome 32 Oct 15 20:52 /neteagle/  #符合预期需求。

【chmod字符式权限知识与实践】(不推荐)

chmod使用字符权限设置的命令格式如下:

chmod [用户类型] [+ | - | =] [权限字符] 文件名

表12-5是使用权限字符设置权限的表格。

表12-5 使用权限字符设置权限表格

b12-5.png

chmod的字符式语法相对来说比较简单,文件或目录权限的改变,是通过比较直观的字符形式的改变来完成的。

下面来看一下在字符式语法中,相关字母的定义。

(1)用户或用户组的定义

  • u:代表属主用户(owner/user)。

  • g:代表属组(group)。

  • o:代表其他用户(other)。

  • a或者不写:同时代表ugo属主、属组和其他用户,也就是上面三个用户(或组)的所有(all)。

    (2)权限定义字母,与前文一致

  • r:代表读权限,用数字4表示。

  • w:代表写权限,用数字2表示。

  • x:代表执行权限,用数字1表示。

  • -:代表没有权限,用数字0表示。

    (3)权限增减字符详细定义

  • +:添加权限。

  • -:取消权限。

  • =:取消其他所有权限,然后赋予给定的权限。

    下面是字符权限的示例说明:

chmod u-x test.sh   #取消用户权限位的x权限。
chmod g+w test.sh   #用户组权限为增加w权限。
chmod u-x,g+w,o-rwx test.sh #用户位取消x权限,用户组增加w权限,其他用户取消rwx权限。
chmod ugo=rw test.sh    #所有权限组赋予rw权限。
chmod a=rw test.sh  #所有权限组赋予rw权限。
chmod +x test.sh    #所有权限组增加x权限,这个命令比较常用。

错误写法:

chmod u=---,g=--x,o=-w- test/gongli.txt #不要带“-”。

提示: 推荐使用数字权限表示法,了解字符权限设置方法即可。

范例12-2: 已知neteagle目录的权限如下,请取消用户位的读取权限,取消用户组为的w权限,增加x权限,其他用户位没有任何权限,目录下所有文件和所有子目录也要同时修改。

[root@centos7 ~]# ll -d /neteagle/
dr-xrw-rwx. 2 neteagle incahome 32 Oct 15 20:52 /neteagle/

方法1: 根据题意一步步来设置。

[root@centos7 ~]# chmod -R u-r,g=rx,o- /neteagle/   #字符权限设置方法。
[root@centos7 ~]# ll -d
dr-xr-x---. 4 root root 285 Oct 15 15:28 .
[root@centos7 ~]# ll /neteagle/
total 0
--w-r-xr--. 1 neteagle incahome 0 Oct 15 20:32 2.txt
--w-r-xr--. 1 neteagle incahome 0 Oct 15 20:32 3.txt

方法2: 根据题意,提前计算好最终的完整字符权限,然后一步到位用等号来设置。

[root@centos7 ~]# chmod -R u=w,g=rx,o=- /neteagle/

方法3: 计算好最终的字符权限对应的数字权限,然后一步到位用数字权限进行设置。

[root@centos7 ~]# chmod -R 250 /neteagle/

提示: -R表示递归设置,对目录下的所有文件和子目录生效。

12.5 企业环境下文件和目录的安全核心知识

还记得Linux运维工程师的职责吗?

  • 数据安全。

  • 永不宕机。

  • 用户体验好。

    Linux的权限是保障Linux下数据安全的重要核心基础,那么,怎样设置权限,数据的安全才能有保障呢?

12.5.1 禁止普通用户删除和创建文件

这是绝大多数网站业务目录的安全临界点,删除文件数据就会造成数据丢失,创建文件将会生成木马病毒危害系统。要实现标题中的需求,目录的权限最低要设置为755权限,对应字符权限为rwxr-xr-x,而且仅设置权限还不够,还要控制用户和用户组,设置用户和用户组都为root才能达到题目所要求的安全级别。对于/neteagle目录,要防止普通用户删除和创建文件的具体操作就是:

[root@centos7 ~]# chmod -R 755 /neteagle/   #防止删除及创建文件安全权限临界点。
root@centos7 ~]# chown -R root.root /neteagle/  #必须要设置合适的用户和组,否则设置的权限有可能达不到效果。
[root@centos7 ~]# ll -d /neteagle/
drwxr-xr-x. 2 root root 32 Oct 15 20:52 /neteagle/
#rwxr-xr-x,目录字符权限的安全临界点。

针对普通用户neteagle的测试具体如下:

[neteagle@centos7 ~]$ whoami
neteagle
[neteagle@centos7 ~]$ ll /neteagle/ #可以查看目录下的内容。
total 0
-rwxr-xr-x. 1 root root 0 Oct 15 20:32 2.txt
-rwxr-xr-x. 1 root root 0 Oct 15 20:32 3.txt
[neteagle@centos7 ~]$ touch /neteagle/test.txt  #无法在目录下创建文件。
touch: cannot touch ‘/neteagle/test.txt’: Permission denied
[neteagle@centos7 ~]$ rm -f /neteagle/2.txt #无法删除目录下的文件。 
rm: cannot remove ‘/neteagle/2.txt’: Permission denied

12.5.2 防止用户修改文件内容

这是绝大多数网站业务文件安全的临界点,如果普通用户可以随便篡改文件内容,那是极其危险和不安全的,要防止文件内容被修改,可利用文件本身的w权限来实现,同时,将文件的用户和用户组想关联,设置用户和用户组都为root,这样才能达到表示所示的要求。对于/neteagle目录下的文件,防止普通用户篡改文件的具体操作如下:

[root@centos7 ~]# touch /neteagle/test.txt  #创建待测试文件。
[root@centos7 ~]# chmod 644 test.txt    #授权644权限,文件的防修改安全临界点。
[root@centos7 ~]# chown root.root test.txt  #必须要设置合适的用户和组,否则设置的权限有可能达不到效果。
[root@centos7 ~]# ll /neteagle/test.txt 
-rw-r--r--. 1 root root 0 Oct 16 14:27 /neteagle/test.txt   #rw-r--r--,文件字符权限的安全临界点。

12.5.3 变态的安全措施

如果安全要求除了不能删除和创建,以及不能修改文件以外,还有更多的需求,那么就要控制r和x权限了。例如,如果不希望浏览目录下的内容,就要对目录取消r权限;如果不希望切换到目录下,就要对目录取消x权限。如果不希望查看文件内容,就要对文件取消r权限,如果不希望执行文件,就要对文件取消x权限。不过,这种变态的安全措施,除了不对外备份数据以外,工作中几乎是没有的。

结论:绝大多数企业中业务安全的临界点都是防止删除、创建和篡改操作,因此,目录安全权限的临界点,即root用户默认创建的目录,权限为755,用户和组为root。文件安全权限的临界点,即root用户默认创建的文件,权限为644,用户和组为root。

有关企业网站目录的安全临界点的科学设置,可参见《跟老男孩学Linux运维:Web集群实战》一书的优化部分。

12.6 默认权限掩码及设置命令umask

12.6.1 命令说明

【命令星级】 ★★★★★

【功能说明】

umask是通过八进制的数值来定义用户创建文件或目录的默认权限的。系统会根据预先设定的umask值计算出默认情况下创建的文件或目录权限。

【语法格式】

umask [option] [mode]
umask [选项] [模式]

12.6.2 通过umask计算默认权限的方法

12.6.2.1 文件默认权限计算

创建文件默认最大的权限为666(-rw-rwxrwx)。其默认创建的文件没有可执行权限x位。

对于文件来说,umask的设置是在假定文件拥有八进制666的权限上进行的,文件的权限就是666减umask(umask的各个位数也不能大于6,比如077讲究不符合条件)的掩码数值。如果得到的3位数字每一位都是偶数,那么这就是最终结果;如果有若干位的数字是奇数,那么这个奇数需要加1变成偶数,最后得到全是偶数的结果。

下面列举几个示例进行说明。

1)假设umask值为022(所有位均为偶数),那么文件的对应权限计算式为:

6 6 6       #文件的其实权限值。
2 2 2 -     #umask的值。
--------
6 4 4

2)假设umask值为045(其他用户组位为奇数),那么文件的对应权限计算式为:

6 6 6       #文件的起始权限值。
0 4 5 -     #umask的值。
----------
6 2 2       #计算出来的权限。由于umask的最后一位数字是奇数5,所以,在其他用户组位再加1。
0 0 1 +
----------
6 2 2       #真实文件权限。

12.6.2.2 目录默认权限计算(umask没有奇偶之分)

创建目录默认最大的权限为777(drwxrwxrwx),默认创建的目录属主是有x权限的,即允许用户进入。

对于目录来说,umask的设置是在假定文件拥有八进制777权限上进行的,目录八进制权限777减去umask的掩码数值,即为:

7 7 7       #目录的起始权限值。
0 2 2 -     #umask的值。
----------
7 5 5

12.6.3 使用范例

范例12-3: 查看系统用户默认的umask值。

[root@centos7 ~]# umask #默认情况下,root用户对应的umask值为022,第一个0暂时忽略。
0022
[test@centos7 ~]$ umask #普通用户test对应的umask值为022,第一个0暂时忽略。
0002

注意,用户的umask值得设定默认存在于/etc/bashrc文件中,命令如下:

[root@centos7 ~]# sed -n '70,74p' /etc/bashrc   #sed命令取出文件的第70行到74行,打印输出。
    if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
       umask 002
    else
       umask 022
    fi
​
[root@centos6 ~]# sed -n '65,69p' /etc/bashrc   #CentOS 6是第65行到69行。
    if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
       umask 002
    else
       umask 022
    fi

提示: 当用户UID大于199,并且与用户组名相同时,上述if添加判断成立,umask值就为002,否则就为022。

12.6.4 umask设置与Linux默认权限设置小结

下面用一个表格(表12-6)整理下umask设置与Linux默认权限设置的知识小结,以方便读者学习掌握。

表12-6 umask与默认权限设置小结

b12-6.png

企业面试题: 什么是umask,它的作用是什么,怎么计算文件和目录的默认权限?

12.7 Linux系统特殊权限位知识

本节将讲解Linux系统的特殊权限位知识,这部分知识内容较难,不过,幸运的是,在一般的生产场景下,运维人员使用特殊权限位只是的情况并不多见,笔者也不推荐大家使用,虽然suid、sgid的功能不错,但是会对服务器带来较大的安全隐患,因此,读者只需了解这节的内容即可。

12.7.1 特殊权限位基本说明

前文详细讲解了Linux系统9位基本权限位,但除了基本的9位权限之外,实际上Linux权限位还有额外的3位权限位,总共12位权限位。

这额外的3位权限位分别为suid、sgid、sticky,下面分别来看一下。

12.7.1.1 suid

suid(setuid)位通过S字符标识,存在于基本权限的用户权限位的x权限对应的位置,如果用户权限位对应的x权限位上有x权限,则suid就用小写的s标识,suid的s对应的数字权限为4,完整权限用八进制数4000表示。

suid位也是通过chmod命令进行设置的,可以利用字符权限以及数字权限来实现,示例代码如下:

[root@centos7 ~]# touch test.txt    #创建测试文件,目录也是一样的。
[root@centos7 ~]# ll test.txt 
-rw-r--r--. 1 root root 0 Oct 16 15:40 test.txt #默认权限位644。
[root@centos7 ~]# chmod u+s test.txt    #在用户位增加suid权限。
[root@centos7 ~]# ll test.txt 
-rwSr--r--. 1 root root 0 Oct 16 15:40 test.txt #查看设置结果,因为用户没有x权限,所以是大写的S,被设置为suid的文件显示的背景是红色,文件名是白色。

12.7.1.2 sgid

sgid(setgid)位同样是通过S字符来进行标识的,但是sgid位存在于基本权限的用户组权限位的x权限对应的位置,如果用户组权限位对应的x权限位上有x权限,则sgid就用小写的s来标识,suid的s对应的数字权限位2,完整的权限用八进制数2000来标识。

sgid位同样是通过chmod命令来设置的,也可以利用字符权限以及数字权限来实现,示例代码如下:

[root@centos7 ~]# touch neteagle.txt    #创建测试文件,目录也是一样的。
[root@centos7 ~]# ll neteagle.txt 
-rw-r--r--. 1 root root 0 Oct 16 15:46 neteagle.txt #默认权限是644.
[root@centos7 ~]# chmod g+s neteagle.txt    #在用户组位增加sgid权限。
[root@centos7 ~]# ll neteagle.txt 
-rw-r-Sr--. 1 root root 0 Oct 16 15:46 neteagle.txt #查看设置结果,因为用户组位没有x权限,所以是大写的S,被设置为sgid的文件显示的背景是黄色,文件名是黑色。

12.7.1.3 sticky知识简介

sticky(粘滞)位通过字符T标识,存在于基本权限的其他用户位对应的x权限位上,如果其他用户位的x权限位上有x权限,则sticky(粘滞)位通过小写的t标识,对应数字权限是1,完整的权限用八进制数1000表示。被设置了sticky(粘滞)位权限的文件会显示黑字绿底,最典型的带sticky(粘滞)位权限的目录就是/tmp。

[root@centos7 ~]# ll -d /tmp/
drwxrwxrwt. 27 root root 4096 Oct 16 15:52 /tmp/    #/tmp目录默认就有sticky权限,绿底黑字显示。
[root@centos7 ~]# ll -d /neteagle/
drwxr-xr-x. 2 root root 48 Oct 16 14:27 /neteagle/
[root@centos7 ~]# chmod o+t /neteagle/  #在其他用户位增加sticky权限。
[root@centos7 ~]# ll -d /neteagle/
drwxr-xr-t. 2 root root 48 Oct 16 14:27 /neteagle/  #查看设置结果,因为其他用户位有x权限,所以是小写t,文件显示的背景是蓝色,文件名是白色。

为了让读者更清晰地了解上述知识点,特整理特殊权限位的对比寿命,具体见表12-7。

表12-7 特殊权限位对比说明表

b12-7.png

12.7.2 深入理解suid权限知识

12.7.2.1 为什么会有suid位功能

在Linux系统中,有时执行某个命令(例如普通用户使用passwd修改自身账号密码)时,需要对另一个文件(/etc/shadow)进行操作,而执行passwd修改的文件/etc/shadow又是普通用户没有权限进行操作的,例如,修改用户密码的命令passwd,该命令文件的所有者和用户组都是root,但/etc/shadow文件的权限极低,不允许任何普通用户及属主用户访问,具体信息如下:

[root@centos7 ~]# ll /etc/shadow
----------. 1 root root 1089 Oct 15 19:25 /etc/shadow   #所有用户没有任何访问权限,只有管理员可改。

这样的权限,对于普通用户是没有办法更改的,但是系统还需要对普通用户开放自己更改自身账号密码的功能,因此就必须要让普通用户有权限修改shadow文件,这时就可以通过对passwd命令设置suid位来解决。

12.7.2.2 suid到底有什么作用

简单地说,suid的作用就是让普通用户可以在执行某个设置了suid位的命令或程序时,拥有与root管理员一样的身份和权限(默认情况)。

12.7.2.3 理解passwd命令的suid功能

根据基本权限的知识,neteagle用户无法修改shadow文件,但是因为passwd具有suid权限,因此,当neteagle用户执行passwd时,就可以取得root管理员的身份和权限(实际上是获取passwd对应用户的身份),所以就可以修改原本neteagle没权限修改的/etc/shadow了(修改过程中是以root身份操作的,这就是suid的作用),整个图解如图12-2所示。

t12-2.png

图12-2 passwd命令suid权限图解

[root@centos7 ~]# ll `which passwd`
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /usr/bin/passwd
[root@centos7 ~]# ll /etc/shadow
----------. 1 root root 1089 Oct 15 19:25 /etc/shadow