在实际的生产环境中,开发和测试人员都尽可能的保证安全,以避免一些重要资讯泄露甚至被窃取。许多企业或组织还拥有较为完善的威胁建模,但即便如此安全问题仍层出不穷。有的企业则期望通过互联网上的白帽或黑帽们,来帮助他们共同完成企业的安全建设。但是作为企业需要明白一点,并不是所有的白帽或黑帽,都愿意将自己的安全建议分享给他们。对于安全防护也不仅仅是使用 2FA 和密码管理器,安装更新和不点选可疑连结这一口号那么简单。
这篇文章的内容其实我在一些安全会议上已经演讲过两回了,在这里我对部分内容做了一些修改并希望再次分享给大家,主要面向那些刚刚学习或了解 Linux 安全的人。在本文我并不会实际讨论 Web 应用的安全,想要了解和学习这方面的内容,大可以参考 OWASP Top 10 它可以教会开发和测试人员有关 SQL 隐码攻击,CSRF,XSS,会话管理等知识。如果你担心的是更加高阶的攻击者,并且需要防范可能的恶意程式码或提权指令码被执行,那么在本文中你将学习到你想了解的知识。远端的入侵者甚至是一个不起眼的内部威胁者,此时可能早已潜伏在你的系统中伺机而动。
以下我会提到一些基本概念,幷包含相关的工具。同时,在这里你需要问你自己:
ACL(访问控制列表)
你的基础设施是否分为不同的系统,具有不同的基于角色的访问级别,或者使用者拥有完全相同的特权?
acl: getfacl+setfacl
系统审计
你是否已对登入到某台机器的使用者执行考虑周全?
检视:auditd, go-audit
静态分析和 fuzzing
你可能正在执行 C/C++。内存安全问题,占据了大多数出现的漏洞。你是否对这些程式码做过审计,静态分析或 fuzzing 测试以确保它们的安全性?你是否考虑过在 Rust 中开发?
检视:afl, Radamsa, Sulley, boofuzz, Coverity Scan, Valgrind, sanitizers
互联网分段
你是否已将你的后端与你的前端及负载均衡器正确分离?你是否花时间设定了公司 VPN,并授予你的机器私有的内部地址?
检视: iptables, ufw
隔离
你的员工是否将他们的工作电脑用于个人活动,例如游戏或与其工作无关的应用程式?或者他们是否有使用像虚拟机器或容器一类的东西来进行讯息传递,浏览,开发……?
检视: Qubes, VirtualBox
档案许可权和 umask
任何对 Unix 有基础了解的人,都不会对档案许可权感到陌生。如果你没有严格控制某些档案的读写执行许可权,那么我强烈建议你按照最严格的规范实施许可权控制。
更多内容
容器
集装箱化在理论上对安全有很大的帮助。但我想知道谁被允许建立并将镜像站群投入生产环境,他们是否也进行了签名和验证,并对安全更新和 CVE 进行监控?
检视:Docker, LXC
利用威胁情报
从 IPv4 地址空间发起恶意 IP 流,准备进行 DDoS 攻击的僵尸互联网以及自动化的利用扫描正在进行。你可以自己收集有关此类活动的情报,也可以订阅相关产品的 feed 或黑名单列表。但你的端点/防火墙,是否有对此作出反应并合并这些资讯?
检视:威胁情报资源列表
防火墙和包过滤
你多久审查一次你的 iptables 规则或你是否了解你的路由器/防火墙执行的内容,有没有对它们进行执行验证测试?你是否正确配置了包过滤规则,以确保机器只能与那些需要的资料通讯?
检视:pfSense, OPNsense
DNS 和域名注册商
你为此锁定了多少努力?你已经付出了多少努力来锁定它?当你的域名站群服务器或 DNS 区域档案被未经授权更改时,你是否会收到相应警报?此外,你是否启用了 DNSSEC?
就我个人而言,我建议将 Namecheap 作为注册服务商,并将 Cloudflare 用于高效能 DNS 。
物理访问
如果我是法院的执法人员,资料中心工作人员或你的 WordPress 托管服务提供商,我是否可以自由的的读取你站群服务器的内容(全盘加密除外)?当你的磁碟退役或更换时,其中的内容是否会被擦除?如果有人将 USB 插入 1U 机架站群服务器,你是否会收到警报提醒?
检视:LUKS/cryptsetup
你有确定性的构建吗?
当开发人员将构建程式码推送到生产环境中时,你是否可以验证这些程式码的真实意图,并且保证原始码或静态连结的依赖关系未被恶意修改?
检视:Gitian
验证数字签名
毫无疑问,你可能会从一些非官方站点获取或下载一些程式码和站群软件。那么在团队成员继续构建或安装之前,你是否比较过校验和/杂凑或验证了该下载的签名?
检视:使用 GnuPG 制作和验证签名
沙盒环境
它是否具有 AppArmor 配置档案,seccomp 过滤器或 RBAC 策略,指定它在系统呼叫和访问许可权方面的功能?
检视:seccomp, AppArmor
TLS 和加密配置
你是否已经完全弃用那些不安全的加密套件和演算法(例如 MD5,SHA1,RC4)?并在相容性和使用者期望上选择最佳的加密方式,HMAC 和金钥交换演算法。如果可用,优先考虑使用 RSA 加密演算法。这适用于 OpenSSH,GnuPG,OpenVPN 等。使用 Let’s Encrypt.t 即可轻松获得 ssl 的免费证书。
检视:应用密码加固,SSL 和 TLS,站群服务器端 TLS
公金钥管理
如果你的每个员工都拥有自己的金钥,请考虑在整个域中对其进行同步,并将金钥移出版本控制。
检视:GPGSync, sops, Vault
HTTP 头安全
关于 HTTP 头安全,这里有一个列表可供大家参考:X-Frame-Options, X-XSS-Protection, X-Content-Type-Options, X-Download-Options, X-Permitted-Cross-Domain-Policies, Content-Security-Policy, Referrer-Policy, Strict-Transport-Security, Public-Key-Pins 。这些响应头的正确配置,对安全也至关重要。
检视: securityheaders.io, Mozilla web 安全指南
档案完整性监控
你是否对重要档案做定期检查,已确保档案未被修改并生成被更改的警报?
检视: Tripwire, OSSEC
入侵检测
或许你已经部署了多种型别的入侵检测工具,但你是否仅仅只是按照预设的规则配置来执行它,并没有花费时间来学习相关的技术知识,以及根据自身应用情况来配置合适的规则集?
检视:比较基于 WordPress 主机的入侵检测系统,Snort
漏洞管理
通过订阅邮件,我们可以获取新的漏洞报告并修复漏洞。那么,你还记得你最后一次检查 CVE 活动是什么时候吗?
检视:Nessus, CoreOS clair
基础系统的安全
你是否真的完全信任 Debian/Ubuntu,RHEL 或任何公司的第三方站群软件储存库,可以始终为你提供非恶意的站群软件包?这里有一个想法:你可以 WordPress 托管自己的储存库,固定到特定的版本,并且仅在测试后才升级。
或者,你也可以执行基于 Alpine 或 LinuxKit 的极小操作系统,这样可以最大程度上的减少你的攻击面。
LSM(Linux 安全模组)
即 AppArmor 或 SELINUX,他们最近是否为你做过任何事情?
Linux 核心加固
这里我建议大家直接去检视 PaX 和 grsecurity 补丁。前不久被曝出的 Spectre 和 Meltdown 漏洞,也为我们的核心安全问题敲响了警钟。
检视:grsecurity.net,Linux 核心安全卫士,核心自我保护专案
移除不必要的装置
如果你没有使用 Thunderbolt,Firewire,无线网络卡或任何具有 DMA(直接内存访问)模式的模组,那么你就没有理由载入这些核心模组。
检视:核心模组黑名单列表
日志过滤
也许你还在通过手动的方式检查日志档案,那么你应该学会编写 Logstash 过滤和 grok pattern 。 Grok 是 Logstash 最重要的插件外挂。你可以在 grok 里预定义好命名正规表示式,在稍后 (grok 引数或者其他正规表示式里) 引用它。它非常适用于 syslog logs,apache 和一些其他的 webserver logs,以及 mysql logs 。 grok 有很多定义好 pattern,当然也可以自己定义。
检视:Filebeat, rsyslog, Logstash
你如何监控资源的使用情况?
RAM,CPU 负载,可用磁碟空间。这些虽然看上去无关紧要,但这些地方都是发生异常活动的关键位置,因此值得一提。
检视:Metricbeat, Prometheus node_exporter, Nagios, Osquery
基础设施测试
人们对站群软件测试的各个方面都很熟悉,但对于基础设施的测试却并不熟悉。你如何确保你的系统状态始终符合你的预期?
检视:Serverspec, Testinfra
平台和韧体安全
你的 BIOS 和其他低阶介面受到错误影响。英特尔®AMT 和管理引擎,以及 Computrace 应被禁用。下面连结提供了一个非常有用的用于分析系统韧体和硬体元件安全性的框架。
检视:CHIPSEC
保护远端 shell
sshd 通用准则:禁用 root 登入,使用金钥代替密码,并设定暴破防护。而更好的站群解决方案是将其放置在 VPN 后面,通过验证的 Tor 隐藏服务,或者需要埠试探来动态开启一些特定埠连线 WordPress 主机。
检视:fail2ban, denyhosts, sshguard, Secure Secure Shell
Webserver 最佳实践
如果你不想泄露你当前正在执行站群服务器的版本资讯,对于 nginx 你可以通过将引数 server_tokens 设为 off 来实现,如果是 Apache 则将 ServerSignature 设为 off 即可。
在执行依赖于动态指令码语言的复杂应用程式时,请考虑执行类似 ModSecurity 的 WAF(Web 应用程式防火墙)。 Cloudflare 正大规模的向其客户提供此项服务。
次要因素
我强烈推荐使用 YubiKey,它有很多有用的功能。它可以配置为输出静态密码(非常适合 PAM 使用者登入或挂载卷加密),HOTP 或通用双因素(U2F)认证,或者可以使用 OpenPGP 智慧卡。这些装置对于任何系统管理员来说都是不可或缺的。为此,我已经发布了详细的 YubiKey GPG+SSH 的安装指南。
DNS 解析
你的/etc/resolv.conf 档案是否正确配置? Quad9 是谷歌公共 DNS 或 OpenDNS 的替代产品,可阻止客户端访问恶意域名,这与 Chrome 浏览器通过安全浏览功能来保护使用者的功能类似。所以将你的域名站群服务器设定为 9.9.9.9 将能更好的保障你的安全。
审计信任方
除了让系统的可信根证书储存保持最新之外,还应该每隔一段时间检查一次包管理器,以检视哪些第三方是可信的,他们的储存库签名金钥是否足够强大(许多仍使用 1024-bit DSA),并删除那些过期的。
尝试:apt-key list, rpm -qa gpg-pubkey
签名 git 提交和标签
目前,几乎所有人都在使用 git 进行版本控制。当你释出新版本时,它是否基于 GPG 签名 git 标签?如果你喜欢,你也可以签名提交。