在 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 文件的更多信息: