Lynis是一个基于主机的、开源的安全审计应用程序,它可以评估安全性配置文件、Linux和其他类UNIX操作系统的安全态势。在本教程中,你将学会安装Lynis,并用它在一台Ubuntu 16.04服务器上执行安全审计。然后,你将会探究一个审计样本的结果,并通过配置Lynis来忽略那些与你的需求所不相关的各种测试。
Lynis不会自动执行任何系统的加固,但它能提供一些建议,以向你展示如何去自行加固系统。因此, 如果你有Linux系统安全方面的基本知识的话,它将对你很有帮助。你还应该对你所计划执行审计的机器上的那些正在运行服务有所熟悉,例如各种web服务器、数据库和其他Lynis可能会默认扫描到的服务。这将有助于你去识别出那些能够被安全地忽略掉的结果。
注意:执行安全审计是需要时间和耐心的。你可能需要在安装Lynis和用它来审计你的服务器之前,花上一些时间来仔细地阅读本文全部内容。
先决条件
为了吃透本文,你需要有:一台Ubuntu 16.04服务器,并配置了一个具有sudo特权的非根用户和防火墙。
步骤1、在你的服务器上安装Lynis
安装Lynis可以有多种方法。你可以从源代码来编译它,下载并复制其二进制文件到系统上的一个适当的位置;或者你可以用包管理器来安装它。使用包管理器是安装并更新Lynis的最简便的方法,所以我们在此将使用该方法。
不过,在Ubuntu 16.04上,资源库里所提供的版本并非是最新的。为了获得其最新的特性,我们将从其项目的官方资源库来安装Lynis。
Lynis的软件资源库使用的是HTTPS协议,因此我们首先需要确保支持HTTPS的包管理器已被安装。你可以使用以下的命令来进行检查:
$ dpkg -s apt-transport-https | grep -i status
如果已安装,该命令的输出结果应该是:
Status: install ok installed
如果输出结果显示未安装,则可用sudo apt-get install apt-transport-https来安装。
扫清并安装了这个唯一的依赖性之后,我们就可以来安装Lynis了。为了触发此过程,我们要添加库的键值:
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C80E383C3DE9F082E01391A0366C67DE91CA5D5F
你将能看到如下的输出结果,它表明键值已被添加成功:
Executing: /tmp/tmp.AnVzwb6Mq8/gpg.1.sh --keyserver
keyserver.ubuntu.com
--recv-keys
C80E383C3DE9F082E01391A0366C67DE91CA5D5F
gpg: requesting key 91CA5D5F from hkp server keyserver.ubuntu.com
gpg: key 91CA5D5F: public key "CISOfy Software (signed software packages) " imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
然后是将Lynis的资源库添加到那些对软件包管理器可用的列表之中:
$ sudo add-apt-repository "deb [arch=amd64] https://packages.cisofy.com/community/lynis/deb/ xenial main"
为了使这些新附加的资源库能为系统所用,我们需更新包的数据库:
$ sudo apt-get update
最后再来安装Lynis:
$ sudo apt-get install lynis
在安装完成后,你将可以访问到lynis的命令其子命令集。接下来让我们来看看如何使用Lynis。
步骤2、执行审计
在安装完毕后,你就可以使用Lynis来对系统执行安全审计了。让我们从查看Lynis所能执行的操作列表开始吧。请执行如下命令:
$ lynis show commands
你会看到如下的输出:
Commands:
lynis audit
lynis configure
lynis show
lynis update
lynis upload-only
Lynis在审计时一般用到的是概要文件(profiles),它们就像配置文件一样通过设置来控制Lynis的审计。你可以使用如下命令来查看默认概要文件的设置:
$ lynis show settings
你将会看到如下的输出:
# Colored screen output
colors=1
# Compressed uploads
compressed-uploads=0
# Use non-zero exit code if one or more warnings were found
error-on-warnings=0
...
# Upload server (ip or hostname)
upload-server=[not configured]
# Data upload after scanning
upload=no
# Verbose output
verbose=0
# Add --brief to hide descriptions, --configured-only to show configured items only, or --nocolors to remove colors
在执行审计之前去验证一下是否有新版本可用是一个很好的习惯,因为这样你将能得到最新的建议和信息。你可以通过以下命令来检查更新:
$ lynis update info
你将得到类似于如下的输出,它会显示出Lynis的最新版本:
== Lynis ==
Version : 2.4.8
Status : Up-to-date
Release date : 2017-03-29
Update location : https://cisofy.com/lynis/
2007-2017, CISOfy - https://cisofy.com/lynis/
或者,你可以输入lynis update check,来产生如下的一行输出:
status=up-to-date
如果当前版本确实需要更新,那么你可以使用包管理器来执行更新操作。
你可使用lynis audit system命令,在系统上运行一次审计。当然,你可以选择用特权或是非特权(渗透测试)模式来运行Lynis。对于后者的模式,一些需要root特权的测试会被忽略。因此,你应该使用sudo来将审计运行在特权模式之下。请使用如下命令来执行你的第一次审计:
$ sudo lynis audit system
验证完成之后,Lynis将运行它的测试并将结果显示在你的屏幕上。Lynis的一次审计通常只需要一分钟或更短的时间。
在Lynis执行审计的过程中,它会用到各种类型的多种测试。在每次审计完成后,各种测试结果、调试信息、和对系统的加固建议都被写到标准的输出中(即屏幕)。而更为详细的信息则被记录在/var/log/lynis.log里;同时,报告数据被保存到/var/log/lynis-report.dat中。报告数据通常只包含有关服务器和应用程序本身的信息,所以你只需要关注的是日志文件。每次审计都会清除(覆盖)日志文件,因此先前的审计结果是不会被下一次所保留下来的。
审计完成后,你应该对结果、警告和建议进行复查,然后有选择的采纳实施相关建议。
让我们来看看运行在本教程中的设备上的一次Lynis审计结果。它也许和你自己的审计结果有所不同,但是你应该能从中领会到一些重点。
Lynis审计输出中的第一个重要部分是其纯信息的部分。它会按类别分组的形式告诉你每个测试的结果。分类的关键字有NONE, WEAK, DONE, FOUND, NOT_FOUND, OK, 和 WARNING。
[+] Boot and services
------------------------------------
- Service Manager [ systemd ]
- Checking UEFI boot [ DISABLED ]
- Checking presence GRUB [ OK ]
- Checking presence GRUB2 [ FOUND ]
- Checking for password protection [ WARNING ]
..
[+] File systems
------------------------------------
- Checking mount points
- Checking /home mount point [ SUGGESTION ]
- Checking /tmp mount point [ SUGGESTION ]
- Checking /var mount point [ OK ]
- Query swap partitions (fstab) [ NONE ]
- Testing swap partitions [ OK ]
- Testing /proc mount (hidepid) [ SUGGESTION ]
- Checking for old files in /tmp [ OK ]
- Checking /tmp sticky bit [ OK ]
- ACL support root file system [ ENABLED ]
- Mount options of / [ OK ]
- Checking Locate database [ FOUND ]
- Disable kernel support of some filesystems
- Discovered kernel modules: udf
...
[+] Hardening
------------------------------------
- Installed compiler(s) [ FOUND ]
- Installed malware scanner [ NOT FOUND ]
- Installed malware scanner [ NOT FOUND ]
...
[+] Printers and Spools
------------------------------------
- Checking cups daemon [ NOT FOUND ]
- Checking lp daemon [ NOT RUNNING ]
虽然Lynis在“开箱即用”的状态下会执行200多种测试,但不是所有的都对你的服务器是必要的。那么如何来判断哪些测试是必要的,而哪些不是呢?这就依靠于服务器上到底运行着什么服务了。举个例子,如果你检查一个典型的Lynis审计的结果部分,你会发现在Printers and Spools类别下有两个测试:
[+] Printers and Spools
------------------------------------
- Checking cups daemon [ NOT FOUND ]
- Checking lp daemon [ NOT RUNNING ]
你真的在Ubuntu 16.04服务器上运行着打印服务器吗?除非你正在运行一个基于云的打印服务器,不然你是没有必要让Lynis每次运行该测试的。
虽然这是一个在测试中筛选忽略的完美例子,但其他的可能就没那么显而易见了。请看下面这个例子。例如:
[+] Insecure services
------------------------------------
- Checking inetd status [ NOT ACTIVE ]
该输出指明它希望在Ubuntu 16.04服务器上使用到的inetd并未被激活。但实际上Ubuntu早已将systemd取代了inetd。知道了这个,你就可以在对服务器进行审计测试时标记出来,让Lynis不去执行。
随着对每个测试结果的复查,你会在测试中圈出更多的多余项目。有了这样的列表,你就可以定制出在未来的审计中有所忽略的Lynis了。你会在步骤5中了解到如何完成这些操作。
在下一节里,我们将浏览Lynis审计输出的其他不同部分,这样你会对如何正确运用Lynis来审计你的系统有一个更好的理解。那么就让我们来首先看看如何处理Lynis所发出的警告吧。
步骤3、修复Lynis的审计警告
Lynis的审计输出并不总是带有警告。但是当你读到有警告部分的时候,你就会需要知道如何解决这些引发警告的根源。
警告一般罗列在结果部分的后面。每个警告都以警告性文本本身开始,并在同一行的括号中列出生成警告的测试项名称。而下一行则包含一个可能的建议性解决方案。最后一行是一个安全控制的URL,你可能从那里发现一些有关该警告的指导说明。不过,URL并不总能提供解释,因此你可能需要做一些进一步的研究。
以下输出源自在本文所涉及服务器上执行过的一次Lynis审计的警告部分。让我们浏览一下每个警告,来看看如何对其进行解决或改正:
Warnings (3):
----------------------------
! Version of Lynis is very old and should be updated [LYNIS]
https://cisofy.com/controls/LYNIS/
! Reboot of system is most likely needed [KRNL-5830]
- Solution : reboot
https://cisofy.com/controls/KRNL-5830/
! Found one or more vulnerable packages. [PKGS-7392]
https://cisofy.com/controls/PKGS-7392/
第一个警告是说Lynis需要被更新。这也意味着根据该审计所使用的Lynis版本,其结果可能并不完整。正如步骤2所示,如果我们事先执行了基本的版本检查,那么这是完全可以避免的。可见,此修复非常容易,就是更新Lynis。
第二个警告表明服务器需要被重启。这可能是因为系统最近的更新里包含了内核的升级。这里的解决方案也就是直接重启系统。
在深究任何警告或是测试结果时,你可以通过查询Lynis的ID来得到更多的关于测试的信息。其对应的命令形式为:
$ sudo lynis show details test-id
因此对于第二个ID为KRNL-5830的警告,我们可以运行这样的命令:
$ sudo lynis show details KRNL-5830
如下是具体测试的输出,它能让你对Lynis的每个测试的执行过程有所认识。在此输出中,Lynis甚至为其警告项给出了一些具体的信息:
2017-03-21 01:50:03 Performing test ID KRNL-5830 (Checking if system is running on the latest installed kernel)
2017-03-21 01:50:04 Test: Checking presence /var/run/reboot-required.pkgs
2017-03-21 01:50:04 Result: file /var/run/reboot-required.pkgs exists
2017-03-21 01:50:04 Result: reboot is needed, related to 5 packages
2017-03-21 01:50:04 Package: 5
2017-03-21 01:50:04 Result: /boot exists, performing more tests from here
2017-03-21 01:50:04 Result: /boot/vmlinuz not on disk, trying to find /boot/vmlinuz*
2017-03-21 01:50:04 Result: using 4.4.0.64 as my kernel version (stripped)
2017-03-21 01:50:04 Result: found /boot/vmlinuz-4.4.0-64-generic
2017-03-21 01:50:04 Result: found /boot/vmlinuz-4.4.0-65-generic
2017-03-21 01:50:04 Result: found /boot/vmlinuz-4.4.0-66-generic
2017-03-21 01:50:04 Action: checking relevant kernels
2017-03-21 01:50:04 Output: 4.4.0.64 4.4.0.65 4.4.0.66
2017-03-21 01:50:04 Result: Found 4.4.0.64 (= our kernel)
2017-03-21 01:50:04 Result: found a kernel (4.4.0.65) later than running one (4.4.0.64)
2017-03-21 01:50:04 Result: Found 4.4.0.65
2017-03-21 01:50:04 Result: found a kernel (4.4.0.66) later than running one (4.4.0.64)
2017-03-21 01:50:04 Result: Found 4.4.0.66
2017-03-21 01:50:04 Warning: Reboot of system is most likely needed [test:KRNL-5830] [details:] [solution:text:reboot]
2017-03-21 01:50:04 Hardening: assigned partial number of hardening points (0 of 5). Currently having 7 points (out of 14)
2017-03-21 01:50:04 Checking permissions of /usr/share/lynis/include/tests_memory_processes
2017-03-21 01:50:04 File permissions are OK
2017-03-21 01:50:04 ===--------------------------------------===
第三个警告PKGS-7392是关于软件漏洞包的,我们可以运行如下命令:
$ sudo lynis show details PKGS-7392
其输出为我们提供了有关需要升级的软件包的更多信息:
2017-03-21 01:39:53 Performing test ID PKGS-7392 (Check for Debian/Ubuntu security updates)
2017-03-21 01:39:53 Action: updating repository with apt-get
2017-03-21 01:40:03 Result: apt-get finished
2017-03-21 01:40:03 Test: Checking if /usr/lib/update-notifier/apt-check exists
2017-03-21 01:40:03 Result: found /usr/lib/update-notifier/apt-check
2017-03-21 01:40:03 Test: checking if any of the updates contain security updates
2017-03-21 01:40:04 Result: found 7 security updates via apt-check
2017-03-21 01:40:04 Hardening: assigned partial number of hardening points (0 of 25). Currently having 96 points (out of 149)
2017-03-21 01:40:05 Result: found vulnerable package(s) via apt-get (-security channel)
2017-03-21 01:40:05 Found vulnerable package: libc-bin
2017-03-21 01:40:05 Found vulnerable package: libc-dev-bin
2017-03-21 01:40:05 Found vulnerable package: libc6
2017-03-21 01:40:05 Found vulnerable package: libc6-dev
2017-03-21 01:40:05 Found vulnerable package: libfreetype6
2017-03-21 01:40:05 Found vulnerable package: locales
2017-03-21 01:40:05 Found vulnerable package: multiarch-support
2017-03-21 01:40:05 Warning: Found one or more vulnerable packages. [test:PKGS-7392] [details:-] [solution:-]
2017-03-21 01:40:05 Suggestion: Update your system with apt-get update, apt-get upgrade, apt-get dist-upgrade and/or unattended-upgrades [test:PKGS-7392] [details:-] [solution:-]
2017-03-21 01:40:05 ===--------------------------------------===
对此警告的解决方案就是更新数据库和系统。
在修复了此项警告之后,你应该再次运行审计。后续的审计就不会再对此产生警告了,当然新的警告也可能会出现在他处。因此你不得不重复进行此步骤以解决所有的警告。
至此,你已经知道了如何读懂并修复Lynis所生成的警告,让我们来看看如何去实施那些Lynis所提供的建议吧。
步骤4、实现Lynis的审计建议
在警告部分的后面,你将会看到一系列的建议,如果实施它们,则会让你的服务器少受到恶意软件的攻击。在这个步骤中,Lynis在审计完成之后,对装有Ubuntu 16.04系统的服务器产生了一些建议,你将了解到如何去实施它们。此过程与前面一节中的步骤基本一致。
一条具体建议是由其建议本身和紧随其后的测试ID所组成。根据测试,其下一行会告诉你如何修改影响服务的配置文件。而最后一行是一个安全控制的URL,你可以通过它找到更多关于此主题的信息。
下面的例子是一个源自Lynis审计的建议部分,它显示了与SSH服务相关的建议:
Suggestions (36):
----------------------------
* Consider hardening SSH configuration [SSH-7408]
- Details : ClientAliveCountMax (3 --> 2)
https://cisofy.com/controls/SSH-7408/
* Consider hardening SSH configuration [SSH-7408]
- Details : PermitRootLogin (YES --> NO)
https://cisofy.com/controls/SSH-7408/
* Consider hardening SSH configuration [SSH-7408]
- Details : Port (22 --> )
https://cisofy.com/controls/SSH-7408/
* Consider hardening SSH configuration [SSH-7408]
- Details : TCPKeepAlive (YES --> NO)
https://cisofy.com/controls/SSH-7408/
* Consider hardening SSH configuration [SSH-7408]
- Details : UsePrivilegeSeparation (YES --> SANDBOX)
https://cisofy.com/controls/SSH-7408/
...
根据你的运行环境,实施所有这些建议都是比较安全可靠的。但是,为了能做出决断,你必须知道每一个建议的具体意思。因为这些都隶属于SSH服务器,因此所有的更改必须体现在SSH守护进程的配置文件/etc/SSH/sshd_config中。如果你对Lynis给出的关于SSH的建议有任何疑问,请用man sshd_config指令来查看。当然这些信息在网上可以找到。
其中的一条建议是要求更改SSH的默认22号端口。如果你要更改它,请相应地在防火墙上添加一条规则,让对于SSH的访问能从新的端口上通过。
和警告部分一样,你可以使用sudo lynis show details test-id来查询Lynis的测试ID,以获得更多有关建议的详细信息。
其他的建议则是要求你在服务器上安装额外的软件。如下例所示:
* Harden the system by installing at least one malware scanner, to perform periodic file system scans [HRDN-7230]
- Solution : Install a tool like rkhunter, chkrootkit, OSSEC
https://cisofy.com/controls/HRDN-7230/
该建议是安装rkhunter、chkrootkit或OSSEC来满足加固测试(HRDN-7230)的要求。OSSEC是一个基于主机的入侵检测系统,它可以生成并发送警告。这是一个能够协助Lynis执行测试的一个很好的安全应用程序。关于此工具,你可以通过DigitalOcean的各个教程(https://www.digitalocean.com/community/tutorials?q=ossec)来进行更多的了解。但是,仅仅安装OSSEC并不能顺利地通过此测试,你还需要安装chkrootkit。这就是为什么有时候除了Lynis所给出的建议,你还要做更多的研究的原因。
让我们来看另一个例子。这是一个在文件完整性测试后显示的一个结果建议。
* Install a file integrity tool to monitor changes to critical and sensitive files [FINT-4350]
https://cisofy.com/controls/FINT-4350/
该安全控制的URL所给出的建议并没有提到我们前面的那个OSSEC程序,但是如果安装它,则会保证我们能通过后续的审计测试。这就是为什么OSSEC是一个很好的文件完整性监控工具的原因。
你也可以忽略一些并不适合你的建议。这里同样也有一个例子:
* To decrease the impact of a full /home file system, place /home on a separated partition [FILE-6310]
https://cisofy.com/controls/FILE-6310/
* To decrease the impact of a full /tmp file system, place /tmp on a separated partition [FILE-6310]
https://cisofy.com/controls/FILE-6310/
传统上,核心Linux文件系统,如/home、/tmp、/var和/usr常被挂载到一个单独的分区里,以减少在整个服务器耗尽其磁盘空间时的影响。但是,这种耗尽的情况其实并不被经常看到,尤其是在那些云服务器上。这些文件系统如今只是作为一个目录被挂载到同一根分区里。但是如果你对这样的系统执行Lynis审计的话,你会得到一些类似于前面所提及的建议输出。除非你的确想实施该建议,否则你很可能想通过配置Lynis来忽略它们,使它们将来不再执行此类审计。
使用Lynis来执行安全审计不仅仅涉及到修复警告和实施建议,它还包括识别出多余的测试。在接下来的步骤中,你将学习到如何定制缺省的概要文件来忽略此类测试。
步骤5、定制Lynis安全审计
在本节中,你将了解到如何定制Lynis,使之只运行那些对你的服务器必要的测试。用于控制审计如何运行的概要文件,在/etc/lynis目录中常被扩展名为.prf的各种文件所定义。其中默认的概要文件被恰当地命名为default.prf。你没有必要直接编辑该默认的概要文件。相反,你可以添加任何你想要的信息到相同目录的custom.prf之中,作为概要文件的定义。
你可以使用文本编辑器来创建一个新的名为/etc/lynis/custom.prf的文件:
$ sudo nano /etc/lynis/custom.prf
让我们通过该文件来告诉Lynis需要忽略的一些测试吧。下面就是我们想忽略的测试项目:
FILE-6310:用来检查分区的间隔。
HTTP-6622:用来测试web服务器上Nginx的安装。
HTTP-6702:用来检查web服务器上Apache的安装。该测试和上述Nginx测试一样都是默认执行的。因此,如果你只安装了Nginx和而非Apache的话,你就需要跳过Apache的测试。
PRNT-2307和PRNT-2308:用来检查打印服务器。
TOOL-5002:用来检查诸如Puppet和Salt这样的自动化工具。如果你在服务器上没有此类工具的话,那么你完全可以跳过对此的测试。
SSH-7408:tcpkeepalive:几个Lynis的测试可以被组合到一个测试ID之下。如果你想忽略属于某个ID的测试,下面便是如何设定的方法。
要想忽略某个测试,你可以通过skip-test指令来传递你想要忽略的测试ID,每行一个。将下面的代码添加到你的文件之中:
/etc/lynis/custom.prf
# Lines starting with "#" are comments
# Skip a test (one per line)
# This will ignore separation of partitions test
skip-test=FILE-6310
# Is Nginx installed?
skip-test=HTTP-6622
# Is Apache installed?
skip-test=HTTP-6702
# Skip checking print-related services
skip-test=PRNT-2307
skip-test=PRNT-2308
# If a test id includes more than one test use this form to ignore a particular test
skip-test=SSH-7408:tcpkeepalive
保存并关闭该文件。
当你下一次执行审计时,Lynis将忽略那些匹配上了你在定制概要文件中配置好的测试ID。而其审计输出也会省略掉相应的测试结果部分和建议部分。
/etc/lynis/custom.prf文件允许你修改概要文件中的任何设置。要做到这一点,你可以将/etc/lynis/default.prf复制为/etc/lynis/custom.prf,并修改之。你只需要修改这些设置就行了,因此你可以集中更多的精力在寻找测试中可以忽略的地方。
接下来,让我们来看看什么是Lynis里所谓的加固指数。
步骤6、解析加固指数
在每个Lynis审计输出的底部,也就是建议部分的下面,你会发现一个看起来像下面输出文字的部分:
Lynis security scan details:
Hardening index : 64 [############ ]
Tests performed : 206
Plugins enabled : 0
这个输出会告诉你它进行了多少种测试,并且配有一个加固指数,Lynis提供该数值让你对服务器的安全态势有所了解。该数值为Lynis所独有。该加固指数将会随着你针对警告修复和针对建议的实施而作出相应的调整。通过Lynis对新的Ubuntu 16.04服务器所做的初次审计,得出了上述该输出,它表明本系统具有64的加固指数。
在修复了警告并实施了大部分的建议之后, 审计给出了如下新的输出。你可以看到加固指数略微升高了:
Lynis security scan details:
Hardening index : 86 [################# ]
Tests performed : 205
Plugins enabled : 0
加固指数并非是对服务器安全程度的一个准确评估,而只是一个基于Lynis所执行的测试后服务器在安全配置(或加固)方面的衡量。正如你所看到的,该指数为越高越好。Lynis安全审计的目的不仅仅是为了获得高的加固指数,更是为了修复各种它所产生的警告和建议。
结论
在本教程中,你已安装了Lynis,用它对Ubuntu 16.04服务器执行了安全审计,探究了如何修复它生成的警告和建议,以及如何定制Lynis所执行的各种测试。
这虽然需要花费一些额外的时间和精力,但是为了让你的机器更加安全,和使得Lynis的审计过程更加顺利,这是完全值得投入的。
关于Lynis的更多信息,请参考《开始使用Lynis》这个官方文档:
Lynis是一个开源的项目,因此如果你乐于奉献的话,请访问该项目的GitHub页面(https://github.com/CISOfy/lynis)。