本文就讨论一下 Linux 系统和应用安全。我们知道,在开发一个应用的过程中,需要涉及代码、操作系统、网络和数据库等多个方面。所以,只是了解代码安全肯定是不够的,我们还需要了解常见的基础环境和工具中的安全机制,学会通过正确地配置这些安全机制,来提升安全保障。
谈到 Linux,我相信你每天都在使用 Linux 进行各种开发和运维操作。但是,大多数情况下,公司不会给每一个员工分配专有的 Linux 服务器,而是多个开发和运维共用一台 Linux服务器。那么,其他员工在使用 Linux 服务器的时候,会不会对我们自己的数据和进程产生影响呢?另外,我在 Web 安全中讲过,黑客可以通过很多漏洞控制 Linux 服务器,那我们又该如何避免和控制黑客的破坏呢?
一、如何理解Linux中的安全模型?
要解决这些安全问题,我们首先要了解一个安全模型,Linux 的安全模型。
我们先来看一下 Linux 的构成,Linux 可以分为内核层和用户层。用户层通过内核层提供的操作接口,来执行各类任务。
既然 Linux 的内核安全这么重要,那我们是不是要在防护上付出大量的精力呢?事实上,正如我们不需要在开发应用时(尤其是使用 Java 这类相对高层的语言时),过多地关心操作系统相关的内容一样,我们在考虑 Linux 安全时,也不需要过多地考虑内核的安全,更多的是要考虑用户层的安全。所以,对于 Linux 内核层的安全,我们只需要按照插件漏洞的防护方法,确保使用官方的镜像并保持更新就足够了。
既然,使用最多的是用户层,那我们就来看一下,用户层的操作都有什么。
在 Linux 中,用户层的所有操作,都可以抽象为“主体 -> 请求 -> 客体”这么一个流程。比如,“打开 /etc/passwd”这一操作的主体是实际的用户,请求是读,客体是/etc/passwd 这个文件。
Linux 系统是一个支持多用户的操作系统,它通过普通的文本文件来保存和管理用户信息。这其中,有 2 个比较关键的文件:/etc/passwd和/etc/shadow。
我们知道,在 Linux 中,/etc/passwd是全局可读的,不具备保密性。因此,/etc/passwd不会直接存储密码,而是用 x 来进行占位。那实际的用户密码信息,就会存储到仅 ROOT 可读的/etc/shadow中。
在/etc/shadow中,除了加密后的密码,也保存了诸如密码有效天数、失效多少天告警之类的密码管理策略。我们可以通过 Chage 命令来对密码管理策略进行修改,比如,通过下面的 Chage 命令,就可以强制 Test 用户在 60 天内必须对密码进行修改。通过这样的方式,就可以降低密码泄漏的可能性了。
chage-M60test
因为认证这个功能是由 Linux 内核来提供的,所以在用户层,我们需要关心的安全问题,就是弱密码导致的身份信息泄漏。为了解决这个问题,在/etc/shadow中,我们可以制定适当的密码策略。除此之外,我们也可以通过John the Ripper,使用已知的弱密码库,来对 Linux 中的弱密码进行检测。下面的命令,就是使用 John the Ripper 检测弱密码。