NAS中数据安全性与可靠性的最佳实践

发布于 2020-05-02  8.04k 次阅读


前些日子某知名B站UP主自建NAS被黑的新闻引起了轩然大波。我也有一个自建的NAS,同样暴露了服务到公网,我是如何确保其安全与可靠的?

这里先说结论,个人认为,安全措施的核心在于:精简、隔离、加密

提到的具体措施仅为抛砖引玉,实际上要根据应用程序、部署方式、规模、用户群等灵活的制定安全策略。例如对于企业应用的安全性,推荐采用微软Azure安全部门提出的“0信任,始终验证”策略。

一、选择可靠的操作系统并加固

1. 及时更新固件与操作系统

有巨大影响力的漏洞,各大公司与Linux社区都会第一时间修复,对于个人服务器来说,及时安装BIOS更新、操作系统更新便可以有效的防御它们。

2. 选择Linux系统

这不是广告,相比于闭源的Windows与macOS系统,一方面,Linux与BSD本身的BUG数量与发现难度要高得多。另一方面,由于Windows用户更多,针对其的病毒也更多。

建议选择LTS(Long Term Support, 长期支持)的精简版(minimal)不要追新

对Linux系统的操作不熟悉的童鞋,可以选择NAS专用系统,如FreeNAS

3. 仅安装必要的软件

对于专门做存储的服务器,除了操作系统本身以外,与存储和网络无关的组件都可以禁用或卸载。一个系统安装的软件越多,攻击面越大,其存在风险的可能性越高。

如果选择了专用的NAS系统,那么基本上只需要考虑禁用不需要的组件,遵循其官方文档进行设置即可。

4. 不要使用Root用户

Linux里面ROOT是一个无法被限制的超级用户,所以除了修改操作系统的行为外,不要用ROOT账户。应用软件应创建独立用户,禁止登录,并给予其需要的最小权限

5. 其他加固措施

在常年累月的操作系统维护过程中,系统管理员们总结出了容易出现问题与疏忽的地方,有现成的巨人的肩膀可以用。例如:FreeNAS的最佳实践

其中提到包括:

  • 使用强密码与密钥来认证
  • 使用有安全措施的协议访问,例如SSH与HTTPS
  • 妥善保管密钥与证书

二、用好防火墙、容器技术与VPN

家庭与企业接入互联网时,都需要使用路由器进行网络地址转换(NAT),中国大陆的运营商普遍封禁了80、443、8080、21等常见协议的端口,而路由器往往只有面向内网的DHCP等服务,所以路由器本身攻击面较小,主要还是针对服务器与其中应用的设置。

1. 只转发必要端口

不应该直接把内网中的机器完全暴露在公网上,而应该使用端口转发的方式,只将必要的端口映射到路由器上。

这样即使其他软件,如FTP有漏洞,黑客也无法访问到它们,能大幅减小风险。

2. 开启防火墙白名单

对于职责较为单一的服务器,可以只允许特定端口接受连接,这样即使内网中的其他机器“中招”,也难以借此攻击本机。对于Linux系统,可以开启iptables,并且将INPUT默认规则设置为DROP,并添加特定允许的ACCEPT规则即可。

3. 公网应用强制开启HTTPS,使用2FA(Two Factor Authentication,双因素验证)

对于暴露到公网的系统来说,防止中间人攻击是第一步,所以要使用HTTPS开启HSTS,禁用不安全的协商方式。

防止暴力破解与撞库也是必须做的。一方面应该设置复杂密码验证码、IP封禁来防止暴力破解,另一方面就是使用双因素验证,如短信验证码,或者基于时间戳的一次性密码(TOTP, Time-based One Time Password)。

TOTP最广泛使用的应用是谷歌的Authenticator应用:安卓版本iOS版本

例如,NextCloud、Gogs都支持设置TOTP。

4. 使用容器技术,做好应用隔离

