“ 本文正在参加「金石计划 . 瓜分6万现金大奖」 ”
12.4 设置及更改文件及目录权限命令chmod
12.4.1 命令说明
【命令星级】 ★★★★★
【功能说明】
chmod命令是用来改变文件或目录权限的命令,但只有文件的属主和超级用户root才能够执行这个命令。
【语法格式】
chmod [option] [mode] [file]
chmod [选项] [模式] [<文件或目录>]
说明: 通过chmod改变文件或目录的权限有两种方法,一种是使用数字方法(常用)来设置权限;另一种是通过字母和操作符表达式的方法来设置权限。
【选项说明】
表12-3针对chmod命令的参数选项进行了说明。
表12-3 chmod命令的参数选项及说明
【chmod命令数字权限知识与实践】(推荐)
chmod使用数字权限设置权限的命令格式如下:
chmod [数字组合] 文件名
chmod的数字语法简单直观,表12-4中列出了用数字表示权限的组合,该组合由3位八进制数来表示文件的3类用户的权限组合。
表12-4 数据权限表
我们可以根据表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 使用权限字符设置权限表格
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与默认权限设置小结
企业面试题: 什么是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 特殊权限位对比说明表
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所示。
图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