尽管从设计上来说,Linux 内核已经相当安全了,但是仍然有一些方法可以更好地锁定它。一旦你知道要找什么,这很容易做到。调整内核有助于防止某些网络攻击和某些类型的信息泄露。(但不用担心——你不必重新编译一个全新的内核来利用这一点。)
通过流程隔离,我们的目标是防止恶意用户执行纵向或横向权限升级。通过将进程相互隔离,我们可以帮助防止有人控制根用户进程或属于其他用户的进程。这两种权限提升都有助于攻击者控制系统或访问敏感信息。
在本章中,我们将快速浏览一下/proc
文件系统,并向您展示如何在其中配置某些参数来帮助增强安全性。然后,我们将转向进程隔离的主题,并讨论各种方法来确保进程保持相互隔离。
在本章中,我们将涵盖以下主题:
-
理解
/proc
文件系统 -
使用 sysctl 设置内核参数
-
配置
sysctl.conf
文件 -
过程隔离概述
-
对照组
-
命名空间隔离
-
内核能力
-
SECCOMP 和系统调用
-
对 Docker 容器使用进程隔离
-
用火牢沙箱
-
用爽快的沙盒
-
用 Flatpak 沙盒
所以,如果你准备好了,我们将从查看/proc
文件系统开始。
如果你进入任何一个 Linux 发行版的/proc
目录,四处看看,你会原谅自己认为它没有什么特别的。您将看到文件和目录,因此看起来它可能只是另一个目录。但实际上,它非常特别。它是 Linux 系统上几个不同的伪文件系统之一。(伪这个词的定义是假的,所以你也可以认为它是假的文件系统。)
如果您将主操作系统驱动器从一台 Linux 机器中取出,并将其作为辅助驱动器安装在另一台机器上,您将在该驱动器上看到一个/proc
目录,但您在其中看不到任何内容。那是因为/proc
目录的内容是每次引导 Linux 机器的时候从头开始创建的,然后每次关机的时候就清除掉了。在/proc
中,你会发现两大类信息:
- 关于用户模式进程的信息
- 关于操作系统内核级正在发生什么的信息
我们将首先研究用户模式流程。
如果您在/proc
中使用ls
命令,您将看到一大堆以数字为名称的目录。以下是我的 CentOS 虚拟机的部分列表:
[donnie@localhost proc]$ ls -l
total 0
dr-xr-xr-x. 9 root root 0 Oct 19 14:23 1
dr-xr-xr-x. 9 root root 0 Oct 19 14:23 10
dr-xr-xr-x. 9 root root 0 Oct 19 14:23 11
dr-xr-xr-x. 9 root root 0 Oct 19 14:23 12
dr-xr-xr-x. 9 root root 0 Oct 19 14:23 13
dr-xr-xr-x. 9 root root 0 Oct 19 14:24 1373
dr-xr-xr-x. 9 root root 0 Oct 19 14:24 145
dr-xr-xr-x. 9 root root 0 Oct 19 14:23 15
dr-xr-xr-x. 9 root root 0 Oct 19 14:23 16
dr-xr-xr-x. 9 root root 0 Oct 19 14:23 17
. . .
. . .
这些编号目录中的每一个对应于用户模式进程的进程标识 ( 进程标识)号。在任何 Linux 系统上,PID 1 始终是 init 系统进程,这是启动机器时启动的第一个用户模式进程。
On Debian/Ubuntu systems, the name of PID 1 is init
. On RHEL/CentOS systems, it's called systemd. Both systems run the systemd init system, but the Debian/Ubuntu folk have chosen to retain the old init
name for PID 1.
在每个编号的目录中,您将看到各种文件和子目录,其中包含有关特定运行进程的信息。例如,在1
目录中,您将看到与初始化过程相关的内容。以下是部分列表:
[donnie@localhost 1]$ ls -l
ls: cannot read symbolic link 'cwd': Permission denied
ls: cannot read symbolic link 'root': Permission denied
ls: cannot read symbolic link 'exe': Permission denied
total 0
dr-xr-xr-x. 2 root root 0 Oct 19 14:23 attr
-rw-r--r--. 1 root root 0 Oct 19 15:08 autogroup
-r--------. 1 root root 0 Oct 19 15:08 auxv
-r--r--r--. 1 root root 0 Oct 19 14:23 cgroup
--w-------. 1 root root 0 Oct 19 15:08 clear_refs
-r--r--r--. 1 root root 0 Oct 19 14:23 cmdline
-rw-r--r--. 1 root root 0 Oct 19 14:23 comm
. . .
. . .
如您所见,有一些符号链接,如果没有 root 权限,我们无法访问。当我们使用sudo
时,我们可以看到符号链接指向哪里:
[donnie@localhost 1]$ sudo ls -l
total 0
dr-xr-xr-x. 2 root root 0 Oct 19 14:23 attr
-rw-r--r--. 1 root root 0 Oct 19 15:08 autogroup
-r--------. 1 root root 0 Oct 19 15:08 auxv
-r--r--r--. 1 root root 0 Oct 19 14:23 cgroup
--w-------. 1 root root 0 Oct 19 15:08 clear_refs
-r--r--r--. 1 root root 0 Oct 19 14:23 cmdline
-rw-r--r--. 1 root root 0 Oct 19 14:23 comm
-rw-r--r--. 1 root root 0 Oct 19 15:08 coredump_filter
-r--r--r--. 1 root root 0 Oct 19 15:08 cpuset
lrwxrwxrwx. 1 root root 0 Oct 19 15:08 cwd -> /
. . .
. . .
您可以使用cat
命令查看其中一些项目的内容,但不能查看全部内容。然而,即使您可以查看内容,您也无法理解其中的内容,除非您是操作系统程序员。与其试图直接查看信息,不如使用top
或ps
,它们从/proc
中提取信息并解析,以便人类可以阅读。
I'm assuming that most of you are already familiar with top
and ps
. For those who aren't, here's the short explanation.
ps
provides a static display of what's going on with your machine's processes. There are loads of option switches that can show you different amounts of information. My favorite ps
command is ps aux
, which provides a fairly complete set of information about each process.
top
provides a dynamic, constantly changing display of the machine's processes. Some option switches are available, but just invoking top
without any options is usually all you need.
接下来,让我们看看内核信息。
在/proc
的顶层,具有实际名称的文件和目录包含关于 Linux 内核的信息。以下是部分视图:
[donnie@localhost proc]$ ls -l
total 0
. . .
dr-xr-xr-x. 2 root root 0 Oct 19 14:24 acpi
dr-xr-xr-x. 5 root root 0 Oct 19 14:24 asound
-r--r--r--. 1 root root 0 Oct 19 14:26 buddyinfo
dr-xr-xr-x. 4 root root 0 Oct 19 14:24 bus
-r--r--r--. 1 root root 0 Oct 19 14:23 cgroups
-r--r--r--. 1 root root 0 Oct 19 14:23 cmdline
-r--r--r--. 1 root root 0 Oct 19 14:26 consoles
-r--r--r--. 1 root root 0 Oct 19 14:24 cpuinfo
. . .
和用户模式的东西一样,你可以使用cat
来查看一些不同的文件。例如,以下是cpuinfo
文件的部分输出:
[donnie@localhost proc]$ cat cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 16
model : 4
model name : Quad-Core AMD Opteron(tm) Processor 2380
stepping : 2
microcode : 0x1000086
cpu MHz : 2500.038
cache size : 512 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
. . .
在这里,您可以看到我的 CPU 的类型和速度等级、其缓存大小,以及这个 CentOS 虚拟机仅在主机的八个 CPU 内核之一上运行的事实。(在 Fedora 主机操作系统上执行此操作将显示主机所有八个内核的信息。)
Yes, you did read that right. I really am using an antique, Opteron-equipped HP workstation from 2009. I got it from eBay for a very cheap price, and it runs beautifully with the LXDE spin of Fedora. And the OpenSUSE machine that you'll see mentioned in other parts of this book is the exact same model and came from the same vendor. (So, now you know just how cheap I really am.)
然而,就我们目前的目的而言,我们不需要深入/proc
中所有事物的本质细节。对我们现在的讨论来说,更重要的是可以在/proc
内设置的不同参数。例如,在/proc/sys/net/ipv4
目录中,我们可以看到许多不同的项目,可以通过调整来改变 IPv4 网络性能。以下是部分列表:
[donnie@localhost ipv4]$ pwd
/proc/sys/net/ipv4
[donnie@localhost ipv4]$ ls -l
total 0
-rw-r--r--. 1 root root 0 Oct 19 16:11 cipso_cache_bucket_size
-rw-r--r--. 1 root root 0 Oct 19 16:11 cipso_cache_enable
-rw-r--r--. 1 root root 0 Oct 19 16:11 cipso_rbm_optfmt
-rw-r--r--. 1 root root 0 Oct 19 16:11 cipso_rbm_strictvalid
dr-xr-xr-x. 1 root root 0 Oct 19 14:23 conf
-rw-r--r--. 1 root root 0 Oct 19 16:11 fib_multipath_hash_policy
-rw-r--r--. 1 root root 0 Oct 19 16:11 fib_multipath_use_neigh
-rw-r--r--. 1 root root 0 Oct 19 16:11 fwmark_reflect
-rw-r--r--. 1 root root 0 Oct 19 16:11 icmp_echo_ignore_all
. . .
. . .
我们可以使用cat
命令来查看这些参数中的每一个,如下所示:
[donnie@localhost ipv4]$ cat icmp_echo_ignore_all
0
[donnie@localhost ipv4]$
所以icmp_echo_ignore_all
参数设置为0
,表示禁用。如果我要从另一台机器 ping 这台机器,假设防火墙配置为允许,这台机器会响应 ping。如果需要,我们有几种方法可以改变这种情况。其中一些如下:
echo
从命令行将新值输入参数。- 从命令行使用
sysctl
实用程序。 - 配置
/etc/sysctl.conf
文件。 - 将包含新配置的新
.conf
文件添加到/etc/sysctl.d
目录中。 - 从 shell 脚本中运行命令。
让我们继续详细了解这些不同的方法。
你会在旧的 Linux 教科书中看到的传统方法是将一个值echo
转换成一个/proc
参数。这不能直接与sudo
一起工作,所以您需要使用bash -c
命令来强制执行该命令。在这里,您可以看到我正在更改icmp_echo_ignore_all
参数的值:
[donnie@localhost ~]$ sudo bash -c "echo '1' > /proc/sys/net/ipv4/icmp_echo_ignore_all"
[donnie@localhost ~]$ cat /proc/sys/net/ipv4/icmp_echo_ignore_all
1
[donnie@localhost ~]$
将该值设置为1
,无论防火墙如何配置,该机器现在都将忽略所有 ping 数据包。您这样设置的任何值都是临时的,并且在您重新启动机器时将恢复到其默认设置。
在此之后的列表中,下一个是icmp_echo_ignore_broadcasts
设置,如下所示:
[donnie@localhost ipv4]$ cat icmp_echo_ignore_broadcasts
1
[donnie@localhost ipv4]$
默认情况下已经启用了,所以开箱即用,Linux 已经对涉及 ICMP 广播泛洪的拒绝服务 ( DoS )攻击免疫。
用 echo 配置/proc
参数是老帽子,个人不喜欢做。最好用sysctl
,这是比较现代的做生意方式。它很容易使用,你可以在sysctl
手册页上读到它的全部内容。
要查看所有参数设置的列表,只需执行以下操作:
[donnie@localhost ~]$ sudo sysctl -a
abi.vsyscall32 = 1
crypto.fips_enabled = 1
debug.exception-trace = 1
debug.kprobes-optimization = 1
dev.hpet.max-user-freq = 64
dev.mac_hid.mouse_button2_keycode = 97
dev.mac_hid.mouse_button3_keycode = 100
dev.mac_hid.mouse_button_emulation = 0
dev.raid.speed_limit_max = 200000
dev.raid.speed_limit_min = 1000
dev.scsi.logging_level = 0
fs.aio-max-nr = 65536
. . .
. . .
要设置参数,使用-w
选项写入新值。诀窍是目录路径中的正斜杠被点代替,你忽略了路径的/proc/sys
部分。因此,要将icmp_echo_ignore_all
值更改回0
,我们将执行以下操作:
[donnie@localhost ~]$ sudo sysctl -w net.ipv4.icmp_echo_ignore_all=0
net.ipv4.icmp_echo_ignore_all = 0
[donnie@localhost ~]$
在这种情况下,更改是永久性的,因为我只是将参数更改回其默认设置。不过,通常情况下,我们这样做的任何更改只会持续到我们重新启动机器。有时,这没关系,但有时,我们可能需要使这些改变永久化。
Ubuntu 和 CentOS 的默认配置有一些显著的区别。两者都使用/etc/sysctl.conf
文件,但是在 CentOS 上,该文件除了一些解释性注释之外没有任何内容。Ubuntu 和 CentOS 在/usr/lib/sysctl.d/
目录中都有默认设置的文件,但是 CentOS 的文件比 Ubuntu 的多。在 Ubuntu 上,你会在/etc/sysctl.d
目录中找到其他有默认值的文件。在中央操作系统上,该目录只包含一个指向/etc/sysctl.conf
文件的符号链接。此外,您会发现有些东西被硬编码到 Linux 内核中,在任何配置文件中都没有提到。在真正的 Linux 时尚中,每个发行版都有不同的方式来配置这一切,只是为了确保用户保持彻底的困惑。但没关系。不管怎样,我们会试着弄清楚的。
在 Ubuntu 机器上的/etc/sysctl.conf
文件中,你会看到很多评论和一些你可以调整的东西的例子。这些评论很好地解释了各种设置的作用。所以,我们从它开始。
该文件的大部分内容包含有助于提高网络安全性的设置。在文件的顶部,我们可以看到:
# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1
欺骗攻击包括一个不良行为者向您发送带有欺骗 IP 地址的网络数据包。欺骗可以用于一些不同的事情,如 DoS 攻击、匿名端口扫描或欺骗访问控制。启用这些设置后,操作系统会验证它是否能够到达数据包报头中的源地址。如果不能,数据包将被拒绝。你可能想知道为什么这是禁用的,因为这似乎是一件好事。然而,情况并非如此:它是在另一个文件中启用的。如果你查看/etc/sysctl.d/10-network-security.conf
文件,你会看到它在那里被启用。因此,没有必要取消这两行的注释。
接下来,我们可以看到:
# Uncomment the next line to enable TCP/IP SYN cookies
# See http://lwn.net/Articles/277146/
# Note: This may impact IPv6 TCP sessions too
#net.ipv4.tcp_syncookies=1
DoS 攻击的一种形式包括向目标机器发送大量 SYN 数据包,而不完成其余的三次握手。这可能会导致受害机器有许多半开放的网络连接,这最终会耗尽机器接受更多合法连接的能力。打开 SYN cookies 可以帮助防止这种类型的攻击。事实上,SYN cookies 已经在/etc/sysctl.d/10-network-security.conf
文件中打开了。
接下来我们会看到:
# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
取消对该行的注释将允许网络数据包在具有多个网络接口的机器中从一个网络接口流向另一个网络接口。除非您正在设置路由器或虚拟专用网服务器,否则请保持此设置不变。
到目前为止,我们只看到了 IPv4 的东西。这里有一个 IPv6:
# Uncomment the next line to enable packet forwarding for IPv6
# Enabling this option disables Stateless Address Autoconfiguration
# based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1
总的来说,你也要像现在这样,把这个注释掉。在 IPv6 环境中的计算机上禁用无状态地址自动配置意味着您需要设置 DHCPv6 服务器或在所有主机上设置静态 IPv6 地址。
下一节控制 ICMP 重定向:
# Do not accept ICMP redirects (prevent MITM attacks)
#net.ipv4.conf.all.accept_redirects = 0
#net.ipv6.conf.all.accept_redirects = 0
# _or_
# Accept ICMP redirects only for gateways listed in our default
# gateway list (enabled by default)
# net.ipv4.conf.all.secure_redirects = 1
#
允许 ICMP 重定向可能会使中间人*(【MITM】)*攻击成功。取消注释这个片段顶部的两行将完全禁用 ICMP 重定向。底部的底线允许重定向,但前提是它们来自可信网关。这一个有点欺骗,因为即使这一行被注释掉了,即使在任何其他配置文件中没有关于这一点的内容,安全重定向实际上是默认启用的。我们可以通过grep
过滤我们的sysctl -a
输出来看到这一点:
donnie@ubuntu1804-1:/etc/sysctl.d$ sudo sysctl -a | grep 'secure_redirects'
net.ipv4.conf.all.secure_redirects = 1
net.ipv4.conf.default.secure_redirects = 1
net.ipv4.conf.docker0.secure_redirects = 1
net.ipv4.conf.enp0s3.secure_redirects = 1
net.ipv4.conf.lo.secure_redirects = 1
donnie@ubuntu1804-1:/etc/sysctl.d$
在这里,我们可以看到所有网络接口都启用了安全重定向。但是如果你确定你的机器永远不会被用作路由器,最好还是完全禁用 ICMP 重定向。(我们一会儿就做。)
这个文件中的最后一个网络项目涉及火星数据包:
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#
现在,如果你和我一样大,你可能还记得 60 年代的一个非常愚蠢的电视节目,叫做《我最喜欢的火星人》——但这个场景与此无关。火星数据包的源地址通常不能被特定的网络接口接受。例如,如果您的面向互联网的服务器接收到带有私有 IP 地址或环回设备地址的数据包,那就是火星数据包。为什么它们被称为火星包?嗯,是因为有人说这些包裹不是这个地球的。不管怎样,火星数据包会耗尽网络资源,所以了解它们很好。您可以通过取消对前面代码片段中的行的注释,或者在/etc/sysctl.d
目录中放置一个覆盖文件来启用它们的日志记录。(我们也将在稍后介绍这一点。)
以下代码片段是 Magic 系统请求密钥的内核参数:
# Magic system request key
# 0=disable, 1=enable all
# Debian kernels have this set to 0 (disable the key)
# See https://www.kernel.org/doc/Documentation/sysrq.txt
# for what other values do
#kernel.sysrq=1
启用此参数后,您可以执行某些功能,例如关闭或重新启动系统、向进程发送信号、转储进程调试信息,以及通过按一系列魔键执行其他一些操作。您可以通过按下 Alt + SysReq +命令键序列来完成。(某些键盘上的 SysReq 键是 PrtScr 键,而命令键是调用某些特定命令的键。)值为0
将完全禁用它,值为1
将启用所有魔法键功能。大于 1 的值只会启用特定的功能。在此文件中,此选项似乎被禁用。然而,它实际上是在/etc/sysctl.d/10-magic-sysrq.conf
文件中启用的。如果您正在处理的服务器被锁在服务器室中,并且无法从串行控制台远程访问,这可能不是什么大问题。但是,对于一台处于开放状态或可以从串行控制台访问的机器,您可能需要禁用它。(我们也将在稍后进行。)
/etc/sysctl.conf
中的最终设置防止在某些情况下创建硬链接和符号链接:
# Protected links
#
# Protects against creating or following links under certain conditions
# Debian kernels have both set to 1 (restricted)
# See https://www.kernel.org/doc/Documentation/sysctl/fs.txt
#fs.protected_hardlinks=0
#fs.protected_symlinks=0
在某些情况下,坏人可能会创建指向敏感文件的链接,以便他们可以轻松访问这些文件。链接保护在/etc/sysctl.d/10-link-restrictions.conf
文件中打开,你想就这样离开。所以,永远不要取消这两个参数的注释。
这几乎涵盖了我们在 Ubuntu 中拥有的东西。现在,让我们看看 CentOS。
在 CentOS 上,/etc/sysctl.conf
文件为空,除了一些注释。这些注释告诉您在其他地方寻找默认配置文件,并通过在/etc/sysctl.d
目录中创建新的配置文件来进行更改。
CentOS 的默认安全设置与 Ubuntu 的基本相同,只是它们是在不同的地方配置的。例如,在 CentOS 上,欺骗保护(rp_filter
)参数和链接保护参数在/usr/lib/sysctl.d/50-default.conf
文件中。
通过将sysctl -a
命令输入到grep
中,您还会看到syncookies
被启用:
[donnie@centos7-tm1 ~]$ sudo sysctl -a | grep 'syncookie'
net.ipv4.tcp_syncookies = 1
[donnie@centos7-tm1 ~]$
secure_redirects
也是如此:
[donnie@centos7-tm1 ~]$ sudo sysctl -a | grep 'secure_redirects'
net.ipv4.conf.all.secure_redirects = 1
net.ipv4.conf.default.secure_redirects = 1
net.ipv4.conf.enp0s3.secure_redirects = 1
net.ipv4.conf.lo.secure_redirects = 1
net.ipv4.conf.virbr0.secure_redirects = 1
net.ipv4.conf.virbr0-nic.secure_redirects = 1
[donnie@centos7-tm1 ~]$
奇怪的是,在任何 CentOS 配置文件中都找不到任何secure_redirects
或syncookies
的设置。为了解开这个谜团,我在整个文件系统中搜索了这些文本字符串。以下是我通过搜索syncookies
找到的部分内容:
[donnie@centos7-tm1 /]$ sudo grep -ir 'syncookies' *
. . .
. . .
boot/System.map-3.10.0-123.el7.x86_64:ffffffff819ecf8c D sysctl_tcp_syncookies
boot/System.map-3.10.0-123.el7.x86_64:ffffffff81a5b71c t init_syncookies
. . .
. . .
grep
找到syncookies
或secure_redirects
文本字符串的唯一位置在/boot
目录的System.map
文件中。所以,我最好的猜测是这些值被硬编码到内核中,这样就不需要在sysctl
配置文件中配置它们。
到目前为止我们所看到的还不算太坏。我们看到的大多数参数已经设置为最安全的值。但是还有改进的空间吗?确实有。但是,通过查看任何配置文件,您都不会知道它。在 Ubuntu 和 CentOS 上,相当多的项目都有缺省值,这些缺省值没有在任何正常的配置文件中设置。最好的方法是使用系统扫描仪,如 Lynis。
Lynis 是一个安全扫描器,它显示了关于系统的大量信息。(我们将在第 13 章、漏洞扫描和入侵检测中详细介绍。)现在,我们将只讨论它能告诉我们关于加固 Linux 内核的什么。
运行扫描后,您将在屏幕输出中看到一个[+] Kernel Hardening
部分。它相当长,所以这里只是它的一部分:
[+] Kernel Hardening
------------------------------------
- Comparing sysctl key pairs with scan profile
- fs.protected_hardlinks (exp: 1) [ OK ]
- fs.protected_symlinks (exp: 1) [ OK ]
- fs.suid_dumpable (exp: 0) [ OK ]
- kernel.core_uses_pid (exp: 1) [ OK ]
- kernel.ctrl-alt-del (exp: 0) [ OK ]
- kernel.dmesg_restrict (exp: 1) [ DIFFERENT ]
- kernel.kptr_restrict (exp: 2) [ DIFFERENT ]
- kernel.randomize_va_space (exp: 2) [ OK ]
- kernel.sysrq (exp: 0) [ DIFFERENT ]
. . .
. . .
标记为OK
的一切都是为了最好的安全性。标记为DIFFERENT
的值应该改为括号内的建议的exp:
值。( exp 代表预期。)现在让我们在动手实验室中进行。
Lynis 在 Ubuntu 的普通存储库中,在 CentOS 的 EPEL 存储库中。你可以直接从作者的网站上获得的东西后面总是有几个版本,但目前来说,这没关系。当我们到达第 13 章、漏洞扫描和入侵检测时,我将向您展示如何获取最新版本。让我们开始吧:
- 通过对 Ubuntu 执行以下操作,从存储库中安装 Lynis:
sudo apt update
sudo apt install lynis
对 CentOS 07 执行以下操作:
sudo yum install lynis
对 CentOS 08 执行以下操作:
sudo dnf install lynis
- 使用以下命令扫描系统:
sudo lynis audit system
- 扫描完成后,向上滚动至输出的
[+] Kernel Hardening
部分。将 sysctl 密钥对复制并粘贴到文本文件中。在自己的主目录中保存为secure_values.conf
。文件的内容应该如下所示:
- fs.protected_hardlinks (exp: 1) [ OK ]
- fs.protected_symlinks (exp: 1) [ OK ]
- fs.suid_dumpable (exp: 0) [ OK ]
- kernel.core_uses_pid (exp: 1) [ OK ]
- kernel.ctrl-alt-del (exp: 0) [ OK ]
- kernel.dmesg_restrict (exp: 1) [ DIFFERENT ]
- kernel.kptr_restrict (exp: 2) [ DIFFERENT ]
- kernel.randomize_va_space (exp: 2) [ OK ]
- kernel.sysrq (exp: 0) [ DIFFERENT ]
- kernel.yama.ptrace_scope (exp: 1 2 3) [ DIFFERENT ]
- net.ipv4.conf.all.accept_redirects (exp: 0) [ DIFFERENT ]
- net.ipv4.conf.all.accept_source_route (exp: 0) [ OK ]
. . .
. . .
- 使用
grep
将所有DIFFERENT
行发送到新文件。名称60-secure_values.conf
:
grep 'DIFFERENT' secure_values.conf > 60-secure_values.conf
- 编辑
60-secure_values.conf
文件,将其转换为 sysctl 配置格式。将每个参数设置为当前在括号对中的exp
值。成品应该是这样的:
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
kernel.sysrq = 0
kernel.yama.ptrace_scope = 1 2 3
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.log_martians = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
- 将文件复制到
/etc/sysctl.d
目录:
sudo cp 60-secure_values.conf /etc/sysctl.d/
- 重新启动机器,从新文件中读入值:
sudo shutdown -r now
- 重复步骤 2 。大多数项目现在应该显示它们最安全的值。然而,你可能会看到一些
DIFFERENT
行出现。没关系;只需将这些参数的行移动到主/etc/sysctl.conf
文件中,然后再次重新启动机器。
This trick didn't completely work with CentOS 8. No matter what I did, the net.ipv4.conf.all.forwarding
item remained enabled. However, the other items came out okay.
实验室到此结束——祝贺你!
我们已经讨论了在这个过程中我们改变的一些项目。以下是其余部分的分类:
kernel.dmesg_restrict = 1
:默认情况下,任何非特权用户都可以运行dmesg
命令,该命令允许用户查看不同类型的内核信息。其中一些信息可能是敏感的,因此我们希望将此参数设置为1
,以便只有具有 root 权限的人才能使用dmesg
。kernel.kptr_restrict = 2
:该设置防止/proc
在内存中暴露内核地址。将此设置为0
将完全禁用它,而将其设置为1
将防止非特权用户看到地址信息。设置为2
,就像我们这里一样,防止任何人看到地址信息,不管这个人的特权级别如何。不过请注意,将此设置为1
或2
可能会阻止某些性能监控程序运行,如perf
。如果你绝对需要进行性能监控,你可能需要将其设置为0
。(这并不像听起来那么糟糕,因为设置好kernel.dmesg_restrict = 1
有助于缓解这个问题。)kernel.yama.ptrace_scope = 1 2 3
:这就对ptrace
实用程序进行了限制,这是一个坏人也可以使用的调试程序。1
将 ptrace 限制为仅调试父进程。2
表示只有拥有 root 权限的人才可以使用 ptrace,而3
则阻止任何人使用 ptrace 跟踪进程。
在本节中,您学习了如何配置各种内核参数来帮助锁定您的系统。接下来,我们将通过限制哪些人可以查看流程信息来进一步锁定。
默认情况下,用户可以使用ps
或top
等工具来查看其他人的流程以及他们自己的流程。为了演示这一点,让我们看一下来自ps aux
命令的以下部分输出:
[donnie@localhost ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 179124 13752 ? Ss 12:05 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
root 2 0.0 0.0 0 0 ? S 12:05 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 12:05 0:00 [rcu_gp]
. . .
. . .
colord 2218 0.0 0.5 323948 10344 ? Ssl 12:06 0:00 /usr/libexec/colord
gdm 2237 0.0 0.2 206588 5612 tty1 Sl 12:06 0:00 /usr/libexec/ibus-engine-simple
root 2286 0.0 0.6 482928 11932 ? Sl 12:06 0:00 gdm-session-worker [pam/gdm-password]
donnie 2293 0.0 0.5 93280 9696 ? Ss 12:06 0:00 /usr/lib/systemd/systemd --user
donnie 2301 0.0 0.2 251696 4976 ? S 12:06 0:00 (sd-pam)
donnie 2307 0.0 0.6 1248768 12656 ? S<sl 12:06 0:00 /usr/bin/pulseaudio --daemonize=no
. . .
即使只有普通用户权限,我也可以查看属于根用户和各种系统用户以及我自己的进程。(如果我的猫登录了,我也可以查看它们的进程。)这些信息对管理员来说可能相当有用,但也可以帮助坏人。这些信息可以帮助 Joe 或 Jane Hacker 计划对您的系统进行攻击,甚至可能会泄露一些敏感信息。解决这个问题的最好方法是使用hidepid
选项挂载/proc
文件系统。您可以通过在/etc/fstab
文件的末尾添加以下一行来实现,如下所示:
proc /proc proc hidepid=2 0 0
然后,重新安装/proc
,像这样:
sudo mount -o remount proc
现在,任何没有 sudo 权限的用户都只能查看自己的进程。(很滑头,嗯?)
The three values for the hidepid option are as follows:
0
: This is the default, which allows all users to see each others' processes.
1
: This allows all users to see other users' process directories within /proc
. However, users will only be able to cd
into their own process directories. Also, they'll only be able to see their own process information with ps
or top
.
2
: This hides all other users' process information, including the process directories within /proc
.
既然您已经了解了/proc
文件系统的内部工作原理以及如何对其进行最佳安全配置,那么让我们来看看进程隔离。
任何网络入侵者的首要目标都是获得执行其肮脏行为所需的特权。这通常涉及以普通用户身份登录,然后执行某种权限升级。纵向升级包括获得根权限,而横向升级包括获得其他普通用户的权限。如果其他普通用户在他或她可以访问的文件夹中有任何敏感文档,那么入侵者可能只需要水平升级。自主访问控制和强制访问控制可以提供帮助,但我们也希望将进程相互隔离,并确保进程仅以尽可能低的权限运行。
When planning a defense against these types of attacks, consider that the attacks could come from either outsiders or insiders. So, yes, you need to guard against attacks from your organization's own employees.
在这一节中,我们将研究各种促进进程隔离的 Linux 内核特性。然后,我们将看看使用这些功能的一些很酷的方法。
控制组,通常被称为 cgroups,早在 2010 年红帽企业版 Linux 6 中就引入了。最初,它们只是一个附加功能,用户必须跳过一些障碍才能手动创建它们。如今,随着 systemd init 系统的出现,cgroup 是操作系统不可分割的一部分,默认情况下,每个进程都在自己的 cgroup 中运行。
使用 cgroups,进程在自己的内核空间和内存空间中运行。如果需要,管理员可以很容易地配置一个 cgroup 来限制进程可以使用的资源。这不仅有利于安全性,也有利于调整系统性能。
那么,什么是 cgroup?嗯,它实际上只是为了特定目的而组合在一起的过程的集合。以下是您可以对 cgroups 执行的操作:
- 设置资源限制:对于每个 cgroup,可以设置 CPU 使用、I/O 使用和内存使用的资源限制。
- 执行不同的核算功能:你可以测量每个 cgroup 的资源使用情况,这样可以很容易地为特定客户使用的资源开出账单。
- 资源优先:你可以对疯狂霸占资源的用户设置限制。
- 冻结、检查点和重启:这些功能对于故障排除很方便。它们允许您停止进程,拍摄系统状态的快照,并从备份中恢复系统状态。
没有足够的空间来查看所有这些功能,但没关系。现在,我们的主要兴趣是设定资源限制。除了一些小的例外,CentOS 7、CentOS 8 和 Ubuntu 18.04 上的工作原理是一样的。目前,我们将使用 CentOS 8。
默认情况下,系统上的每个组都没有定义的资源限制。定义它们的第一步是考虑 CPU 使用、内存使用和输入/输出使用。我们可以通过手动编辑我们想要限制的每个服务的 systemd 服务文件来实现这一点,但是只运行一个systemctl
命令更容易,如下所示:
sudo systemctl set-property httpd.service MemoryAccounting=1 CPUAccounting=1 BlockIOAccounting=1
我们刚刚在 CentOS 8 机器上打开了 Apache 网络服务器的记账功能。(这个命令在 Ubuntu 机器上是一样的,只是我们用apache2.service
代替httpd.service
。)现在,当我们查看/etc/systemd/system.control
目录时,我们会看到我们已经创建了一个httpd.service.d
目录。在这个目录中有开启我们会计功能的文件:
[donnie@localhost httpd.service.d]$ pwd
/etc/systemd/system.control/httpd.service.d
[donnie@localhost httpd.service.d]$ ls -l
total 12
-rw-r--r--. 1 root root 153 Oct 30 15:07 50-BlockIOAccounting.conf
-rw-r--r--. 1 root root 149 Oct 30 15:07 50-CPUAccounting.conf
-rw-r--r--. 1 root root 152 Oct 30 15:07 50-MemoryAccounting.conf
[donnie@localhost httpd.service.d]$
在每个文件里面,我们可以看到两行修改了原来的httpd.service
文件,以便打开记账。例如,这里有一个用于CPUAccounting
:
[donnie@localhost httpd.service.d]$ cat 50-CPUAccounting.conf
# This is a drop-in unit file extension, created via "systemctl set-property"
# or an equivalent operation. Do not edit.
[Service]
CPUAccounting=yes
[donnie@localhost httpd.service.d]$
既然我们已经为 Apache 服务启用了记帐,我们可以对它设置一些资源限制。(默认情况下,没有限制。)假设我们希望将 Apache 限制在只有 40%的 CPU 使用率和 500 MB 的内存使用率。我们将使用以下命令设置这两个限制:
[donnie@localhost ~]$ sudo systemctl set-property httpd.service CPUQuota=40% MemoryLimit=500M
[donnie@localhost ~]$
该命令在/etc/systemd/system.control/httpd.service.d/
目录下又创建了两个文件:
[donnie@localhost httpd.service.d]$ ls -l
total 20
-rw-r--r--. 1 root root 153 Oct 30 15:07 50-BlockIOAccounting.conf
-rw-r--r--. 1 root root 149 Oct 30 15:07 50-CPUAccounting.conf
-rw-r--r--. 1 root root 144 Oct 30 15:18 50-CPUQuota.conf
-rw-r--r--. 1 root root 152 Oct 30 15:07 50-MemoryAccounting.conf
-rw-r--r--. 1 root root 153 Oct 30 15:18 50-MemoryLimit.conf
[donnie@localhost httpd.service.d]$
咱们cat
其中一个,就来看看文件的格式:
[donnie@localhost httpd.service.d]$ cat 50-CPUQuota.conf
# This is a drop-in unit file extension, created via "systemctl set-property"
# or an equivalent operation. Do not edit.
[Service]
CPUQuota=40%
[donnie@localhost httpd.service.d]$
我们可以以同样的方式将资源分配给其他服务。例如,如果这是一个Linux-Apache-MySQL/MariaDB-PHP(LAMP)服务器,我们可以将剩余的一部分 CPU 和内存资源分配给 PHP 服务,其余的分配给 MySQL/Mariadb 服务。
LAMP is the bedrock for many popular Content Management Systems, such as WordPress and Joomla.
我们还可以对用户帐户设置资源限制。例如,让我们将 Katelyn 的 CPU 使用率限制在 20%,内存使用率限制在 500 MB。首先,我们需要获取凯特琳的用户标识号。我们将使用id
命令来完成:
[donnie@localhost ~]$ id katelyn
uid=1001(katelyn) gid=1001(katelyn) groups=1001(katelyn)
[donnie@localhost ~]$
所以,她的 UID 是1001
。让我们为她启用会计并设置她的限制:
[donnie@localhost ~]$ sudo systemctl set-property user-1001.slice MemoryAccounting=1 CPUAccounting=1 BlockIOAccounting=1
[donnie@localhost ~]$ sudo systemctl set-property user-1001.slice CPUQuota=20% MemoryLimit=500M
[donnie@localhost ~]
如果我们查看/etc/systemd/system.control/user-1001.slice.d
目录,我们将看到为 httpd 服务创建的相同文件集。
我已经提到了在 CentOS 和 Ubuntu 上做这个的区别;也就是说,某些服务在每个发行版上都有不同的名称。这种情况下,服务在 CentOS 上是httpd.service
,在 Ubuntu 上是apache2.service
。除此之外,Ubuntu 18.04 和 CentOS 8 的工作原理是一样的。
在 CentOS 7 上,/etc/systemd
目录内没有system.control
目录。相反,httpd.service.d
目录是在/etc/systemd/system
目录中创建的。当我第一次试图为凯特琳设置限制时,同样是用 UID 1001
,CentOS 7 不允许我这样做,直到凯特琳登录激活她的slice
。她的文件是在/run/systemd/system/user-1001.slice.d
目录中创建的,该目录只包含短暂的运行时文件。因此,与 CentOS 8 不同的是,这些文件不会在重启后保持不变。这意味着,如果你需要在 CentOS 7 上设置用户资源限制,你需要知道一旦你重启机器,它们就会消失。
除了我在这里能展示的内容,还有很多其他的内容。但没关系。在本节中,我们研究了 cgroups 增强安全性的两种方法:
- 它们提供过程隔离。
- 使用它们来限制资源使用可以帮助防止 DoS 攻击。
接下来,我们将简单了解一下名称空间和名称空间隔离的概念。
名称空间是 Linux 内核版本 2.4.19 中引入的一个内核安全特性,一直追溯到 2002 年。命名空间允许一个进程拥有自己的一组其他进程看不到的计算机资源。当您可能有多个客户在同一台服务器上共享资源时,它们尤其方便。每个用户的进程都有自己的名称空间。目前,有七种类型的名称空间:
- Mount (mnt) :这是最初的命名空间,在 Linux 内核 2.4.19 中引入。当时,这是唯一的命名空间。这允许每个进程都有自己的根文件系统,其他进程看不到,除非您选择共享它。这是防止信息泄露的好方法。
- UTS:UTS 命名空间允许每个进程拥有自己唯一的主机名和域名。
- PID :每个运行的进程都可以有自己的一组 PID 号。PID 命名空间可以嵌套,这样父命名空间就可以看到子命名空间的 PID。(请注意,子命名空间看不到父命名空间。)
- 网络(net) :这样可以为每个进程创建一个完整的虚拟网络。每个虚拟网络都可以有自己的子网、虚拟网络接口、路由表和防火墙。
- 进程间通信 (ipc) :这也通过防止两个进程共享同一个内存空间来防止数据泄露。每个正在运行的进程都可以访问自己的内存空间,但是其他进程将被阻止。
- 控制组(cgroup) :该命名空间隐藏了进程所属的 cgroup 的标识。
- 用户:用户命名空间允许用户对不同的进程拥有不同的权限级别。例如,用户可以对一个进程拥有根级权限,但只能对另一个进程拥有普通用户权限。
要查看这些名称空间,只需进入/proc
文件系统中的任何编号目录,并查看ns
目录的内容。这是我的一台机器的例子:
[donnie@localhost ns]$ pwd
/proc/7669/ns
[donnie@localhost ns]$ ls -l
total 0
lrwxrwxrwx. 1 donnie donnie 0 Oct 30 16:16 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx. 1 donnie donnie 0 Oct 30 16:16 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx. 1 donnie donnie 0 Oct 30 16:16 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx. 1 donnie donnie 0 Oct 30 16:16 net -> 'net:[4026531992]'
lrwxrwxrwx. 1 donnie donnie 0 Oct 30 16:16 pid -> 'pid:[4026531836]'
lrwxrwxrwx. 1 donnie donnie 0 Oct 30 16:16 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx. 1 donnie donnie 0 Oct 30 16:16 user -> 'user:[4026531837]'
lrwxrwxrwx. 1 donnie donnie 0 Oct 30 16:16 uts -> 'uts:[4026531838]'
[donnie@localhost ns]$
你们当中目光敏锐的人会发现,这个目录中还有一个我们没有涉及的额外项目。pid_for_children
项跟踪子命名空间中的 PiD。
虽然您当然可以创建自己的名称空间,但您可能永远也不会创建,除非您是软件开发人员。最有可能的是,您将只使用已经内置了名称空间技术的产品。一些现代 web 浏览器使用名称空间为每个打开的选项卡创建一个沙箱。你可以使用一个产品,比如 Firejail,在它自己的安全沙箱中运行一个普通的程序。(我们稍后再看这个。)然后是 Docker,它使用名称空间来帮助将 Docker 容器相互隔离,并与主机操作系统隔离。
我们刚刚对名称空间有了一个高层次的概述。接下来,让我们看看内核功能。
当您执行一个ps aux
命令时,或者如果您已经用hidepid=1
或hidepid=2
选项挂载了/proc
的话,您将会看到许多由根用户拥有的进程。这是因为这些进程必须访问某种非特权用户无法访问的系统资源。然而,让服务以完全根权限运行可能有点安全问题。幸运的是,有一些方法可以缓解这种情况。
例如,任何网络服务器服务,如 Apache 或 Nginx,都需要以根权限启动才能绑定到端口80
和443
,它们是特权端口。但是,Apache 和 Nginx 都通过在服务启动后删除根权限或通过生成属于非特权用户的子进程来缓解这个问题。在这里,我们可以看到主 Apache 进程生成属于非特权apache
用户的子进程:
[donnie@centos7-tm1 ~]$ ps aux | grep http
root 1015 0.0 0.5 230420 5192 ? Ss 15:36 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1066 0.0 0.2 230420 3000 ? S 15:36 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1067 0.0 0.2 230420 3000 ? S 15:36 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1068 0.0 0.2 230420 3000 ? S 15:36 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1069 0.0 0.2 230420 3000 ? S 15:36 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1070 0.0 0.2 230420 3000 ? S 15:36 0:00 /usr/sbin/httpd -DFOREGROUND
donnie 1323 0.0 0.0 112712 964 pts/0 R+ 15:38 0:00 grep --color=auto http
[donnie@centos7-tm1 ~]$
但并不是所有的软件都能做到这一点。有些程序被设计为始终以 root 权限运行。对于某些情况——不是全部,而是部分——您可以通过将内核功能应用于程序可执行文件来解决这个问题。
功能允许 Linux 内核将根用户可以做的事情分成不同的单元。假设您刚刚编写了一个很酷的自定义程序,需要访问一个特权网络端口。如果没有这些功能,您要么必须以 root 权限启动该程序,让它以 root 权限运行,要么跳过对它的编程,这样一旦启动它就可以放弃 root 权限。通过应用适当的功能,非特权用户将能够启动它,并且它将以该用户的特权运行。(稍后会有更多相关信息。)
这里列出的功能太多了(总共大约有 40 个),但是您可以使用以下命令查看完整的列表:
man capabilities
回到我们前面的例子,假设我们需要使用 Python 来设置一个非常原始的 web 服务器,任何非特权用户都可以启动它。(我们将使用 Python 2 来实现这一点,因为它不适用于 Python 3。)目前,我们将在 CentOS 8 机器上进行此操作。
The names of the Python packages and executable files are different between CentOS 7, CentOS 8, and Ubuntu. I'll show you all three sets of commands when we get to the hands-on lab.
运行简单 Python 网络服务器的命令如下:
python2 -m SimpleHTTPServer 80
然而,这是行不通的,因为它需要绑定到端口80
,这是网络服务器通常使用的特权端口。在该命令输出的底部,您将看到问题:
socket.error: [Errno 13] Permission denied
在命令前面加上sudo
将解决问题,并允许网络服务器运行。然而,我们不希望这样。我们更愿意允许非特权用户启动它,我们更愿意让它在没有根用户特权的情况下运行。修复这个问题的第一步是找到 Python 可执行文件,如下所示:
[donnie@localhost ~]$ which python2
/usr/bin/python2
[donnie@localhost ~]$
大多数情况下,python
或python2
命令是指向另一个可执行文件的符号链接。我们将用一个简单的ls -l
命令来验证:
[donnie@localhost ~]$ ls -l /usr/bin/python2
lrwxrwxrwx. 1 root root 9 Oct 8 17:08 /usr/bin/python2 -> python2.7
[donnie@localhost ~]$
所以,python2
链接指向python2.7
可执行文件。现在,让我们看看是否有任何功能分配给此文件:
[donnie@localhost ~]$ getcap /usr/bin/python2.7
[donnie@localhost ~]$
没有输出意味着没有。当我们查阅功能手册页时,我们会发现CAP_NET_BIND_SERVICE
功能似乎正是我们所需要的。对它的一行描述是:将套接字绑定到互联网域特权端口(端口号小于1024
) *。*好的;听起来不错。所以,让我们在python2.7
可执行文件上设置它,看看会发生什么。由于我们使用getcap
来查看文件功能,您可能会猜测我们将使用setcap
来设置功能。(你是对的。)我们现在就开始吧:
[donnie@localhost ~]$ sudo setcap 'CAP_NET_BIND_SERVICE+ep' /usr/bin/python2.7
[sudo] password for donnie:
[donnie@localhost ~]$ getcap /usr/bin/python2.7
/usr/bin/python2.7 = cap_net_bind_service+ep
[donnie@localhost ~]$
能力名称末尾的+ep
表示我们正在添加有效(激活)和允许的能力。现在,当我尝试用我自己的正常权限运行这个 web 服务器时,它会正常工作:
[donnie@localhost ~]$ python2 -m SimpleHTTPServer 80
Serving HTTP on 0.0.0.0 port 80 ...
当我在主机上使用 Firefox 连接到该服务器时,我会看到一个文件和目录列表,其中列出了我主目录中的所有内容:
Linux 功能在其他方面也非常有用。在任何 Linux 系统上,ping 实用程序都需要超级用户权限,以便创建完成工作所需的网络数据包。然而,每个人和他的兄弟都可以像普通用户一样使用 ping。如果您查看 ping 可执行文件,您会看到 Linux 维护人员为它分配了两项功能:
[donnie@localhost ~]$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_admin,cap_net_raw+p
[donnie@localhost ~]$
尽管这一切看起来很酷,但也有一些缺点:
- 试图弄清楚一个程序到底需要哪些功能并不总是简单的。事实上,在你把事情做好之前,可能需要大量的实验。
- 设定能力不是万能的。很多时候,你会看到设置一个特定的功能仍然不允许程序做你需要它做的事情。事实上,甚至可能没有一种功能可以让程序在没有 root 权限的情况下按照您的要求运行。
- 执行系统更新可能会替换您分配了功能的可执行文件。(有了 ping,我们就不用担心这个了,因为功能是由 Linux 维护人员设置的。)
好吧,所以很有可能你从来不需要设置任何功能。然而,这是我的物联网安全客户端用来帮助锁定物联网设备的工具之一,因此这确实有实际用途。此外,功能是我们稍后将会看到的一些技术的构建模块。
在本实验中,您将允许普通用户运行 Python 网络服务器。您可以使用任何虚拟机。让我们开始吧:
- 如果您的虚拟机上安装了 Apache,请确保它已为 Ubuntu 停止:
sudo systemctl stop apache2
对于 CentOS,请执行以下操作:
sudo systemctl stop httpd
- 为 Ubuntu 安装 Python 2:
sudo apt install python
对于 CentOS 7,请执行以下操作:
sudo yum install python
对于 CentOS 8,请执行以下操作:
sudo dnf install python2
- 从您自己的主目录中,尝试以您的普通用户权限启动 Python
SimpleHTTPServer
,并注意 Ubuntu 和 CentOS 7 上的错误消息:
python -m SimpleHTTPServer 80
在 CentOS 8 上,您将看到以下内容:
python2 -m SimpleHTTPServer 80
- 查看 CentOS 7 上的 Python 可执行文件是否设置了任何功能:
getcap /usr/bin/python2
在 Ubuntu 和 CentOS 8 上,执行以下操作:
getcap /usr/bin/python2.7
- 在 CentOS 7 上的 Python 可执行文件上设置
CAP_NET_BIND_SERVICE
功能:
sudo setcap 'CAP_NET_BIND_SERVICE+ep' /usr/bin/python2
在 Ubuntu 和 CentOS 8 上,执行以下操作:
sudo setcap 'CAP_NET_BIND_SERVICE+ep' /usr/bin/python2.7
- 重复步骤 3 和步骤 4 。这一次,应该管用。
- 确保虚拟机防火墙上的端口 80 已打开,并使用主机的网络浏览器访问服务器。
- 使用 Ctrl + C 关闭网络服务器。
- 查看已分配给 ping 可执行文件的功能:
getcap /usr/bin/ping
- 查看手册页的功能,尤其是关于各种功能的部分。
实验到此结束,祝贺你!
到目前为止,您已经看到了如何设置文件功能,以及它们能为您做什么和不能为您做什么。接下来,我们将看看如何控制系统调用。
每次在 Linux 机器上运行任何命令,都会发生多次系统调用。每个系统调用从人类用户那里获取一个命令,并将其传递给 Linux 内核。这告诉 Linux 内核它需要执行某种特权动作。打开或关闭文件、写入文件或更改文件权限或所有权只是需要进行某种系统调用的一些操作。Linux 内核中内置了大约 330 个系统调用。我不能说具体有多少,因为新的 syscalls 会不时被添加。除此之外,不同的中央处理器架构之间的系统调用也不同。因此,ARM 中央处理器不会有与 x86_64 中央处理器完全相同的系统调用集。查看计算机上可用的 syscalls 列表的最佳方法是使用以下命令:
man syscalls
Note that each individual syscall has its own man page.
为了了解这是如何工作的,这里有strace
命令,它显示了由一个简单的ls
命令进行的系统调用:
[donnie@localhost ~]$ strace -c -f -S name ls 2>&1 1>/dev/null | tail -n +3 | head -n -2 | awk '{print $(NF)}'
access
arch_prctl
brk
close
execve
. . .
. . .
set_robust_list
set_tid_address
statfs
write
[donnie@localhost ~]$
总共有 22 个系统调用是从只做ls
开始的。(由于格式限制,我不能在这里全部显示。)
安全计算 ( SECCOMP )最初是为谷歌 Chrome 网络浏览器创建的,它允许您只启用某个进程想要使用的系统调用的某个子集,或者禁用某个进程不想使用的系统调用。除非你是一个软件开发人员或者 Docker 容器开发人员,否则你可能不会直接使用它。然而,这是正常人日常使用的技术的另一个组成部分。
接下来,让我们通过观察这些很酷的东西在现实生活中是如何使用的来透视它们。
容器技术已经存在了相当长的一段时间,但是 Docker 花了很长时间才使容器流行起来。与虚拟机不同,容器不包含整个操作系统。相反,一个容器包含的操作系统刚好足够让应用在自己的私有沙箱中运行。容器缺少自己的操作系统内核,所以使用宿主 Linux 机器的内核。容器如此受欢迎的原因是,与虚拟机相比,您可以将更多的容器打包到物理服务器上。因此,它们非常适合降低数据中心的运营成本。
Docker 容器使用我们在本章中介绍的技术。内核功能、cgroups、名称空间和 SECCOMP 都有助于 Docker 容器保持相互隔离和与主机操作系统隔离,除非我们选择其他方式。默认情况下,Docker 容器以一组减少的功能和系统调用运行,Docker 开发人员可以为他们创建的容器减少更多的功能和系统调用。
I can't go into the nitty-gritty details about how all this works in Docker because it would require explaining the development process for Docker containers. That's okay, though. In this section, you'll understand what to look out for if someone wants to deploy Docker containers in your data center.
尽管听起来不错,但 Docker 的安全性远非完美。正如我在第 9 章、中演示的那样,使用 SELinux 和 appamor实现强制访问控制,docker
组的任何非特权成员都可以将主机的根文件系统挂载到他或她自己创建的容器中。docker
组中通常没有特权的成员在容器中拥有根特权,这些特权扩展到主机的挂载根文件系统。在演示中,我向您展示了只有有效的强制访问控制系统,特别是 SELinux,才能阻止 Katelyn 控制整个主机。
为了解决这个相当严重的设计缺陷,红帽的开发人员创建了他们自己的 Docker 替代品。他们称之为podman-docker
,它可以在 RHEL 8 和 CentOS 8 存储库中找到。在podman-docker
中安全性得到了很大的提高,我为大家演示的攻击类型即使没有 SELinux 也不起作用。就我个人而言,除了 RHEL 8 或 CentOS 8 之外,我甚至不会考虑任何运行容器的东西。(不,红帽子的人不会付钱让我这么说。)
现在,我已经向您概要介绍了流程隔离技术在 Docker 中的使用方式,让我们看看它们在凡人更可能使用的技术中是如何使用的。我们将从消防监狱开始。
Firejail 使用名称空间、SECCOMP 和内核功能在自己的沙箱中运行不受信任的应用。这有助于防止应用之间的数据泄漏,也有助于防止恶意程序破坏您的系统。它在 Debian 及其后代的正常存储库中,包括树莓 Pi 设备的 Raspbian,可能还有 Ubuntu 家族的每个成员。在红帽方面,它在 Fedora 存储库中,但不在 CentOS 存储库中。因此,对于 CentOS,您必须下载源代码并在本地编译。Firejail 是为单用户桌面系统设计的,所以我们需要使用 Linux 的桌面版本。为了让事情变得简单,我将使用 Lubuntu,这是带有 LXDE 桌面的 ubuntu,而不是 Gnome 3 桌面。
Whenever I can choose between the Gnome 3 desktop and something else, you'll always see me go with something else. To me, Gnome 3 is like the Windows 8 of the Linux world, and you know how everyone liked to hate on Windows 8. However, if you like Gnome 3, more power to you, and I won't argue with you.
在我们继续讨论之前,让我们考虑一下 Firejail 的一些用例:
- 当您访问银行的门户网站时,您需要加倍确保您的网络浏览器不会泄露敏感信息。
- 您需要运行从互联网下载的不受信任的应用。
要在您的 Debian/Ubuntu/Raspbian 机器上安装 Firejail,请使用以下命令:
sudo apt update
sudo apt install firejail
这将安装 Firejail,以及一大堆用于不同应用的配置文件。当你用 Firejail 调用一个应用时,它会自动为该应用加载正确的配置文件(如果存在的话)。如果你调用一个没有配置文件的应用,Firejail 只会加载一个通用的。要查看配置文件,cd
进入/etc/firejail
并查看:
donnie@donnie-VirtualBox:/etc/firejail$ ls -l
total 1780
-rw-r--r-- 1 root root 894 Dec 21 2017 0ad.profile
-rw-r--r-- 1 root root 691 Dec 21 2017 2048-qt.profile
-rw-r--r-- 1 root root 399 Dec 21 2017 7z.profile
-rw-r--r-- 1 root root 1414 Dec 21 2017 abrowser.profile
-rw-r--r-- 1 root root 1079 Dec 21 2017 akregator.profile
-rw-r--r-- 1 root root 615 Dec 21 2017 amarok.profile
-rw-r--r-- 1 root root 722 Dec 21 2017 amule.profile
-rw-r--r-- 1 root root 837 Dec 21 2017 android-studio.profile
. . .
. . .
要轻松计算配置文件的数量,请使用以下命令:
donnie@donnie-VirtualBox:/etc/firejail$ ls -l | wc -l
439
donnie@donnie-VirtualBox:/etc/firejail$
从输出顶部减去total 1780
线,我们总共得到 438 个轮廓。
使用 Firejail 最简单的方法是在你想要运行的应用的名字前面加上firejail
。让我们从火狐开始:
firejail firefox
现在,Firejail 的主要问题是它不能始终如一地很好地工作。大约一年前,一个客户让我写了一篇关于 Firejail 的文章,我主要是在我的 Fedora 工作站和我的 Raspbian 树莓 Pi 上工作。但是即使有了它所使用的程序,我还是失去了一些重要的功能。例如,当在我的 Fedora 机器上运行带有 Firejail 的网络浏览器时,我无法在几个不同的网站上观看视频,包括 YouTube。Dropbox 和 Keepass 在 Firejail 下根本不起作用,尽管它们都有特定的配置文件。
而现在,在我的 Lubuntu 虚拟机上,无论我尝试在哪里冲浪,在 Firejail 下运行 Firefox 只会给我一个空白的浏览器页面。于是,我安装了chromium-browser
并尝试了一下。到目前为止,它的效果要好得多,我甚至可以用它看 YouTube 视频。然后,我安装了 LibreOffice,到目前为止,它似乎在 Firejail 上运行良好。
在 Firejail 提供的众多选项中,有一个选项可以确保程序运行时不启用任何内核功能,或者只启用您指定的功能。手册页建议删除任何不需要超级用户权限的程序的所有功能。因此,对于铬,我们会做以下工作:
firejail --caps.drop=all chromium-browser
那么,如果你只是想从“开始”菜单启动你的应用,就像你通常会做的那样,但仍然有 Firejail 保护呢?为此,您可以使用以下命令:
sudo firecfg
该命令在/usr/local/bin
目录中为每个有 Firejail 配置文件的程序创建符号链接。它们看起来像这样:
donnie@donnie-VirtualBox:/usr/local/bin$ ls -l
total 0
lrwxrwxrwx 1 root root 17 Nov 14 18:14 audacious -> /usr/bin/firejail
lrwxrwxrwx 1 root root 17 Nov 14 18:14 chromium-browser -> /usr/bin/firejail
lrwxrwxrwx 1 root root 17 Nov 14 18:14 evince -> /usr/bin/firejail
lrwxrwxrwx 1 root root 17 Nov 14 18:14 file-roller -> /usr/bin/firejail
lrwxrwxrwx 1 root root 17 Nov 14 18:14 firefox -> /usr/bin/firejail
lrwxrwxrwx 1 root root 17 Nov 14 18:14 galculator -> /usr/bin/firejail
. . .
. . .
如果你发现一个程序在 Firejail 下不工作,只需进入/usr/local/bin
并删除它的链接。
现在,你会想知道关于 Firejail 文档的一个非常奇怪的事情。在 fire Jill 手册页和 fire Jill 网站的主页上,都说可以使用 fire Jill 来沙箱化桌面应用、服务器应用和用户登录会话。然而,如果你点击 fire Jill 网站的文档选项卡,它会显示 fire Jill 只适用于单用户桌面系统。这是因为,为了完成任务,Firejail 可执行文件必须设置 SUID 权限位。Firejail 的开发人员认为,允许多个用户使用这个 SUID 程序访问一台机器是一种安全风险。
好了,说够了。让我们练习一下。
在本实验中,您将创建一个具有您最喜欢的桌面 Ubuntu 风格的虚拟机。让我们开始吧:
- 用你最喜欢的 Ubuntu 风格创建一个虚拟机。要像我一样使用 Lubuntu,只需使用以下下载链接:http://cdimage . Ubuntu . com/Lubuntu/releases/18.04/release/Lubuntu-18 . 04 . 3-desktop-amd64 . iso。
- 使用以下命令更新虚拟机:
sudo apt update
sudo dist-upgrade
然后,重新启动机器。
- 安装防火墙、LibreOffice 和 Chromium:
sudo apt install firejail libreoffice chromium-browser
- 在一个终端窗口中,启动没有任何内核功能的 Chromium:
firejail --caps.drop=all chromium-browser
- 浏览各种网站,看看是否一切正常。
- 在另一个终端窗口中,启动 LibreOffice,也没有任何功能:
firejail --caps.drop=all libreoffice
- 创建各种类型的图书馆办公室文档,并尝试各种图书馆办公室功能,看看有多少仍然正常工作。
- 关闭铬和 LibreOffice。
- 配置 Firejail,使其自动沙箱化您启动的每个应用,即使您是从正常的“开始”菜单执行此操作:
sudo firecfg
- 看看创建的符号链接:
ls -l /usr/local/bin
-
尝试从普通菜单打开 Firefox。除非在我写这篇文章之后事情已经解决了,否则你应该只会看到空白的浏览器页面。所以,关闭火狐。
-
好吧。所以你将无法用沙箱保护火狐。为了能够在没有 Firejail 的情况下运行 Firefox,只需从
/user/local/bin
目录中删除它的符号链接,如下所示:
sudo rm /usr/local/bin/firefox
- 尝试再次运行 Firefox。你应该看到它正常启动。
您已经完成了本实验–祝贺您!
消防监狱的选择比我在这里展示的要多得多。有关更多信息,请参见 fire Jill 手册页和 fire Jill 网站上的文档。
到目前为止,您已经看到了使用 Firejail 的好处和坏处。接下来,我们将看几个通用的 Linux 打包系统。
在 Windows 世界和 Mac 世界中,操作系统和它们可以运行的应用是相互独立销售的。所以,你买一台运行 Windows 或 macOS 的电脑,然后你单独购买应用。说到做更新,你必须更新操作系统,然后分别更新每个应用。
在 Linux 世界中,您所需要的大多数应用都在您的 Linux 发行版的存储库中。要安装一个应用,您只需使用您的发行版的包管理实用程序——apt、yum、dnf 或其他任何工具——来安装它。然而,事实证明,这既是一种祝福,也是一种诅咒。它确实可以更容易地跟踪您的应用,并保持最新的错误修复和安全更新的安装。但是除非你运行的是一个滚动发行版,比如 Arch,否则在你的 Linux 发行版生命周期结束之前,应用包将会过时。这是因为发行版维护者使用的应用版本在发行版发布时是最新的,他们直到发行版的下一个版本发布时才升级到新的应用版本。这也让应用开发人员感到困难,因为每个 Linux 发行版系列都使用自己的打包格式。所以,如果有一种通用的打包格式,可以在所有 Linux 发行版中工作,并且可以轻松地保持最新,那不是很好吗?
通用打包始于几年前的 AppImage 包。然而,他们从未真正了解这一点,并且他们不提供任何沙盒功能。所以,这就是我要说的关于他们的一切。
接下来是 Ubuntu 的 Snapter 系统,它允许开发人员创建快照包,这些包应该在任何可以安装 Snapter 系统的系统上运行。每个 snap 应用都在自己的独立沙箱中运行,这有助于保护系统免受恶意程序的攻击。由于快照应用可以在没有根权限的情况下安装,因此不需要担心恶意程序会使用根权限来做不该做的事情。每个快照包都是一个独立的单元,这意味着您不必担心安装依赖项。您甚至可以为包含多个服务的服务器创建快照包。快照守护程序不断在后台运行,自动更新自身和任何已安装的快照应用。
尽管这听起来很好,但有几件事让它有点争议。首先,Ubuntu 的人拒绝发布爽快应用服务器的源代码。因此,不可能查看源代码,也不可能设置自己的本地爽快服务器。如果您开发快照包并想要部署它们,即使这只是在您自己的本地网络上,您也别无选择,只能使用 Ubuntu 母公司 Canonical 运行的中央快照包门户。这确实违背了整个 GNU/Linux 生态系统应该代表的软件自由。然而,典型的人们这样做是为了验证被分发的快照包的安全性。
其次,即使快照包被沙箱化以保护系统,其他奇怪的事情也会发生。在“爽快”系统上线后不久,一名软件包开发人员被发现在他的一个软件包中偷偷放入了一些 Monero 采矿软件。虽然他只是想把他的努力货币化,并没有恶意,但在没有告诉你的潜在客户的情况下,把这种东西偷偷放进你的包里仍然是不好的。在那之后,Canonical 的人加紧努力扫描上传到门户网站的包,以防止这种事情再次发生。
然后,还有用户控制的问题。用户无法控制包何时更新。快照守护程序将更新您安装的软件包,无论您是否真的希望它这样做。
最后,将每个快照包作为一个独立的单元会增加磁盘空间的使用。每个包都包含其应用使用的所有链接库,这意味着您可能有多个包都使用相同的库。对于当今现代的大容量硬盘来说,这不一定是什么大问题,但如果磁盘空间不足,这可能是个问题。
如果你正在运行 Ubuntu,你可能已经运行了爽快服务。在某个时候(我忘了是什么时候),Ubuntu 的人开始在 Ubuntu 服务器的默认安装中加入了爽快。但是,它没有安装在我的 Lubuntu 18.04 虚拟机上。要安装它,我将使用以下命令:
sudo apt update
sudo apt install snapd
在许多非 Ubuntu 发行版的存储库中也可以使用 finder。它在 Fedora 的普通存储库中,在红帽和 CentOS 的 EPEL 存储库中。
那么,对于一个忙碌的管理员来说,如何让“爽快”变得有用呢?好吧,假设你头发尖尖的老板刚刚告诉你设置一个 Nextcloud 服务器,这样员工就可以有一个中心位置来存储他们的文档。然而,你正处于一个时间的紧要关头,你不想跳过设置一个 LAMP 系统的所有独立组件的步骤。没问题–只需安装一个快照。首先,让我们看看有什么可用的:
donnie@ubuntu1804-1:~$ snap search nextcloud
Name Version Publisher Notes Summary
nextcloud 16.0.5snap3 nextcloud√ - Nextcloud Server - A safe home for all your data
spreedme 0.29.5snap1 nextcloud√ - Spreed.ME audio/video calls and conferences feature for the Nextcloud Snap
onlyoffice-desktopeditors 5.4.1 onlyoffice√ - A comprehensive office suite for editing documents, spreadsheets and presentations
qownnotes 19.11.13 pbek - Plain-text file markdown note taking with Nextcloud / ownCloud integration
nextcloud-port8080 1.01 arcticslyfox - Nextcloud Server
. . .
. . .
有很多选择。我们可以使用info
选项将范围缩小一点:
donnie@ubuntu1804-1:~$ snap info nextcloud
name: nextcloud
summary: Nextcloud Server - A safe home for all your data
publisher: Nextcloud√
contact: https://github.com/nextcloud/nextcloud-snap
license: AGPL-3.0+
description: |
Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in
a data center or at a provider. And that is where your files will be. Nextcloud runs on that
server, protecting your data and giving you access from your desktop or mobile devices. Through
Nextcloud you also access, sync and share your existing data on that FTP drive at school, a
Dropbox or a NAS you have at home.
. . .
. . .
看起来这就是我需要的。那么,让我们安装它:
donnie@ubuntu1804-1:~$ snap install nextcloud
error: access denied (try with sudo)
donnie@ubuntu1804-1:~$
嘿,现在。我不是应该可以在没有 root 权限的情况下做到这一点吗?嗯,是的,但只有在我登录我的 Ubuntu One 帐户后。创建账户,只需进入https://login.ubuntu.com/的注册页面。
然后,返回命令行,使用您的新凭据登录快照存储:
donnie@ubuntu1804-1:~$ sudo snap login
[sudo] password for donnie:
Personal information is handled as per our privacy notice at
https://www.ubuntu.com/legal/dataprivacy/snap-store
Email address: [email protected]
Password of "[email protected]":
Login successful
donnie@ubuntu1804-1:~$
这是你最后一次需要在这台机器上使用sudo
和 snap 命令。现在,我可以安装 Nextcloud:
donnie@ubuntu1804-1:~$ snap install nextcloud
nextcloud 16.0.5snap3 from Nextcloud√ installed
donnie@ubuntu1804-1:~$
这一次,成功了。要启动它,只需使用以下命令:
donnie@ubuntu1804-1:~$ snap start nextcloud
Started.
donnie@ubuntu1804-1:~$
最后,从台式机上,导航到 Nextcloud 服务器的 IP 地址,单击创建管理帐户,填写完所有详细信息后,单击完成设置:
很简单,对吧?想象一下,用传统方式做这件事要花多长时间。唯一的小问题是它运行在一个未加密的 HTTP 连接上,所以你肯定不想把它暴露在互联网上。
Snapcraft 存储是 Canonical 的快照包官方存储库。任何想要的人都可以创建一个账户并上传自己的照片。桌面/工作站、服务器和物联网设备有很多应用。支持几种不同的机器架构,包括 x86_64、ARM 和 PowerPC。(所以是的,这甚至可以对你的树莓 Pi 设备有用。)这可以从下面的截图中看到:
差不多就这些了。尽管有争议,这仍然是一个相当酷的概念。
If you have to deploy IoT devices, you might want to look into Ubuntu Core. It's a stripped-down version of Ubuntu that consists wholly of snap packages. Space doesn't permit me to cover it in detail here, but you can read all about it at https://ubuntu.com/core.
现在,您已经看到了如何使用 Ubuntu 的爽快系统,我们将看看 Fedora 的 Flatpak 系统。
由 Fedora Linux 团队创建的 Flatpak 系统与 Ubuntu 的 nimpt 系统的工作目标相同,但在实现上有显著的差异。您可以让一个或两个系统在任何给定的 Linux 机器上运行。无论使用哪种系统,您都可以创建一个通用的软件包,该软件包可以在任何安装了 finder 或 Flatpak 的机器上运行。两个系统都在各自的安全沙箱中运行各自的应用。
然而,正如我之前提到的,有一些不同之处:
- Flatpak 安装应用可以访问的共享运行时库,而不是让每个应用包完全独立。这有助于减少磁盘空间的使用。
- Fedora 家族经营着一个他们称之为 Flathub 的中央仓库。然而,他们也让任何想要建立自己的 Flatpak 存储库的人都可以使用服务器代码。
- Flatpak 只需要稍微多花一点功夫来设置,因为在您安装它之后,您必须配置它来使用所需的存储库。
- Snapcraft 商店有供服务器、桌面和物联网使用的软件包。Flathub 主要有桌面应用。
根据您运行的发行版,您可能已经安装了 Flatpak 系统,也可能没有安装。在 Debian/Ubuntu 系统上,使用以下命令安装它:
sudo apt update
sudo apt install flatpak
在 RHEL、CentOS 和 Fedora 系统上,很有可能已经安装了。如果不是,用正常的yum
或dnf
命令安装即可。安装完 Flatpak 后,请转到 Flatpak 快速设置页面,了解如何进行配置。点击你正在运行的发行版的图标,并按照指示操作。
You'll find the Quick Setup page here: https://flatpak.org/setup/.
不过,奇怪的是,如果你点击 CentOS 或 Red Hat 的图标,你会看到安装 Flathub 存储库的指令,但它没有说明如何操作。不过,没关系。只需点击任何其他发行版的图标,您就会看到正确的命令,如下所示:
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
按说,这是唯一需要 sudo 权限的flatpak
命令。(我说,可能是因为实际上,某些运行时库包确实需要 sudo 权限才能安装。)
安装存储库后,重新启动计算机。机器重新启动后,您就可以安装一些应用了。选择一个,去 Flathub 网站浏览,直到你找到你想要的东西。
You'll find Flathub here: https://flathub.org/home.
假设您已经浏览了生产力应用,并找到了 Bookworm 电子书阅读器。点击链接进入 Bookworm 应用页面。您将在顶部看到一个安装按钮。如果你点击那个按钮,你将下载 Bookworm 的安装文件。要安装它,您仍然需要在命令行中键入一个命令。您最好向下滚动到页面底部,在那里您将看到同时下载和安装应用的命令:
还有运行应用的命令,但您可能不需要它。根据您运行的发行版,您可能会也可能不会在“开始”菜单中为您创建图标。(我唯一没见过的发行版是 Debian。)
As I mentioned previously, flatpak
commands sometimes require sudo privileges, and sometimes they don't. Try running your flatpak
command without sudo
first. If it doesn't work, just do it again with sudo
.
与爽快不同,Flatpak 不会自动更新其应用。您必须通过定期执行以下命令来自己完成:
flatpak update
在本节中,您将了解使用爽快包装系统和扁平包装系统的基本知识。对于每一个,开发人员可以只打包他们的应用一次,而不是用多种类型的包进行多次打包。最终用户可以使用它们,以便他们的应用总是最新的,而不必坚持使用他们发行版库中更过时的版本。此外,与本书的整体背景保持一致,理解通过在它们自己的独立沙箱中运行应用,这两个系统都提供了额外的应用安全措施。
所以,另一个大篇章已经过去了,我们已经看到了很多很酷的东西。我们从查看/proc
文件系统以及如何配置它的一些设置以获得最佳的安全性开始。之后,我们研究了如何使用 cgroups、名称空间、内核功能和 SECCOMP 将进程相互隔离。我们用一些使用这些酷技术的实用程序和包管理系统的例子来结束这一章。
在下一章中,我们将讨论扫描、审计和加固系统的不同方法。到时候见。
-
以下哪一项是正确的? A.
/proc
就像 Linux 文件系统中的任何其他目录一样。 B./proc
是 Linux 中唯一的伪文件系统。 C./proc
是 Linux 中几个伪文件系统之一。 D .您可以使用systemctl
命令设置/proc
参数的值。 -
您将使用以下哪个命令来设置
/proc
参数的值? a .sudo systemctl -w
T7】b .sudo sysctl -w
T8】c .sudo procctl -w
T9】d .sudo sysctl -o
T10】e .sudo systemctl -o
-
您需要一个可执行的程序以一个特定的根权限运行,而不需要向运行它的人授予任何根权限。你会怎么做? A .添加一个命名空间。 B .创建 SECCOMP 配置文件。 诸侯王加 SUID 诛杀。 D .增加一个内核能力。
-
在哪里可以找到关于用户进程的信息? 答:在
/proc
文件系统的编号子目录中。 B .在/proc
文件系统的按字母顺序命名的子目录中。/dev
目录中的 C。 D .在每个用户的主目录中。 -
什么是系统调用? A .它告诉 Linux 内核代表用户执行一个特权动作。 B .它将新的系统信息调入内核。 它跟踪系统内核正在做的所有事情。 D .它将对系统资源的调用相互隔离。
-
让用户只看到自己流程的信息,最好的方法是什么? A .将
hidepid=2
选项添加到 GRUB 配置中的内核启动参数中。 B .在 GRUB 配置中将nopid=1
选项添加到内核启动参数中。将nopid=1
选项添加到/etc/fstab
文件中。将hidepid=1
选项添加到/etc/fstab
文件中。 -
为了获得最佳安全性,您会使用以下哪个命令来查看哪些内核参数需要更改? a .
sudo audit system
T5】b .sudo lynis audit system
T6】c .sudo system audit
T7】d .sudo lynis system audit
-
以下哪个命令允许非特权用户在不使用根特权的情况下在端口 80 上启动 Python web 服务器? a .
sudo setcap 'CAP_NET_SERVICE+ep' /usr/bin/python2.7
T5】b .sudo setcap 'CAP_NET_BIND_SERVICE+ep' /usr/bin/python2.7
T6】c .sudo getcap 'CAP_NET_BIND_SERVICE+ep' /usr/bin/python2.7
T7】d .sudo setcap 'CAP_NET_SERVICE+ep' /usr/bin/python2.7
-
爽快系统和 Flatpak 系统的主要区别是什么? A .没有。 B. Flatpak 包是完全独立的,但是爽快包让你安装独立的运行时包。 C .爽快包是完全独立的,但是 Flatpak 包让你安装独立的运行时包。 D. Flatpak 包在自己的沙箱中运行,而 nimpt 包则没有。 e . nimpt 包在自己的沙箱中运行,但是 Flatpak 包不运行。
-
您需要限制 Docker 容器可以进行的系统调用的数量。你会怎么做? A .在自己的组中创建容器,并为该组配置系统调用限制。 B .在自己的命名空间中创建容器,并为该命名空间配置 syscall 限制。 C .在火牢下运行容器。 D .用 SECCOMP 配置文件创建容器。
- C.
- B.
- D.
- A.
- A.
- D.
- B.
- B.
- C.
- D.
-
探索
/proc
文件系统:https://www . tec mint . com/exploring-proc-file-system-in-Linux/ -
Linux 内核安全子系统 wiki:https://kernsec.org/wiki/index.php/Main_Page
-
Linux 魔法系统请求密钥黑客:https://www . kernel . org/doc/html/latest/admin-guide/sysrq . html
-
Linux 获取内核“锁定”功能:https://www . zdnet . com/article/Linux 获取内核-锁定-功能/
-
保护 RHEL 的硬链接和符号链接
-
记录可疑的火星数据包:https://www . cyber iti . biz/FAQ/Linux-log-可疑-火星-数据包-不可路由-来源-地址/
-
防止使用 ptract:https://Linux-audit . com/protect-ptrace-processes-kernel-yama-ptrace _ scope/
-
Linux 控制组介绍(cggroups):https://access . RedHat . com/documentation/en-us/red _ hat _ enterprise _ Linux/7/html/resource _ management _ guide/chap-introduction _ to _ Control _ Groups
-
RHEL 7:如何开始使用 cggroups:https://www.certdepot.net/rhel7-get-started-cgroups/
-
限制带系统组的 Ubuntu 19.10 的中央处理器使用:https://youtu.be/_AODvcO5Q_8
-
控制组对命名空间:https://youtu.be/dTOT9QKZ2Lw
-
如何管理 Linux 文件功能:https://www . how toforge . com/如何管理-Linux-文件-功能/
-
getcap、setcap 和文件功能:https://www.insecure.ws/linux/getcap_setcap.html
-
Docker 安全功能–SECCOMP 配置文件:https://blog . aquasec . com/new-docker-security-features-及其含义-seccomp-profiles
-
码头工人文件–码头工人安全:https://docs.docker.com/engine/security/security/
-
Linux 上的 App Packages 简介:https://FOSS post . org/education/App-Packages-Linux-snap-flat pak-App image
-
Ubuntu 快照使用教程:https://tutorials.ubuntu.com/tutorial/basic-snap-usage#0
-
官方标准 Snapcraft 商店:https://snapcraft.io/
-
Linux 桌面应用交付的未来是 Flatpak 和 Snap:https://www . zdnet . com/article/the-未来的 Linux-桌面-应用-交付-是 flatpak 和 snap/
-
平面集线器:https://flat hub . org/home
-
Flatpak 应用机密管理的三种方法:https://open source . com/article/19/11/机密-管理-Flatpak-应用