关于安全性

考虑以下方面以确保您的 Incus 安装安全

  • 保持您的操作系统更新并安装所有可用的安全补丁。

  • 仅使用受支持的 Incus 版本。

  • 限制对 Incus 守护进程和远程 API 的访问。

  • 除非必要,否则不要使用特权容器。如果您使用特权容器,请实施适当的安全措施。有关更多信息,请参阅LXC 安全页面

  • 配置您的网络接口以确保安全。

请参阅以下部分以获取详细信息。

如果您发现安全问题,请参阅Incus 安全策略,了解如何报告该问题。

受支持的版本

切勿在生产环境中使用不受支持的 Incus 版本。

Incus 有两种类型的版本

  • 功能版本

  • 长期支持版本

对于功能版本,仅支持最新的版本,并且我们通常不进行点版本发布。相反,用户应等到下一个版本发布。

对于长期支持版本,我们会定期发布错误修复版本,其中包含从功能版本积累的错误修复。此类错误修复版本不包含新功能。

访问 Incus 守护进程

Incus 是一种守护进程,可以通过 Unix 套接字在本地访问,或者如果配置了,则可以通过 TLS 套接字在远程访问。任何能够访问套接字的人都可以完全控制 Incus,包括附加主机设备和文件系统或调整所有实例的安全功能的能力。

因此,请确保将对守护进程的访问权限限制为受信任的用户。

本地访问 Incus 守护进程

Incus 守护进程以 root 身份运行,并提供 Unix 套接字用于本地通信。Incus 的访问控制基于组成员身份。root 用户和 incus-admin 组的所有成员都可以与本地守护进程交互。

重要

通过 Unix 套接字本地访问 Incus 始终授予对 Incus 的完全访问权限。这包括能够将文件系统路径或设备附加到任何实例以及调整任何实例上的安全功能。

因此,您应该只向您信任其具有系统 root 访问权限的用户授予此类访问权限。

访问远程 API

默认情况下,仅可以在本地访问守护进程。通过设置 core.https_address 配置选项,您可以通过网络上的 TLS 套接字公开相同的 API。有关说明,请参阅如何将 Incus 公开到网络。然后,远程客户端可以连接到 Incus 并访问标记为公开使用的任何镜像。

有几种方法可以将远程客户端认证为受信任的客户端,以允许它们访问 API。有关详细信息,请参阅远程 API 身份验证

在生产环境中,您应该将 core.https_address 设置为服务器应该可用的单个地址(而不是主机上的任何地址)。此外,您应该设置防火墙规则,以仅允许来自授权主机/子网的访问 Incus 端口。

容器安全性

Incus 容器可以使用各种安全功能。

默认情况下,容器是非特权的,这意味着它们在用户命名空间内运行,将容器中用户的权限限制为主机上普通用户的权限,并且对容器拥有的设备具有有限的权限。

如果不需要容器之间的数据共享,您可以启用security.idmap.isolated,这将为每个容器使用不重叠的 UID/GID 映射,从而防止对其他容器的潜在 DoS 攻击。

Incus 还可以运行特权容器。但是,请注意,这些容器不是 root 安全的,并且此类容器中具有 root 访问权限的用户将能够对主机执行 DoS 攻击,并找到逃避限制的方法。

有关容器安全性以及我们使用的内核功能的更多详细信息,请参阅LXC 安全页面

容器名称泄漏

默认的服务器配置使列出系统上的所有 cgroup 变得容易,并且可以扩展到所有正在运行的容器。

您可以通过在启动任何容器之前阻止对 /sys/kernel/slab/proc/sched_debug 的访问来防止此名称泄漏。为此,请运行以下命令

chmod 400 /proc/sched_debug
chmod 700 /sys/kernel/slab/

网络安全性

确保将您的网络接口配置为安全。您应该考虑哪些方面取决于您决定使用的网络模式。

桥接 NIC 安全性

Incus 中的默认网络模式是提供每个实例连接到的“托管”专用网络桥。在此模式下,主机上有一个名为 incusbr0 的接口充当实例的桥接。