推荐使用Docker或Jail等容器技术部署应用,因为:

  • 容器与宿主机的文件系统隔离,攻击面基本限定在容器内。
  • 方便升级与维护,不担心影响其他应用。
  • 容器间隔离:只映射必要的端口与目录,不与其他容器共享非必要数据。

例如,NextCloud与Gogs两个容器就可以分别映射不同的目录,使用不同的用户运行,并且映射到不同的端口上。这样即使黑客拿到了Gogs的漏洞,其权限也被限制在其映射的目录内,无法影响到NextCloud,反之亦然。

5. 使用VPN访问Samba、NFS、AFP与SSH

这里VPN说的是广义的隧道技术,而非特定的协议,使用它们可以安全的远程接入局域网。开源的文件共享协议有Samba、NFS、AFP等,这些协议本身是为内网共享文件而生,未做防暴力破解等措施,不应该暴露到公网,他们一旦沦陷,数据就危险了。SSH虽然可以使用密钥认证,但本身没做防暴力破解,而且没必要暴露公网,徒增风险。

三、可靠性的保障

可靠性的保障,核心在于:冗余、备份、延迟删除。其中,实时冗余技术能防止硬盘坏掉,冷备份能防止自然灾害黑客入侵,回收站能防止手残误删。

1. RAID类实时冗余技术

这类技术可以让文件系统在执行“写入”操作时,同时将文件写入多块硬盘,这样能避免单盘故障导致的数据损坏与丢失。

常用技术:

  • 硬件RAID卡
  • BIOS中的软RAID
  • ZFS
  • unRAID
  • 不推荐:Windows的“镜像卷”、“存储池”

请注意,使用前要确保丢失一块硬盘以后,可以用新硬盘重建。Windows的“镜像卷”功能我测试时,虽然丢失一块硬盘后数据仍在,但无法使用新硬盘重建镜像卷,只能使用新硬盘创建新镜像卷,然后将数据复制回来,Excuse me? 所以,除非是你找到了重建的途径,否则不推荐使用。其他技术使用前也请先进行类似的测试。

2. 冷备份

关键数据冷备份始终是最好的保险。定期将数据备份到一个离线的介质中,如一堆硬盘,或者一堆磁带(性价比较高),网线都不连,自然无法攻击。备份后的介质可以放到哥哥姐姐家里、大洋彼岸的朋友处、或者银行的保险柜里。即便是亚欧大陆沉到海底,大洋彼岸还有一份数据 😉

3. 快照机制

ZFS有快照机制,可以设定每天凌晨自动快照,由于它只存储修改了的部分,所以快照本身几乎不占空间,是个做备份的好方法。

4. 回收站机制

Linux系统中,可以安装Trash CLI,然后使用trash命令代替rm执行删除。

NextCloud中,可以直接打开"回收站"功能。

Samba中,需要先安装Samba-vfs,然后修改共享文件夹的配置,打开“回收站”功能:

[Media]
	guest account = smbaccount
	force user = smbaccount
	writeable = yes
	delete readonly = yes
	public = yes
	path = /mystorage/media
	# Enable the recycle bin
	vfs object = recycle
	recycle:repository = /mystorage/recycle/%U
	recycle:touch = Yes
	recycle:keeptree = Yes
	recycle:versions = Yes
	recycle:noversions = *.tmp,*.temp,*.o,*.obj,*.TMP,*.TEMP
	recycle:exclude = *.tmp,*.temp,*.o,*.obj,*.TMP,*.TEMP
	recycle:excludedir = /recycle,/tmp,/temp,/TMP,/TEMP

上面的代码中,# Enable the recycle bin开始即为开启回收站。参数的详细说明见这里

四、总结

没有万能的防弹衣,不同等级的机密信息需要的安全措施不尽相同,但是核心思想是相通的。所以不要死搬硬套,而是把握其灵魂,这里再重复一遍:

如何保证安全性:精简、隔离、加密

如何保证可靠性:冗余、备份、延迟删除