自主访问控制 ( 数模转换器)实际上只是意味着每个用户都有能力控制谁可以进入他们的东西。如果我想打开我的主目录,以便系统上的所有其他用户都可以进入它,我可以这样做。这样做之后,我就可以控制谁可以访问每个特定的文件。在下一章中,我们将使用我们的 DAC 技能来管理共享目录,其中一个组的成员可能需要对其中的文件进行不同级别的访问。
在您的 Linux 职业生涯的这个阶段,您可能已经知道通过设置文件和目录权限来控制访问的基础知识。在这一章中,我们将回顾基础知识,然后我们将了解一些更高级的概念。
在本章中,我们将涵盖以下主题:
- 使用
chown
更改文件和目录的所有权 - 使用
chmod
设置文件和目录的权限 - 在常规文件中,SUID 和 SGID 设置可以为我们做什么
- 在不需要的文件上设置 SUID 和 SGID 权限的安全影响
- 如何使用扩展文件属性保护敏感文件
- 保护系统配置文件
控制对文件和目录的访问实际上可以归结为确保适当的用户可以访问他们自己的文件和目录,并且每个文件和目录都有权限设置,只有授权用户才能访问它们。chown
实用程序涵盖了这个等式的第一部分。
chown
的一个独特之处在于,您必须拥有 sudo 权限才能使用它,即使您在自己的目录中处理自己的文件。您可以使用它来同时更改文件或目录的用户、与文件或目录相关联的组或两者。
首先,假设您拥有perm_demo.txt
文件,并且您希望将用户和组的关联更改为另一个用户的关联。在这种情况下,我将文件所有权从我更改为maggie
:
[donnie@localhost ~]$ ls -l perm_demo.txt
-rw-rw-r--. 1 donnie donnie 0 Nov 5 20:02 perm_demo.txt
[donnie@localhost ~]$ sudo chown maggie:maggie perm_demo.txt
[donnie@localhost ~]$ ls -l perm_demo.txt
-rw-rw-r--. 1 maggie maggie 0 Nov 5 20:02 perm_demo.txt
[donnie@localhost ~]$
maggie:maggie
中的第一个maggie
是您想要授予所有权的用户。冒号后的第二个maggie
代表您希望文件与之关联的组。由于我将用户和组都更改为maggie
,所以我可以省略第二个maggie
,第一个maggie
后面跟着一个冒号,这样我就可以获得相同的结果:
sudo chown maggie: perm_demo.txt
要仅更改组关联而不更改用户,只需列出组名,前面加一个冒号:
[donnie@localhost ~]$ sudo chown :accounting perm_demo.txt
[donnie@localhost ~]$ ls -l perm_demo.txt
-rw-rw-r--. 1 maggie accounting 0 Nov 5 20:02 perm_demo.txt
[donnie@localhost ~]$
最后,要只更改用户而不更改组,请列出不带尾随冒号的用户名:
[donnie@localhost ~]$ sudo chown donnie perm_demo.txt
[donnie@localhost ~]$ ls -l perm_demo.txt
-rw-rw-r--. 1 donnie accounting 0 Nov 5 20:02 perm_demo.txt
[donnie@localhost ~]$
这些命令在目录中的工作方式与在文件中的工作方式相同。但是,如果您还想更改目录内容的所有权和/或组关联,同时对目录本身进行更改,请使用-R
选项,该选项代表递归。在这种情况下,我只想将perm_demo_dir
目录的组更改为accounting
。让我们看看我们必须从什么开始:
[donnie@localhost ~]$ ls -ld perm_demo_dir
drwxrwxr-x. 2 donnie donnie 74 Nov 5 20:17 perm_demo_dir
[donnie@localhost ~]$ ls -l perm_demo_dir
total 0
-rw-rw-r--. 1 donnie donnie 0 Nov 5 20:17 file1.txt
-rw-rw-r--. 1 donnie donnie 0 Nov 5 20:17 file2.txt
-rw-rw-r--. 1 donnie donnie 0 Nov 5 20:17 file3.txt
-rw-rw-r--. 1 donnie donnie 0 Nov 5 20:17 file4.txt
现在,让我们运行命令并查看结果:
[donnie@localhost ~]$ sudo chown -R :accounting perm_demo_dir
[donnie@localhost ~]$ ls -ld perm_demo_dir
drwxrwxr-x. 2 donnie accounting 74 Nov 5 20:17 perm_demo_dir
[donnie@localhost ~]$ ls -l perm_demo_dir
total 0
-rw-rw-r--. 1 donnie accounting 0 Nov 5 20:17 file1.txt
-rw-rw-r--. 1 donnie accounting 0 Nov 5 20:17 file2.txt
-rw-rw-r--. 1 donnie accounting 0 Nov 5 20:17 file3.txt
-rw-rw-r--. 1 donnie accounting 0 Nov 5 20:17 file4.txt
[donnie@localhost ~]$
这就是chown
的全部。
在 Unix 和 Linux 系统上,您可以使用chmod
实用程序来设置文件和目录的权限值。您可以为文件或目录的用户、与文件或目录关联的组等设置权限。三种基本权限如下:
r
:表示读取权限。w
:表示有写权限。x
:这是可执行权限。您可以将其应用于任何类型的程序文件或目录。如果你对一个目录应用了可执行权限,被授权的人就可以进入其中。
如果你在一个文件上执行ls -l
,你会看到如下内容:
-rw-rw-r--. 1 donnie donnie 804692 Oct 28 18:44 yum_list.txt
这一行的第一个字符表示文件的类型。在这种情况下,我们可以看到一个破折号,它表示一个常规文件。(普通文件几乎是普通用户在日常生活中能够访问的所有类型的文件。)接下来的三个字符,rw-
,表示文件对用户有读写权限,用户是文件的拥有者。然后,我们可以看到该组的rw-
权限和其他人的r--
权限。程序文件也将设置可执行权限:
-rwxr-xr-x. 1 root root 62288 Nov 20 2015 xargs
这里我们可以看到xargs
程序文件为大家设置了可执行权限。
有两种方法可以使用chmod
更改权限设置:
- 符号方法
- 数值方法
接下来我们将介绍这些方法。
当您以普通用户身份创建文件时,默认情况下,它将对用户和组拥有读/写权限,对其他人拥有读权限。
chmod u+x donnie_script.sh
chmod g+x donnie_script.sh
chmod o+x donnie_script.sh
chmod u+x,g+x donnie_script.sh
chmod a+x donnie_script.sh
前三个命令为用户、组和其他人添加了可执行权限。第四个命令为用户和组添加可执行权限,而最后一个命令为所有人添加可执行权限(a
为所有人)。您也可以通过将+
替换为-
来移除可执行权限。最后,您还可以根据需要添加或删除读或写权限。
虽然这种方法有时很方便,但它也有一点缺陷;也就是说,它只能向已经存在的内容添加权限,或者从已经存在的内容中移除权限。如果您需要确保特定文件的所有权限都设置为某个值,那么符号方法可能会有点笨拙。对于 shell 脚本来说,忘了它吧。在 shell 脚本中,您需要添加各种额外的代码来确定已经设置了哪些权限。数值方法可以极大地简化我们的工作。
使用数值方法,您将使用八进制值来表示文件或目录的权限设置。对于r
、w
和x
权限,分别分配数值4
、2
和1
。您可以对用户、组和其他位置执行此操作,然后将它们全部相加,以获得文件或目录的权限值:
| 用户 | 组 | 其他 |
| rwx
| rwx
| rwx
|
| 421
| 421
| 421
|
| 7
| 7
| 7
|
因此,如果您为每个人设置了所有权限,文件或目录的值将为777
。如果我要创建一个 shell 脚本文件,默认情况下,它将具有标准的664
权限,即用户和组的读写权限,其他人的只读权限:
-rw-rw-r--. 1 donnie donnie 0 Nov 6 19:18 donnie_script.sh
If you create a file with root privileges, either with sudo or from the root user command prompt, you'll see that the default permissions setting is the more restrictive 644
.
假设我想让这个脚本可执行,但我想成为全世界唯一能用它做任何事情的人。为此,我可以执行以下操作:
[donnie@localhost ~]$ chmod 700 donnie_script.sh
[donnie@localhost ~]$ ls -l donnie_script.sh
-rwx------. 1 donnie donnie 0 Nov 6 19:18 donnie_script.sh
[donnie@localhost ~]$
通过这个简单的命令,我已经删除了该组和其他人的所有权限,并为自己设置了可执行权限。这种东西使得数值方法在编写 shell 脚本时非常方便。
一旦您使用数值方法一段时间,查看文件并计算其数值权限值将成为第二天性。同时,您可以使用stat
和-c %a
选项来显示值。可以这样做:
[donnie@localhost ~]$ stat -c %a yum_list.txt
664
[donnie@localhost ~]$
[donnie@localhost ~]$ stat -c %a donnie_script.sh
700
[donnie@localhost ~]$
[donnie@localhost ~]$ stat -c %a /etc/fstab
644
[donnie@localhost ~]$
如果您想一次查看所有文件的数字权限,请执行以下操作:
[donnie@donnie-ca ~]$ stat -c '%n %a ' *
dropbear 755
internal.txt 664
password.txt 664
pki-server.crt 664
pki-server.p12 644
yum_list.txt 664
[donnie@donnie-ca ~]$
在这里,您可以在命令的末尾看到通配符(*
),表示您想要查看所有文件的设置。%n
表示您想要查看文件名以及权限设置。因为我们使用了两个-c
选项,所以我们必须用一对单引号将这两个选项括起来。这里唯一的小问题是,这个输出没有显示这些项目中哪些是文件,哪些是目录。然而,由于目录需要可执行权限,以便人们可以cd
进入其中,我们可以猜测dropbear
可能是一个目录。不过可以肯定的是,使用ls -l
就可以了,比如:
[donnie@donnie-ca ~]$ ls -l
total 2180
-rwxr-xr-x. 1 donnie donnie 277144 Apr 22 2018 dropbear
-rw-rw-r--. 1 donnie donnie 13 Sep 19 13:32 internal.txt
-rw-rw-r--. 1 donnie donnie 11 Sep 19 13:42 password.txt
-rw-rw-r--. 1 donnie donnie 1708 Sep 19 14:41 pki-server.crt
-rw-r--r--. 1 root root 1320 Sep 20 21:08 pki-server.p12
-rw-rw-r--. 1 donnie donnie 1933891 Sep 19 18:04 yum_list.txt
[donnie@donnie-ca ~]$
现在,让我们继续讨论几个非常特殊的权限设置。
当常规文件设置了 SUID 权限时,访问该文件的人将拥有与该文件用户相同的权限。
为了演示这一点,假设 Maggie,一个普通的、没有权限的用户,想要更改她自己的密码。因为这是她自己的密码,所以她只使用一个字passwd
命令,而不使用 sudo:
[maggie@localhost ~]$ passwd
Changing password for user maggie.
Changing password for maggie.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[maggie@localhost ~]$
要更改密码,必须对/etc/shadow
文件进行更改。在我的 CentOS 机器上,影子文件的权限如下所示:
[donnie@localhost etc]$ ls -l shadow
----------. 1 root root 840 Nov 6 19:37 shadow
[donnie@localhost etc]$
在 Ubuntu 机器上,它们看起来像这样:
donnie@ubuntu:/etc$ ls -l shadow
-rw-r----- 1 root shadow 1316 Nov 4 18:38 shadow
donnie@ubuntu:/etc$
无论哪种方式,权限设置都不允许 Maggie 修改影子文件。但是,通过更改密码,她能够修改影子文件。发生什么事了?为了回答这个问题,让我们进入/usr/bin
目录,看看passwd
可执行文件的权限设置:
[donnie@localhost etc]$ cd /usr/bin
[donnie@localhost bin]$ ls -l passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 passwd
[donnie@localhost bin]$
对于用户权限,您将看到rws
而不是rwx
。s
表示此文件具有 SUID 权限集。由于文件属于根用户,因此访问该文件的任何人都具有与根用户相同的权限。我们可以看到小写的s
这一事实意味着该文件也为根用户设置了可执行权限。因为允许根用户修改影子文件,所以无论谁使用这个passwd
工具来更改他或她自己的密码,也可以修改影子文件。
具有 SGID 权限集的文件在该组的可执行位置有一个s
:
[donnie@localhost bin]$ ls -l write
-rwxr-sr-x. 1 root tty 19536 Aug 4 07:18 write
[donnie@localhost bin]$
与tty
组相关联的write
实用程序允许用户通过他们的命令行控制台向其他用户发送消息。拥有tty
组权限允许用户这样做。
尽管拥有 SUID 或 SGID 对您的可执行文件的权限可能很有用,但我们应该将其视为一种必要的邪恶。虽然在某些操作系统文件上设置 SUID 或 SGID 对于 Linux 系统的运行是必不可少的,但是当用户在其他文件上设置 SUID 或 SGID 时,它就会成为一个安全风险。问题是,如果入侵者发现了一个属于根用户并设置了 SUID 位的可执行文件,他们就可以利用这个文件来利用系统。在他们离开之前,他们可能会留下自己的带有 SUID 集的根文件,这将允许他们在下次遇到它时轻松进入系统。如果没有找到入侵者的 SUID 文件,入侵者仍然可以访问,即使最初的问题已经解决。
SUID 的数值是4000
,SGID 的数值是2000
。要在文件中设置 SUID,您只需将4000
添加到您要设置的权限值中。例如,如果您有一个权限值为755
的文件,您可以通过将权限值更改为4755
来设置 SUID。(这将为用户提供读/写/执行权限,为组提供读/执行权限,为其他用户提供读/执行权限,并添加 SUID 位。)
一个快速的安全技巧是运行find
命令来清点系统中的 SUID 和 SGID 文件。您还可以将输出保存到文本文件中,以便验证自运行命令以来是否添加了任何内容。您的命令如下所示:
sudo find / -type f \( -perm -4000 -o -perm -2000 \) > suid_sgid_files.txt
细分如下:
/
:我们正在搜索整个文件系统。由于有些目录只有拥有 root 权限的人才可以访问,所以我们需要使用sudo
。-type f
:这意味着我们在搜索常规文件,包括可执行程序文件和 shell 脚本。-perm 4000
:我们正在搜索设置了4000
或【SUID】权限位的文件。-o
:or 运算符。-perm 2000
:我们正在搜索设置了2000
或【SGID】权限位的文件。>
:这里,我们用>
操作符将输出重定向到suid_sgid_files.txt
文本文件。
请注意,这两个-perm
项需要组合成一个包含在一对括号中的术语。为了防止 Bash shell 错误地解释括号字符,我们需要用反斜杠对每个字符进行转义。我们还需要在第一个括号字符和第一个-perm
之间放置一个空格,在2000
和最后一个反斜杠之间放置另一个空格。此外,-type f
和-perm
之间的 and 运算符被理解为存在,即使没有插入-a
。您将创建的文本文件应该如下所示:
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/su
/usr/bin/umount
/usr/bin/sudo
. . .
. . .
/usr/lib64/dbus-1/dbus-daemon-launch-helper
或者,如果您想查看哪些文件是 SUID,哪些是 SGID 的详细信息,您可以添加-ls
选项:
sudo find / -type f \( -perm -4000 -o -perm -2000 \) -ls > suid_sgid_files.txt
好吧。你现在说,嘿,唐尼,这太过分了,打不动。我听到了。幸运的是,有一个类似的速记。从4000 + 2000 = 6000
开始,我们可以创建一个与 SUID ( 4000
)或 SGID ( 2000
)值匹配的表达式,如下所示:
sudo find / -type f -perm /6000 -ls > suid_sgid_files.txt
这个命令中的/6000
意味着我们要找的不是4000
就是2000
值。就我们的目的而言,这是仅有的两个可以组合成6000
的加数。
In some older references, you might see +6000
instead of /6000
. Using the +
sign for this has been deprecated, and no longer works.
现在,假设 Maggie,不管出于什么原因,决定在她主目录的 shell 脚本文件中设置 SUID 位:
[maggie@localhost ~]$ chmod 4755 bad_script.sh
[maggie@localhost ~]$ ls -l
total 0
-rwsr-xr-x. 1 maggie maggie 0 Nov 7 13:06 bad_script.sh
[maggie@localhost ~]$
再次运行find
命令,将输出保存到不同的文本文件中。然后,对两个文件执行diff
操作,查看发生了什么变化:
[donnie@localhost ~]$ diff suid_sgid_files.txt suid_sgid_files2.txt
17a18
> /home/maggie/bad_script.sh
[donnie@localhost ~]$
唯一不同的是增加了 Maggie 的 shell 脚本文件。
您可以在任一台虚拟机上执行本实验。您将把find
命令的输出保存到一个文本文件中。让我们开始吧:
- 在将输出保存到文本文件之前,在整个文件系统中搜索设置了 SUID 或 SGID 的所有文件:
sudo find / -type f -perm /6000 -ls > suid_sgid_files.txt
- 登录到系统上的任何其他用户帐户,并创建一个虚拟 shell 脚本文件。然后,在该文件上设置 SUID 权限,然后注销并登录到您自己的用户帐户:
su - desired_user_account
touch some_shell_script.sh chmod 4755 some_shell_script.sh
ls -l some_shell_script.sh
exit
- 再次运行
find
命令,将输出保存到不同的文本文件:
sudo find / -type f -perm /6000 -ls > suid_sgid_files_2.txt
- 查看这两个文件的区别:
diff suid_sgid_files.txt suid_sgid_files_2.txt
实验到此结束,祝贺你!
正如我们之前提到的,您不希望用户将 SUID 和 SGID 分配给他们创建的文件,因为这会带来安全风险。通过使用nosuid
选项安装分区,可以防止分区使用 SUID 和 SGID。因此,我在上一章中创建的luks
分区的/etc/fstab
文件条目如下所示:
/dev/mapper/luks-6cbdce17-48d4-41a1-8f8e-793c0fa7c389 /secrets xfs nosuid 0 0
在操作系统安装期间,不同的 Linux 发行版有不同的设置默认分区方案的方法。大多数情况下,默认的业务方式是在/
分区下拥有除/boot
目录之外的所有目录。如果您要设置一个自定义分区方案,您可以将/home
目录放在其自己的分区中,您可以在其中设置nosuid
选项。请记住,您不想为/
分区设置nosuid
;否则,您将拥有一个无法正常运行的操作系统。
扩展文件属性是另一个可以帮助您保护敏感文件的工具。它们不会阻止入侵者访问您的文件,但可以帮助您防止敏感文件被更改或删除。有相当多的扩展属性,但我们只需要看看那些处理文件安全的属性。
首先,让我们使用lsattr
命令来查看我们已经设置了哪些扩展属性。在 CentOS 机器上,您的输出看起来像这样:
[donnie@localhost ~]$ lsattr
---------------- ./yum_list.txt
---------------- ./perm_demo.txt
---------------- ./perm_demo_dir
---------------- ./donnie_script.sh
---------------- ./suid_sgid_files.txt
---------------- ./suid_sgid_files2.txt
[donnie@localhost ~]$
到目前为止,我没有在任何文件上设置任何扩展属性。
在 Ubuntu 机器上,输出看起来更像这样:
donnie@ubuntu:~$ lsattr
-------------e-- ./file2.txt
-------------e-- ./secret_stuff_dir
-------------e-- ./secret_stuff_for_frank.txt.gpg
-------------e-- ./good_stuff
-------------e-- ./secret_stuff
-------------e-- ./not_secret_for_frank.txt.gpg
-------------e-- ./file4.txt
-------------e-- ./good_stuff_dir
donnie@ubuntu:~$
我们不会担心e
属性,因为这仅仅意味着分区是用 ext4 文件系统格式化的。CentOS 没有设置这个属性,因为它的分区是用 XFS 文件系统格式化的。
我们将在本节中讨论的两个属性如下:
a
:可以在具有该属性的文件末尾追加文本,但不能覆盖。只有拥有适当 sudo 权限的人才能设置或删除此属性。i
:这使得一个文件不可变,只有拥有适当 sudo 权限的人才能设置或删除。不能以任何方式删除或更改具有此属性的文件。也不可能创建到具有此属性的文件的硬链接。
要设置或删除属性,需要使用chattr
命令。您可以在一个文件上设置多个属性,但仅限于有意义的时候。例如,您不会在同一个文件中同时设置a
和i
属性,因为i
将覆盖a
。
让我们从创建perm_demo.txt
文件开始,该文件包含以下文本:
This is Donnie's sensitive file that he doesn't want to have overwritten.
现在,让我们继续设置属性。
现在,我来设置a
属性:
[donnie@localhost ~]$ sudo chattr +a perm_demo.txt
[sudo] password for donnie:
[donnie@localhost ~]$
您可以使用+
添加属性,使用-
删除属性。另外,文件属于我并在我自己的主目录中也没关系。我仍然需要 sudo 权限来添加或删除这个属性。
现在,让我们看看当我试图覆盖这个文件时会发生什么:
[donnie@localhost ~]$ echo "I want to overwrite this file." > perm_demo.txt
-bash: perm_demo.txt: Operation not permitted
[donnie@localhost ~]$ sudo echo "I want to overwrite this file." > perm_demo.txt
-bash: perm_demo.txt: Operation not permitted
[donnie@localhost ~]$
不管有没有sudo
权限,我都不能覆盖。那么,如果我尝试附加一些东西呢?
[donnie@localhost ~]$ echo "I want to append this to the end of the file." >> perm_demo.txt
[donnie@localhost ~]$
这次没有错误信息。让我们看看文件里有什么:
This is Donnie's sensitive file that he doesn't want to have overwritten.
I want to append this to the end of the file.
除了不能覆盖文件,我也不能删除它:
[donnie@localhost ~]$ rm perm_demo.txt
rm: cannot remove ‘perm_demo.txt’: Operation not permitted
[donnie@localhost ~]$ sudo rm perm_demo.txt
[sudo] password for donnie:
rm: cannot remove ‘perm_demo.txt’: Operation not permitted
[donnie@localhost ~]$
所以,a
起作用了。但是,我决定不再设置此属性,所以我将删除它:
[donnie@localhost ~]$ sudo chattr -a perm_demo.txt
[donnie@localhost ~]$ lsattr perm_demo.txt
---------------- perm_demo.txt
[donnie@localhost ~]$
当一个文件设置了i
属性时,你唯一能做的就是查看它的内容。您不能对其进行更改、移动、删除、重命名或创建硬链接。让我们用perm_demo.txt
文件测试一下:
[donnie@localhost ~]$ sudo chattr +i perm_demo.txt
[donnie@localhost ~]$ lsattr perm_demo.txt
----i----------- perm_demo.txt
[donnie@localhost ~]$
有趣的是:
[donnie@localhost ~]$ sudo echo "I want to overwrite this file." > perm_demo.txt
-bash: perm_demo.txt: Permission denied
[donnie@localhost ~]$ echo "I want to append this to the end of the file." >> perm_demo.txt
-bash: perm_demo.txt: Permission denied
[donnie@localhost ~]$ sudo echo "I want to append this to the end of the file." >> perm_demo.txt
-bash: perm_demo.txt: Permission denied
[donnie@localhost ~]$ rm -f perm_demo.txt
rm: cannot remove ‘perm_demo.txt’: Operation not permitted
[donnie@localhost ~]$ sudo rm -f perm_demo.txt
rm: cannot remove ‘perm_demo.txt’: Operation not permitted
[donnie@localhost ~]$ sudo rm -f perm_demo.txt
我还可以尝试一些命令,但你已经明白了。要删除i
属性,请使用以下代码:
[donnie@localhost ~]$ sudo chattr -i perm_demo.txt
[donnie@localhost ~]$ lsattr perm_demo.txt
---------------- perm_demo.txt
[donnie@localhost ~]$
在本实验中,您需要创建一个带有您选择的文本的perm_demo.txt
文件。您将设置i
和a
属性并查看结果。让我们开始吧:
- 使用您喜欢的文本编辑器,用一行文本创建
perm_demo.txt
文件。 - 查看文件的扩展属性:
lsattr perm_demo.txt
- 添加
a
属性:
sudo chattr +a perm_demo.txt
lsattr perm_demo.txt
- 尝试覆盖并删除文件:
echo "I want to overwrite this file." > perm_demo.txt
sudo echo "I want to overwrite this file." > perm_demo.txt
rm perm_demo.txt
sudo rm perm_demo.txt
- 现在,在文件中添加一些内容:
echo "I want to append this line to the end of the file." >> perm_demo.txt
- 删除
a
属性,增加i
属性:
sudo chattr -a perm_demo.txt
lsattr perm_demo.txt
sudo chattr +i perm_demo.txt
lsattr perm_demo.txt
- 重复步骤 4 。
- 此外,尝试更改文件名并创建文件的硬链接:
mv perm_demo.txt some_file.txt
sudo mv perm_demo.txt some_file.txt
ln ~/perm_demo.txt ~/some_file.txt
sudo ln ~/perm_demo.txt ~/some_file.txt
- 现在,尝试创建文件的符号链接:
ln -s ~/perm_demo.txt ~/some_file.txt
Note that the i
attribute won't let you create hard links to a file, but it will let you create symbolic links.
实验到此结束,祝贺你!
如果您查看任何给定 Linux 发行版的配置文件,您会发现它们中的大多数属于根用户或指定的系统用户。您还会看到,这些文件中的大部分对其各自的所有者具有读写权限,对其他所有人都具有读取权限。这意味着每个人和他的兄弟都可以读取大多数 Linux 系统配置文件。以这个 Apache 网络服务器配置文件为例:
[donnie@donnie-ca ~]$ cd /etc/httpd/conf
[donnie@donnie-ca conf]$ pwd
/etc/httpd/conf
[donnie@donnie-ca conf]$ ls -l httpd.conf
-rw-r--r--. 1 root root 11753 Aug 6 09:44 httpd.conf
[donnie@donnie-ca conf]$
当r
处于“其他”位置时,登录的每个人,无论其权限级别如何,都可以查看 Apache 配置。
这有什么大不了的吗?这真的取决于你的情况。一些配置文件,尤其是网络服务器上某些基于 PHP 的内容管理系统 ( 内容管理系统)的配置文件,可能包含内容管理系统必须能够访问的纯文本密码。在这些情况下,很明显,您需要限制对这些配置文件的访问。但是其他不包含敏感密码的配置文件呢?
对于只有少数管理员可以访问的服务器来说,这并不是什么大事。但是普通的非管理用户可以通过 Secure Shell 远程访问的服务器呢?如果他们没有任何 sudo 权限,他们就不能编辑任何配置文件,但是他们可以查看这些文件来查看您的服务器是如何配置的。如果他们看到事情是如何配置的,这是否有助于他们努力破坏系统,他们是否应该选择这样做?
我不得不承认,这是我直到最近才考虑的事情,当时我成为了一家专门从事物联网 ( 物联网)设备安全的公司的 Linux 顾问。与普通服务器相比,使用物联网设备时,您要担心的事情要多一些。普通服务器受到高度物理安全的保护,而物联网设备通常几乎没有物理安全。你可能在整个信息技术生涯中都没有真正见过服务器,除非你是少数几个被授权进入服务器机房的人之一。相反,物联网设备通常是公开的。
我合作的物联网安全公司有一套指导方针,有助于加固物联网设备,抵御威胁和攻击。其中之一就是保证设备上的所有配置文件都设置了600
权限设置。这意味着只有文件的所有者——通常是根用户或系统帐户——才能读取它们。但是,有很多配置文件,您需要一种简单的方法来更改设置。你可以和我们值得信赖的朋友一起做,我们称之为find
工具。你可以这样做:
sudo find / -iname '*.conf' -exec chmod 600 {} \;
细分如下:
sudo find / -iname '*.conf'
:这正是你所期望的。它在整个根文件系统(/
)中对所有扩展名为.conf
的文件执行不区分大小写的搜索。您可能会查找的其他文件扩展名包括.ini
和.cfg
。另外,因为find
本身是递归的,所以您不必提供选项开关来让它搜索所有较低级别的目录。-exec
:这就是表演魔术的地方。它会在find
找到的每个文件上自动执行以下命令,而不会提示用户。如果您想对find
找到的每个文件回答是或否,请使用-ok
而不是-exec
。chmod 600 {} \;
:chmod 600
是我们要执行的命令。当find
找到每个文件时,它的文件名被放在一对花括号({}
)内。每个-exec
子句都必须以分号结尾。为了防止 Bash shell 错误地解释分号,我们必须用反斜杠对其进行转义。
如果你决定这样做,彻底测试东西,以确保你没有打破任何东西。大多数情况下,将它们的配置文件设置为600
权限设置就可以了,但有些则不行。我刚刚在我的一台虚拟机上执行了此命令。让我们看看当我尝试 ping 一个互联网站点时会发生什么:
[donnie@donnie-ca ~]$ ping www.civicsandpolitics.com
ping: www.civicsandpolitics.com: Name or service not known
[donnie@donnie-ca ~]$
这看起来很糟糕,但解释很简单。只是为了能上网,机器必须能找到一个 DNS 服务器。DNS 服务器信息可以在/etc/resolv.conf
文件中找到,我刚刚删除了其他人的读取权限。没有其他人的读取权限,只有具有超级用户权限的人才能访问互联网。因此,除非您想限制具有 root 或 sudo 权限的用户访问互联网,否则您需要将resolv.conf
权限设置更改回644
:
[donnie@donnie-ca etc]$ ls -l resolv.conf
-rw-------. 1 root root 66 Sep 23 14:22 resolv.conf
[donnie@donnie-ca etc]$ sudo chmod 644 resolv.conf
[donnie@donnie-ca etc]$
好吧,让我们再试一次:
[donnie@donnie-ca etc]$ ping www.civicsandpolitics.com
PING www.civicsandpolitics.com (64.71.34.94) 56(84) bytes of data.
64 bytes from 64.71.34.94: icmp_seq=1 ttl=51 time=52.1 ms
64 bytes from 64.71.34.94: icmp_seq=2 ttl=51 time=51.8 ms
64 bytes from 64.71.34.94: icmp_seq=3 ttl=51 time=51.2 ms
^C
--- www.civicsandpolitics.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 51.256/51.751/52.176/0.421 ms
[donnie@donnie-ca etc]$
看起来好多了。现在,让我们重新启动机器。当您这样做时,您将获得以下输出:
所以,我还需要将/etc/locale.conf
文件设置回644
权限设置,机器才能正常开机。正如我之前提到的,如果您选择在配置文件上设置更严格的权限,请务必测试所有内容。
正如我已经说过的,您可能并不总是觉得有必要从默认设置中更改配置文件的权限。但是如果你真的觉得有必要,你现在知道怎么做了。
You definitely want to make friends with the find
utility. It's useful both on the command line and within shell scripts, and it's extremely flexible. The man page for it is very well-written, and you can learn just about everything you need to know about find
from it. To see it, just use the man find
command.
Once you get used to find
, you'll never want to use any of those fancy GUI-type search utilities again.
好了——我想这就结束了这一章的内容。
在本章中,我们回顾了设置文件和目录的所有权和权限的基础知识。然后,我们介绍了 SUID 和 SGID 在正确使用时可以为我们做些什么,以及将它们设置在我们自己的可执行文件上的风险。在查看了处理文件安全的两个扩展文件属性后,我们总结出一个方便、省时的技巧,用于从系统配置文件中删除世界可读的权限。
在下一章中,我们将把在这里学到的内容扩展到更高级的文件和目录访问技术。到时候见。
-
下列哪个分区装载选项会阻止对文件设置 SUID 和 SGID 权限? a .
nosgid
T5】b .noexec
T6】c .nosuid
T7】d .``nouserT8】
-
以下哪一项表示文件对用户和组具有读写权限,对其他人具有只读权限? a .
775
T5】b .554
T6】c .660
T7】d .664
-
您要将
somefile.txt
文件的所有权和组关联更改为 Maggie。以下哪个命令可以做到这一点? a .sudo chown maggie somefile.txt
b .sudo chown :maggie somefile.txt
c .sudo chown maggie: somefile.txt
d .sudo chown :maggie: somefile.txt
-
以下哪一项是 SGID 许可的数值? a .
6000
T5】b .2000
T6】c .4000
T7】d .1000
-
您会使用哪个命令来查看文件的扩展属性? a .
lsattr
T5】b .ls -a
T6】c .ls -l
T7】d .chattr
-
以下哪个命令可以在整个文件系统中搜索具有 SUID 或 SGID 权限集的常规文件? a .
sudo find / -type f -perm \6000
T5】b .sudo find / \( -perm -4000 -o -perm -2000 \)
T6】c .sudo find / -type f -perm -6000
T7】d .sudo find / -type r -perm \6000
-
以下哪个陈述是正确的? A .使用符号方法设置权限是所有情况下最好的方法。 B .使用符号方法设置权限是 shell 脚本中最好使用的方法。 C .使用数值方法设置权限是在 shell 脚本中使用的最佳方法。 D .用哪种方法设置权限并不重要。
-
下列哪个命令可以对具有用户和组读/写/执行权限以及其他人读/执行权限的文件设置 SUID 权限? a .
sudo chmod 2775 somefile
T5】b .sudo chown 2775 somefile
T6】c .sudo chmod 1775 somefile
T7】d .sudo chmod 4775 somefile
-
通过对可执行文件设置 SUID 权限,可以实现以下哪个功能? 答:它允许任何用户使用该文件。 B .防止文件意外擦除。 C .它允许“其他人”拥有与文件“用户”相同的权限。 D .它允许“其他人”拥有与文件关联的组相同的权限。
-
为什么用户不应该在自己的常规文件上设置 SUID 或 SGID 权限? A .它不必要地占用了更多的硬盘空间。 B .如果需要,它可以防止有人删除文件。 C .它可以允许某人修改文件。 D .它可能允许入侵者危害系统。
-
以下哪个
find
命令选项允许您在find
找到的每个文件上自动执行命令,而无需提示? a .-exec
T7】b .-ok
T8】c .-xargs
T9】d .-do
-
对/错:为了最好的安全性,请始终对系统上的每个
.conf
文件使用600
权限设置。 真 假 -
以下哪一项是正确的陈述? 答:通过使用
nosuid
选项挂载/
分区,防止用户在文件上设置 SUID。 B .您必须在某些系统文件上设置 SUID 权限,操作系统才能正常运行。 C .可执行文件绝不能设置 SUID 权限。 D .可执行文件应始终具有 SUID 权限集。 -
以下哪两项是配置文件的安全问题? A .使用默认配置,任何具有命令行访问权限的普通用户都可以编辑配置文件。 B .某些配置文件可能包含敏感信息。 C .使用默认配置,任何具有命令行访问权限的普通用户都可以查看配置文件。 D .服务器上的配置文件比物联网设备上的配置文件需要更多的保护。
- 如何在 linux 中找到具有 SUID 和 SGID 权限的文件:https://www . tec mint . com/如何在 Linux 中找到具有 suid 和 sgid 权限的文件/
- Linux
find
命令:https://youtu.be/tCemsQ_ZjQ0 - Linux 和 Unix 文件权限:https://youtu.be/K9FEz20Zhmc
- Linux 文件权限:https://www . Linux . com/教程/理解-Linux-文件-权限/
- Linux
find
命令的 25 个简单例子:https://www.binarytides.com/linux-find-command-examples/ - Linux
find
命令的 35 个实例:https://www . tec mint . com/35-Linux 实用实例-find-command/ - VDOO 物联网安全(我的客户):https://www.vdoo.com/