主机为每个受管桥运行一个 dnsmasq 实例,负责分配 IP 地址并提供权威和递归 DNS 服务。

使用 DHCPv4 的实例将被分配一个 IPv4 地址,并且将为其实例名称创建一个 DNS 记录。这可以防止实例通过在 DHCP 请求中提供错误的主机名信息来伪造 DNS 记录。

dnsmasq 服务还提供 IPv6 路由器通告功能。这意味着实例将使用 SLAAC 自动配置自己的 IPv6 地址,因此 dnsmasq 不会进行任何分配。但是,也使用 DHCPv4 的实例也将获得一个 AAAA DNS 记录,该记录用于等效的 SLAAC IPv6 地址。这假设实例在生成 IPv6 地址时未使用任何 IPv6 隐私扩展。

在此默认配置中,虽然无法伪造 DNS 名称,但实例连接到以太网桥并且可以传输它希望的任何第 2 层流量,这意味着不受信任的实例可以有效地在桥上执行 MAC 或 IP 欺骗。

在默认配置中,连接到桥的实例也可以通过向桥发送(可能存在恶意行为的)IPv6 路由器通告来修改 Incus 主机的 IPv6 路由表。这是因为 incusbr0 接口是在 /proc/sys/net/ipv6/conf/incusbr0/accept_ra 设置为 2 的情况下创建的,这意味着即使启用了 forwarding,Incus 主机也将接受路由器通告(有关更多信息,请参见 /proc/sys/net/ipv4/* 变量)。

但是,Incus 提供了一些桥接的 NIC 安全功能,可用于控制允许实例发送到网络的流量类型。这些 NIC 设置应添加到实例正在使用的配置文件中,或者可以添加到单个实例中,如下所示。

桥接 NIC 提供以下安全功能:

类型

默认值

是否必需

描述

security.mac_filtering

布尔值

false

防止实例伪造其他实例的 MAC 地址

security.ipv4_filtering

布尔值

false

防止实例伪造其他实例的 IPv4 地址(启用 mac_filtering

security.ipv6_filtering

布尔值

false

防止实例伪造其他实例的 IPv6 地址(启用 mac_filtering

可以使用以下方法覆盖配置文件中默认的桥接 NIC 设置:

incus config device override <instance> <NIC> security.mac_filtering=true

这些功能一起使用可以防止连接到桥的实例伪造 MAC 和 IP 地址。这些选项使用 xtablesiptablesip6tablesebtables)或 nftables 实现,具体取决于主机上可用的内容。

值得注意的是,这些选项有效地阻止了嵌套容器使用具有不同 MAC 地址的父网络(即使用桥接或 macvlan NIC)。

IP 过滤功能阻止包含伪造 IP 的 ARP 和 NDP 通告,以及阻止包含伪造源地址的任何数据包。

如果启用了 security.ipv4_filteringsecurity.ipv6_filtering 且无法为实例分配 IP 地址(因为 ipvX.address=none 或桥上未启用 DHCP 服务),则将阻止该实例的所有该协议的 IP 流量。

启用 security.ipv6_filtering 时,将阻止实例的 IPv6 路由器通告。

启用 security.ipv4_filteringsecurity.ipv6_filtering 时,将丢弃任何不是 ARP、IPv4 或 IPv6 的以太网帧。这可以防止堆叠的 VLAN Q-in-Q (802.1ad) 帧绕过 IP 过滤。

路由 NIC 安全

另一种可用的网络模式称为“路由”。它在容器和主机之间提供一对虚拟以太网设备。在此网络模式下,Incus 主机充当路由器,并且会将静态路由添加到主机中,以将容器 IP 的流量引导到容器的 veth 接口。

默认情况下,主机上创建的 veth 接口已禁用其 accept_ra 设置,以防止来自容器的路由器通告修改 Incus 主机上的 IPv6 路由表。此外,主机上的 rp_filter 设置为 1,以防止针对主机不知道容器拥有的 IP 的源地址欺骗。