在 Linux 客户端上禁用 SMB 1

许多组织和 Internet 服务提供商 (ISP) 会阻止 SMB 用来通信的端口 445。 这种做法源自于有关传统版和已弃用版 SMB 协议的安全指导原则。 SMB 3.x 是 Internet 安全的协议,但早期版本的 SMB,尤其是 SMB 1,却并非如此。 SMB 1 也称“CIFS”(通用 Internet 文件系统),包含在许多 Linux 发行版中。

SMB 1 是一个已过时的低效且不安全的协议。 好消息是,Azure 文件存储不支持 SMB 1。 此外,从 Linux 内核版本 4.18 开始,Linux 可以禁用 SMB 1。 我们强烈建议在生产环境中使用 SMB 文件共享之前,禁用 Linux 客户端上的 SMB 1。

注意

本文引用 CentOS,这是 2024 年 6 月之后将不再支持的 Linux 分发版。 请相应地考虑你的使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指南

Linux 分发状态

从 Linux 内核 4.18 开始,SMB 内核模块(由于历史遗留原因,称作 cifs)会公开一个名为 disable_legacy_dialects 的新模块参数(在各种外部文档中通常名为 parm)。 尽管 Linux 内核 4.18 中已引入此项更改,但某些供应商会将此项更改向后移植到他们支持的旧内核。 下表详细描述了此模块参数在常用 Linux 分发版上的可用性。

分发 可以禁用 SMB 1
Ubuntu 14.04-16.04
Ubuntu 18.04
Ubuntu 19.04+
Debian 8-9
Debian 10+
Fedora 29+
CentOS 7
CentOS 8+
Red Hat Enterprise Linux 6.x-7.x
Red Hat Enterprise Linux 8+
openSUSE Leap 15.0
openSUSE Leap 15.1+
openSUSE Tumbleweed
SUSE Linux Enterprise 11.x-12.x
SUSE Linux Enterprise 15
SUSE Linux Enterprise 15.1

可通过以下命令检查 Linux 发行版是否支持 disable_legacy_dialects 模块参数:

sudo modinfo -p cifs | grep disable_legacy_dialects

此命令应输出以下消息:

disable_legacy_dialects: To improve security it may be helpful to restrict the ability to override the default dialects (SMB2.1, SMB3 and SMB3.02) on mount with old dialects (CIFS/SMB1 and SMB2) since vers=1.0 (CIFS/SMB1) and vers=2.0 are weaker and less secure. Default: n/N/0 (bool)

删除 SMB 1

在禁用 SMB 1 之前,请确认 SMB 模块当前未加载到系统中(如果已装载 SMB 共享,则会自动发生这种情况)。 运行以下命令。如果未加载 SMB,则此命令不会输出任何信息:

lsmod | grep cifs

若要卸载该模块,请先使用 umount 命令卸载所有 SMB 共享。 可使用以下命令识别系统上所有已装载的 SMB 共享:

mount | grep cifs

卸载所有 SMB 文件共享后,可以安全地卸载该模块。 运行 modprobe 命令:

sudo modprobe -r cifs

可以使用 modprobe 命令手动加载已卸载 SMB 1 的模块:

sudo modprobe cifs disable_legacy_dialects=Y

最后,可以通过查看 /sys/module/cifs/parameters 中加载的参数,来检查是否已使用相应参数加载了 SMB 模块:

cat /sys/module/cifs/parameters/disable_legacy_dialects

若要在 Ubuntu 和基于 Debian 的分发版上永久禁用 SMB 1,必须创建一个名为 /etc/modprobe.d/local.conf 且包含相应设置的新文件(如果尚未对其他模块使用自定义选项)。 运行以下命令:

echo "options cifs disable_legacy_dialects=Y" | sudo tee -a /etc/modprobe.d/local.conf > /dev/null

可以通过加载 SMB 模块来验证上述操作是否成功:

sudo modprobe cifs
cat /sys/module/cifs/parameters/disable_legacy_dialects

后续步骤

请参阅以下链接,获取有关 Azure 文件的更多信息: