前些日子某知名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
开始即为开启回收站。参数的详细说明见这里。
四、总结
没有万能的防弹衣,不同等级的机密信息需要的安全措施不尽相同,但是核心思想是相通的。所以不要死搬硬套,而是把握其灵魂,这里再重复一遍:
如何保证安全性:精简、隔离、加密。
如何保证可靠性:冗余、备份、延迟删除。
Comments | NOTHING