Linux-安全实践秘籍第二版-全-
Linux 安全实践秘籍第二版(全)
原文:
annas-archive.org/md5/dab5131b501213fc0222fd0813bcfd70译者:飞龙
前言
在设置 Linux 系统时,安全应该是所有阶段中的一个重要部分。了解 Linux 基础知识对于在机器上实施良好的安全策略至关重要。
Linux 本身在出厂时并不完全安全,管理员有责任以一种方式配置机器,使其更加安全。实用 Linux 安全秘籍将作为一本实用指南,帮助管理员配置更安全的机器。
如果你想了解内核配置、文件系统安全、身份验证、安全网络以及各种 Linux 安全工具,本书适合你。
Linux 安全是一个庞大的话题,并非所有内容都能在一本书中涵盖。尽管如此,实用 Linux 安全秘籍将为你提供大量的方案,帮助你保护机器安全。
本书适合人群
实用 Linux 安全秘籍适合所有已经了解 Linux 文件系统和管理的 Linux 用户。你应该熟悉基本的 Linux 命令。理解信息安全及其对 Linux 系统的风险将帮助你更轻松地理解书中的方案。
然而,即使你对信息安全不熟悉,也能轻松跟随并理解本书中讨论的各个方案。
由于实用 Linux 安全秘籍采用了实践方法,按照步骤操作非常容易。
本书内容
第一章,Linux 安全问题,讨论了可以为这些漏洞实施的各种安全措施。话题包括为密码保护和服务器安全制定安全策略和安全控制,进行 Linux 系统的漏洞评估,还涉及 sudo 访问的配置。
第二章,配置安全且优化的内核,重点讲解了配置和构建 Linux 内核的过程并进行测试。涵盖的主题包括构建内核的要求、内核配置、内核安装、定制以及内核调试。该章节还讨论了使用 Netconsole 配置控制台。
第三章,本地文件系统安全,着眼于 Linux 文件结构和权限。涵盖的主题包括查看文件和目录详情、使用 chmod 处理文件和文件权限以及实施访问控制列表。该章节还向读者介绍了 LDAP 配置。
第四章,Linux 本地身份验证,探讨了在确保安全的同时,如何在本地系统上进行用户身份验证。该章节包括用户身份验证日志记录、限制用户登录能力、监控用户活动、身份验证控制定义,以及如何使用 PAM。
第五章,远程认证,讲解如何在 Linux 系统上进行远程用户认证。本章包括的主题有使用 SSH 远程访问服务器、禁用和启用 root 登录、在使用 SSH 时限制远程访问、通过 SSH 远程复制文件以及设置 Kerberos。
第六章,网络安全,提供了有关网络攻击和安全的信息。内容包括管理 TCP/IP 网络、使用 Iptables 配置防火墙、阻止伪造地址和不需要的传入流量。本章还向读者介绍了如何配置和使用 TCP Wrapper。
第七章,安全工具,介绍了可以在 Linux 系统上使用的各种安全工具或软件。本章涉及的工具包括 sXID、Portsentry、Squid 代理、OpenSSL 服务器、Tripwire、Shorewall、OSSEC、Snort 以及 Rsync/Grsync。
第八章,Linux 安全发行版,向读者介绍了一些与安全和渗透测试相关的著名 Linux/Unix 发行版。本章涉及的发行版包括 Kali Linux、PfSense、DEFT、NST、Security Onion、Tails 和 Qubes。
第九章,Bash 漏洞修补,探讨了 Bash shell 中最著名的漏洞——Shellshock。它帮助读者了解 Shellshock 漏洞以及其存在可能带来的安全问题。本章还告诉读者如何使用 Linux 补丁管理系统来保护他们的机器,并让他们了解在 Linux 系统中如何应用补丁。还提供了其他已知 Linux 漏洞的相关信息。
第十章,安全监控与日志记录,提供了关于在 Linux 系统中本地以及网络上的日志监控信息。本章讨论的主题包括使用 Logcheck 监控日志、使用 Nmap 进行网络监控、使用 Glances 进行系统监控以及使用 MultiTail 监控日志。还讨论了一些其他工具,包括 Whowatch、stat、lsof 和 strace。读者还可以了解如何使用 IPTraf、Suricata 和 OpenNMS 进行网络监控。
第十一章,理解 Linux 服务安全性,帮助读者了解 Linux 系统中常用的服务以及与这些服务相关的安全问题。像 HTTPD、Telnet 和 FTP 等服务已经使用了很长时间,但至今仍有许多管理员对这些服务如果配置不当可能带来的安全问题一无所知。
第十二章,扫描和审计 Linux,提供有关在 Linux 系统上执行恶意软件扫描的信息,以查找所有恶意软件,包括根套件。它还介绍了使用系统服务(如 auditd)和工具(如 ausearch 和 aureport)进行审计的方式。本章将帮助读者了解如何通过日志了解系统服务正在执行什么操作。
第十三章,漏洞扫描与入侵检测,将帮助读者使用各种工具和 Linux 发行版(如 Security Onion、OpenVAS 和 Nikto)对 Linux 机器进行漏洞评估。了解网络和服务器类别的漏洞以及基于 Web 的漏洞。本章还将帮助读者使用 Lynis 加强 Linux 系统的安全性。
最大限度地利用本书
为了充分利用本书,读者应该具备基本的 Linux 文件系统和管理知识。他们应该了解 Linux 的基本命令,并且对信息安全有一定了解将是一个额外的优势。
本书将包含有关 Linux 安全的实际示例,使用内置的 Linux 工具以及其他可用的开源工具。根据本书中的方法,读者需要安装这些工具,如果它们尚未安装在 Linux 上。
使用的约定
本书中使用了许多文本约定。
CodeInText:指示文本中的代码词、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 用户名。例如:“将下载的WebStorm-10*.dmg磁盘映像文件挂载为系统中的另一个磁盘。”
任何命令行输入或输出都会如下所示:
$ mkdir css
$ cd css
粗体:表示新术语、重要单词或屏幕上出现的单词。例如,菜单或对话框中的单词在文本中会以这种方式出现。以下是一个示例:“从管理面板中选择系统信息。”
警告或重要提示以这种形式出现。
提示和技巧以这种形式出现。
章节
本书中有几个标题会频繁出现(准备工作,如何做...,它是如何工作的...,还有更多...,和另请参阅)。
为了给出明确的完成方法的指示,使用以下各节:
准备工作
本节告诉你在方法中可以期待什么,并描述如何设置所需的软件或任何预备设置。
如何做...
本节包含执行方法所需的步骤。
它是如何工作的...
本节通常包含对上一节所发生内容的详细解释。
还有更多内容...
本节包含有关方法的附加信息,帮助你更好地理解该方法。
另请参阅
本节提供了与方法相关的其他有用信息的链接。
联系我们
我们始终欢迎读者的反馈。
一般反馈:请通过电子邮件feedback@packtpub.com联系我们,并在邮件主题中提及书名。如果您对本书的任何方面有疑问,请发送电子邮件至questions@packtpub.com。
勘误表:虽然我们已经尽最大努力确保内容的准确性,但错误仍然会发生。如果您在本书中发现错误,我们将不胜感激您能向我们报告。请访问 www.packtpub.com/submit-errata,选择您的书籍,点击勘误提交表单链接,并填写相关信息。
盗版:如果您在互联网上发现任何形式的我们作品的非法复制品,我们将感激您提供该位置地址或网站名称。请通过copyright@packtpub.com与我们联系,并提供链接。
如果您有兴趣成为作者:如果您在某个领域具有专业知识,并且有意撰写或参与编写书籍,请访问authors.packtpub.com。
评论
请留下评论。当您阅读并使用完本书后,不妨在您购买本书的网站上留下评论。潜在读者可以查看并参考您的公正意见来做出购买决定,我们在 Packt 也能了解您对我们产品的看法,而我们的作者也能看到您对他们书籍的反馈。谢谢!
欲了解更多关于 Packt 的信息,请访问packtpub.com。
第一章:Linux 安全问题
一台 Linux 机器的安全性取决于管理员的配置。我们安装完自己选择的 Linux 发行版并移除所有不必要的包之后,可以通过微调已安装的软件和服务来开始处理系统的安全问题。
在本章中,我们将讨论以下主题:
-
配置服务器安全
-
安全策略—服务器安全
-
定义安全控制
-
缺乏备份计划
本章将涵盖以下内容:
-
使用校验和检查安装介质的完整性
-
使用 LUKS 磁盘加密
-
利用
sudoers—配置sudo权限 -
使用 Nmap 扫描主机
-
获取脆弱的 Linux 系统的 root 权限
-
缺乏备份计划
安全策略
安全策略是一个定义,概述了组织在计算机网络安全方面应遵循的规则和做法。安全策略定义了组织应如何管理、保护和分发敏感数据。
制定安全策略
在创建安全策略时,您应该牢记它应该简洁易懂,便于所有用户遵循。策略的目标应该是在保护数据的同时,保持用户的隐私。
它应围绕以下几点进行开发:
-
系统的可访问性
-
系统上的软件安装权限
-
数据权限
-
从故障中恢复
在制定安全策略时,用户应仅使用已获得授权的服务。任何不允许的行为都应在策略中加以限制。让我们来看一些常见的 Linux 安全误区。
Linux 安全误区
在计划在您的业务中使用基于 Linux 的系统时,您可能会感到紧张。这可能是由于一些关于 Linux 安全的错误传言,认为这些系统可能已成为某些安全误区的受害者。
误区 – 由于 Linux 是开源的,因此它被认为不安全
Linux 作为一个免费和开源的操作系统,拥有许多优势。它包括一个庞大的开发者基础,这些开发者不断审计源代码,寻找潜在的安全风险;Linux 社区能够为任何可能的安全问题提供快速的支持和修复。补丁会快速发布给社区进行测试,因此它们不必处理其他 Unix 供应商可能遇到的繁琐管理问题。
由于全球庞大的用户群体,Linux 的安全性在各种计算环境中得到了广泛的测试,从而使其成为最稳定、最安全的操作系统之一。由于 Linux 开放供全球开发者审查,它有助于在权限分配的方式上提高安全性。Linux 系统中这些权限的分配方式也是源自开源代码的安全特性。
误区 – Linux 仅适用于专家,只有他们知道如何在安全方面配置系统
假设 Linux 仅适用于懂得如何处理病毒的专家是一个误解。Linux 已经发展成了一个适合任何人使用的最友好的操作系统之一,无论是新手还是专家。
Linux 因其强大的架构而安全。Linux 系统上的普通用户拥有低权限账户,而不是 root 权限。
错误观念——Linux 是没有病毒的
由于其强大的架构,即使 Linux 系统被攻破,病毒也无法获得 root 权限,因此无法对系统造成重大损害。
即使在 Linux 服务器上,也会实施多个级别的安全措施,并且它们会更频繁地更新,从而有助于保护服务器免受病毒侵害。
仍然存在一些针对 Linux 的病毒,因此它并非完全没有病毒。但大多数存在的 Linux 病毒性质上是非破坏性的。
配置服务器安全
创建 Linux 服务器后,紧接着的步骤是实施安全程序,确保任何威胁都不会导致系统被攻击。对 Linux 服务器恶意攻击的一个主要原因是安全措施实施不当或存在漏洞。在配置服务器时,安全策略需要正确实施,以创建一个安全的环境,帮助防止您的业务被黑客攻击。
如何操作...
让我们逐一查看每个配置。
用户管理
按照以下步骤配置服务器安全:
-
当创建 Linux 服务器时,默认创建的第一个用户始终是 root 用户。该 root 用户仅应用于初始配置。
-
初始配置完成后,应通过 SSH 禁用此 root 用户。这将使黑客更难以访问您的 Linux 机器。
-
此外,应创建一个二级用户来登录并管理机器。如果需要执行管理操作,可以授予该用户 sudo 权限。
密码策略
按照以下步骤配置服务器安全:
-
创建用户账户时,确保使用强密码。如果允许,密码长度应保持在 12 到 14 个字符之间。
-
如果可能,随机生成密码,并包括小写字母、大写字母、数字和符号。
-
避免使用容易猜测的密码组合,如字典单词、键盘模式、用户名、身份证号等。
-
避免重复使用相同的密码。
配置策略
按照以下步骤配置服务器安全:
-
服务器上的操作系统应根据批准的 InfoSec 指南进行配置。
-
任何未使用的服务或应用程序应尽可能禁用。
-
服务器上服务和应用程序的每次访问都应进行监控和记录。还应通过访问控制方法进行保护。此示例将在第三章中讨论,本地文件系统安全。
-
系统应保持更新,并且应尽快安装任何可用的最新安全补丁。
-
尽量避免使用 root 账户。最好使用需要最低权限才能执行功能的安全原则。
-
任何特权访问必须尽可能通过安全通道连接(SSH)进行。
-
服务器的访问应在受控环境中进行。
监控策略
- 服务器系统上的所有安全相关操作必须进行日志记录,并且审核报告应按如下方式保存:
-
所有与安全相关的日志应保持在线一个月。
-
所有每日备份和每周备份应保留一个月。
-
至少保留两年的每月完整备份
-
任何与安全相关的事件发生泄露时,应报告给 InfoSec 团队。随后,他们将审查日志并将事件报告给 IT 部门。
-
一些安全相关事件的示例如下:
-
端口扫描相关攻击
-
未经授权访问特权账户
-
由于主机上的某个特定应用程序而导致的异常情况
它是如何工作的...
遵循此处给出的策略有助于组织拥有或运营的内部服务器的基本配置。有效实施该策略将最大限度地减少对任何敏感和专有信息的未经授权访问。
安全策略 – 服务器安全
对 Linux 服务器的恶意攻击的主要原因之一是安全实施不当或现有漏洞。在配置服务器时,需要正确实施安全策略,并对服务器的适当定制负责。
如何执行…
让我们看一下各种安全策略
一般策略
让我们讨论各种安全策略:
-
组织内所有服务器的管理由一个专门的团队负责,该团队还应监控任何合规性问题。如果发生合规性问题,该团队应立即审查并实施更新的安全策略。
-
在配置内部服务器时,必须以如下方式进行注册,以便根据以下信息识别服务器:
-
服务器的位置
-
操作系统版本和硬件配置
-
服务器上运行的服务和应用程序
-
-
组织的管理系统中的任何信息必须始终保持最新。
配置策略
让我们讨论各种安全策略:
-
服务器上的操作系统应按照 InfoSec 批准的指南进行配置。
-
任何未使用的服务或应用程序应尽可能禁用。
-
对服务器上所有服务和应用程序的访问应进行监控和记录,并应通过访问控制方法进行保护。有关示例将在第三章中介绍,本地文件系统安全。
-
系统应保持更新,任何可用的最新安全补丁应尽快安装。
-
尽量避免使用 root 账户。最好使用最小权限原则来执行功能。
-
任何类型的特权访问都必须通过安全通道连接(SSH)进行,尽可能地。
-
访问服务器应在受控环境下进行。
监控策略
让我们讨论一下各种安全策略:
-
所有与安全相关的服务器系统操作必须记录日志,并且审计报告应按如下方式保存:
-
在一个月的时间内,所有与安全相关的日志应保持在线。
-
在一个月的时间内,日常备份以及每周备份应予以保留。
-
至少保留两年的月度完整备份。
-
-
任何与安全相关的事件如果被泄露,应该报告给信息安全团队。然后他们会审查日志并将事件报告给 IT 部门。
-
一些与安全相关的事件示例如下:
-
与端口扫描相关的攻击
-
未经授权访问特权账户
-
主机上由特定应用程序引起的异常事件
-
它是如何工作的...
遵循这里给出的策略有助于组织所拥有或运营的内部服务器的基础配置。有效实施该策略将最小化对任何敏感和专有信息的未经授权访问。
定义安全控制
加固 Linux 服务器的过程从加固系统开始,为此,定义安全控制列表非常重要。安全控制列表(或安全检查清单)可以确认已实施适当的安全控制措施。
如何执行...
让我们看一下各种安全控制检查表。
安装
现在我们将查看每个安全控制检查表:
-
安装介质如 CD-ROM/DVD/ISO 应通过使用校验和进行检查。
-
在创建服务器时,应进行最小基础安装。
-
为
/home和/tmp创建单独的文件系统是一种良好的做法。 -
在服务器上安装最小软件是一种良好的实践,可以最大限度地减少漏洞的可能性。
-
始终保持 Linux 内核和软件的最新状态。
启动和磁盘
现在我们将查看每个安全控制检查表:
-
使用如 LUKS 等磁盘加密方法对分区进行加密。
-
通过配置 BIOS 密码限制对 BIOS 的访问。
-
限制可启动设备,仅允许像磁盘这样的设备启动。
-
配置密码以访问单用户模式的引导加载程序。
网络与服务
现在我们将查看每个安全控制检查表:
-
通过检查打开的网络端口来确定正在运行的服务。
-
使用防火墙,如
iptables/nftables,根据需要限制对服务的访问。 -
加密所有通过网络传输的数据。
-
避免使用 FTP、Telnet、Rlogin/Rsh 等服务。
-
应禁用任何不必要的服务。
-
应使用集中式认证服务。
入侵检测和拒绝服务(DoS)
现在我们将查看每个安全控制检查表:
-
应安装并配置文件完整性工具,如 AIDE、Samhain 和 AFICK,用于监控重要文件。
-
使用恶意软件扫描工具,如 CalmAV,来防止恶意脚本。
-
配置系统日志记录到远程机器,用于检测、取证和归档。
-
通过使用反暴力破解工具来防止暴力破解攻击。
审计和可用性
现在我们将查看每个安全控制检查表:
-
阅读日志以监控可疑活动。
-
配置 auditd 配置以执行系统帐务。
-
确保备份正常工作,并检查恢复。
它是如何工作的……
实施这些安全控制措施可以最小化 Linux 服务器的安全风险,帮助保护数据免受黑客攻击。
使用校验和检查安装介质的完整性
每当你下载任何 Linux 发行版的镜像文件时,都应该检查文件的正确性和安全性。这可以通过下载镜像文件后生成 MD5 哈希,然后将生成的哈希与提供镜像文件的组织生成的哈希进行比较来完成。
这有助于检查下载文件的完整性。如果原始文件被篡改,通过 MD5 哈希比较可以检测到。文件大小越大,文件变化的可能性越高。强烈建议你对操作系统安装光盘等文件进行 MD5 哈希比较。
做好准备
md5sum 通常已在大多数 Linux 发行版中安装,因此无需安装。
如何执行……
执行以下步骤:
- 打开 Linux 终端,然后将目录切换到包含已下载 ISO 文件的文件夹。
由于 Linux 对大小写敏感,输入文件夹名称时请确保拼写正确。在 Linux 中,Downloads 与 downloads 并不相同。
- 切换到下载目录后,输入以下命令:
md5sum ubuntu-filename.iso
md5sum 将以单行形式打印计算的哈希,如下所示:
8044d756b7f00b695ab8dce07dce43e5 ubuntu-filename.iso
现在,我们可以将此命令计算出的哈希与 UbuntuHashes 页面上的哈希进行比较(help.ubuntu.com/community/UbuntuHashes)。打开 UbuntuHashes 页面后,我们只需要将之前计算出的哈希复制到浏览器的查找框中(通过按 Ctrl + F)。
它是如何工作的……
如果计算出的哈希值与 UbuntuHashes 页面上的哈希值匹配,则表示下载的文件没有损坏。如果哈希值不匹配,则可能是文件已被篡改或损坏。尝试重新下载文件。如果问题仍然存在,建议向服务器管理员报告该问题。
另见
如果你想再进一步,下面是一个额外的内容:适用于 Ubuntu 的 GUI 校验和计算器。
有时候,使用终端进行校验和检查真的很不方便。你需要知道下载文件的正确文件夹和准确的文件名,这让记住确切的命令变得很困难。
作为解决方案,有一个非常小巧简单的软件——GtkHash。
你可以在这里下载该工具:gtkhash.sourceforge.net/。
或者,你也可以使用以下命令安装它:
sudo apt-get install gtkhash
使用 LUKS 磁盘加密
在企业、小型企业和政府办公室中,用户可能需要保护他们的系统,以保护个人数据,包括客户信息、重要文件、联系方式等。为此,Linux 提供了许多加密技术,可以用来保护硬盘或可移动介质等物理设备上的数据。一个这样的加密技术是使用Linux 统一密钥设置(LUKS)磁盘格式。此技术允许加密 Linux 分区。
这是 LUKS 的功能:
-
整个块设备可以使用 LUKS 进行加密;它非常适合保护可移动存储介质或笔记本硬盘上的数据。
-
LUKS 使用现有的设备映射内核子系统
-
它还提供了密码短语强化功能,有助于防止字典攻击。
准备工作
为了让以下过程顺利进行,在安装 Linux 时需要创建一个单独的分区,该分区将使用 LUKS 进行加密。
按照给定步骤配置 LUKS 将删除加密分区上的所有数据。因此,在开始使用 LUKS 之前,请确保将数据备份到外部来源。
如何操作...
要手动加密目录,请执行以下步骤:
- 按照此处所示安装
cryptsetup,它是用于设置加密文件系统的工具:
apt-get install cryptsetup
前面的命令生成以下输出:

- 加密你的
/dev/sdb1分区,它是一个可移动设备。要加密该分区,请输入以下命令:
cryptsetup -y -v luksFormat /dev/sdb1
前面的命令生成以下输出:

该命令初始化分区并设置一个密码短语。请确保记下密码短语,以便后续使用。
-
现在通过创建映射打开新创建的加密设备:
![]()
-
检查以确认设备是否存在:
ls -l /dev/mapper/backup2
上述命令生成以下输出:

-
使用以下命令检查映射状态:
![]()
-
使用以下命令导出 LUKS 头部信息:
![]()
-
接下来,将零写入
/dev/mapper/backup2加密设备:![]()
由于 dd 命令可能需要几个小时才能完成,我们使用 pv 命令来监控进度。
- 现在创建文件系统:
mkfs.ext4 /dev/mapper/backup2
上述命令生成以下输出:

- 然后挂载新文件系统并确认文件系统是否可见:
![]()
![]()
恭喜!你已成功创建加密分区。现在,即使电脑关机,你也能保证数据安全。
还有更多...
执行以下命令来卸载并保护分区上的数据:
umount /backup2
cryptsetup luksClose backup
要重新挂载加密分区,请执行以下步骤:
cryptsetup luksOpen /dev/xvdc backup2
mount /dev/mapper/backup2 /backup2
df -H
mount

利用 sudoers —— 配置 sudo 访问权限
Sudoer 是 Linux 系统的一个功能,管理员可以通过它向受信任的普通用户提供管理员访问权限,而无需实际共享 root 用户的密码。管理员只需将普通用户添加到 sudoers 列表中。
一旦用户被添加到 sudoers 列表中,他们就可以通过在命令前加上 sudo 来执行任何管理员命令。接着,系统会要求用户输入自己的密码。之后,管理员命令将以与 root 用户相同的方式执行。
准备就绪
由于配置文件是预定义的且使用的命令是内建的,因此在开始步骤之前不需要进行额外配置。
如何操作…
执行以下步骤:
- 首先创建一个普通账户,然后为其提供 sudo 权限。完成后,你将能够从新账户使用
sudo命令,并执行管理员命令。按照给定步骤配置 sudo 访问权限。首先,使用 root 账户登录系统,然后使用useradd命令创建一个用户账户,如下所示。将命令中的 USERNAME 替换为你选择的任何名字:

-
现在,使用
passwd命令为新用户账户设置密码,如下所示:![]()
-
现在通过运行
visudo编辑/etc/sudoers文件,如下所示。使用sudo命令时应用的策略由/etc/sudoers文件定义:![]()
-
打开文件后,搜索以下行,这些行允许测试组的用户获得 sudo 访问权限:
![]()
-
您可以通过删除第二行开头的注释字符(
#)来启用给定的配置。更改完成后,保存文件并退出编辑器。现在,使用usermod命令将先前创建的用户添加到测试组中:![]()
-
现在,您需要检查当前创建的配置是否允许新用户帐户使用
sudo执行命令。 -
要切换到新创建的用户帐户,请使用
su选项:![]()
-
现在,使用
groups命令确认该用户帐户是否在测试组中:![]()
最后,从新帐户运行带有 sudo 的 whoami 命令。由于您是第一次使用该新用户帐户通过 sudo 执行命令,因此会显示 sudo 命令的默认横幅消息。屏幕还会要求输入用户帐户密码:

- 输出的最后一行是
whoami命令返回的用户名。如果sudo配置正确,该值将是 root。
您已成功配置了一个具有 sudo 权限的用户。现在,您可以登录此用户帐户,并像使用 root 用户一样使用 sudo 执行命令。
它是如何工作的…
当您创建一个新帐户时,它没有运行管理员命令的权限。然而,在编辑 /etc/sudoers 文件并进行适当的条目以授予新用户帐户 sudo 访问权限后,您就可以开始使用新帐户执行所有管理员命令。
还有更多内容…
以下是一些您可以采取的额外措施,以确保完全的安全性。
漏洞评估
漏洞评估是审计您的网络和系统安全的过程,通过该过程,您可以了解网络的机密性、完整性和可用性。漏洞评估的第一阶段是侦察,这将进一步引导进入系统准备阶段,在该阶段我们主要检查目标中所有已知的漏洞。接下来是报告阶段,我们将所有发现的漏洞分为低风险、中等风险和高风险类别。
使用 Nmap 扫描主机
Nmap 是用于扫描网络的工具,是 Linux 中最流行的工具之一。它已经存在多年,目前是收集网络信息的首选工具之一。Nmap 可以由管理员在其网络上使用,用于查找任何开放端口和主机系统。在进行漏洞评估时,Nmap 绝对是一个不容错过的工具。
准备工作
大多数 Linux 版本都预装了 Nmap。第一步是使用以下命令检查您是否已安装它:
nmap --version
如果 Nmap 存在,您应该看到类似以下的输出:

如果 Nmap 尚未安装,你可以通过以下链接下载并安装它:nmap.org/download.html
以下命令将快速在你的系统上安装 Nmap:
sudo apt-get install nmap
如何操作...
扫描主机时请按照以下步骤操作:
-
Nmap 最常见的用途是查找给定 IP 范围内的所有在线主机。所使用的默认命令需要一些时间来扫描完整的网络,这取决于网络中主机的数量。
-
以下截图展示了一个例子:
![]()
-
要对子网中的特定 IP 执行 SYN 扫描,请使用以下命令:
![]()
-
如果 SYN 扫描不能正常工作,你也可以使用隐形扫描:
![]()
-
要检测远程主机上运行的服务版本号,可以执行服务版本检测扫描,如下所示:
![]()
-
如果你想检测远程主机上运行的操作系统,请运行以下命令:
nmap -O 192.168.1.102

-
这里的输出已被截断:
![]()
-
如果你只想扫描某个特定端口,如
80,请运行以下命令:![]()
它是如何工作的...
Nmap 通过测试最常见的网络通信端口来检查正在监听的服务。此信息有助于网络管理员关闭所有不需要或未使用的端口和服务。之前的示例展示了如何使用端口扫描以及如何利用 Nmap 作为强大的工具来研究我们周围的网络。
参见
Nmap 还具有脚本功能,可以用来编写自定义脚本。这些脚本可以与 Nmap 一起使用,自动化并扩展 Nmap 的扫描能力。
你可以在 Nmap 的官方网站找到更多关于使用 Nmap 的信息:nmap.org/
获取有漏洞的 Linux 系统的 root 权限
当尝试学习如何扫描并利用 Linux 机器时,我们遇到的一个主要问题是哪里可以进行尝试。为此,Metasploit 团队开发并发布了一款虚拟机,名为Metasploitable。这台机器故意设为有漏洞,运行了许多未打补丁的服务。因此,它成为了一个非常适合练习或开发渗透测试技能的平台。在本节中,我们将学习如何扫描 Linux 系统,并通过扫描结果,找到一个有漏洞的服务。利用这个漏洞服务,我们将获取系统的 root 权限。
准备工作
本节将使用 Kali Linux 和 Metasploitable VMware 系统。Metasploitable 的镜像文件可以从以下链接下载:
-
sourceforge.net/projects/metasploitable/files/Metasploitable2/ -
images.offensive-security.com/virtual-images/kali-linux-2018.2-vm-i386.zip
如何操作…
Metasploit 框架是一个开源工具,全球的安全专业人员使用它通过在框架内执行漏洞代码来进行渗透测试。它预装在 Kali Linux 中(Kali Linux 是安全专家的首选发行版)。
按照以下步骤获得对易受攻击的 Linux 系统的 root 访问权限:
- 首先通过运行以下命令在 Kali 系统上打开 Metasploit 控制台:
service postgresql start
msfconsole

-
在屏幕底部,你应该看到由
msf>表示的 Metasploit 框架提示符。 -
接下来,我们需要使用 Nmap 扫描目标(在本示例中是
192.168.0.102):
以下截图显示了命令的输出:

-
在前面的命令中,你可以看到许多服务正在不同的端口上运行。其中你可以看到 FTP 也在端口
21上运行。 -
我们现在重点关注 FTP 服务。从输出结果中可以看到,FTP 服务由 vsftpd 应用程序版本 2.3.4 提供。
-
现在让我们尝试在 Metasploit 框架中为
vsftpd寻找一个漏洞,通过简单地执行命令search vsftpd。以下是输出结果:

-
搜索结果显示了一个模块——VSFTPD 后门命令执行,评分非常高,这意味着这个漏洞可以完美地工作。
-
现在运行以下命令来使用漏洞并检查其选项:
![]()
-
如截图所示,你需要设置
RHOST的值,在我们的例子中是192.168.1.102。 -
设置
RHOST的值,然后按照如下所示执行漏洞:

- 一旦漏洞成功执行,你将获得 root 访问权限,如前面的截图所示。
它是如何工作的…
我们首先进行了 Nmap 扫描,检查运行的服务和开放的端口,并发现 FTP 服务正在运行。然后我们尝试找出 FTP 服务的版本。一旦获取了信息,我们就搜索是否有适用于 VSFTPD 的漏洞。搜索结果中找到的 VSFTPD 后门模块,实际上是 Metasploit 框架发送到目标机器的代码。由于 VSFTPD 的某个模块编写不当,代码会在目标机器上执行。一旦代码执行,我们就能在 Kali 机器上获得 root shell 访问权限。
使用找到的 VSFTPD 漏洞,我们尝试攻击目标系统并获得了 root shell。
还有更多…
让我们了解一些 Linux 中常见的其他漏洞和攻击方式。
缺少备份计划
在这个充满恶意攻击和危险网络攻击的时代,数据永远不安全。你的数据需要的不仅仅是保护,它还需要备份作为保险。在任何时候,如果你的数据丢失,拥有数据备份可以确保你的业务能够迅速恢复运行。
准备工作
当我们谈论 Linux 中的数据备份时,选择一个与业务需求相匹配的最佳备份工具是至关重要的。每个人都需要一个可靠的数据备份工具,但不需要花费过多,以便获得满足需求的功能。备份工具应该允许你进行本地备份、远程备份、一次性备份、定期备份等许多功能。
如何操作…
让我们来看一下几个出色的 Linux 备份工具。
fwbackups
这是所有 Linux 备份工具中最简单的。fwbackups 具有用户友好的界面,可以用于单次备份,也可以用于定期备份。
可以通过各种格式进行本地和远程备份,例如 tar、tar.gz、tar.bz 或 rsync 格式。可以使用该工具备份单个文件或整个计算机。
使用该工具,备份和恢复可以轻松完成。增量或差异备份可以加速该过程。
rsync
这是最广泛使用的 Linux 备份解决方案之一。它可用于增量备份,无论是本地备份还是远程备份。
rsync 可以在保持链接、所有权、权限和特权的同时,更新目录树和文件系统。
作为一款命令行工具,rsync 非常适合用来创建简单的脚本,结合 cron 使用,以便实现自动化备份。
Amanda(高级马里兰自动网络磁盘归档器)
这是一个为“中型计算机中心”开发的免费开源工具。它旨在通过网络对多台机器进行备份,备份目标可以是磁带驱动器、磁盘或光盘。
Amanda 可以用于备份多样化网络中的几乎所有内容,结合主备份服务器与 Linux 或 Windows 系统使用。
LVM 快照和硬件快照也可以通过该工具进行处理。
简单备份解决方案(SBS)
SBS 主要针对桌面备份,可以用于备份文件和目录。它还允许使用正则表达式进行排除操作。
它包括预定义的备份配置,可以用来备份如 /var/、/etc/、/usr/local 等目录。
SBS 可用于自定义备份、手动备份和定期备份,并不限于仅仅预定义的备份。
Bacula
Bacula 是一个免费开源工具,需要在每个目标系统上安装客户端程序,所有这些系统通过一个集中控制的服务器来管理备份规则。
Bacula 有自己的文件格式,并不是专有的,因为该工具是开源的。
可以使用该工具进行常规的全量和增量备份,如果使用多个服务器并配有独立磁带驱动器,它还提供更好的配置支持。
Bacula 支持加密和 RAID。Bacula 还提供了自定义备份任务的脚本语言,可以用来集成加密功能。
它是如何工作的…
备份工具对于任何 IT 行业从业者或计算机重度用户都是必需的。该备份工具应支持定时备份、一键备份、本地备份、远程备份以及许多其他功能。
第二章:配置安全且优化的内核
内核是任何操作系统的核心,无论是 Windows 还是 Linux。从技术上讲,Linux 只是内核,而不是完整的操作系统。作为操作系统的核心,内核首先被安装,通常无需手动配置。即使需要安装一些内核级别的更新,在 Linux 系统上也可以像常规应用程序一样进行安装。然而,在某些情况下,可能需要从源代码编译内核并进行特定的修改。
然而,可能会有一些情况需要您自己从源代码编译内核。这些情况包括:
-
启用内核中的实验性功能
-
启用新硬件支持
-
调试内核
-
探索内核源代码
在您开始构建 Linux 内核之前,必须确保已经存在用于 Linux 系统的有效启动媒体。这可以用于在引导加载程序配置不正确的情况下启动到 Linux 系统。您将学习如何创建 USB 启动媒体、获取内核源代码、配置和构建内核,并从内核安装并启动。
在本章中,我们将涵盖以下内容:
-
创建 USB 启动媒体
-
获取内核源代码
-
配置和构建内核
-
从内核安装并启动
-
内核测试与调试
-
使用 Netconsole 配置调试控制台
-
调试内核启动
-
内核错误
-
使用 Lynis 检查内核参数
创建 USB 启动媒体
可以在任何格式为 ext2、ext3 或 VFAT 的 USB 媒体设备上创建 USB 启动媒体。同时,请确保设备上有足够的空闲空间,通常在 4 GB 用于传输发行版 DVD 镜像,700 MB 用于发行版 CD 镜像,或仅 10 MB 用于传输最小启动媒体镜像。对于不太熟悉 Linux 的读者来说,学习如何创建启动媒体将非常有帮助。
准备工作
在开始步骤之前,您需要准备一个 Linux 安装磁盘的镜像文件,您可以将其命名为boot.iso,以及一个 USB 存储设备,正如之前所述。
操作步骤...
要开始创建 USB 启动媒体的过程,您需要以 root 用户执行以下命令:
- 要在您的系统上安装 Syslinux,只需执行以下命令:
sudo apt-get install syslinux
- 您需要通过在 USB 存储设备上执行以下命令来安装 Syslinux 引导加载程序:
syslinux /dev/sdb1
- 现在通过执行以下命令为
boot.iso文件和 USB 存储设备各创建一个挂载点:
mkdir /mnt/isoboot /mnt/diskboot
- 接下来,将
boot.iso文件挂载到为其创建的挂载点:
mount -o loop boot.iso /mnt/isoboot
在之前的命令中,-o loop选项用于创建一个伪设备,充当基于块的设备。它将文件视为块设备。
- 接下来,将 USB 存储设备挂载到为其创建的挂载点:
mount /dev/sdb1 /mnt/diskboot
- 一旦
boot.iso和 USB 存储设备都已挂载,复制boot.iso中的 Isolinux 文件到 USB 存储设备:
cp /mnt/isoboot/isolinux/* /mnt/diskboot
- 接下来,运行命令使用
boot.iso文件中的isolinux.cfg文件作为 USB 存储设备的syslinux.cfg文件:
grep -v local /mnt/isoboot/isolinux/isolinux.cfg > /mnt/diskboot/syslinux.cfg
- 完成前面的命令后,卸载
boot.iso和 USB 存储设备:
unmount /mnt/isoboot /mnt/diskboot
- 现在重新启动系统,然后尝试使用 USB 启动媒体启动,以验证您是否能从中启动。
它是如何工作的...
当您从 boot.iso 文件复制所需的文件到 USB 存储媒体,并将 USB 存储媒体中的 isolinux.cfg 文件作为 syslinux.cfg 文件使用时,它将把 USB 存储设备转换为可引导的媒体设备,从而可以用来启动 Linux 系统。
获取内核源代码
大多数 Linux 发行版都包含内核源代码。然而,这些源代码可能有些过时。因此,您在构建或定制内核时,可能需要获取最新的源代码。
准备就绪
大多数 Linux 内核开发者社区使用Git工具进行源代码管理。甚至 Ubuntu 也将 Git 集成到其 Linux 内核源代码中,从而使内核开发者能更好地与社区互动。您可以使用以下命令安装 Git 包:
sudo apt-get install git
如何做...
Linux 内核源代码可以从不同的来源下载,下面我们将介绍从这些来源下载的几种方法:
- 我们可以在 Linux 内核的官方网站上找到完整的 tarball 以及增量补丁的源代码:
除非您有特定的原因需要使用较旧的版本,否则始终建议使用最新版本。
- Ubuntu 的内核源代码可以在 Git 中找到。每个版本的内核代码都会在
kernel.ubuntu.com上以独立的 Git 仓库进行维护,仓库位置如下:
git://kernel.ubuntu.com/ubuntu/ubuntu-<release>.git
它位于这里:
http://kernel.ubuntu.com/git-repos/ubuntu/
-
您可以使用 Git 克隆仓库,获取本地副本。命令会根据您感兴趣的 Ubuntu 版本进行修改。
-
要获取精确的树结构,请插入以下命令:

要下载其他树结构,命令的语法如下:
git clone git://kernel.ubuntu.com/ubuntu/ubuntu-<release>.git
- 下载的文件将是 GNU ZIP(
gzip)格式或bzip2格式。下载源文件后,您需要解压它。如果压缩包是bzip2格式,请使用以下命令:
tar xvjf linux-x.y.z.tar.bz2
如果是压缩的 GNU ZIP 格式,请使用以下命令:
tar xvzf linux-x.y.z.tar.gz
它是如何工作的...
通过这里提到的不同方法,您可以下载 Linux 内核的源代码。使用任何选项都取决于用户的选择和偏好。
配置和构建内核
配置内核的需求可能由于多种原因而产生。您可能希望调整内核的大小,仅运行必要的服务,或者您可能需要打补丁以支持内核之前不支持的新硬件。对任何系统管理员来说,这可能是一项艰巨的任务,在本节中,您将看到如何配置和构建内核。
准备工作
始终建议在任何系统中为内核在启动分区中留出足够的空间。您应该选择整个磁盘安装选项,或者为启动分区分配至少 3 GB 的磁盘空间。安装完您的 Linux 发行版并配置了所需的开发包后,为您的用户帐户启用 sudo。现在在开始安装任何软件包之前,先更新系统:
sudo apt-get update && sudo apt-get upgrade
在此之后,您需要安装一些软件包才能开始。这些软件包包括此处提到的包:
-
最新版本的
gcc -
ncurses 开发包
-
用于交叉编译 Linux 内核所需的软件包
-
用于运行 make menuconfig 的包
为此,使用此处给出的命令:
sudo apt-get install build-essential gcc libncurses5-dev ncurses-dev binutils-multiarch alien bc libelf-dev
这些软件包用于在x86_64系统上配置和编译 Linux 内核。
如何操作...
完成准备工作部分的步骤后,您可以开始配置和构建内核的过程。这个过程会花费很长时间,所以请做好准备:
- 通过访问
www.kernel.org下载 Linux 内核,如此处截图所示:

- 或者您可以使用以下命令:
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.47.tar.xz

- 下载完成后,转到下载保存的文件夹。执行此操作的命令是:

- 现在使用以下命令将下载的 tar 文件提取到
/usr/src/:

- 接下来,切换到文件提取的文件夹:

- 现在运行命令来配置 Linux 内核,以便在系统上编译和安装:

如果您的帐户没有管理员权限,可能需要在命令前加上sudo。
- 执行前面的命令后,将弹出一个包含许多菜单的窗口,如此处所示。选择新配置的项目:

- 您需要检查文件系统菜单,如下所示:

- 在菜单下,检查是否已选择
ext4,如截图所示。如果没有选中,您需要现在选择它:

- 然后提供一个名称并保存配置:

- 现在编译 Linux 内核。根据系统配置,编译过程大约需要 40 到 50 分钟完成。按照下面的命令运行:
make -j 5
前述命令的输出如下图所示:

它是如何工作的...
首先下载 Linux 内核源代码,然后将其解压到特定位置,接着配置内核以进行编译过程。
安装并从内核启动
在花费大量时间配置和编译内核后,您现在可以开始将内核安装到本地系统的过程。
准备工作
在开始安装内核之前,确保备份系统中的所有重要数据。同时,将/boot/目录复制到格式化为 FAT32 文件系统的外部存储中。如果安装过程由于任何原因失败,这将有助于修复系统。
如何操作...
一旦内核编译完成,您可以开始按照此处的命令继续安装内核:
- 如果作为模块启用,可以通过运行命令来安装驱动程序。该命令将把模块复制到
/lib/modules的子目录中:

- 现在运行以下命令以安装实际的内核:
make install
前述命令将显示以下输出:

该命令执行/sbin/installkernel。新内核将安装到/boot/vmlinuz-{version}。如果/boot/vmlinuz已存在符号链接,它将通过将/boot/vmlinuz链接到新内核来刷新。以前安装的内核将作为/boot/vmlinuz.old可用。对配置文件和System.map文件也会发生相同的情况。
- 接下来,通过运行以下命令将内核复制到
/boot目录:
cp -v arch/x86/boot/bzImage /boot/vmlinuz-4.1.6
前述命令将显示以下输出:

-
现在制作初始 RAM 磁盘:
![]()
-
接下来,我们需要复制
System.map,它包含内核符号及其对应的地址。运行给定命令来执行此操作,并将内核的名称附加到目标文件中:![]()
-
接下来,创建一个
symlink /boot/System.map文件,该文件将指向/boot/System.map-YourKernelName,如果/boot所在的文件系统支持symlinks:![]()
如果/boot所在的文件系统不支持符号链接,只需运行cp /boot/System.map-YourKernelName /boot/System.map
它是如何工作的...
一旦内核配置并编译完成,就可以安装到系统中。第一个命令将模块复制到/lib/modules的子目录中。第二个命令执行/sbin/installkernel。同时,新的内核将被安装到/boot/vmlinuz-{version}中。在此过程中,如果/boot/vmlinuz已经存在符号链接,它将被更新,指向新的内核。而之前安装的内核将作为/boot/vmlinuz.old保留。配置文件和System.map文件也会做同样的处理。完成这些操作后,我们可以重启系统,使用新的内核启动:

内核测试和调试
任何开放或封闭的软件开发周期中,测试和调试都是重要的一部分。Linux 内核也不例外。测试和调试的最终目标是确保内核在安装新的内核源代码后,仍然能够与之前的版本以相同的方式工作。
使用 netconsole 配置控制台进行调试
Linux 内核的最大问题之一是内核恐慌(Kernel Panic)。它类似于微软 Windows 操作系统中的蓝屏死机(Blue Screen of Death)。如果内核发生恐慌,它将把大量信息显示在屏幕上,并保持在那里。如果系统重启,由于没有生成日志,就很难追踪内核恐慌。为了解决这个问题,我们可以使用 Netconsole。它是一个内核模块,可以通过 UDP 记录内核的printk消息。当磁盘日志失败时,这对于调试问题非常有帮助。
准备工作
在开始配置 Netconsole 之前,你需要知道要发送 UDP 数据包的系统的 MAC 地址。这个系统可以称为接收端,可能在同一子网中,也可能在不同的子网中。这里描述了这两种情况。我们先来看第一种情况,当接收端在同一子网中时:
-
本示例中接收端的 IP 地址是
192.168.1.4。我们将使用此命令将 UDP 数据包发送到该 IP 地址:![]()
-
现在通过执行以下命令,来查找接收端系统的 MAC 地址。这里,IP 地址是接收端系统的:
![]()
如前面的示例所示,90:00:4e:2f:ac:ef是我们需要的 MAC 地址。现在来看第二种情况,当接收端不在同一子网时。
- 在这种情况下,我们需要先找到默认网关。为此,执行下面的命令:
![]()
在这种情况下,默认网关是192.168.1.1。
- 我们需要找到默认网关的 MAC 地址。首先,向默认网关发送一个数据包:

- 现在我们来查找 MAC 地址:
![]()
这里,c0:3f:0e:10:c6:be是我们需要的默认网关的 MAC 地址。现在我们已经有了接收端的 MAC 地址,可以开始进行 Netconsole 的配置过程。
如何操作...
首先,你需要在启动时更改内核选项。如果你使用的是 GRUB 作为引导加载程序,它默认会以quiet splash选项引导内核。然而,你不希望这样发生,因此需要更改内核选项:
-
首先,创建
/etc/default/grub的备份:![]()
-
现在,打开你选择的任何编辑器来编辑
/etc/default/grub:![]()
找到GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"这一行,并将其替换为GRUB_CMDLINE_LINUX_DEFAULT="debug ignore_loglevel":

-
现在运行命令以相应地更新 GRUB:
![]()
-
完成这些命令后,你需要在启动时初始化 Netconsole。为此,首先需要知道发送端系统的 IP 地址和接口。可以通过以下命令获取:

你还需要接收系统的 IP 地址和 MAC 地址,这些信息我们已经在准备工作部分获取。
- 现在让我们开始初始化 Netconsole。首先,通过将模块添加到
/etc/modules来让 Netconsole 在启动时加载:![]()
接下来,确保它也配置了正确的选项。为此,将模块选项添加到/etc/modprobe.d/netconsole.conf文件中,然后运行以下命令:

在之前的命令中,以netconsole开头的部分具有以下语法:
netconsole=<LOCAL_PORT>@<SENDER_IP_ADDRESS>/<SENDER_INTERFACE>,<REMOTE_PORT>@<RECEIVER_IP_ADDRESS>/<STEP_1_MAC_ADDRESS>
我们使用6666作为<LOCAL_PORT>和<REMOTE_PORT>。
- 接下来,我们需要设置接收端。
根据使用的 Linux 版本不同,设置接收端的命令可能会有所不同:
netcat -l -u 192.168.1.4 6666 | tee ~/netconsole.log
或者如果之前的命令不工作,可以尝试不带 IP 地址的方式:
netcat -l -u 6666 | tee ~/netconsole.log
- 如果你使用的是具有不同版本 Netcat 的其他 Linux 变种,尝试之前的命令时将会显示以下错误消息:
![]()
如果出现错误信息,你可以尝试以下命令:

-
现在让之前的命令保持运行。
-
接下来,你需要检查一切是否正常工作。重启发送系统,然后执行以下命令:

-
现在你需要检查接收系统,看看内核消息是否已收到。
-
完成所有操作后,按下Ctrl + C。然后可以查看
~/netconsole.log中的消息。
它是如何工作的...
为了捕获内核 panic 消息,我们配置 Netconsole,它通过网络记录这些消息。为此,我们需要一个额外的系统作为接收端。首先,我们尝试找到接收系统的 MAC 地址。然后,我们更改内核启动选项。更新 GRUB 后,我们开始在发送端系统上初始化 Netconsole。最后,我们设置接收端系统开始接收内核消息。
还有更多...
如果你使用的是 Windows 系统作为接收端,我们也可以使用适用于 Windows 的 Netcat,下载链接为http://joncraton.org/files/nc111nt.zip。
从给定的链接下载文件,并将其解压到某个位置,例如C:\Users\Tajinder\Downloads\nc。
现在打开命令提示符(开始 | 运行 | cmd)。然后移动到你解压 Netcat 的文件夹:

接下来,运行以下命令:

这里,192.168.1.3就是<RECEIVER_IP_ADDRESS>。让前面的命令继续运行,然后继续执行第 9 步中的命令。一旦完成,按Ctrl + C。你会在netconsole.txt中找到消息。
调试内核启动
有时候,由于内核的变化,你的系统可能无法启动。因此,在创建关于这些失败的报告时,包含所有调试的相关信息非常重要。这将有助于内核团队解决问题。
如何操作...
如果你尝试捕获在启动过程中出现的错误信息,那么最好在启动内核时移除quiet和splash选项。这可以帮助你看到屏幕上出现的任何信息。
要编辑启动选项参数,请执行以下操作:
-
启动计算机。
-
在 BIOS 屏幕期间,按下Shift键并保持按住。BIOS 加载后,你应该看到 GRUB 菜单:
![]()
-
导航到你希望启动的内核条目并按下e键。
-
然后移除
quiet和splash关键字(在以linux开头的那一行中找到)。![]()
-
按下Ctrl + X启动。
如果有错误信息,你可以在屏幕上看到它们。根据你遇到的错误信息类型,可能有其他启动选项可以尝试。例如,如果你发现有 ACPI 错误,可以尝试使用acpi=off启动选项来启动。
内核错误
内核 panic 或内核错误是指 Linux 系统停止运行且似乎没有响应的情况。当内核检测到异常情况时,它会自愿暂停系统活动。当 Linux 系统检测到无法安全恢复的内部致命错误时,它会生成内核 panic。
内核错误的原因
在 Linux 中,内核错误可能由多种原因引起。这里我们将讨论其中一些原因:
- 硬件 – 机器检查异常:这种类型的内核错误是在硬件通过异常检测到并报告组件故障时引起的。通常,错误信息如下所示:
System hangs or kernel panics with MCE (Machine Check Exception) in /var/log/messages file.
System was not responding. Checked the messages in netdump server. Found the following messages ..."Kernel panic - not syncing: Machine check".
System crashes under load.
System crashed and rebooted.
Machine Check Exception panic
- 错误检测与纠正(EDAC):如果检测到任何内存芯片和 PCI 传输错误,硬件机制会报告此错误并导致 EDA 错误。此错误会在
/sys/devices/system/edac/{mc/,pci}中报告,通常如下所示:
Northbridge Error, node 1, core: -1
K8 ECC error.
EDAC amd64 MC1: CE ERROR_ADDRESS= 0x101a793400
EDAC MC1: INTERNAL ERROR: row out of range (-22 >= 8)
EDAC MC1: CE - no information available: INTERNAL ERROR
EDAC MC1: CE - no information available: amd64_edacError Overflow
- 不可屏蔽中断(NMI):当标准操作系统机制无法忽略或屏蔽一个中断时,就称为不可屏蔽中断(NMI)。它通常用于关键的硬件错误。在
/var/log/messages中出现的示例 NMI 错误如下所示:
kernel: Dazed and confused, but trying to continue
kernel: Do you have a strange power saving mode enabled?
kernel: Uhhuh. NMI received for unknown reason 21 on CPU 0
kernel: Dazed and confused, but trying to continue
kernel: Do you have a strange power saving mode enabled?
kernel: Uhhuh. NMI received for unknown reason 31 on CPU 0.
- 软件 – BUG()宏:当发生任何异常情况,表明存在编程错误时,内核代码会引发这种类型的内核错误。它通常如下所示:
NFS client kernel crash because async task already queued hitting BUG_ON(RPC_IS_QUEUED(task)); in __rpc_executekernel BUG at net/sunrpc/sched.c:616!invalid opcode: 0000 [#1] SMPlast sysfs file: /sys/devices/system/cpu/cpu15/cache/index2/shared_cpu_mapCPU 8Modules linked in: nfs lockd fscache nfs_acl auth_rpcgss pcc_cpufreq sunrpc power_meter hpilohpwdt igb mlx4_ib(U) mlx4_en(U) raid0 mlx4_core(U) sg microcode serio_raw iTCO_wdtiTCO_vendor_support ioatdma dca shpchp ext4 mbcache jbd2 raid1 sd_mod crc_t10dif mpt2sasscsi_transport_sas raid_class ahci dm_mirror dm_region_hash dm_log dm_mod[last unloaded: scsi_wait_scan]
-
软件 – 假死锁:这种类型的错误通常出现在系统似乎挂起时,可能有多种原因导致这种行为,如:
- 死锁:当运行实时内核时,如果应用负载过高,可能导致系统进入无法响应的状态。系统并未完全挂起,但看起来像是因为运行过慢。
当系统频繁挂起时,/var/log/messages 中记录的示例错误信息如下所示:
INFO: task cmaperfd:5628 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
cmaperfd D ffff810009025e20 0 5628 1 5655 5577 (NOTLB)
ffff81081bdc9d18 0000000000000082 0000000000000000 0000000000000000
0000000000000000 0000000000000007 ffff81082250f040 ffff81043e100040
0000d75ba65246a4 0000000001f4db40 ffff81082250f228 0000000828e5ac68
Call Trace:
[<ffffffff8803bccc>]
:jbd2:start_this_handle+0x2ed/0x3b7
[<ffffffff800a3c28>] autoremove_wake_function+0x0/0x2e
[<ffffffff8002d0f4>] mntput_no_expire+0x19/0x89
[<ffffffff8803be39>]
:jbd2:jbd2_journal_start+0xa3/0xda
[<ffffffff8805e7b0>]
:ext4:ext4_dirty_inode+0x1a/0x46
[<ffffffff80013deb>] __mark_inode_dirty+0x29/0x16e
[<ffffffff80041bf5>] inode_setattr+0xfd/0x104
[<ffffffff8805e70c>] :ext4:ext4_setattr+0x2db/0x365
[<ffffffff88055abc>] :ext4:ext4_file_open+0x0/0xf5
[<ffffffff8002cf2b>] notify_change+0x145/0x2f5
[<ffffffff800e45fe>] sys_fchmod+0xb3/0xd7
- 软件 – 内存不足杀手:当发生内存饥饿时,系统需要释放一些内存,通过杀死几个进程来触发这种错误或恐慌。此错误通常如下所示:
Kernel panic - not syncing: Out of memory and no killable processes...
每当发生内核恐慌或错误时,您可能需要分析这些错误以进行诊断和故障排除。可以使用 Kdump 工具来完成此操作。Kdump 可以按照以下步骤进行配置:
-
安装
kexec-tools。 -
编辑
/etc/grub.conf文件,并在内核行的末尾插入crashkernel=<reserved-memory-setting>。 -
编辑
/etc/kdump.conf并指定kexec输出的目标位置,即vmcore。 -
丢弃不必要的内存页,仅压缩所需的内存页,通过配置 Core 收集器来实现。
使用 Lynis 检查内核参数
任何操作系统都像其最弱的一环。就 Linux 而言,任何内核中的弱点都会导致系统的完全破坏。因此,有必要检查 Linux 内核的安全配置。
在本主题中,我们将学习如何使用 Lynis 自动检查内核参数。Lynis 有多个预定义的关键字对用于检查内核配置,并根据检查结果提供建议。
准备工作
要查看或编辑 Linux 内核的任何安全相关参数,可以使用/etc/sysctl.conf文件。所有参数都存储在此文件中,并且在启动时读取。如果你希望查看此文件中的可用内核参数,可以通过运行command:sysctl -a来实现。该命令将显示一个广泛的配置设置列表。内核安全参数也在此列表中。Lynis 帮助自动检查此文件中的内核安全参数,从而避免了手动检查每个参数的麻烦。为了使用 Lynis,运行工具的用户帐户需要对/tmp具有写访问权限。
如何操作…
Lynis 是一款开源安全工具,帮助审计运行 UNIX 衍生系统(如 Linux、macOS、BSD、Solaris、AIX 等)的系统。
以下是接下来的步骤列表:
- 使用 Lynis 的第一步是下载它的包。你可以通过这个链接来下载:

-
一旦你点击下载,你将获得一个 tarball 文件来保存。将其保存在系统中的任何文件夹里:
![]()
-
下一步是从 tar 文件中提取内容。你可以通过运行以下命令来完成:
![]()
一旦提取完成,你将在同一目录下获得一个名为lynis的目录。
- 进入
lynis目录,并列出其中的文件:

-
在
lynis目录内,除了其他文件,你还会看到一个名为lynis的可执行文件。运行这个文件后,你将能够看到所有可用的 Lynis 工具选项。你可以按以下方式运行该工具:![]()
-
要审计内核参数,你需要使用
audit system参数。一旦你使用该参数运行 Lynis,它将开始审计系统:

在结果中,你还将看到内核参数列表:

- 内核参数将在结果中显示,如下所示:

- 根据操作系统和内核版本,参数的数量可能会有所变化。如果任何参数配置不正确,Lynis 会通知你并提供建议。
第三章:本地文件系统安全
在本章中,我们将讨论以下内容:
-
使用
ls查看文件和目录详细信息 -
使用
chmod设置文件和目录的权限 -
使用
chown更改文件和目录的所有权 -
使用 ACLs 访问文件
-
使用 SELinux 实现强制访问控制
-
使用扩展文件属性保护敏感文件
-
使用
mv命令处理文件(移动和重命名) -
在 Ubuntu 上安装和配置基本的 LDAP 服务器
使用 ls 查看文件和目录详细信息
ls命令用于列出目录中的文件,类似于 DOS 中的dir命令。可以根据不同的参数使用该命令,以获得不同的结果。
准备工作
由于ls命令是 Linux 中的内置命令,我们无需安装其他任何东西即可使用它。
如何操作…
现在,让我们来看看如何通过这些步骤以不同的方式使用ls来获取各种结果:
- 要查看当前目录下的简单文件列表,输入
ls命令:

- 要获取更多关于文件和目录的信息,可以在
ls命令后添加类型标识符,如下所示:

- 当使用前面提到的标识符时,可执行文件的名称末尾会有一个星号,而目录会有一个斜杠,等等。要查看文件的详细信息,如创建日期、所有者和权限,可以运行带有
l标识符的命令,如下所示:

- 要列出当前目录下的所有隐藏文件,可以使用
a标识符,如下所示:

- 以点(.)开头的文件(也叫做点文件)是隐藏文件,如果没有使用
–an选项,它们不会显示。
要以可读的形式打印文件大小(如 MB、GB、TB 等),而不是以字节为单位显示,可以使用-h标识符与-l标识符一起使用,如下所示:

- 如果你只想排除所有文件并仅显示子目录,则可以使用
-d选项,如下所示:

- 当
ls命令与-R选项一起使用时,它还会显示子目录的内容:

它是如何工作的…
当我们使用不同的选项与ls命令时,它会根据不同的目录列出不同的结果。我们可以根据需求使用任何选项。
建议你养成使用ls -lah的习惯,这样你可以始终以可读的大小查看文件列表。
使用 chmod 设置文件和目录的权限
chmod,或称 Change Mode,是一个用于修改文件和目录访问权限的 Linux 命令。每个人都希望保持数据的安全和正确组织。因此,Linux 提供了将所有者和组与每个文件和目录关联的概念。这些所有者和组有不同的权限来访问特定文件。
正在准备中
在我们查看 chmod 命令的使用之前,我们需要知道,不同类型的用户使用的符号表示如下:
-
u用于表示用户/所有者 -
g用于表示组 -
o用于表示其他用户
现在,让我们创建一个名为 file1.txt 的文件,以检查 chmod 的不同命令。
如何操作...
现在,我们将展示如何以不同的方式使用 chmod 来设置不同的权限:
- 我们首先检查文件的当前权限以及它的创建时间:

如我们所见,目前只有用户/所有者具有读写权限,而组和其他用户只有读取权限。
- 现在,让我们使用
+符号来修改所有者的单一权限,这个符号用于添加权限:
chmod u+x file1.txt

该命令将为文件的所有者添加执行权限。
- 要添加多个权限,我们可以在一个命令中执行相同的操作。只需要使用逗号分隔不同的权限,如下所示:
chmod g+x,o+x file1.txt

该命令将为文件的组和其他用户添加执行权限。
- 如果我们希望删除某个权限,只需使用
-符号代替+,如下所示:
chmod o-x file1.txt

这将删除特定文件的其他用户的执行权限。
- 如果我们希望为所有用户(所有者、组和其他用户)添加或删除某个权限,可以通过使用
a选项(表示所有用户)来使用单个命令完成。
要为所有用户添加读取权限,可以使用以下命令:
chmod a+r file1.txt
要删除所有用户的读取权限,可以使用以下命令:
chmod a-r file1.txt

- 假设我们想要为目录中的所有文件添加特定权限。一种方法是之前看到的,为所有文件单独运行命令。相反,我们可以使用
-R选项,它表示给定操作是递归的。因此,要为目录中所有文件添加执行权限,命令将是:
chmod o+x -R /dir1

- 我们还可以使用
reference选项将某个文件的权限复制到另一个文件:
chmod --reference=file2 file1

在这里,我们已将 file2 的权限应用到另一个文件 file1。相同的命令也可以用于将一个目录的权限应用到另一个目录。
它是如何工作的...
当使用符号表示法时,chmod 的使用规则如下:
-
u用于表示用户/所有者 -
g用于表示组 -
o用于表示其他用户
此外,不同的权限表示如下:
-
r: 读取
-
w: 写入
-
x: 执行
因此,使用这些命令,我们可以根据需要更改用户、组或其他人的权限。
还有更多...
权限也可以通过数字形式设置,称为八进制表示法。我们可以同时编辑所有者、组和其他用户的权限。命令的语法如下:
chmod xxx file/directory
这里,xxx 表示从 1 到 7 之间的三位数字。第一位表示所有者的权限,第二位表示组的权限,第三位表示其他用户的权限。
当我们使用八进制表示法时,r、w 和 x 权限有特定的数值:
-
r = 4
-
w = 2
-
x = 1
所以,如果我们想添加读取和执行权限,它的计算方式如下:
- r-x = 4+0+1 = 5
类似地,读取、写入和执行权限的计算方式如下:
- rwx = 4+2+1 = 7
如果我们只想给予读取权限,它将是:
- r-- = 4+0+0 = 4
所以,现在如果我们运行给定的命令,它会按计算方式赋予权限:
chmod 754 file1.txt

使用chown更改文件和目录的所有权
文件所有权在 Linux 中是基础性的。因为每个文件都与一个所有者和一个组相关联,我们可以使用chown命令来更改文件或目录的所有者。
如何操作...
为了理解chown的使用方法,我们可以按照以下步骤操作:
- 为了理解
chown命令的使用,我们可以创建一个名为file1.txt的文件和一个名为user1的用户:

更改密码信息的先前命令是可选的。如果你不需要,可以忽略它。
- 现在,让我们检查
file1.txt的当前所有者。
我们可以看到,当前两个文件的所有者都是 root,并且它们属于 root 组。
- 让我们将
file1.txt的所有权更改为user1:

如这里所示,file1.txt的所有者已更改为user1。
- 如果我们想要更改文件的组,也可以使用
chown命令来完成:

- 我们可以在一个命令中同时更改文件的所有者和组,如下所示:

我们可以看到,file2.txt的所有者和组已经更改。
- 如果我们希望递归地更改目录及其内容的所有权,可以按照以下方式操作:

chown还可以用于将一个文件的所有者/组权限复制到另一个文件:

还有更多...
如果我们希望以详细的方式列出chown命令所做的更改,可以使用以下命令:

使用 ACLs 来访问文件
使用chmod实现基本文件权限是不够的,因此我们可以使用 ACL,或称为访问控制列表。除了为特定文件的所有者和组提供权限外,我们还可以为任何用户、任何用户组或任何不在特定用户组中的所有用户组设置权限。
准备就绪
在使用 ACL 之前,我们检查它是否已启用:
- 为此,我们尝试查看任何文件的 ACL,如下所示:

如果启用了 ACL,此命令将显示如下输出。在我们的例子中,/dev/sda1没有启用 ACL,因为它没有列在挂载选项中。
- 要启用 ACL,我们将其添加到文件系统中,使用以下命令:

- 现在,再次运行
tune2fs命令以确认 ACL 已启用:

现在,我们可以在/dev/sda1分区看到 ACL 选项。
如何执行...
为了理解 ACL 的工作原理,让我们按照以下步骤操作:
- 我们将首先检查任何文件或目录的默认 ACL 值。为此,我们使用
getfacl命令:

- 现在,要在
file1.txt上设置 ACL,我们将使用以下命令:

在上述命令中,我们为file1.txt文件的 root 用户授予了rwx权限。
当我们再次使用getfacl检查时,我们可以看到新的 ACL 值。
- 运行给定的命令以确认
file1.txt上的 ACL 设置:

文件权限后的(+)符号确认它已设置 ACL。
- 我们还可以通过使用
setfacl命令递归地设置文件夹上的 ACL。首先,我们将使用getfacl检查dir1目录的默认 ACL:

- 现在,让我们使用
setfacl为dir1目录添加rwx权限:

- 我们现在可以通过给定的命令确认目录上已设置 ACL:

- 现在,让我们检查
user1组在file1.txt上的 ACL:

- 让我们为
user1组设置rwx权限在file1.txt上:

还有更多...
每当我们处理文件权限时,最好对权限进行备份,特别是当文件很重要时。
在这里,我们假设我们有一个包含一些重要文件的dir1目录。然后,我们首先导航到dir1目录,并使用以下命令备份权限:
getfacl -R * > permissions.acl

该命令会创建权限的备份并将其存储在permissions.acl中。
现在,如果我们想恢复权限,命令如下:
setfacl --restore=permissions.acl

这将恢复所有权限,回到创建备份时的状态。
使用mv命令进行文件处理(移动和重命名)
mv或move命令用于将文件从一个目录移动到另一个目录,而不会创建任何重复文件,这与cp或复制命令不同。
准备工作
由于mv是 Linux 的内建命令,我们无需配置任何其他设置即可理解其工作原理。
它是如何工作的...
让我们通过不同的示例来看看如何使用mv命令:
- 要将
testfile1.txt从当前目录移动到其他目录,比如/home/practical/example,命令如下:
mv testfile1.txt /home/practical/example

只有当源文件位置与目标位置不同时,此命令才会生效。
当我们使用前面的命令移动文件时,文件将从原始位置被删除。
- 要使用单个命令移动多个文件,可以使用以下命令:
mv testfile2.txt testfile3.txt testfile4.txt /home/practical/example
当使用前面的命令时,我们移动的所有文件应位于相同的源位置。
- 移动目录的命令与移动文件时相同。假设我们在当前工作目录下有一个
directory1目录,并希望将其移动到/home/practical/example位置;命令如下:
mv directory1 /home/practical/example

mv命令还用于重命名文件和目录。假设我们有一个文件,example_1.txt,并且希望将其重命名为example_2.txt。实现这一操作的命令如下:
mv example_1.txtexample_2.txt
只有当源位置和目标位置相同的时候,此命令才会生效:

- 重命名目录与重命名文件的方式相同。假设我们有一个目录,
test_directory_1,我们想将其重命名为test_directory_2;命令如下:
mv test_directory_1/ test_directory_2/

- 当我们使用
mv命令移动或重命名大量文件或目录时,可以通过在命令中使用-v选项来检查命令是否成功执行。
假设我们想将当前目录中的所有文本文件移动到/home/practical/example目录,并希望确保它能正确工作;命令如下:
mv -v *.txt /home/practical/example

移动或重命名目录时也是如此,如下所示:

- 当我们使用
mv命令将文件移动到另一个位置,并且该位置已经存在同名文件时,默认命令将覆盖已存在的文件。然而,如果我们希望在覆盖文件之前显示弹出通知,则需要使用-i选项,如下所示:
mv -i testfile1.txt /home/practical/example

当执行上述命令时,它会通知我们目标位置已经存在同名文件。只有在我们按下 Y 时,命令才会完成,否则会被取消。
- 当使用
mv命令将文件移动到另一个位置时,如果目标位置已有同名文件,使用-u选项可以仅在源文件比目标文件更新时才更新目标文件。
我们在源位置有两个文件,file_1.txt 和 file_2.txt,首先使用 ls 命令检查文件的详细信息:
ls -l *.txt
现在,让我们检查目标位置文件的详细信息:
ls -l /home/practical/example/*.txt
现在,使用给定的命令移动文件:
mv -uv *.txt /home/practical/example/

我们看到 file1.txt 和 file2.txt 已经被移动到目标位置,并且因为源文件的时间戳较新,更新了先前的文件。
- 我们在源位置有两个文件,
file_1.txt和file_2.txt,首先使用以下命令检查文件的详细信息:
ls -l *.txt
现在,使用以下命令移动文件:
mv -vn *.txt /home/practical/example/
现在,让我们检查目标位置文件的详细信息:
ls -l /home/practical/example/*.txt
我们看到同名文件没有被移动,可以通过观察时间戳进行检查:

- 在移动文件时,如果目标位置已经有同名文件,我们还可以在新文件覆盖目标文件之前,创建目标文件的备份。为此,我们使用
-b选项:
mv -bv *.txt /home/practical/example
现在,让我们检查目标位置文件的详细信息。
我们在详细信息中看到有名为 file1.txt~ 和 file2.txt~ 的文件。这些文件是备份文件,可以通过时间戳验证,它们的时间戳早于 file1.txt 和 file2.txt。

使用 SELinux 实现强制访问控制
SELinux(安全增强型 Linux的缩写),是一种灵活的强制访问控制(MAC),旨在克服标准的 ugo/rwx 权限和 ACL 的限制。
正在准备中
在大多数 Linux 发行版中,如 CentOS 和 Redhat,SELinux 默认包含在内核中。然而,如果我们使用的是其他发行版,如 Debian,可能需要在系统上安装和配置 SELinux:
- 首先,我们必须通过运行以下命令来获取 SELinux 的基本工具集和默认策略:

- 安装完成后,运行以下命令配置 GRUB 和 PAM,并创建
/autorelabel:

之后,您需要重启系统,以便在启动时标记文件系统。
- 重启后,当系统启动时,您可能会收到以下警告:

现在,我们有一个正常工作的 SELinux 系统。
如何操作...
一旦我们有了一个正常工作的 SELinux 系统,我们可以选择如何使用它:
-
SELinux 可以以两种不同的方式运行:Enforcing 模式和 Permissive 模式。
-
让我们通过使用
getenforce命令来检查当前的模式:

如我们所见,SELinux 当前处于 Permissive 模式。
- 现在,如果我们希望切换模式,可以使用
setenforce命令:

当我们运行带有选项 1 的上述命令时,模式将切换为 Enforcing 模式。
- 如果我们想要切换回 Permissive 模式,可以再次使用带有选项 0 的
setenforce命令:

现在,模式已恢复为 Permissive 模式。
-
此更改不会在系统重启后保留。如果我们想要永久更改模式,必须编辑
/etc/selinux/config文件,并将 SELinux 变量更改为我们想要的模式:enforcing、permissive 或 disabled。 -
每当应用程序出现故障或无法正常工作时,作为故障排除的一部分,我们应该尝试在 SELinux 模式之间切换(从 Enforcing 到 Permissive,或反之)。这将帮助我们了解在切换到 Permissive 模式后,应用程序是否能正常工作。如果可以正常工作,那么我们就知道这是一个 SELinux 权限问题。
它是如何工作的...
SELinux 在两种模式下运行:Enforcing 和 Permissive 模式。在 Enforcing 模式下,SELinux 根据 SELinux 策略规则拒绝访问。这些规则是控制安全引擎的准则的一部分。
当 SELinux 在 Permissive 模式下工作时,它不会拒绝访问,但任何在 Enforcing 模式下会被拒绝的操作都会被记录下来。
可以修改 SELinux 规则,以允许在 Enforcing 模式下会被拒绝的任何应用程序或服务。
还有更多...
你可以通过输入man mv或mv --help来了解更多关于mv命令的信息。这将显示它的手册页面,我们可以在其中探索更多有关该命令的详细信息。
使用扩展文件属性保护敏感文件
扩展属性是一种可扩展的方式,用于在文件中存储元数据。这些是与文件和目录相关联的名称-值对。多个文件系统支持扩展文件属性,使得文件操作的自定义变得更加灵活。
准备中
目前,在 Linux 中有四种不同的命名空间用于扩展文件属性:
-
user -
trusted -
security -
system
有许多工具可以操作扩展属性,这些工具通常包含在attr软件包中,后者大多数 Linux 发行版都包含该软件包。
如果系统中没有安装attr,只需执行以下命令来安装它:
sudo apt-get install attr
要检查该软件包是否已安装在我们的系统中,只需在终端运行attr。如果出现如下输出,则表示该软件包已安装:

下一步是检查内核是否支持该属性。可以使用以下命令进行检查:

输出确认内核已支持该属性。
我们还需要确认文件系统是以user_xattr选项挂载的。为此,运行以下命令:

如何操作...
一旦我们确认了前面一节中提到的所有要求,就可以继续了解如何使用扩展属性:
- 首先,我们将创建一个包含一些虚拟数据的测试文件:

- 现在,我们将使用
setfattr命令向该文件添加一个扩展属性:

- 现在,让我们使用
getfattr命令确定文件上的属性:

- 如果我们想要检查属性的值,可以使用以下命令:

- 随时,如果我们想要删除任何属性,可以使用
setfattr命令,添加-x选项来实现。
在 Ubuntu 上安装和配置基本的 LDAP 服务器
轻量级目录访问协议(LDAP)是一种用于管理从某个集中位置访问文件和目录层次结构的协议。LDAP 主要用于集中认证。
LDAP 服务器有助于控制谁可以访问和更新目录中的信息。
准备工作
要安装和配置 LDAP,我们首先需要创建一个 Ubuntu 服务器。当前的 Ubuntu 服务器安装媒体版本可以在此找到:www.ubuntu.com/download/server。
下载后,按照提供的步骤安装 Ubuntu 服务器。
我们需要第二台安装了 Ubuntu 桌面版本的系统。将用来通过 Web 界面访问 LDAP 服务器。
完成后,我们可以继续安装 LDAP。
如何操作...
现在我们开始在 Ubuntu 服务器上安装和配置 LDAP:
- 我们将首先从 Ubuntu 的仓库更新服务器上的软件包列表,以获取所有软件包及其依赖项的最新版本信息:
sudo apt-get update
- 现在,运行命令来安装
slapd包及其相关工具,并安装ldap-utils来安装 LDAP 服务器:

-
在安装过程中,当系统提示时,输入并确认一个管理员密码,该密码将用于 LDAP 的管理员账户。配置一个您选择的密码并继续安装过程。
-
安装完软件包后,我们将根据我们的需求重新配置 LDAP 包。为此,输入以下命令:
Sudo dpkg-reconfigure slapd
这将启动一系列关于配置软件的问题。我们需要根据需求逐一选择选项。
- 第一个问题是是否忽略 OpenLDAP 服务器配置?选择否并继续:

- 接下来,输入域名。可以使用服务器上已存在的域名,也可以创建一个新的域名。我们在这里使用
example.com:

- 接下来,输入
组织名称:
-
-
接下来,配置 LDAP 的管理员密码。可以使用安装过程中配置的相同密码,或者在此步骤中更改为其他密码。
-
接下来,设置要使用的数据库后端。选择
MDB并继续:

-
现在,系统会询问是否希望在
slapd被删除时移除数据库。请选择否。 -
接下来,选择是以移动旧数据库,并允许配置过程创建一个新数据库:

- 当询问
是否允许使用 LDAPv2 协议?时,选择否,因为最新版本是 LDAPv3,LDAPv2 现在已经过时:

- 此时,配置过程完成,LDAP 正在运行:

- 现在让我们为 LDAP 打开防火墙端口,以便外部用户可以使用它:

- 现在我们将安装 PHPldapadmin 包,它将帮助通过 Web 界面管理 LDAP:
sudo apt-get install phpldapadmin

安装完成后,编辑 PHPldapadmin 的配置文件,以配置一些值:
Sudo nano /etc/phpldapadmin/config.php
- 现在,搜索给定部分并修改它,以反映 Ubuntu 服务器的域名或 IP 地址:
$servers->setValue('server','host','domain_name_or_IP_address');
- 接下来,编辑以下条目并插入我们在重新配置
slapd时给定的域名:
$servers->setValue('server','base',array('dc=example,dc=com'));
将域名作为值输入到前一行中的dc属性。由于我们的域名是example.com,因此前一行中的值将输入为dc=example, dc=com。
- 接下来,找到以下行,并再次将域名作为
dc属性输入。对于cn属性,值将仅为admin:
$servers->setValue('login','bind_id','cn=admin,dc=example,dc=com');
- 现在,搜索如下所示的部分,首先取消注释该行,然后将值设置为
true:
$config->custom->appearance['hide_template_warning'] = true;
完成所有这些更改后,保存并关闭文件。
- 当 PHPldapadmin 的配置完成后,在另一个系统中打开浏览器,该系统具有 Ubuntu 桌面版本。在浏览器的地址栏中,输入域名或服务器的 IP 地址,后跟
/phpldapadmin:
domain_name_or_IP_address/phpldapadmin
- 一旦 PHPldapadmin 页面打开,在左侧找到登录链接。点击它,你将看到一个登录提示:

如果 PHPldapadmin 配置正确,登录界面将显示正确的登录 DN 详细信息:

在我们的例子中,这是cn=admin,dc=example,dc=com。
- 一旦正确输入管理员密码,管理界面将会显示:

- 在管理界面中,在左侧看到域组件(
dc=example,dc=co)的位置,点击旁边的加号。它将显示正在使用的管理员登录:

- 我们的基础 LDAP 服务器现在已设置并正常运行。
它是如何工作的……
我们首先创建一个 Ubuntu 服务器,然后在其上安装slapd包来安装 LDAP。安装完成后,我们安装所需的附加包。然后,我们根据需求重新配置 LDAP。
配置完成后,我们安装 PHPldapadmin 包,它将帮助我们通过浏览器的 Web 界面管理 LDAP 服务器。
第四章:Linux 中的本地认证
在本章中,我们将讨论以下内容:
-
用户认证与日志记录
-
限制用户的登录能力
-
禁用用户名/密码登录
-
使用 acct 监控用户活动
-
使用 USB 设备和 PAM 进行登录认证
-
定义用户授权控制
-
使用 IDAM 进行访问管理
用户认证与日志记录
用户认证的一个重要部分是监控系统用户。Linux 提供了多种方法来追踪用户的成功与失败的登录尝试。
准备工作
Linux 系统会记录系统中所有账户的登录尝试。这些日志都位于/var/log/目录下:

如何操作...
Linux 有许多方法帮助管理员查看日志,既有图形界面方法,也有命令行方法:
- 如果我们想检查某个特定用户(例如 root)的错误登录尝试,可以使用以下命令:
lastb root

- 要使用终端查看日志,我们可以使用
dmesg命令。此命令显示存储在内存中的 Linux 内核消息缓冲区,如下所示:

- 如果我们希望过滤前面的输出,仅显示与 USB 设备相关的日志,可以使用
grep来实现:

- 如果我们不想查看所有日志,而只查看特定日志文件中的 10 条最新日志,可以使用以下命令:

在前面的命令中,-n选项用于指定要显示的行数。
- 如果我们希望查看用户账户的最新登录尝试,可以使用
last命令:

last命令以格式化的方式显示var/log/wtmp日志。
- 如果我们想查看每个用户最后一次登录系统的时间,可以使用
lastlog命令:

如何工作...
Linux 有不同的文件来记录不同类型的日志。通过这里展示的命令,我们可以查看这些日志并获取详细信息。每个命令提供了不同类型的细节。
限制用户的登录能力
作为一名 Linux 系统管理员,你可能希望限制特定用户或组对 Linux 系统的访问。在本节中,我们将学习如何使用/etc/securetty和/etc/security/access.conf这两个文件来限制用户访问。
准备工作
这里提供的所有步骤已在 Ubuntu 系统上进行了测试;然而,你也可以在任何其他 Linux 发行版上执行这些步骤。
如何操作...
让我们学习如何编辑前面提到的两个文件,以对 Linux 系统上的用户访问进行不同的限制:
- 首先,我们将使用
more命令检查/etc/securetty文件的内容:
more /etc/securetty

正如我们在前面的截图中看到的,文件指定了允许 root 登录的终端。
- 现在,使用你选择的任何编辑器编辑文件,并按图所示注释掉
tty1项:

在完成前述步骤并进行更改后,保存并退出编辑器。
- 现在,通过运行命令
chvt 1切换到tty1终端。如果我们现在尝试以 root 身份登录,将会得到以下结果:

我们可以看到系统已拒绝 root 账户的访问。如果我们仍然希望获取 root 权限,我们必须首先以普通用户身份登录,然后使用sudo或su命令。
- 从同一个终端,当我们尝试以普通用户账户登录时,登录结果如图所示:

-
我们已经看到如何使用
/etc/securetty文件来指定从任何终端进行 root 账户访问。现在,让我们来看一下如何允许或拒绝特定用户的访问。 -
第一件事是修改
/etc/pam.d/login文件,并添加pam_access.so模块。这将允许pam扫描/etc/security/access.conf文件并检查我们定义的规则。
所以我们打开etc/pam.d/login,找到那行写着#account required pam_access.so的内容,去掉#以取消注释该行:

- 接下来,我们将在
/etc/security/access.conf中定义一个规则。使用任何编辑器打开该文件,并根据以下语法定义规则:
permission : users : origins
- 如果我们想要拒绝 root 账户从
tty1终端的访问,可以使用以下规则:

- 要拒绝
user1的访问,我们使用以下规则:

- 如果我们想要在同一规则中指定多个用户名,可以像下面这个规则一样操作:

它是如何工作的...
Linux 使用/etc/securetty来指定哪些终端可以进行 root 访问。因此,当我们在该文件中进行更改时,特定终端的 root 访问也会受到影响。
同样,/etc/security/access.conf文件被pam用来检查是否允许特定用户的终端访问。该文件中定义的规则遵循以下语法:
permission : users: origins
这里,permission指的是拒绝或允许规则,并由-或+符号表示。
Users 指的是一个登录用户名的列表。
Origins 指的是允许或拒绝访问的来源。
禁用用户名/密码登录
系统管理员的一个重要职责是配置和管理 Linux 系统中的用户和组。这也涉及到检查所有用户的登录能力,并在必要时禁用它们。
准备工作
这里给出的所有步骤都在 Ubuntu 系统上进行了尝试;然而,你也可以在任何其他 Linux 发行版上按照这些步骤进行操作。
如何操作...
在这里,我们将讨论如何在 Linux 系统上限制用户的登录能力:
- 我们可以通过在
/etc/passwd文件中将帐户的登录 shell 更改为特殊值来限制用户帐户的访问。让我们以user1帐户为例,在/etc/passwd文件中检查详细信息,如下所示:

- 在这些详细信息中,
user1帐户的最终值设置为/bin/bash。目前,我们可以从user1帐户登录。现在,如果我们要更改希望限制的用户帐户的 shell,我们可以像这样做:

- 如果我们现在尝试从用户 1 登录,我们会收到以下错误:

- 限制用户访问的另一种方式是使用
/etc/shadow文件。如果我们使用cat命令检查此文件的详细信息,我们将得到以下结果:

-
详细信息显示了
user3帐户的哈希密码(以... \(6\)wI1akgI4...开头)。 -
现在,要锁定
user3帐户,命令如下:
passwd -l user3

让我们再次查看/etc/shadow文件中user3帐户的详细信息。我们看到哈希密码已通过添加!而变为无效。
cat /etc/shadow | grep user3

- 要再次解锁帐户,命令如下:
passwd -u user3
- 如果我们想要检查帐户是否已被锁定,可以使用此命令进行检查:

正如我们在输出中看到的,user1帐户已被锁定,第二字段的细节显示为L,而user2没有被锁定,因为细节中显示为P。
- 锁定或解锁帐户的过程也可以使用
usermod命令完成。要使用usermod锁定帐户,命令如下:
usermod -L user2

- 一旦锁定,如果我们尝试从该帐户登录,我们会收到以下错误:

- 要使用
usermod解锁帐户,命令如下:
usermod -U user2

它是如何工作的……
对于 Linux 中的每个帐户,用户帐户详细信息存储在/etc/passwd和/etc/shadow文件中。这些详细信息指定用户帐户的行为。当我们能够更改这些文件中任何用户帐户的详细信息时,我们能够更改用户帐户的行为。
在前面的部分中,我们已经看到如何修改这些文件以“锁定”或“解锁”用户帐户。
使用 acct 监控用户活动
Acct是一个开源应用程序,可以帮助监控 Linux 系统上的用户活动。它在后台运行,跟踪用户的所有活动,并记录正在使用的资源。
准备就绪
要使用acct命令,我们首先需要通过以下命令在 Linux 系统上安装该软件包:
apt-get install acct

如果前述方法无法正常工作,我们可以访问此链接手动下载软件包:
packages.ubuntu.com/precise/admin/acct
下载软件包后,我们需要将其解压到某个目录中,就像我们在桌面上所做的那样:

然后,进入该目录:

接下来运行脚本来配置该软件包:

配置完成后,接下来运行make命令:

然后,运行make install命令:

一旦成功完成,它将把软件包安装到你的 Linux 系统上。
如何操作...
acct 包有不同的命令来监控进程活动:
- 根据特定用户从 wtmp 文件中登录和注销的情况,如果我们希望检查总连接时间,可以使用
ac命令:

- 如果我们希望按天打印总登录时间,可以在“ac”命令中使用
-d选项:

- 要打印按用户统计的总登录时间,我们使用以下命令:

- 如果我们只希望检查特定用户的登录时间,可以使用以下命令:

- 我们还可以通过使用
lastcomm命令查看所有用户或特定用户之前执行的命令:

它是如何工作的...
为了监控系统,我们首先需要在系统上安装 acct 包。对于其他一些 Linux 发行版,如果acct不兼容,可以使用psacct包。
一旦工具安装并运行,它会开始维护系统活动日志。我们可以使用前面讨论的命令来查看这些日志。
使用 USB 设备和 PAM 进行登录认证
当一个 Linux 用户想要保护系统安全时,最常见的方法通常是使用他们的登录密码。然而,我们知道这种方法并不非常可靠,因为有许多方法可以破解传统的密码。为了提高安全性,我们可以使用像身份验证令牌这样的 USB 设备,用于登录系统。
准备就绪
为了执行这些步骤,我们需要一个 USB 存储设备,并且在 Linux 系统上下载 可插拔认证模块(PAM)。大多数 Linux 系统以预编译软件包的形式提供 PAM,可以从相关的软件仓库中获取。
如何操作...
通过使用任何类型的 USB 存储设备和 PAM,我们可以创建身份验证令牌:
- 首先,我们需要安装 PAM USB 认证所需的包。为此,我们运行以下命令:
$ sudo apt-get install pamusb-tools libpam-usb

- 安装完软件包后,我们必须配置 USB 设备以使用 PAM 认证。为此,我们可以使用命令,或者编辑
/etc/pamusb.conf文件。
若要使用命令方法,首先连接 USB 设备,然后执行以下命令:
$ sudopamusb-conf --add-device usb-device

在前面的命令中,usb-device是我们正在使用的 USB 设备的名称。这个名称可以是你选择的任何名称。
使用pamusb-conf命令时,它会自动发现 USB 设备,包含多个分区。当命令执行完成后,它会在/etc/pamusb.conf文件中添加一个 XML 代码块,定义我们的 USB 设备:

- 接下来,我们定义我们的 USB 设备:
$ sudopamusb-conf --add-user user1

如果用户已存在,它将被添加到 PAM 配置中。
前面的命令将pam_usb用户的定义添加到/etc/pamusb.conf文件中:

- 现在,我们将配置 PAM,在系统认证过程中添加
pam_usb模块。为此,我们将编辑/etc/pam.d/common-auth文件,并添加以下行:

这将使系统范围的 PAM 库识别pam_usb模块。
required选项指定需要正确的密码,而sufficient选项表示这也可以认证用户。在前面的配置中,我们使用sufficient进行 USB 设备认证,但对默认密码使用required。
如果系统中未定义user1的 USB 设备,用户需要输入正确的密码。为了在授予系统访问权限之前强制用户完成两个认证流程,请将sufficient更改为required。
- 现在,我们将尝试切换到
user1:

当被要求时,连接 usb-device。如果连接了正确的 USB 令牌设备,登录将完成,否则会出现错误。
- 如果出现任何错误,比如此处显示的错误,可能是因为 USB 设备的路径未正确添加:
Error: device /dev/sdb1 is not removable
* Mount failed
在这种情况下,将 USB 设备的完整路径添加到/etc/pmount.allow。
- 现在,运行该命令检查 USB 设备分区如何在文件系统中列出:
$ sudo fdisk -l

在我们的情况下,分区已列为/dev/sdb1。
-
现在,在
/etc/pmount.allow文件中添加一行,以解决该错误。 -
我们目前在
/etc/pam.d/common-auth中所做的配置意味着,如果 USB 设备未连接,用户仍然可以使用正确的密码登录。如果我们希望强制用户在登录时也使用 USB 设备,则将sufficient改为required,如下所示:

- 如果用户现在尝试登录,他们将需要输入正确的密码并插入 USB 设备:

- 现在,移除 USB 设备并尝试使用正确的密码再次登录:

它是如何工作的...
一旦我们安装了所需的 pam-usb 包,我们编辑配置文件以添加我们的 USB 设备,将其作为认证令牌使用。之后,我们添加需要使用的用户账户。然后,我们在 /etc/pam.d/common-auth 文件中做更改,以指定 USB 认证如何工作,并且是否始终需要进行登录。
还有更多内容...
我们已经看过如何使用 USB 设备来验证用户登录。除此之外,我们还可以利用 USB 设备触发事件,每次它从系统中断开或连接时都会发生此事件。
让我们修改 /etc/pamusb.conf 中的 XML 代码,以便为用户定义添加事件代码:

由于前面的修改,每当用户断开 USB 设备时,屏幕将被锁定。类似地,当用户再次连接 USB 设备时,屏幕将解锁。
定义用户授权控制
在计算机上定义用户授权主要是决定用户可以或不能执行的操作。这可能包括执行程序或读取文件等活动。
由于 root 账户拥有所有权限,授权控制主要是决定是否允许用户账户访问 root 权限。
准备开始
为了查看用户授权如何工作,我们需要一个用户账户来尝试这些命令。所以,我们创建了几个用户账户,user1 和 user2,来执行这些命令。
如何操作...
在本节中,我们将介绍可以应用于用户账户的各种控制:
- 假设我们有两个用户账户,
user1和user2。我们从user2登录,然后尝试以user1身份运行命令ps。在正常情况下,我们会得到以下结果:

- 现在,编辑
/etc/sudoers文件并添加这一行:
User2 ALL = (user1) /bin/ps
- 在
/etc/sudoers中保存更改后,再尝试从user2以user1身份运行ps命令:

- 现在,如果我们希望从
user2以user1身份再次运行相同的命令,但不要求输入密码,我们可以通过编辑/etc/sudoers文件来实现,方法如下:

- 现在,当我们以
user1身份从user2运行ps命令时,我们看到它不再要求输入密码:

-
现在我们已经看到如何在不要求输入密码的情况下运行命令,系统管理员的主要关注点将是
sudo始终提示输入密码。 -
要使
user1用户帐户在系统上始终提示输入密码,请编辑/etc/sudoers文件并添加以下行:
Defaults:user1 timestamp_timeout = 0

- 现在,如果
user1尝试运行任何命令,系统将始终提示输入密码:

- 现在,假设我们要授予
user1帐户更改user2和user3密码的权限。编辑/etc/sudoers文件并添加以下行:

- 现在,从
user1登录,让我们尝试更改user2和user3帐户的密码:

它是如何工作的...
使用sudo命令和/etc/sudoers文件,我们进行必要的更改,以按要求执行任务。
我们编辑文件以允许以其他用户身份执行程序。我们还添加了NOPASSWD选项,以便在执行程序时不要求输入密码。然后我们添加所需的行,以便sudo始终提示输入密码。
接下来,我们将看到如何授权用户帐户更改其他用户帐户的密码。
使用 IDAM 进行访问管理
在今天的世界中,一个 Linux 系统可能被多个本地或远程用户使用。管理这些用户的访问权限变得至关重要,以保护那些仅应由少数经过身份验证的用户访问的敏感和机密信息。
IDAM(身份和访问管理)工具可以帮助系统管理员轻松管理各种用户的身份和访问权限。
准备就绪
要开始安装和配置 WSO2 Identity Server,我们需要任何已设置 Java 环境的 Linux 发行版。
在这里,我们将看到如何设置 Java 环境:
- 在安装 JDK 之前,我们需要安装一个与 Python 相关的包作为依赖项。执行此操作的命令如下:

- 现在,要安装 Oracle JDK,即 Oracle 官方版本,我们需要更新系统的包仓库并添加 Oracle 的 PPA。为此,我们运行以下命令:

- 现在,通过运行以下命令安装 Java 的稳定版本:

- 安装完成后,下一步是设置
JAVA_HOME环境变量。为此,使用任何编辑器编辑/etc/environment文件并添加以下行:

- 为了测试环境变量是否已正确设置,可以执行以下命令:

我们可以看到在前面的步骤中设置的路径。
如何操作...
在系统上完成 JDK 的安装和配置后,我们可以继续安装和配置 WSO 身份和访问管理服务器:
-
首先,从以下链接下载 WSO2 包:
wso2.com/identity-and-access-management/install/download/?type=ubuntu -
接下来,创建一个目录
/var/wso2,并将下载的包解压到此目录中:

- 为了提取包,运行以下命令:
unzip ~/wso2is-5.6.0.zip /var/wso2
- 提取过程完成后,我们可以检查目录中的文件:

- 接下来,如果我们希望配置服务器使用 FQDN 而不是
localhost启动,我们可以更改carbon.xml文件中的配置。为此,编辑位于[INSTALL_DIR]/repository/conf/carbon.xml的carbon.xml文件:

修改<HostName>,将 localhost 替换为系统的 FQDN:

- 现在,我们可以启动 WSO2 身份服务器。为此,运行以下命令:

- 一旦服务器成功启动,它会显示类似于
WSO2 Carbon started in 463 sec的行,如下所示:

- 一旦服务器启动并运行,我们可以通过浏览器访问它。访问服务器的默认配置始终是通过 HTTPS 并使用端口
9443:

在登录页面,使用默认用户名admin和默认密码admin进行登录。
- 登录后,我们可以用它来添加用户和角色。
Linux 管理员现在可以使用 WSO2 IS 来管理身份并执行访问管理。
工作原理...
WSO2 身份服务器是一个开源的 IAM 产品,专注于访问管理、访问控制、身份治理管理、API 安全等众多功能。
第五章:远程身份验证
本章将讨论以下内容:
-
使用 SSH 访问远程服务器/主机
-
禁用或启用 SSH 根用户登录
-
基于密钥的 SSH 登录以限制远程访问
-
远程复制文件
-
使用 Ubuntu 设置 Kerberos 服务器
-
使用 LDAP 进行用户身份验证和管理
使用 SSH 访问远程服务器/主机
安全外壳(SSH)是一种用于安全登录远程系统的协议,是访问远程 Linux 系统的最常用方法。
准备工作
要了解如何使用 SSH,您需要两台 Ubuntu 系统。一台作为服务器,另一台作为客户端。
如何操作……
要使用 SSH,您可以使用一个名为 OpenSSH 的免费软件。安装该软件后,可以通过ssh命令使用它。我们将详细了解如何使用此工具:
- 如果 OpenSSH 服务器尚未安装,可以使用以下命令进行安装:
sudo apt-get install openssh-server

- 接下来,我们需要安装软件的客户端版本:
sudo apt-get install openssh-client

- 对于最新版本,SSH 服务在软件安装后会自动启动。如果默认情况下没有运行,我们可以使用以下命令启动服务:
sudo service ssh start

- 现在,要从任何其他系统通过 SSH 登录到服务器,可以使用以下命令:
ssh remote_ip_address
这里,remote_ip_address指的是服务器系统的 IP 地址。此外,假设客户端机器上的用户名与服务器机器上的用户名相同:

如果我们想以不同的用户登录,命令将如下所示:
ssh username@remote_ip_address

- 接下来,我们需要根据需求配置 SSH。Ubuntu 中
sshd的主要配置文件位于/etc/ssh/sshd_config。在对该文件的原版进行任何更改之前,请使用以下命令创建备份:
sudo cp /etc/ssh/sshd_config{,.bak}
配置文件定义了服务器系统上 SSH 的默认设置。
- 打开文件在文本编辑器中,我们可以看到
sshd服务器监听传入连接的默认端口声明是22。我们可以将其更改为任何非标准端口,以通过防止随机端口扫描来增强服务器的安全性,从而使其更安全。假设我们将端口更改为888,那么下一次客户端想连接到 SSH 服务器时,命令将如下所示:
ssh -p port_numberremote_ip_address

如您所见,当您运行命令时,如果未指定端口号,则连接会被拒绝。当您指定正确的端口号时,连接将成功建立。
如何操作……
SSH 用于将客户端程序连接到 SSH 服务器。在一台系统上,我们安装 openssh-server 软件包将其设置为 SSH 服务器,而在另一台系统上,我们将安装 openssh-client 软件包以将其用作客户端。
现在,保持服务器系统上的 SSH 服务运行,我们尝试通过客户端连接到它。
我们使用 SSH 的配置文件来更改连接的默认端口等设置。
启用和禁用 SSH 上的 root 登录
Linux 系统默认启用 root 账户。未经授权的用户获得 root 访问权限可能会非常危险。
我们可以根据需要禁用或启用 root 用户的 SSH 登录,以防止攻击者获得系统访问权限。
准备就绪
我们需要两台 Linux 系统作为服务器和客户端。在服务器系统上,安装 openssh-server 软件包,如前面的配方所示。
如何操作...
首先,我们将看到如何禁用 SSH root 登录,然后我们也会看到如何重新启用它:
- 首先,在任何编辑器中打开 SSH 的主配置文件
/etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
- 现在查找以下内容的行:
PermitRootLogin yes
- 将
yes的值更改为no。然后保存并关闭文件:
PermitRootLogin no

- 完成后,使用以下命令重启 SSH 守护进程服务:

- 现在让我们尝试以 root 用户登录。我们应该会收到一个错误:
"Permission Denied"
这是因为 root 登录已被禁用:

- 现在每当我们想要以 root 用户登录时,首先我们必须以普通用户身份登录。之后,我们可以使用
su命令切换到 root 用户。所以,/etc/sudoers文件中没有列出的用户将无法切换到 root 用户,系统将更加安全:

- 如果我们想要再次启用 SSH 的 root 登录,我们只需要重新编辑
/etc/ssh/sshd_config文件,并将no选项改为yes:
PermitRootLogin yes

- 然后再次使用以下命令重启服务:

- 现在,如果我们再次尝试以 root 用户身份登录,它将成功:

它是如何工作的...
当我们尝试使用 SSH 连接到远程系统时,远程系统会检查其位于 /etc/ssh/sshd_config 的配置文件,并根据文件中提到的细节决定是否允许连接。
还有更多...
假设我们的系统上有许多用户账户。我们需要编辑 /etc/ssh/sshd_config 文件,以便仅为少数指定的用户允许远程访问:
sudo nano /etc/ssh/sshd_config
添加以下行:
AllowUsers tajinder user1
现在重启 SSH 服务:
sudo service ssh restart
现在,当我们尝试以 user1 登录时,登录成功。然而,当我们尝试以 user2 登录时,由于 user2 未在 /etc/ssh/sshd_config 文件中添加,登录失败,并且我们会收到 "Permission denied" 错误,如下所示:

基于密钥的 SSH 登录以限制远程访问
尽管 SSH 登录通过使用用户账户密码进行保护,但我们可以通过使用基于密钥的 SSH 身份验证来增强其安全性。
准备工作
要查看基于密钥的身份验证如何工作,我们需要两个 Linux 系统(在我们的示例中,都是 Ubuntu 系统)。我们应该在它们上面安装 OpenSSH 服务器包。
操作步骤...
要使用基于密钥的身份验证,我们需要创建一对密钥——一个私钥和一个公钥:
- 在客户端或本地系统上,执行以下命令生成 SSH 密钥对:
ssh-keygen -t rsa

在创建密钥时,我们可以接受默认值或根据需要进行更改。它还会询问是否设置密码短语,您可以选择任何内容或将其留空。
- 密钥对将被创建在
~./ssh/目录中。切换到该目录,然后使用ls -l命令查看密钥文件的详细信息:

我们可以看到id_rsa文件只能由所有者读取和写入。此权限确保文件的安全性。
- 现在,我们需要将公钥文件复制到远程 SSH 服务器。为此,我们运行以下命令:
ssh-copy-id 192.168.1.101

一个 SSH 会话将被启动,并提示输入用户账户的密码。一旦输入正确的密码,密钥将被复制到远程服务器。
- 一旦公钥成功复制到远程服务器,再次使用以下命令尝试登录到服务器:
ssh 192.168.1.101

我们可以看到现在我们不再被要求输入用户账户的密码。由于我们已为 SSH 密钥配置了密码短语,因此没有被询问密码。如果没有配置密码短语,则系统会要求我们输入密码。
工作原理...
当我们创建 SSH 密钥对并将公钥移至远程系统时,它作为连接远程系统的身份验证方法。如果远程系统中的公钥与本地系统生成的公钥匹配,并且本地系统也拥有完整的密钥对的私钥,则会进行登录。否则,如果任何密钥文件丢失,则不允许登录。
远程复制文件
使用 SSH 进行远程管理系统非常方便。然而,许多人并不知道 SSH 还可以帮助远程上传和下载文件。
准备工作
要尝试文件传输工具,我们需要两个可以互相 ping 的 Linux 系统。我们还需要在其中一台系统上安装 OpenSSH 包,并确保 SSH 服务器正在运行。
操作步骤...
Linux 提供了一些可以帮助在联网计算机之间传输数据的工具。在本节中,我们将看看它们的部分工作原理:
- 假设我们在本地系统上有一个
myfile.txt文件,想要将其复制到远程系统。执行以下命令进行复制:
scp myfile.txt tajinder@sshserver.com:~Desktop/

这里,文件将被复制到的远程位置是用于连接的用户账户的Desktop目录。
- 当我们检查远程 SSH 系统时,我们可以看到
myfile.txt文件已成功复制:

- 现在,假设我们在本地系统中有一个目录
mydata,我们希望将其复制到远程系统。这可以通过在命令中使用-r选项来完成:
scp -r mydata/ tajinder@sshserver.com:~Desktop/

- 再次检查远程服务器,我们看到
mydata目录已经连同所有文件一起复制成功:

- 现在,我们将看到如何将文件从远程系统复制回本地系统。
首先,在远程服务器上创建一个文件。我们的文件是newfile.txt:

- 现在,在本地系统中,进入你希望复制文件的目录。
然后,运行如所示的命令,将文件从远程系统复制到当前目录中的本地系统:
scp -r tajinder@sshserver.com:/home/tajinder/Desktop/newfile.txt .

-
你也可以使用
sftp工具,通过使用ftp命令交互式地从远程系统复制文件。 -
为此,首先使用以下命令启动连接:
sftp tajinder@sshserver.com

- 接下来,你可以运行任何
ftp命令。在我们的例子中,我们尝试使用get命令从远程系统获取文件,如下所示:
get sample.txt /home/tajinder/Desktop

- 在本地系统中,你现在可以检查文件是否已成功复制:

-
SSH 还可以通过 Nautilus(GNOME 桌面环境的默认文件管理器)工作。因此,我们可以使用 GNOME 文件浏览器启动与远程系统的 SSH 连接,而不是使用命令行。
-
在 GNOME 文件浏览器中,前往文件 | 连接到服务器。
-
在下一个窗口中,输入所需的详细信息并点击连接:

- 现在我们可以通过图形界面从远程系统复制文件到本地系统,或反向操作:

它是如何工作的...
要通过 SSH 远程复制文件,我们使用scp工具。它帮助将单个文件或完整目录从客户端系统复制到服务器系统的指定位置。要复制一个包含所有内容的目录,我们在命令中使用-r选项。
我们使用相同的工具将文件从远程 SSH 服务器复制到客户端计算机。不过,为了做到这一点,我们需要知道服务器上文件的确切位置。
类似于scp,我们也有 sftp工具,它用于通过 ftp 从服务器到客户端复制文件。安全文件传输协议(SFTP)优于 FTP,确保数据安全传输。
最后,我们使用 GNOME 文件浏览器以图形方式连接并传输文件,从服务器到客户端,或反向操作。
在 Ubuntu 上设置 Kerberos 服务器
Kerberos 是一种认证协议,通过使用秘密密钥加密和可信第三方,在不受信任的网络上进行安全认证。
开始
要查看 Kerberos 的设置和运行,我们需要三台 Linux 系统(在我们的示例中,我们使用了 Ubuntu)。它们应该能够相互通信,并且还应该具有准确的系统时钟。
我们为每个系统设置的主机名如下:
-
Kerberos 系统 –
mykerberos.com -
SSH 服务器系统 –
sshserver.com -
客户端系统 –
sshclient.com
完成此操作后,编辑每个系统中的/etc/hosts文件,并添加以下详细信息:

系统的 IP 地址和主机名可能不同。只需确保在进行这些更改后,它们仍然能够相互 ping 通。
如何操作...
现在让我们看看如何为我们的示例设置 Kerberos 服务器和其他系统:
- 第一步是安装 Kerberos 服务器。为此,我们将在
mykerberos.com系统上运行以下命令:
sudo apt-get install krb5-admin-server krb5-kdc

-
在安装过程中,将会问几个问题。按照此处所述输入详细信息。
-
对于问题
默认的 Kerberos 版本 5 领域,我们案例中的答案是v=spf1 ip6:fd1d:f5c3:ee7c6::/48 -all:

- 对于下一个问题
你的领域的 Kerberos 服务器?,答案是mykerberos.com:

- 在下一个屏幕中,问题是
你的领域的管理服务器?,其答案是mykerberos.com:

一旦我们回答了所有问题,安装过程将继续进行。
- 下一步是创建一个新的领域。为此,我们使用以下命令:
sudo krb5_realm

在此过程中,我们将被要求为 Kerberos 数据库创建一个密码。我们可以选择任何密码。
- 接下来,我们需要编辑
/etc/krb5.conf文件,并按照此处所示修改详细信息。如果文件中没有某一行,则需要手动输入。进入文件中的libdefaults部分并按以下方式修改值:

向下移动到realms部分,并按照此处所示修改详细信息:

接下来,进入domain_realm部分并输入如所示的行:
mykerberos.com = MYKERBEROS.COM .mykerberos.com = MYKERBEROS.COM

- 接下来,我们需要向 Kerberos 数据库中添加原则或条目,这些原则代表网络上的用户或服务。为此,我们将使用
kadmin.local工具。每个参与 Kerberos 认证的用户都必须定义一个原则。
通过键入以下命令运行该工具:
sudo kadmin.local
这将启动kadmin.local提示符,如下所示:

要查看现有的原则,我们可以输入以下命令:
list princs
- 现在,为了为用户添加一个原则,我们使用
addprinc命令,如下所示:
为了添加tajinder账户,我们使用了以下命令:

为了给所添加的账户添加管理员角色,命令如下:

如果我们赋予某个用户管理员角色,那么取消注释*/admin这一行,位于/etc/krb5kdc/kadm.acl文件中。
- 要检查原则是否正确应用,请使用以下命令:
kinit
- 一旦你完成 Kerberos 系统的设置,我们就可以转到客户端系统了。首先,我们需要通过以下命令安装 Kerberos 客户端包:

在安装过程中,它将询问与安装 Kerberos 服务器时相同的问题。这里输入我们之前输入的相同信息。
-
完成安装后,检查我们是否仍能从 sshclient.com 系统 ping 通 mykerberos.com。
-
现在,为了获取客户端机器的票证,根据我们在 mykerberos.com 上创建的原则,使用的命令如下:

如果命令运行正常,说明它工作得很顺利。
- 完成上述命令后,我们转到第三个系统,即作为 SSH 服务器的系统。我们需要在该系统上安装 SSH 服务器和
krb5-config包。为此,我们运行如下命令:

再次,我们将被询问与安装 Kerberos 服务器时相同的问题。这里输入我们之前输入的相同信息。
- 现在编辑
/etc/ssh/sshd_config文件,启用以下行:

如果尚未更改,请移除#并将值更改为yes。
做完更改后,使用以下命令重启 SSH 服务器:
sudo service ssh restart
- 接下来,我们将配置 Kerberos 服务器,使其与 SSH 服务器配合使用。为此,运行
kadmin.local工具,然后运行如下所示的命令:
kadmin.local

截图中的上一个命令为 SSH 服务器添加了原则。
接下来,我们运行以下命令来创建密钥文件:

- 现在我们将使用以下命令将密钥文件从 Kerberos 服务器系统复制到 SSH 服务器系统:

我们已将文件复制到 SSH 服务器系统的/tmp/目录。复制完成后,将文件移动到/etc/目录。
- 现在在客户端系统上,编辑文件
/etc/ssh/ssh_config,并按如下所示修改这些行:
GSSAPIAuthentication yes
GSSAPIDelegateCredentialsyes
- 现在在客户端系统上,运行命令获取票证:
kinit tajinder
- 一旦此命令正常工作,尝试从客户端系统使用
ssh登录到 SSH 服务器系统。

我们应该在不被要求输入密码的情况下完成认证。
它是如何工作的...
首先,我们在第一个系统上安装所需的软件包,以创建 Kerberos 服务器。安装后,为服务器配置创建一个领域。为了完成配置,我们按照 /etc/krb5.conf 文件中的说明进行更改。
然后我们在 Kerberos 数据库中添加主体,以便添加将要使用的用户账户。
完成此操作后,我们转到下一个系统,安装 Kerberos 用户软件包以创建客户端系统。然后,我们从 Kerberos 服务器系统获取用户账户的票证,以便在客户端上使用。
接下来,我们转到第三个系统,安装 Openssh 服务器软件包以创建 SSH 服务器。然后编辑 SSH 的配置文件,启用认证功能。
现在我们回到 Kerberos 服务器系统,为 SSH 服务器添加一个主体。我们为 SSH 服务器创建一个密钥,然后使用 scp 命令将此密钥文件从 Kerberos 服务器传输到 SSH 服务器。
现在,如果我们尝试从客户端系统登录到 SSH 服务器系统,我们会在不被要求输入密码的情况下登录,因为我们之前生成的密钥正在用于认证。
使用 LDAP 进行用户认证和管理
轻量级目录访问协议 (LDAP) 有助于将认证信息集中存储。我们将在本主题中讨论如何配置任何客户端机器与 LDAP 服务器进行远程认证。
入门
要继续配置客户端机器,我们需要一台配置为 LDAP 服务器的 Linux 机器。这个过程已在 第三章 本地文件系统安全 中详细讲解。
配置完 LDAP 服务器后,我们需要添加组织单位、组和用户。登录到 LDAP 服务器后,可以使用左侧菜单创建组和用户。
完成此过程后,我们应该拥有一个设置了若干用户和组的 LDAP 服务器。
如何操作...
在完成 Ubuntu 上 LDAP 服务器的设置,并创建了一些用户和组之后,我们现在尝试配置客户端机器,以便远程与服务器进行认证:
- 第一步是在客户端机器上安装一些软件包,以便与 LDAP 服务器正常进行认证。安装软件包时,我们运行以下命令:
apt-get install libpam-ldap nscd

-
在安装过程中,将会问到各种问题,方式与安装服务器组件时相同。
-
第一个被要求的信息将是 LDAP 服务器的统一资源标识符,如下所示:

将字符串ldapi:///更改为ldap://,并输入服务器信息,如下所示:

- 接下来,输入 LDAP 服务器的识别名称,确保与配置
/etc/phpldapadmin/config.php文件时输入的 LDAP 服务器值一致:

- 接下来,选择要使用的 LDAP 版本,选择
3:

- 接下来,选择
Yes,以允许 LDAP 管理员账户作为本地 root 账户使用:

- 然后选择
No,表示LDAP 数据库是否需要登录:

- 接下来,输入 LDAP 服务器上
/etc/phpldapadmin/config.php文件中配置的 root LDAP 账户的详细信息:

- 输入 LDAP root 账户的密码:

-
所有问题回答完成后,包的安装将完成。
-
我们的下一步是配置客户端,使其认证文件知道需要查找我们的 LDAP 服务器以获取认证信息。为此,我们编辑
/etc/nsswitch.conf文件,并更新包含passwd、group和shadow定义的三行,如下所示:

-
之后,我们在 PAM 配置文件
etc/pam.d/common-session中添加一个值。PAM(可插拔认证模块)有助于连接认证,为需要认证的应用程序提供服务。 -
编辑
/etc/pam.d/common-session文件,并在底部添加一行,如下所示:
session required pam_mkhomedir.so skel=/etc/skel umask=0022

- 现在我们重新启动服务以实施之前的更改:

- 我们已经完成了客户端机器上的所有配置。现在我们将尝试使用我们的 LDAP 用户登录。使用新的终端窗口通过 LDAP 用户的详细信息 SSH 连接到客户端机器:

- 我们应该能够像本地用户一样成功登录。
第六章:网络安全
在本章中,我们将讨论以下主题:
-
管理 TCP/IP 网络
-
使用数据包嗅探器监控网络流量
-
使用 IP 防火墙进行配置
-
阻止伪造地址
-
阻止传入流量
-
配置和使用 TCP Wrappers
-
使用
mod_security阻止特定国家的流量 -
使用 SSL 保护网络流量
管理 TCP/IP 网络
随着计算机网络规模的扩大,管理网络信息成为系统管理员的重要任务。
准备工作
在我们开始更改 TCP/IP 配置之前,请确保通过以下命令备份网络管理器配置文件:

同样以相同的方式备份/etc/network/interfaces文件。
如何操作...
在本节中,我们将了解如何使用命令行手动配置网络设置:
- 在开始手动配置之前,首先检查当前由 DHCP 自动分配给系统的 IP 地址。我们可以通过右键点击右上角面板上的网络图标,选择连接信息来以图形方式查看详细信息,如下图所示:

我们可以看到,当前系统的 IP 地址是192.168.1.101。
- 接下来,我们使用命令行通过输入
ifconfig命令来检查相同的信息:

- 如果我们只想查看系统上可用的以太网设备,可以运行以下命令:

上述命令将列出系统上所有可用以太网设备的单行描述。
- 如果我们想获取有关网络接口的更详细信息,可以使用一个叫做
lshw的工具,如下所示:

此命令还提供有关硬件其他功能的详细信息。
- 现在,我们将禁用网络管理器,并手动设置 IP 地址。要禁用网络管理器,编辑
/etc/NetworkManager/NetworkManager.conf文件,如下所示:

将行managed=false更改为managed=true并保存文件。
- 现在,打开
/etc/network/interfaces文件,可以选择任何编辑器。我们可以看到,默认情况下,eth0接口没有任何信息:

- 编辑文件并添加下图所示的信息。确保根据您的网络设置添加 IP 详细信息:

完成后,保存文件并重启计算机以解除网络管理器的控制。
- 如果您希望创建一个虚拟网络适配器,可以在
/etc/network/interfaces文件中添加以下行,如下所示:

通过这样做,我们已经为单个以太网卡添加了两个 IP 地址。我们可以通过这种方式创建多个网络卡实例。
- 完成编辑后,通过以下命令重启网络服务:
service network-manager restart
您还可以使用此命令:
/etc/init.d/networking restart
- 接下来,我们可以查看如何配置适当的
nameserver,如果 IP 地址是手动配置的话。
要进行更改,请在任意编辑器中编辑/etc/resolv.conf文件,并添加以下截图所示的行:

按照前面的步骤,我们将能够成功配置 IP 详情。
它是如何工作的...
系统上的 TCP/IP 设置可以是自动管理或手动管理的。根据/etc/NetworkManager/NetworkManager.conf文件中的内容,系统会理解这些设置是自动管理还是手动管理。
对于手动配置,我们编辑/etc/network/interfaces文件,并输入前面章节中显示的 IP 详情。完成后,我们可以重启网络服务或完全重启系统,以使更改生效。
使用数据包嗅探器监控网络流量
最广泛使用的 Linux 命令行数据包嗅探器或数据包分析工具之一是 Tcpdump。它帮助捕获或过滤通过网络在特定接口上传输或接收的 TCP/IP 数据包。
准备工作
Tcpdump 在大多数 Linux/Unix 操作系统中预装。如果没有预装,我们可以通过以下命令安装它:

如何操作...
一旦安装了tcpdump,我们可以通过简单地运行命令tcpdump来开始使用它:
- 当我们仅仅运行
tcpdump时,它会开始捕获在任何接口上发送或接收的所有数据包。

- 如果我们只想捕获特定接口上的数据包,可以按以下截图所示的方式进行操作:

- 前述命令将捕获在定义接口上接收到的所有数据包,直到手动停止。如果我们希望捕获特定数量的数据包,可以使用
-c选项,如下所示:

- 要以 ASCII 格式显示捕获的数据包,我们可以使用
-A选项:

- 如果我们希望列出系统上可用的接口数量,可以使用
-D选项来实现:

- 如果我们在捕获数据包时使用
-XX选项,tcpdump将捕获数据包的链路层头部,格式为 HEX 和 ASCII,如下所示:

- 我们可以通过在执行
tcpdump时使用-w选项,将捕获的数据包保存到.pcap格式的文件中:

在前面的命令中,我们已将数据保存到 capture.pcap 文件中。
- 当我们想要读取和分析捕获的包文件时,可以使用带有
-r选项的命令,如下所示:

- 默认情况下,
tcpdump会捕获所有端口的包。如果我们想要捕获某个特定端口的数据包,例如端口80,可以按如下方式进行:

它是如何工作的...
TCPdump 分析网络行为、性能以及生成或接收网络流量的应用程序。Tcpdump 使用 libpacp/winpcap 来捕获数据,并利用其内置的广泛协议定义来分析捕获的数据包。
使用 IP 表配置防火墙
在保护 Linux 系统时,一个至关重要的步骤是设置一个好的防火墙。大多数 Linux 发行版都预装了不同的防火墙工具。Iptables 就是其中一种默认的防火墙工具。对于旧版本的 Linux 内核,Ipchains 是默认的防火墙。
准备就绪
由于 Iptables 随 Linux 发行版一起提供,因此无需安装额外的工具即可使用它。然而,建议在使用 Iptables 时不要使用 root 账户。相反,使用具有超级用户权限的普通账户来高效运行命令。
如何实现...
我们可以使用 Iptables 定义不同的规则。这些规则会被内核在检查进出流量数据包时遵循:
- 我们在系统上要做的第一件事是检查安装的
iptables版本,可以使用以下命令:

- 现在,我们将通过使用
-L选项检查系统中是否已经存在 Iptables 的规则:

- 上述输出也可以以一种格式查看,它告诉我们每个策略所需的命令。为此,可以使用
-S选项,如下所示:

- 现在,我们将通过以下命令检查哪些
iptables模块在默认情况下已加载,以确保其正常功能:

- 现在,让我们添加第一个规则,它将确保即使在我们设定阻止不需要的服务规则后,所有当前的在线连接仍然保持在线:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
在这里,-A 选项将规则附加到现有的表中。INPUT 告诉我们该规则将被附加到 Iptables 的输入链中。命令的下一个参数 -m conntrack --ctstateESTABLISHED,RELATED 确保该规则只适用于当前在线的连接。接着,-j ACCEPT 告诉 iptables 接受并允许符合先前指定条件的数据包。
- 现在,如果我们再次检查
iptables中的规则列表,我们可以看到我们的规则已被添加:

- 现在,假设我们希望保持通过 Iptables 允许 SSH 连接。为此,我们添加以下截图中的规则:

我们使用了端口 22,因为它是 SSH 的默认端口。如果你在服务器上更改了 SSH 的端口,请在前面的截图中使用相应的端口。
- 我们还需要确保我们的服务器继续正常运行,允许服务器上的服务之间相互通信,而不会被 Iptables 规则阻塞。为此,我们希望允许所有发送到回环接口的包。
我们添加以下规则以允许回环访问:
iptables -I INPUT 1 -i lo -j ACCEPT
在这里,-I 选项告诉 iptables 插入一条新规则,而不是将其附加到现有规则中。它需要指定链和新规则需要添加的位置。在前面的命令中,我们将此规则作为 INPUT 链中的第一条规则进行添加,这样它就是首先被应用的规则。
- 现在,如果我们使用
-v选项查看 Iptables 中的规则列表,我们可以看到回环接口lo的规则作为我们的第一条规则:

- 现在,假设我们已经根据需求为所有要允许的数据包添加了规则,我们必须确保任何其他进入
INPUT链的数据包都应该被阻止。
为此,我们将通过运行 iptables -A INPUT -j DROP 命令来修改 INPUT 链:

从前面的代码可以看出,丢弃所有数据包的规则已被添加到 INPUT 链的底部。这确保每当有数据包进入时,iptables 规则会按指定顺序进行检查。如果没有规则匹配该数据包,它将被丢弃,从而默认阻止数据包被接受。
-
到目前为止,我们在 Iptables 中添加的所有规则都是非持久性的。这意味着,一旦系统重启,所有的
iptables规则将会消失。为了保存我们创建的规则并在服务器重启时自动加载这些规则,我们可以使用iptables-persistent包。 -
使用以下命令安装该软件包:
apt-get install iptables-persistent

-
在安装过程中,系统会询问您是否希望保存当前的 iptables 规则并自动加载它们。根据您的选择,选择
Yes或No。 -
安装完成后,我们可以通过运行以下命令启动该软件包:

它是如何工作的……
在前面的示例中,我们使用了 Linux 中的 Iptables 来配置系统防火墙。
首先,我们了解了 iptables 命令的基本选项,然后我们学习了如何在 iptables 中添加不同的规则。我们添加了允许本地访问和外发主动连接的规则。接着,我们添加了一条规则来允许 SSH 连接。
然后,我们添加了一条规则,拒绝所有不符合上述规则的传入数据包。
最后,我们使用 iptables-persistent 包保存 iptables 规则,即使在系统重启后也能保存。
阻止伪造的地址
IP 欺骗是一种攻击者常用的技术,用于向服务器发送恶意数据包。它是通过伪造 IP 地址创建 IP 数据包的过程。这主要用于执行如拒绝服务(DoS)攻击等攻击。
准备工作
如果我们希望阻止伪造的 IP 地址,我们需要有一个包含这些伪造连接源地址的 IP 地址或域名列表。
如何操作……
我们将尝试创建一个基本的 iptables 规则集,通过它我们将限制所有传入数据包,除了那些我们需要的:
- 第一步是创建一个允许访问回环接口的规则,以便系统上的服务能够在本地相互正常通信。执行此操作的命令如下:
iptables -A INPUT -i lo -j ACCEPT

这是系统正常运行所必需的。
- 接下来,我们将为由我们的系统发起的外发连接创建规则:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
这将接受所有外发流量,包括来自远程服务器的响应,我们尝试连接的服务器(例如我们访问的任何网站):

- 现在,让我们创建一个在
iptables中使用的表。我们将其命名为blocked_ip。您可以选择任何您喜欢的名称:
iptables -N blocked_ip
这是我们将添加要阻止的伪造 IP 地址的表。
- 现在,我们将通过以下命令将此表插入到
iptables的INPUT表中:
iptables -I INPUT 2 -j blocked_ip
请注意,我们使用了数字 2,确保此规则在 iptables 中排在第二位。
- 现在,让我们将恶意 IP 地址添加到我们创建的
blocked_ip表中:
iptables -A blocked_ip -s 192.168.1.115 -j DROP
我们在这里使用了 IP 地址 192.168.1.115 作为示例。您可以将其替换为您要阻止的 IP 地址。如果您有多个 IP 地址需要阻止,请逐个添加到 iptables。
- 现在,我们可以使用以下命令查看
iptables中的规则列表:
iptables -L
在以下截图中显示的详细信息中,我们可以看到,在底部,我们有正在尝试阻止的 IP 地址。您可以根据需要指定单个 IP 地址或范围:

- 在设置完 Iptables 规则后,我们还可以编辑
/etc/host.conf文件。用您选择的任何编辑器打开该文件。我使用的是 nano:
nano /etc/host.conf
现在,按如下方式在文件中添加或编辑以下行:
order hosts,bind
nospoof on

在前面的示例中,nospoof on 选项会将通过主机名查找返回的 IP 地址与通过 IP 地址查找返回的主机名进行比较。如果比较失败,系统会生成欺骗警告。
完成后,保存并关闭文件。这也有助于保护系统免受 IP 欺骗。
它是如何工作的...
要阻止伪造的 IP 地址或任何其他 IP 地址,我们再次使用 Iptables,因为它是默认的防火墙,除非我们不想使用任何其他 Linux 工具。
我们再次创建规则以允许本地主机访问系统,并保持出站活动连接的存活。然后,我们在 Iptables 中创建一个表格,用于维护我们要阻止的伪造 IP 地址列表。之后,我们将此表格添加到 Iptables 的输入链中。现在,我们可以在需要时将任何 IP 地址添加到表格中,它将自动被阻止。
我们还可以使用 /etc/host.conf 文件来保护系统免受 IP 欺骗。
阻止传入流量
Linux 系统管理员最重要的任务之一是控制对网络服务的访问。有时,最好阻止服务器上的所有传入流量,仅允许所需的服务进行连接。
准备工作
由于我们在这里也将使用 iptables,因此执行这些步骤无需额外的软件包。我们只需要一个具有超级用户权限的用户帐户。然而,最好这个帐户不是 root 帐户。
如何操作...
我们将配置 Iptables 来拒绝一切流量,除了从我们系统内部发起的流量(例如,网页浏览器有网页流量,或者之前已经启动了某些下载,以更新软件包或其他软件):
- 如前面的示例所示,我们在 Iptables 中的第一条规则将是允许访问本地主机数据。运行以下命令来执行此操作:
iptables -A INPUT -i lo -j ACCEPT

- 我们的下一条规则将用于接受所有与出站连接相关的流量。这也包括来自远程服务器的响应,我们的系统正在连接该服务器:

- 接下来,我们将添加规则以接受时间超时 ICMP 数据包。这对于时间限制的连接设置非常重要:
iptables -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
- 接下来,我们将添加规则以接受来自远程服务器的目的地不可达 ICMP 数据包:
iptables -A INPUT -p icmp -m icmp --icmp-type 3/4 -j ACCEPT
- 接下来,添加规则以接受 PING 请求/响应(回显 ICMP),保持我们系统与可能需要 PING 的 Web 服务的连接:
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
- 一旦添加了前面的规则,我们通过运行以下命令来检查 Iptables 中的列表:
iptables -L

- 现在,我们将创建一个 iptables 表,其中包含一系列可接受的规则和服务:
iptables -N allowed_ip
然后,我们将这个表添加到 Iptables 的INPUT链中:
iptables -A INPUT -j allowed_ip
- 现在,让我们添加一条规则,允许系统访问 SSH。为此,我们可以运行以下命令:
iptables -A allowed_ip -p tcp --dport 22 -j ACCEPT
- 现在,如果我们检查 iptables 中的规则列表,得到的结果如下:
iptables -L

- 一旦我们添加了接受我们需要的流量的规则,我们现在希望拒绝所有其他没有设置规则的流量。为此,我们添加以下规则:
iptables -A INPUT -j REJECT --reject-with icmp-host-unreachable
通过这样做,每当有人尝试连接到服务器时,会向他们发送一个主机不可达ICMP 数据包,从而终止连接尝试。
- 在添加了上述规则后,我们的 iptables 现在看起来像以下屏幕截图所示:

它是如何工作的...
为了阻止所有进入的流量并只允许出站连接,我们再次使用 Iptables,因为它是 Linux 的默认防火墙。
为了确保服务器内部的正常运行,我们允许访问本地主机。
接下来,为了保持出站连接的活跃,我们添加规则以接受超时、目标不可达和回显ICMP 数据包。
一旦这些规则被添加,我们可以定义是否允许某些特定服务(如 SSH)或某个特定客户端地址的传入流量。为此,我们创建一个表来添加我们希望允许的客户端的 IP 地址列表。然后,添加规则来允许访问 SSH 服务,或根据我们的需求允许任何其他服务。
最后,我们添加规则来拒绝所有没有添加规则的流量。
配置和使用 TCP Wrappers
通过限制访问来保护服务器是一项关键措施,设置服务器时不应忽视。使用 TCP Wrappers,我们可以只允许已配置并支持 TCP Wrappers 的网络访问我们服务器的服务。
准备就绪
为了演示接下来的步骤,我们使用两个在同一网络中的系统,能够成功地彼此 ping 通。一个系统将作为服务器,另一个将作为客户端。
如何操作...
Linux 提供了几种控制网络服务访问的工具。TCP Wrappers 是其中之一,它增加了一层额外的保护。在接下来的步骤中,我们将展示如何配置 TCP Wrappers 来定义不同主机的访问权限:
- 首先,我们需要检查某个程序是否支持 TCP Wrappers。为此,可以使用
which命令查找程序可执行文件的路径:
which sshd

在这里,我们以SSH程序为例。
- 接下来,我们使用
ldd程序检查SSH程序与 TCP Wrappers 的兼容性:
ldd /usr/sbin/sshd

如果前面命令的输出中包含libwrap.so,则表示该程序支持 TCP Wrappers。
- 现在,每当 SSH 程序尝试使用 TCP Wrappers 连接到服务器时,将按照以下顺序检查两个文件:
-
-
/etc/hosts.allow:如果在此文件中找到与程序匹配的规则,则会允许访问。 -
/etc/hosts.deny:如果在此文件中找到与程序匹配的规则,则会拒绝访问。
-
-
如果在两个文件中都没有找到匹配的规则,访问将被允许。
-
如果我们尝试连接到 SSH 服务器,在添加任何规则之前,我们会看到连接成功:

- 现在,假设我们想拒绝来自某个系统的 SSH 程序访问,且该系统具有指定的 IP 地址。为此,我们将编辑
/etc/hosts.deny文件,如下所示:

- 现在,如果我们尝试从已被拒绝访问的特定系统连接到 SSH 服务器,它将显示以下错误:

- 如果我们想允许所有程序和所有客户端的访问,可以在两个文件中都不添加任何规则,或者在
/etc/hosts.allow文件中添加以下行:

- 如果我们想允许来自特定客户端(IP 地址为
192.168.1.106)的所有服务访问,那么我们可以在/etc/hosts.allow文件中添加以下行:

- 如果我们希望允许某个特定网络中的所有客户端访问 SSH,但排除 IP 地址为
192.168.1.100的特定客户端,可以在/etc/hosts.allow文件中进行以下更改:

- 在做完上述更改后,当我们尝试通过 SSH 连接时,我们将看到以下错误:

我们可以看到,一旦客户端的 IP 地址更改,SSH 访问将被允许,这意味着该网络中的所有客户端可以访问 SSH,除非该 IP 地址已被拒绝。
- 前述步骤会阻止我们在
/etc/hosts.allow文件中定义规则的服务。然而,在服务器端,我们无法得知是哪一个客户端尝试连接服务器以及何时尝试连接。因此,如果我们想保持客户端所有连接尝试的日志,可以按如下方式编辑/etc/hosts.allow文件:

在前面的这行中,spawn 关键字定义了每当客户端发出连接请求时,它将回显由 %h 选项指定的详细信息,并将其保存在日志文件 conn.log 中。
- 现在,当我们读取
conn.log文件的内容时,可以看到其详细信息,如下所示:

文件包含了客户端尝试连接的时间记录以及来源 IP 地址。通过使用 spawn 命令的不同参数,可以捕获更多的细节信息。
它是如何工作的...
我们使用 TCP Wrappers 来限制对支持 TCP Wrapper 包的程序的访问。我们首先使用 ldd 工具检查我们要限制的程序是否被 TCP Wrapper 支持。然后,我们根据需要在 /etc/hosts.allow 或 /etc/hosts.deny 文件中添加规则。
之后,我们根据需要添加规则来限制某个特定客户端或整个网络的访问。通过在 TCP Wrapper 中使用 spawn 选项,我们甚至可以为被限制的客户端或程序的连接尝试维护一个日志。
使用 mod_security 阻止特定国家的流量
ModSecurity 是一个可以用于 Apache Web 服务器的 Web 应用防火墙。它提供日志记录功能,并可以监控 HTTP 流量以检测攻击。ModSecurity 还可以作为入侵检测工具,我们可以使用它来根据需求阻止特定国家的流量。
准备工作
在我们开始安装和配置 mod_security 之前,必须在 Ubuntu 系统上安装 Apache 服务器。
在 Ubuntu 上安装 Apache,运行以下命令:
apt-get update
apt-get install apache2
如何操作...
在本节中,我们将看到如何安装和配置 ModSecurity Web 应用防火墙(WAF)来阻止特定国家的流量:
- 一旦在 Ubuntu 上安装了 Apache,下一步是通过运行以下命令来安装 ModSecurity:

- 安装 ModSecurity 后,重启 Apache:

- 为了确认 ModSecurity 是否安装成功,运行以下命令:

如果安装成功,我们应该会看到类似于以下内容:security2_module (shared),如前面的截图所示。
-
安装完成后,我们开始配置 ModSecurity。为此,我们使用预先包含的推荐配置文件
modsecurity.conf-recommended,该文件位于/etc/modsecurity目录中。 -
将
modsecurity.conf-recommended文件重命名,如下所示:

- 重命名文件后,我们编辑
modsecurity.conf文件,并将SecRuleEngine detectiononly的值更改为SecRuleEngine打开。

- 保存这些更改后,重启 Apache:

- ModSecurity 提供了许多 Core Set Rules (CSR) 规则集。不过,我们可以通过以下命令从 GitHub 下载最新的 OWASP ModSecurity CRS:
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
- 下载完成后,进入下载的目录。接下来,将
crs-setup.conf.example文件移动并重命名为/etc/modsecurity/,如下所示。将rules/目录也移动到/etc/modsecurity/:

- 现在,编辑 Apache 配置文件
/etc/apache2/mods-available/security2.conf,并添加Include指令来指向规则集,如下所示:

- 重新启动 Apache 以使更改生效:

-
ModSecurity 支持通过与免费的 Maxmind 数据库集成来使用地理位置数据。
-
要阻止特定国家的流量,首先需要在与 ModSecurity 配置相同的服务器上下载地理位置数据库。下载数据库的命令如下:

-
下载完成后,解压并将文件移动到
/usr/share/GeoIP/。 -
下一步是编辑
/etc/modsecurity/crs-setup.conf文件,以启用地理位置数据库的使用。为此,我们启用SecGeoLookupDb指令,并定义下载的 GeoIP 数据库文件的路径:

- 接下来,我们需要设置规则来阻止来自任何国家的流量。配置文件中有一个示例规则供参考,可以通过取消注释该规则来使用:

- 取消注释规则并添加我们希望阻止的国家的国家代码后,如下图所示,我们可以保存文件:

- 如果我们希望服务器仅能从特定国家访问,并阻止所有其他国家的流量,我们可以创建如下的规则:
SecRule *GEO:COUNTRY_CODE3* "***!@streq USA***" "phase:1,t:none,log,deny,msg:'Client IP not from USA'"
这样,我们就可以使用 ModSecurity 来阻止或允许特定国家的流量。
使用 SSL 加密网络流量
TLS 和 SSL 是安全协议,旨在将普通流量放置在一个受保护的加密外壳中。借助这些协议,流量可以以加密格式在远程用户之间传输,从而保护流量不被其他人拦截和读取。这些证书是数据加密过程中的重要组成部分,并有助于确保互联网交易的安全。
准备工作
在开始创建和配置自签名证书之前,我们需要在 Ubuntu 系统上安装 Apache 服务器。
要在 Ubuntu 上安装 Apache,请运行以下命令:
apt-get update
apt-get install apache2
如何操作...
在本节中,我们将学习如何创建自签名证书以加密到 Apache 服务器的流量:
- 一旦我们的 Apache 服务器安装完成,我们可以通过访问浏览器中的
http://localhost链接来检查默认网页:

- 然而,当我们尝试使用 HTTPS 访问相同页面时,我们会遇到以下错误:

- 要开始使用 SSL,我们必须在 Ubuntu 服务器上启用 SSL 支持模块。为此,我们需要运行以下命令:

- 启用 SSL 模块后,重新启动 Apache 服务器,以便可以识别更改:

- 现在,我们将继续创建自签名证书。首先,在 Apache 配置层级中创建一个子目录。我们将在此处放置要创建的证书文件。运行以下命令:

- 现在,我们将创建密钥和证书文件,并将其放置在前一步骤中创建的目录中。要创建密钥和证书文件,我们可以使用
openssl命令,如下所示:

有关 openssl 命令使用的选项的更多详细信息,建议查阅该命令的手册。
- 当我们执行之前的命令时,会提示我们回答一些问题。输入所需的详细信息以完成证书创建过程:

在这些问题中,最重要的是 Common Name(服务器的 FQDN 或您的名字)。在此,我们需要输入应与证书关联的域名。如果没有域名,也可以使用服务器的公网 IP。
- 一旦命令完成,我们可以检查之前创建的
/etc/apache2/ssl目录。我们将看到密钥和证书文件已被放置在此处:

-
创建密钥和证书文件后,下一步是配置 Apache 使用这些文件。我们将以
etc/apache2/sites-available/default-ssl文件为基础进行配置,因为该文件包含默认的 SSL 配置。 -
编辑文件并设置我们将为虚拟主机配置的值,包括
SeverAdmin、ServerName、ServerAlias等。按照以下方式输入详细信息:

- 在同一文件中,我们需要定义 Apache 可以找到 SSL 证书和密钥的位置,如下所示:

- 一旦为启用 SSL 的虚拟主机完成上述配置,我们需要启用它。为此,我们运行以下命令:

-
为了加载新的虚拟主机文件,重新启动 Apache 使更改生效。
-
完成所有设置后,我们现在可以通过使用 HTTPS 协议访问我们服务器的域名来测试我们的配置。一旦我们在浏览器中输入带有
https的域名并按Enter键,我们将看到以下屏幕:

这证实证书正在加载。由于它是自签名证书,我们会收到一个警告消息,指出“此连接不受信任”。如果证书是由浏览器信任的证书颁发机构之一签发的,则不会出现此警告。
- 一旦我们点击“我理解风险并继续”,我们将被要求添加一个安全异常,如下截图所示。确认安全异常以将我们的自签名证书添加到浏览器中:

我们现在在我们的 Web 服务器上启用了 SSL。这将有助于保护用户和服务器之间的通信流量。
工作原理...
SSL 证书是提供认证的数字护照,用于保护服务器与浏览器之间通信的机密性和完整性。SSL 证书具有一对密钥:公钥和私钥,它们共同工作以建立加密连接。
当浏览器尝试连接到使用 SSL 加密的 Web 服务器时,它会请求 Web 服务器进行身份验证。然后,服务器会发送其 SSL 证书的副本。收到证书后,浏览器向服务器发送一条消息。之后,服务器会发送回一个数字签名的确认消息,告知服务器启动 SSL 加密连接。现在,服务器和浏览器之间共享的所有数据都是加密的。
第七章:安全工具
本章我们将讨论以下内容:
-
Linux sXID
-
Port Sentry
-
使用 Squid Proxy
-
Open SSL 服务器
-
Trip Wire
-
Shorewall
-
OSSEC
-
Snort
-
Rsync 和 Grsync—备份工具
Linux sXID
在 Linux 中,通常一个文件具有读取、写入和执行权限。除了这些权限外,文件还可以具有特殊权限,如 SUID(设置所有者用户 ID)和 SGID。由于这些权限,用户可以从他们的帐户登录,并以实际文件所有者的权限(也可以是 root)运行某个特定文件/程序。sXid 是定期监控 SUID/SGID 的工具。使用该工具,我们可以跟踪文件和文件夹的 SUID/SGID 变化。
准备工作
要使用此工具,我们需要在 Linux 系统上安装 sXid 软件包。我们可以使用 apt-get 命令来安装软件包,或者下载软件包并手动配置和安装它。要安装 sXid 软件包,我们运行以下命令:
apt-get install sxid

如何做到...
要开始监控文件和文件夹的 suid/sgid,我们将工具配置如下:
- 安装完成后,我们开始编辑
/etc/sxid.conf文件,以根据需要使用该工具。用您选择的编辑器打开文件:
nano /etc/sxid.conf
- 在配置文件中,查找以下行:

如果您希望每次运行 sxid 时将更改的输出发送到您的电子邮件 ID,请将 EMAIL 的值更改为其他电子邮件 ID。
- 接下来,查找包含
KEEP_LOGS的行,并将其值更改为您选择的数字值。此数字定义了要保留的日志文件数量:

- 如果您希望即使 sXid 未发现任何变化时也能收到日志,请将
ALWAYS_NOTIFY的值更改为 yes:

- 我们可以为
SEARCH选项定义一个以空格分隔的目录列表,作为 sXid 搜索的起始点。然而,如果我们希望排除任何目录,可以在EXCLUDE选项下指定该目录:

假设我们有一个目录 /usr/local/share 需要被搜索,而 /usr/local 目录已被列入排除列表,但它仍会被搜索。这在排除主目录并只指定一个目录时非常有用。
-
/etc/sxid.conf中有更多选项,可以根据我们的需求进行配置。完成编辑后,保存并关闭文件。 -
现在,如果我们希望手动运行 sxid 进行抽查,可以使用以下命令:
sxid -c /etc/sxid.conf -k

这里,-c 选项帮助定义配置文件的路径,如果命令没有自动选择该路径。-k 选项用于运行该工具。
它是如何工作的...
我们首先安装 sxid 包,然后根据我们的要求编辑 /etc/sxid.conf 文件进行配置。配置完成后,我们手动运行 sXid 进行抽查。我们甚至可以在 crontab 中添加一个条目,以便在定义的间隔时间内自动运行 sXid(如果需要的话)。
Port Sentry
作为系统管理员,一个主要的关注点是保护系统免受网络入侵。这就是 PortSentry 发挥作用的地方。它具有检测主机系统上扫描活动的能力,并根据我们选择的方式对这些扫描作出反应。
准备就绪
为了演示 PortSentry 的实现和使用,我们需要两个在同一网络中的系统,且这两个系统可以相互 ping 通。此外,我们还需要在一个系统上安装 Nmap 包,它将作为客户端,另一个系统上我们将安装并配置 PortSentry 包。要安装 nmap 包,可以使用 apt-get install nmap 命令:

如何操作...
- 在第一台系统上,我们使用以下命令安装 PortSentry 包:
apt-get install portsentry

-
在安装过程中,会弹出一个包含有关 PortSentry 信息的窗口。只需点击
Ok继续。 -
一旦安装完成,PortSentry 就开始监控 TCP 和 UDP 端口。我们可以通过使用以下命令检查
/var/log/syslog文件来验证这一点:
grep portsentry /var/log/syslog

我们可以在日志中看到与 portsentry 相关的消息。
- 现在,在第二台我们用作客户端的机器上,运行如下所示的
nmap命令:

我们还可以使用任何其他 nmap 命令对第一个运行 portsentry 的系统进行 TCP 或 UDP 扫描。要查看 Nmap 命令,请参见 第一章,Linux 安全问题。在之前的结果中,我们可以看到,即使在第一个系统上运行 PortSentry,nmap 也能够成功扫描。我们甚至可以尝试从客户端 ping 服务器系统,看看在安装 PortSentry 后是否仍然有效。
- 现在,让我们通过编辑服务器系统上的
/etc/portsentry/portsentry.conf文件来配置 PortSentry。打开文件后,查找显示的行并将值更改为1:

- 向下滚动并找到并取消注释此行:

- 接下来,取消注释以下行:

完成后,保存并关闭文件。
- 接下来,编辑
/etc/default/portsentry文件:

在这里显示的行中,我们需要提到 Portsentry 应该工作在哪个协议上,TCP 还是 ATCP。
- 现在,编辑
/etc/portsentry/portsentry.ignore.static文件,并在文件底部添加一行,如下所示:

这里,192.168.1.104 是我们尝试阻止的客户端机器的 IP 地址。
- 现在,使用以下命令重启 Portsentry 服务:

- 完成前面的步骤后,我们将再次尝试在客户端机器上运行
nmap,并查看它是否仍然正常工作:

我们可以看到,nmap 现在无法扫描该 IP 地址。
- 如果我们尝试从客户端 ping 服务器,即使是这个操作也无法成功:

- 如果我们检查
/etc/hosts.deny文件,我们会看到以下行已经自动添加:

- 同样,当我们检查
/var/lib/portsentry/portsentry.history文件时,我们会得到类似于此截图最后一行的结果:

工作原理...
我们使用了两台系统。第一台系统充当 Portsentry 服务器,另一台充当客户端。在第一台系统上,我们安装 Portsentry 软件包,在第二台系统上安装 nmap,用于演示 Portsentry 的工作原理。现在,我们在客户端机器上对服务器执行 Nmap 扫描,看到它正常工作。完成此操作后,我们根据需求编辑各种文件来配置 Portsentry。编辑完成后,重启 portsentry 服务,然后再次尝试从客户端对服务器执行 Nmap 扫描。我们看到现在扫描无法正常工作。
使用 Squid 代理
Squid 是一款功能强大的 Web 代理应用,具有多种配置和用途。Squid 拥有大量的访问控制功能,并支持多种协议,如 HTTP、HTTPS、FTP 和 SSL。在本节中,我们将学习如何使用 Squid 作为 HTTP 代理。
准备工作
要在特定系统和网络上安装和使用 Squid,请确保该系统有足够的物理内存,因为 Squid 也作为缓存代理服务器工作,因此需要空间来维护缓存。我们在本例中使用的是 Ubuntu 系统,Squid 可以在 Ubuntu 仓库中找到。所以,我们需要确保系统是最新的。为此,我们运行此命令:
apt-get update
然后我们运行此命令:
apt-get upgrade
如何操作...
要在我们的系统上安装和配置 Squid,我们需要按照以下步骤进行:
- 第一步是使用以下命令安装 Squid 软件包:

- 一旦 Squid 安装完成,它将以默认配置启动,默认配置是阻止所有网络上的 HTTP/HTTPS 流量。要检查这一点,我们只需要配置网络中任意系统的浏览器,使用代理系统的 IP 地址,如下所示:

- 完成后,我们可以尝试访问任何网站,并且会看到一个错误页面,如下图所示:

- 现在,我们将开始配置我们的代理服务器,以使其按照我们的要求工作。为此,我们将在我们选择的编辑器中编辑
/etc/squid3/squid.conf文件。一旦在编辑器中打开文件,搜索读取TAG: visible_hostname的类别。在此类别下,添加一行,visible_hostname ourProxyServer:

在这里,ourProxyServer是我们给代理服务器起的名称。
- 接下来,搜索类别为
TAG: cache_mgr并添加一行,cache_mgr email@yourdomainname。在此处,提及可以联系的管理员电子邮件地址,而不是email@yourdomainname:

- 接下来,我们搜索如下截图所示的行。
http_port变量定义了 Squid 监听的端口。默认端口是3128,但我们可以将其更改为任何未使用的端口。我们甚至可以定义多个 Squid 要监听的端口,如下所示:

- 现在,根据我们的需求,我们需要添加一条允许网络计算机上流量的规则。为此,我们将搜索读取
acl localnet src 10.0.0.8的行。在这里,我们添加我们的规则,acl localnetwork src 192.168.1.0/24,如下面的截图所示:

在我们添加的前面的规则中,acl用于定义一个新规则,localnetwork是我们给规则起的名称。src定义了要发送到代理服务器的流量源。我们按位数定义了网络 IP 地址与子网,如此处所示。根据我们的需求,我们可以添加任意数量的规则。
- 接下来,搜索读取
http_access allow localhost的行,并在其下方添加http_access allow localnetwork的行,以开始使用我们在上一步中添加的规则并允许流量:

- 完成前述配置步骤后,我们使用此命令重新启动 Squid 服务:
service squid3 restart
- 现在,我们的 Squid 代理服务器正在运行。为了检查,我们可以尝试从网络上任何系统的浏览器访问代理服务器的 IP 地址:

前面的错误屏幕告诉我们 Squid 代理运行正常。现在,我们可以尝试访问任何其他网站,它应该按照我们在 Squid 配置文件中添加的规则打开。
工作原理如下...
我们从安装 Squid 包开始。安装完包后,我们编辑其配置文件/etc/squid3/squid.conf,并添加主机名、管理员的电子邮件 ID 以及 Squid 应该监听的端口。然后,我们创建一条规则,以允许同一网络上所有系统的流量。一旦保存了所有配置,我们重新启动 Squid 服务,我们的代理服务器就可以工作了。
打开 SSL 服务器
SSL(安全套接层)是一种用于在互联网上传输敏感信息的协议。这些信息可能包括账户密码和信用卡详细信息。SSL 通常与 HTTP 协议一起用于网页浏览。OpenSSL 库提供了 SSL 和 TLS(传输层安全)协议的实现。
准备就绪
为了演示 OpenSSL 的使用,我们需要两台系统。一个将作为服务器,我们将在其上安装 OpenSSL 软件包以及 Apache。第二台系统将作为客户端。要安装 Apache,我们运行以下命令:

如何操作...
我们现在将展示如何使用 OpenSSL 为 Apache 创建一个自签名证书。这将有助于加密流向服务器的流量:
- 我们首先在第一个系统上使用以下命令安装 OpenSSL 软件包:

- 一旦安装了 OpenSSL,我们需要启用 SSL 支持,Ubuntu 的 Apache 包默认已包含此功能。为此,我们运行以下命令:

启用 SSL 支持后,使用以下命令重新启动 Apache:
service apache2 restart
- 现在,在 Apache 的配置目录中创建一个目录。这是我们将在下一步中创建的证书文件存放的位置:
mkdir /etc/apache2/ssl
- 现在,我们将使用以下命令创建密钥和证书:

在上一个命令中,req -x509指定我们将创建一个符合 X.509 证书签名请求(CSR)管理的自签名证书。-nodes指定密钥文件将创建时不受密码保护。-days 365告诉我们创建的证书将在一年内有效。-newkeyrsa:2048表示密钥文件和证书文件将同时创建,并且生成的密钥将是 2048 位长。下一个参数-keyout指定将创建的私钥的名称。-out参数指定创建的证书文件的名称。
-
在创建密钥和证书文件时,系统会问你几个问题。提供你的配置细节。然而,其中一个问题是
Common Name(例如服务器 FQDN 或您的名字),这是非常重要的,我们必须提供域名或服务器的公共 IP。 -
接下来,我们需要编辑
/etc/apache2/sites-available/default文件,配置 Apache 使用在前一步中创建的密钥文件和证书文件。找到并编辑此处显示的行。对于ServerName,我们提供了 Apache 服务器系统的 IP 地址:

- 在同一个文件中,滚动到文件末尾,在
<VirtualHost>块关闭之前,添加此处给出的行。指定在创建这些文件时使用的密钥文件名和证书文件名:

- 现在,在客户端系统上,打开任何浏览器并使用
https://协议访问 Apache 服务器的公共 IP,如下所示:

浏览器将显示关于连接不安全的警告信息,因为证书没有被任何受信任的机构签名。
- 点击
我了解风险,然后点击添加例外按钮,将证书添加到浏览器中:

- 接下来的窗口将显示有关服务器的一些信息。要继续并添加证书,请点击
确认安全例外:

-
如果您希望查看证书的更多详细信息,请点击上一屏幕中的
查看,您将获得一个新窗口,显示证书的完整信息。 -
一旦证书成功添加,网页加载将完成,如下所示:

它是如何工作的...
我们在此设置中使用了两个系统。第一个是安装了 OpenSSL 包的 Apache 服务器。第二个系统作为客户端,我们将尝试从该客户端连接到 Apache Web 服务器。在第一个系统上安装 Apache 和 OpenSSL 包后,我们启用 Apache 的 SSL 支持。接着,我们使用 OpenSSL 工具和一些参数创建服务器密钥和服务器证书文件。完成后,我们编辑/etc/apache2/sites-available/default文件,以便 Apache 能够使用我们创建的密钥和证书。完成后,我们尝试通过客户端机器上的浏览器访问 Apache Web 服务器。我们看到它要求将新的证书添加到浏览器中,添加完成后,我们就能够使用 HTTPS 协议访问网页。
还有更多...
我们已经看到如何使用 OpenSSL 创建自签名证书。除了创建自签名证书之外,OpenSSL 还有其他多种使用场景。在这里,我们将看到其中的一些:
- 如果我们想创建一个新的证书签名请求(CSR)和一个新的私钥,可以使用如下所示的命令:

- 在此过程中,它会要求提供一些详细信息。请输入此处所示的详细信息:

- 我们可以看到当前目录中创建的两个文件:

- 如果我们想在将证书签名之前检查 CSR,可以按照这里所示进行操作:

同样,还有其他可以与 OpenSSL 一起使用的命令。
Tripwire
随着如今服务器攻击次数的增加,在确保安全的同时管理服务器正变得越来越复杂。要确保每次攻击都已有效阻止是很难知道的。Tripwire 是一个基于主机的入侵检测系统(IDS),它可以用来监控不同的文件系统数据点,并在文件被修改或更改时提醒我们。
准备中
我们只需要在 Linux 系统上安装 Tripwire 包来配置我们的 IDS。在接下来的部分中,我们将看到如何安装和配置该工具。
如何操作...
我们将在接下来的步骤中讨论如何在我们的 Ubuntu 系统上安装和配置 Tripwire:
- 第一步是使用
apt-get安装 Tripwire 包,如下所示:

-
在安装过程中,会显示一个信息窗口。点击 OK 继续。
-
在下一个窗口中,选择 Internet Site 作为邮件配置类型,然后点击 Ok:

- 在下一个窗口中,它将要求输入
system mail name。请输入您正在配置 Tripwire 的系统的域名:

-
在下一个屏幕中按 Ok 继续。
-
现在,我们将被问到是否要为 Tripwire 创建一个密码短语。选择 Yes 并继续。
-
现在,我们将被问到是否希望重新构建配置文件。选择 Yes 并继续:

- 接下来,选择 Yes 以重新构建 Tripwire 的策略文件:

- 接下来,提供您希望为 Tripwire 配置的密码短语:

它还会要求您在下一屏中重新确认密码短语。
- 接下来,为本地密钥提供一个密码短语,并在下一屏中重新确认:

- 下一屏确认安装过程已成功完成。点击 Ok 完成安装:

- 一旦安装成功完成,我们的下一步是初始化 Tripwire 数据库。为此,我们运行这里显示的命令:

在这里显示的输出中,我们可以看到许多文件名显示了一个名为No such file or directory的错误。这是因为 Tripwire 会扫描其配置文件中提到的每个文件,无论它是否存在于系统中。
-
如果我们希望删除之前显示的错误,我们必须编辑
/etc/tripwire/tw.pol文件,并注释掉文件/目录中不存在的行。如果我们愿意,也可以保持原样,因为这不会影响 Tripwire。 -
如果我们遇到与“分段错误”相关的错误,可能需要编辑
/etc/tripwire/twpol.txt文件,禁用出现该错误的设备/文件,如下所示 -

- 我们现在来测试 Tripwire 的工作情况。为此,我们将运行以下命令创建一个新文件:
touch tripwire_testing
你可以为文件选择任何名称。
- 现在,运行 Tripwire 的交互命令来测试它的工作情况。为此,命令如下:
tripwire --check --interactive

我们将得到之前显示的输出。Tripwire 会检查所有文件/目录,如果有任何修改,它会显示在结果中:

在我们的例子中,它显示了之前提到的那一行,告诉我们在/root目录下添加了一个名为tripwire_testing的文件。如果我们希望保留这些变化,只需保存自动在编辑器中打开的结果文件。在保存时,会提示你输入本地密码短语。请输入在安装 Tripwire 时配置的密码短语。
- 最后,我们在
crontab中添加一条记录,以便自动运行 Tripwire 检查文件/目录的变化。使用你喜欢的编辑器打开/etc/crontab文件,并添加这一行:

这里,00 6表示 Tripwire 将每天 6 点进行检查。
它是如何工作的...
我们首先安装 Tripwire 软件包,并在安装过程中填写要求的详细信息。安装完成后,我们初始化 Tripwire 数据库。之后,我们检查 Tripwire 是否正常工作。为此,我们首先在任意位置创建一个新文件,然后运行 Tripwire 的交互命令。命令执行完成后,我们会看到输出显示新文件已添加。这确认了 Tripwire 正在完美运行。然后我们编辑 Crontab 配置,以便在特定时间间隔自动运行 Tripwire。
Shorewall
想要将 Linux 系统设置为小型网络的防火墙吗?Shorewall 帮助我们通过标准的 Shorewall 工具配置企业级防火墙。Shorewall 实际上是建立在 Iptables 之上的,但它简化了配置过程。
准备工作
配置 Shorewall 需要一台安装并正常工作的带有两个网卡的 Linux 系统。一个网卡将用作外部网络接口,另一个将用作内部网络接口。在我们的示例中,我们使用eth0作为外部接口,eth1作为内部接口。根据网络配置配置两个网卡。确保能够 ping 通本地网络中的另一台系统,并且能够连接到外部网络,即互联网。在这台系统上,我们将安装 Shorewall 软件包,并根据我们的需求进行配置。
如何操作...
- 我们从使用
apt-get命令在系统上安装 Shorewall 开始:
我们添加了一条规则:如果数据包从net发送到fw,并且使用tcp协议且端口号为80,则accept该数据包。
- 安装完成后,尝试启动 Shorewall。你会看到如下错误信息:


- 要配置 Shorewall,编辑
/etc/default/shorewall文件,并选择你喜欢的编辑器。寻找包含startup=0的行,将其值改为1:

- 接下来,编辑
/etc/shorewall/shorewall.conf文件,并找到包含IP_FORWARDING的行。验证其值是否设置为On:

-
Shorewall 的配置文件位于
/etc/shorewall目录中。要使其工作,必需的最小文件是 interfaces、policy、rules 和 zones。如果在安装后/etc/shorewall目录中找不到这些文件,可以在/usr/share/doc/shorewall/default-config/目录中找到相同的文件。将所需的文件从该位置复制到/etc/shorewall目录。 -
现在,编辑
/etc/shorewall/interfaces文件,并添加以下截图所示的行:

我们在配置中将eth0称为net,将eth1称为local。你可以选择其他任何名称,只要它是字母数字组合且不超过5个字符。
- 接下来,编辑
/etc/shorewall/zones文件。Zone 主要用于设置是否使用ipv4或ipv6:

在之前的配置中,fw指的是me或 Shorewall 防火墙本身。接下来的两行定义了两个网络接口的ipv4。
- 现在,编辑
/etc/shorewall/policy策略文件。此文件主要用于设置整体策略,规定谁可以去哪里。该文件中的每一行都从上到下处理,并按照以下格式读取:如果数据包从 ____ 发送到 __,则 ______ 它:

在我们的示例中,如果我们读取第一条策略,它的含义是:如果数据包从本地发送到网络,则接受该数据包。你可以按照相同的方式添加任意数量的策略,Shorewall 防火墙会相应地工作。
- 最后,我们编辑
/etc/shorewall/rules文件。此文件用于创建政策的例外。它主要用于允许外部网络的人进入内部网络。以下是一个示例规则文件:

这意味着我们需要首先配置 Shorewall,才能让其开始运行。
- 一旦我们根据需求完成了配置前述文件,就可以通过运行此命令来测试设置:
shorewall check
- 在显示的输出中,滚动到底部,如果看到
Shorewall configuration verified,则表示设置已正确完成,现在 shorewall 可以作为防火墙使用:

- 现在,重启
shorewall服务以应用设置:
serviceshorewall restart
它是如何工作的...
我们从在系统上安装 shorewall 开始,该系统有两个网络接口卡。安装完成后,我们编辑/etc/default/shorewall文件以及/etc/shorewall/shorewall.conf文件。然后,我们编辑或创建以下文件:interfaces、policy、rules 和 zones,并根据给定的要求在每个文件中添加相应的行。编辑完成后,我们检查一切是否正常,然后启动shorewall服务以启动防火墙。
OSSEC
作为系统管理员,我们可能希望跟踪服务器上的授权和未授权活动。OSSEC 可能是解决方案。它是一个开源的基于主机的入侵检测系统,可用于跟踪服务器活动。当正确配置时,OSSEC 可以执行日志分析、完整性检查、rootkit 检测、基于时间的警报等多种功能。
准备就绪
为了安装和配置 OSSEC,我们将使用 Ubuntu 服务器。可能需要额外的包,如 gcc、libc、Apache 和 PHP,用于编译和运行 OSSEC。此外,如果我们希望实时警报功能正常工作,还需要一个单独的包。要安装所有必需的包,请运行此处显示的命令:

如何操作...
在本节中,我们将学习如何安装和配置 OSSEC 以监控本地 Ubuntu 服务器。我们还将测试 OSSEC 以检测任何文件修改:
- 我们的第一步是使用以下命令从其 GitHub 仓库下载最新版本的 OSSEC:

- 根据下载文件保存的位置,使用以下命令解压下载的文件:

- 进入解压后的目录并列出其内容。我们将看到一个 install.sh 脚本,将用于安装 OSSEC:

- 如下所示运行 install.sh 来安装 OSSEC:

当提示时,我们将选择我们的语言。所以,如果我们的语言是英语,那么我们将输入en并按Enter键。
- 一旦我们按下Enter,将会看到以下输出:

- 再次按Enter键继续。在下一屏幕上,它会让你选择想要的安装类型。输入
local来监控正在安装 OSSEC 的服务器,然后按Enter键:

- 接下来,我们将选择 OSSEC 的安装位置。默认安装位置是
/var/ossec。按 Enter 键继续:

- 我们可以配置 OSSEC,以便将电子邮件通知发送到本地邮箱地址。键入
y并按 Enter 键进行此操作:

- 在下一步中,我们将被询问是否要运行完整性检查守护进程和 rootkit 检测引擎。对于两者都输入
Y并按 Enter 键继续:

- 接下来,我们将启用主动响应:

- 继续进行以启用防火墙丢弃响应:

- 如果需要,我们可以将 IP 添加到白名单中。否则,键入
n并按 Enter 键继续:

-
接下来,按 Enter 键启用远程 Syslog。
-
一旦所有配置完成,按 Enter 键开始安装。安装开始后,将显示如下输出:

- 安装完成后,将看到以下输出:

- 安装完成后,我们可以通过以下命令检查 OSSEC 的状态:

- 要启动 OSSEC,请运行以下命令:

- 一旦 OSSEC 启动,我们将收到邮件警报。键入
mail来查看邮件,邮件内容将类似于以下内容:

-
我们的下一步是编辑 OSSEC 的主配置文件,即
/var/ossec/etc/ossec.conf文件。使用像 nano 这样的编辑器打开ossec.conf配置文件。 -
当我们打开文件时,它将显示我们在安装过程中指定的电子邮件配置。我们可以随时更改此设置:

- 根据默认配置,OSSEC 在服务器上添加新文件时不会提醒我们。我们可以通过在该部分下方添加一行来更改此设置,如下所示:

- 如果我们希望 OSSEC 发送实时警报,则需要更改 OSSEC 应检查的目录列表。为此,我们需要修改以下两行,以使 OSSEC 实时报告变更。按如下所示进行更改:

- 接下来,修改
local_rules.xml规则文件,该文件位于/var/ossec/rules目录中,以包括新添加到系统的文件规则:

- 在完成前述更改后,保存并关闭文件。然后,重启 OSSEC:

- 现在,我们将检查 OSSEC 是否正常工作。让我们尝试在
/etc/network/interfaces中做一些更改。如果 OSSEC 工作正常,我们应该会收到一封电子邮件警告,提到系统发生了变化。我们会看到类似以下的警告:

它是如何工作的...
我们首先在我们的 Ubuntu 服务器上安装 OSSEC,并在安装过程中提供我们希望接收 OSSEC 生成的警报的详细信息。我们还在安装过程中启用希望用于监控的守护进程。安装完成后,我们在配置文件中进行更改,以便每次向服务器添加新文件时收到警报。还在相关配置文件中做了其他必要的更改,以便从 OSSEC 获取警报。
Snort
在今天的企业环境中,安全性是一个主要问题,有许多工具可以用来保护网络基础设施和互联网通信。Snort 就是其中之一,作为开源工具,它是免费的。它是一个轻量级的网络入侵检测和防御系统。Snort 有三种不同的工作模式:嗅探模式、数据包日志记录模式和网络入侵检测系统模式。
准备就绪
在开始安装 Snort 之前,确保我们的系统是最新的,并且安装所需的依赖项。要安装所需的依赖项,我们运行以下命令:

如何操作...
Snort 可以在 Ubuntu 上安装,无论是从源代码安装,还是通过 deb 包安装。在本节中,我们将通过 deb 包安装 Snort:
- 要开始,我们在我们的 Ubuntu 系统上使用
apt-get命令进行安装,如下所示:

- 在安装过程中,我们将被要求选择 Snort 监听数据包的接口。默认选择的接口是
eth0,如下所示:

- 根据我们的系统配置选择接口:

- 现在,让我们开始使用 Snort 的嗅探模式。在嗅探模式下,Snort 读取网络流量并显示人类可读的翻译。要在嗅探模式下测试 Snort,请输入以下命令:

- 在这里显示的输出中,我们可以看到 Snort 检测到的系统、路由器和互联网之间的流量头信息:

- 以下输出显示了 Snort 分析的流量摘要:

- 如果我们希望 Snort 也显示数据,可以运行以下命令:
-snort -vd

这将给出之前显示的输出。
- 现在,让我们开始使用 Snort 的数据包记录器模式。如果我们希望 Snort 仅显示流量标头并将完整的流量详细信息记录在磁盘上,我们需要首先指定一个目录,Snort 可以在其中保存其报告。为此,我们进入
/var/log/snort并创建一个任意名称的目录,如下所示:

- 现在,运行这里显示的命令,Snort 的日志将保存在
logs_snort目录内:

- 一旦我们捕获了足够的数据包,我们停止命令。现在,我们可以检查
logs_snort目录内部,看到已创建了一个文件:

- 如果我们想要读取前一步骤中创建的日志文件的内容,我们可以运行以下命令:

我们可以看到完整的输出,如前所示。
工作原理...
Snort 可以在三种不同的模式下工作:sniffer 模式、数据包日志模式和网络入侵检测系统模式。根据运行 Snort 时使用的参数,相应的模式会被启动,我们可以相应地捕获和监视日志。
Rsync 和 Grsync – 备份工具
远程同步 (Rsync) 是一种本地和远程文件同步工具。使用其算法,它可以高效地复制和同步文件,允许我们仅传输两组文件之间的差异。Grsync 是 Rsync 工具的 GUI 前端。作为跨平台工具,它可以在 Linux、Windows 和 macOS 上运行。
准备工作
由于在 Linux 和类 Unix 系统上的流行,Rsync 大多数 Linux 发行版默认安装了。然而,如果没有安装,我们可以通过运行以下命令来安装它:

与 Rsync 不同,Grsync 在 Linux 发行版中并不预装。要在 Ubuntu 上安装 Grsync,请运行以下命令:

要使用 Rsync 和 Grsync 进行远程文件同步,需要确保两个系统都启用了 SSH 访问,并且在两个系统上都安装了 rsync 和 grsync。
如何操作...
在本节中,我们将看到如何使用 rsync 和 grsync 将文件/目录在本地同步,以及从一个系统远程同步到另一个系统。
- 让我们从一个系统开始创建两个测试目录,并在其中一个目录内创建一些测试文件。为此,我们运行以下命令:

这里我们创建了两个目录,dir1 和 dir2,并且在 dir1 中创建了五个空文件。
- 如果我们想要在本地将
dir1的内容同步到dir2,可以使用以下命令:

-r 选项表示递归方法,dir1 后面的斜杠 (/) 指的是 dir1 的内容。
- 如果我们想将
dir1目录同步到另一个远程系统,可以使用以下命令:

在这里,我们提到目标系统的用户名前缀后的目标地址。当我们运行命令时,它会要求输入远程用户的密码。一旦输入密码,同步就会完成。
- 一旦之前的命令完成工作,我们可以检查远程系统,看到
dir1目录已同步到远程系统,如下所示:

- 现在,让我们看看如何使用 Grsync 通过图形界面同步文件。我们可以通过应用菜单或使用
grsync命令在命令行中启动 Grsync。Grsync 的默认界面如下所示:

- 要将本地系统中的目录(
/root/backup)备份到远程系统,请按照如下所示输入源和目标的详细信息:

- 输入完上述详细信息后,转到文件菜单,点击“模拟”以验证输入的详细信息是否已收集:

一旦点击“模拟”,系统会提示你输入远程用户的密码。
- 如果输入的详细信息正确且一切正常,将出现“已成功完成”消息,如下所示:

- 现在,我们可以通过点击文件菜单中的“执行”选项开始文件传输:

再次,它会提示输入远程用户密码。提供密码后继续操作。
- 根据目录的内容,过程可能需要一些时间。一旦完成,将显示“已成功完成”消息,如下所示:

- 我们可以通过检查远程系统中的备份文件来验证传输是否成功:

它是如何工作的...
Rsync 和 Grsync 是可以本地和远程工作的同步工具。Rsync 是一个命令行工具,而 Grsync 为 Rsync 提供了一个图形用户界面(GUI)。通过使用这些工具中的不同选项,我们可以管理两个系统之间的备份同步。
第八章:Linux 安全发行版
在本章中,我们将讨论:
-
Kali Linux
-
pfSense
-
数字证据和取证工具包(DEFT)
-
网络安全工具包(NST)
-
Security Onion
-
Tails OS
-
Qubes OS
Kali Linux
Kali 是一个基于 Debian 的 Linux 发行版,专为安全测试而开发。Kali 内置了数百个渗透测试工具,是一个即用型操作系统。我们可以通过 live CD、USB 媒体或虚拟机来运行它。
Kali 的最新版本经历了一些重大变化,其中之一是从 Kali 2.0 开始,整个系统已转向滚动发布模型。现在我们只需在系统上安装 Kali 2.0 或更高版本,并通过正常更新获得其中的最新工具版本。这意味着我们不必删除现有的操作系统并安装最新版本的 Kali 2.2 来获得最新的内容。
要探索 Kali 2.2,您可以从其官方网站下载最新版本:www.kali.org/downloads/
我们可以下载 ISO 文件,然后将其刻录到 CD/DVD 或创建可启动的 USB 设备。我们还可以从相同的链接下载Kali Linux VMWare、VirtualBox 或 ARM 镜像。
Kali 的最新版本包含了关于更新的开发环境和工具的重大变化。我们将探索这些变化,了解它们之间的差异。
要开始使用 Kali,我们可以选择安装它,或者通过 live 选项使用它。
当我们启动 Kali 时,会发现 GRUB 屏幕发生了变化,并且变得更加简洁易用,如图所示:

Kali 的桌面环境已迁移至 GNOME 3,并拥有全新设计的用户界面。我们可以在这里的登录屏幕看到这些变化,登录屏幕也经过了重新设计:

整个桌面以及面板和应用程序菜单都已重新设计/重构:

我们还可以通过点击位于侧边栏底部的菜单图标来访问工具,如图所示。这样我们可以一次性看到所有工具:

Kali 包含一个内置的屏幕录制选项,它实际上是 GNOME 3 的一部分。在顶部,右键单击录制器图标,我们会看到开始录制的选项。现在您可以通过单击一次来录制您在 Kali 上所做的任何操作:

如果我们想访问 Kali 的设置菜单,会发现它在应用程序菜单中缺失。要访问设置,请点击右上角的电源图标,弹出一个菜单。
在这个菜单中,我们可以看到左下角的设置图标:

我们还可以在此菜单中看到 VPN 选项。使用此选项,我们可以配置 VPN 设置。
当我们点击前一步的设置图标时,会看到如下所示的设置菜单。现在,根据需求修改系统设置:

向下滚动并点击“详细信息”以查看关于 Kali Linux 的更多信息。
我们可以在这里显示的屏幕中看到有关系统的详细信息。这包括关于 GNOME 版本的信息:

每当我们希望更新 Kali 时,只需在“详细信息”窗口中点击“检查更新”按钮。
如果你的系统已经是最新的,屏幕上会显示一条消息,如下所示,否则可以下载可用的更新:

当我们启动 Kali 时,会看到桌面屏幕发生了变化。现在屏幕左侧有一个侧边栏,帮助我们轻松访问应用程序。
左上角的应用程序菜单包含了不同类别下的所有工具。应用程序也可以通过屏幕底部侧边栏上的菜单图标来访问。
接下来,我们看到 Kali 内置了一个屏幕录制工具,可以通过右上角的菜单访问。在同一个菜单中,我们现在可以访问系统设置菜单。
然后我们可以看到检查系统更新的选项,以保持 Kali 的最新。
Kali 包含了更新的工具,并且构建时会从 Debian 拉取更新,确保系统始终保持最新,并定期实施安全更新。
pfSense
作为网络管理员,拥有一个防火墙和路由器是必不可少的。当我们谈到设置防火墙时,我们可以选择从任何供应商安装一个预配置的防火墙,或者自己设置防火墙系统。
pfSense 是一款非常棒的软件发行版,如果你希望从头开始设置自己的防火墙,它非常合适。它是一个基于 FreeBSD 的开源发行版,专门设计用于作为防火墙,可以通过 Web 界面轻松管理。
准备就绪
-
从此链接下载 pfSense:
www.pfsense.org/download/mirror.php?section=downloads. -
根据需求选择正确的计算机架构和平台。
-
下载 pfSense 后,将 ISO 文件刻录到 CD/DVD 介质中,或者你甚至可以创建一个可启动的 USB 介质。
-
我们还需要一台具有两张网络接口卡的系统来安装和配置 pfSense。
该系统将专用于防火墙功能,不能用于其他计算任务,如网页浏览等。建议使用一台旧电脑,比如 Pentium 4 机器,或者甚至可以设置并使用虚拟机来完成此任务。
如何操作...
按照这里的步骤设置和配置 pfSense 防火墙:
- 当我们使用 pfSense CD/DVD 或 USB 设备启动系统时,欢迎界面将如图所示。按 6 配置启动选项:

- 在下一个屏幕中,再次按 6 开启详细模式,然后按 1 返回上一屏幕。
返回到第一个屏幕时,按 Enter 启动 pfSense。
- pfSense 开始启动。在启动过程中,我们会看到如图所示的屏幕:

按 I 安装 pfSense。在 20 秒倒计时内迅速选择该选项。
-
下一个屏幕要求你配置控制台。选择“接受这些设置”选项并按 Enter 继续。
-
在下一个屏幕中,如果你是 pfSense 新手,请选择快速/简单安装,否则可以选择自定义安装,以便在安装过程中使用更多高级选项。
-
按“确定”继续安装。安装过程将开始。
-
在安装过程中,你将被要求选择安装哪个内核配置。选择标准内核,因为我们是在桌面或 PC 上安装 pfSense。如果是在嵌入式平台(如路由器板)上安装,可以选择嵌入式内核选项。
-
完成后,安装将继续。一旦完成,选择“重启”并按 Enter 完成安装。
-
在重启过程中,pfSense 的默认用户名和密码将显示如下:

- 重启后,我们现在需要根据网络配置设置接口卡。两个接口的名称将如图所示。这些名称在你的设备上可能会有所不同:

-
现在系统会询问你是否要立即设置 VLAN。此时输入
n表示否。 -
现在,我们需要输入用于 WAN 的接口名称。在我们的示例中是
le0。根据你的配置输入相应的名称。 -
接下来,输入用于 LAN 的接口名称。对于我们的示例,它是
le1:

然后按 Y 继续设置。
- 一旦设置完接口,我们将看到如图所示的 pfSense 菜单:

如果 WAN 和 LAN 接口的 IP 地址在此步骤之前未正确设置,我们可以通过从上一步菜单中选择 2 来手动设置 IP 地址。
- 选择要配置的接口,然后提供相应的 IP 地址:

- 接下来,输入子网和默认网关:

- 对于 LAN 接口,按照相同步骤操作。完成后,屏幕上将显示一个链接,可以用于访问
pfSensewebConfigurator界面:

在我们的案例中,地址是http://192.168.1.115.
- 现在,从与 pfSense 系统在同一局域网的任何浏览器上访问此链接。一旦访问该链接,我们将看到如图所示的登录界面:

输入默认用户名 admin 和默认密码 pfsense 以登录。登录后,这些信息可以稍后更改。
成功登录后,我们将看到 pfSense 的主仪表板:

它是如何工作的…
我们从 pfSense CD/DVD 启动,然后选择安装操作系统的选项。
要安装 pfSense,我们在启动时选择选项 I,然后使用快速/简易安装。安装完成后,我们设置两个接口卡。第一张卡按照外部网络进行配置,使用菜单中的“设置接口 IP 地址”选项。然后配置 IP 地址、子网和网关地址。
接下来,我们对第二张卡执行相同的操作,按照本地网络进行配置。
配置完成后,我们可以使用第二张网卡的 IP 地址,通过同一网络系统上的任何浏览器访问 pfSense 的网页界面,并根据我们的需求自定义路由器/防火墙。
数字证据和取证工具包(DEFT)
在进行计算机取证时,使用的软件必须能够确保文件结构的完整性。它还应能够分析正在调查的系统,而不改变、删除或更改数据。
DEFT 是为取证设计的,基于 Lubuntu,而 Lubuntu 又基于 Ubuntu。
DEFT 可以通过以下链接下载:www.deftlinux.net/download/.
下载完成后,我们可以将镜像文件刻录到 CD/DVD 媒体上,或者创建一个可启动的 USB 媒体。
要使用 DEFT,我们需要先了解操作系统中包含了哪些工具,接下来我们将了解这些内容。
一旦我们从 DEFT CD/DVD 或 USB 媒体启动,我们会看到启动屏幕。首先,我们需要选择语言。完成后,我们可以选择运行 DEFT live,或者将 DEFT 安装到我们的系统中。
在我们的示例中,我们选择了启动 DEFT live。启动过程完成后,我们应该看到 DEFT 桌面。
现在让我们了解 DEFT 中有哪些不同的工具可用。
在开始菜单中,DEFT 下的第一个子菜单包含了各种分析工具的列表:

下一个子菜单展示了所有的反恶意软件工具。接着是与数据恢复相关的工具子菜单。
下一个子菜单包含了不同的哈希工具列表,可以用来检查和比较任何文件的哈希值。
在下一个子菜单中,我们可以看到用于成像的工具。这些工具可以在取证调查中使用,用于创建需要调查的系统磁盘的映像。随着 DEFT 7 的发布,还添加了用于分析移动设备的工具。它们可以在“移动取证”子菜单中找到。
下一个子菜单包含网络取证工具。下一个菜单是 OSINT,包含开源情报工具。
DEFT 还包含密码恢复工具,可以在下一个子菜单中找到。
除了这些分类工具外,DEFT 还包含一些报告工具,这在创建报告时非常有用。DEFT 使用WINE在 Linux 下执行 Windows 工具,WINE 的选项可以在主菜单中找到。
我们可以选择安装 DEFT,或者使用实时 CD 选项将其启动到系统中。启动后,我们进入开始菜单,然后进入 DEFT 菜单。在这里,我们可以找到各种分类下的工具。我们可以使用用于分析、数据恢复、移动取证、网络取证等的工具。
WINE 在 DEFT 中用于执行 Windows 应用程序。
网络安全工具包(NST)
Linux 有许多发行版,主要用于渗透测试。其中一个是网络安全工具包(NST),它的开发目的是为了在一个地方提供对开源网络安全应用程序的便捷访问。
NST 基于 Fedora Linux,包含面向专业人员和网络管理员的工具。
准备就绪
NST 可以从其网页或直接通过此链接下载:sourceforge.net/projects/nst/files/.
下载完成后,我们可以将 ISO 烧录到 CD/DVD 上,或创建一个实时可启动的 USB 介质。
如何操作...
当我们了解如何使用操作系统以及操作系统中包含了哪些工具时,使用 NST 进行渗透测试将变得更加容易。
-
要使用 NST,第一步是用 NST 启动系统。我们可以选择使用实时启动选项,或者直接在系统上安装 NST。在我们的示例中,我们选择了实时启动选项。根据需要,您可以选择任何选项。
-
启动完成后,我们将看到 NST 的默认桌面,如图所示:

- NST 配有一个 Web 用户界面,这是一个控制面板,可以用来执行与 NST 相关的任何操作。然而,只有在现有用户账户设置了密码后才能访问此界面。要设置密码,我们需要点击桌面上的“设置 NST 系统密码”图标。这将打开一个终端窗口,并提供创建新密码的选项:

- 设置密码后,我们可以通过任何浏览器访问 NST 的 Web 用户界面。要在本地系统上访问它,我们可以使用这个地址:
http://127.0.0.1:9980/nstwui.
如果从本地网络上的其他系统访问,则需要使用运行 NST 的系统的 IP 地址:

一旦我们打开链接,系统会提示输入用户名和密码。输入详细信息后点击 OK。
- 现在我们看到的是NSTWUI的登录页面。在左上角,我们可以看到运行 NST 的系统的详细信息。下面是 NST 菜单:

我们还可以在右上角看到系统运行时长的相关信息:

- NST 配备了多种工具,其中之一是bandwidthd。该工具展示了网络使用情况的概览,我们可以通过进入 Network | Monitors | bandwidthd UI 菜单来启用它:

-
点击“Start Bandwidthd”后,工具将开始运行。
-
另一个重要功能是能够通过 SSH 使用 Web 界面进行远程操作。请前往 System | Control Management | Run command 菜单。
如截图所示,将会弹出一个窗口,我们可以在其中运行任何命令:

-
NSTWUI 还允许管理员通过 Web 界面远程重启或关闭服务器。操作方法是进入 System | Control Management | Reboot 菜单。
-
点击“Proceed to reboot this NST system”以确认重启。否则,点击“Exit”取消操作。
-
在下一个屏幕中,输入如图所示的文本并点击 OK:

它是如何工作的...
安装或启动 NST 后,第一步是为现有用户帐户设置密码。可以通过使用“Set NST System Password”选项来完成此操作。
设置密码后,我们可以通过任何浏览器访问系统的 IP 地址,通过 Web 用户界面访问 NST。
登录 NSTWUI 后,我们可以看到与网络安全相关的各种工具列表。
我们可以探索一些工具,例如 bandwidthd 和 SSH。
Security Onion
Security Onion 是一个免费的开源 Linux 发行版,适用于入侵检测、企业级安全监控和日志管理。Security Onion 内置了多种工具,如 Snort、Suricata、Kibana、OSSEC 等。
正在准备
Security Onion 可以通过其官方网页提供的 ISO 镜像进行安装。另一种安装方法是先安装标准的 Ubuntu 16.04 ISO 镜像,然后再添加 Security Onion 的 PPA 和相关软件包。
要下载 Security Onion 的 ISO 镜像,请访问此链接:
github.com/Security-Onion-Solutions/security-onion/blob/master/Verify_ISO.md.
如何操作...
本节将介绍如何使用 ISO 镜像安装 Security Onion。安装完成后,我们将配置其进行后续使用:
- 要开始安装,我们通过 ISO 镜像启动系统。接下来会出现以下屏幕,我们选择第一个选项启动 Security Onion:

- 启动完成后,桌面将出现。我们可以在桌面上看到 Install Security Onion 16.04 的图标:

- 我们点击图标后,安装将开始。第一个屏幕会要求我们选择安装类型。根据需求选择任意选项,或者继续使用默认选择:

-
一旦点击“立即安装”,安装过程将开始。这将需要一些时间来完成。
-
初始安装完成后,它会提示我们重启系统。选择“立即重启”以完成安装。
-
当系统重启时,我们将看到启动菜单。选择默认选项并按Enter键启动 Security Onion。
-
重启后,我们将看到登录屏幕。请输入在安装过程中配置的用户名和密码。
-
登录后,我们可以看到屏幕上的一个“设置”图标。我们将使用它完成 Security Onion 提供的安全工具设置:

-
我们将被提示输入管理员账户的密码。
-
输入密码后,下一屏将显示将要配置的服务列表。按“是,继续!”以继续:

- 安装程序会询问我们是否现在配置接口,还是稍后配置。按“是”以立即配置接口:

- 安装程序会检测系统中存在的接口并进行配置。如果有多个接口,我们可以选择要配置的接口:

- 根据需求选择静态或 DHCP 选项:

-
完成后,点击“是,进行更改”继续。
-
安装程序会要求我们重启系统。重启以继续安装过程。
-
系统重启后,再次点击“设置”图标继续设置。系统会询问我们是否要重新配置接口或跳过。点击“是,跳过网络配置”继续:

- 在下一步,安装程序会询问我们是为评估模式还是生产模式设置系统。目前我们选择评估模式,并点击“确定”:

- 现在,我们将创建一个供安装程序配置的服务使用的用户账户。在这里输入用户名:

- 接下来,配置新创建用户的密码:

-
在下一屏中,点击“是”继续更改。
-
安装完成后,我们会看到以下窗口:

- 安装程序还会显示如下信息,用于后续服务的使用:

- 安装程序还会显示有关服务所使用的规则位置的信息:

- 要开始使用 Security Onion 在设置过程中配置的服务,打开浏览器并访问
localhost。接受有关 SSL 证书的安全警告并继续操作。接着,我们会看到一个网页,如下所示:

通过这个页面,我们可以开始访问 Security Onion 工具套件中的服务。
它是如何工作的...
Security Onion 附带了一整套安全工具。我们将 Security Onion 安装到系统中,然后设置套件中的所有工具。设置完成后,我们可以使用在设置过程中配置的用户帐户来启动工具。
Tails 操作系统
Tails是一个 Linux 发行版,作为实时操作系统运行,可以从 USB 驱动器或 DVD 运行在任何系统上。
它旨在通过帮助用户匿名上网并避免在用户去的几乎任何地方受到限制,从而保护用户的隐私和匿名性。Tails 还帮助用户在不留下任何痕迹的情况下进行活动,除非用户明确要求它保存痕迹。
准备就绪
Tails 是一个基于 Debian 的免费软件,ISO 镜像可以从其网站下载:tails.boum.org/index.en.html:

使用右侧的按钮下载 Tails 的 ISO 镜像。
如何操作...
Tails 是一个完整的操作系统,可以作为实时操作系统从 USB 驱动器或 DVD 运行。
要使用 Tails,我们从 Tails 的实时 DVD 或 USB 启动系统,当我们使用 Tails 启动系统时,屏幕将显示如下:

点击“启动 Tails”以开始使用 Tails 操作系统。启动完成后,我们将看到桌面界面。点击“应用程序”菜单,我们可以看到不同类别的工具,就像其他任何基于 Debian 的操作系统一样。不过,菜单中有一个 Tails 类别:

Tails 子菜单包含帮助它维持隐私和匿名性的工具。Tails 包含Tor浏览器,帮助维持在线隐私。当我们点击 Tor 浏览器时,它会在后台启动。Tor 准备就绪时,我们会收到通知:

当我们在任何系统上使用 Tails 时,它不会改变或依赖当前运行在系统上的操作系统。Tails 已被配置为不使用其运行的系统的硬盘,除非用户明确希望将数据保存到硬盘。Tails 还附带了一组保护数据的工具,使用强加密技术。这包括 LUKS,用于加密 USB 驱动器或外部硬盘。Tails 使用 HTTPS Everywhere,自动加密与任何主要网站的所有通信。
我们可以通过使用 Tails 安装程序从应用程序菜单将 Tails 安装到 USB 闪存驱动器上:

Tails 可以作为实时操作系统使用,并且它预装了一些已配置好并且注重安全性的应用程序。一旦用户通过 Tails 启动他们的计算机,他们可以使用这些工具来保持隐私和匿名。
Qubes 操作系统
目前有许多 Linux 发行版,其中包括一些小众的发行版。Qubes就是其中一个专注于安全性的 Linux 发行版。正如其标语所说,它是一个“合理安全的操作系统”。
当用户使用任何其他操作系统时,如果他们不小心运行了恶意软件(可能是通过电子邮件附件传播的),那么根据恶意软件的严重性,它可能会影响系统上的所有内容。
然而,Qubes 采用了一种不同的方法,称为通过隔离来保证安全。它使用 Qubes(虚拟实例)来隔离用户运行的程序。
准备工作
要使用 Qubes,我们可以从其官方网站下载 ISO 镜像:
要在计算机上安装 Qubes,建议您具有如上所述的最低配置:
-
64 位 Intel 或 AMD 处理器(x86_64,也叫 x64,亦即 AMD64)
-
4 GB 内存
-
32 GB 磁盘空间
Qubes 也可以安装在不符合这些推荐配置的系统上,但性能可能会较慢。
如何操作...
当我们完成 Qubes 的 ISO 镜像下载后,就可以在符合推荐配置的系统上开始安装。
-
要安装 Qubes,我们使用之前下载的 ISO 镜像启动系统。
-
一旦 ISO 镜像启动,它将显示一个菜单。选择“测试此媒体并安装 Qubes”并按回车键开始安装。
-
下一屏幕将要求我们选择语言。我们将选择英语并点击继续:

- 在下一个窗口中,点击“安装目标”:

- 这将打开另一个窗口。向下滚动并取消勾选“加密我的数据”选项,然后点击左上角的“完成”:

- 现在,我们回到之前的窗口。点击“开始安装”以继续:

- 随着安装的进行,我们会看到“用户设置”选项。在这里,我们可以为 root 账户设置密码,也可以通过点击“用户创建”来创建一个新用户以使用 Qubes:

- 当我们点击“用户创建”时,会弹出一个新窗口,让我们为新用户设置用户名和密码。设置完成后,安装将继续:

- 安装完成后,我们需要重新启动系统以开始使用 Qubes。点击“重新启动”,如图所示,来使用 Qubes:

- 当系统重新启动时,我们会看到以下屏幕,屏幕上显示了 QUBES OS 的图标。点击 QUBES OS 以进行设置:

- 在下一个窗口中,根据您的需求选择选项,然后点击 Done:

- 一旦点击 Done,Qubes 设置将开始使用默认模板配置系统,如下所示:

- 一旦模板配置完成,我们将看到以下屏幕。点击 FINISH CONFIGURATION 继续:

- 现在我们可以使用在安装过程中创建的用户账户登录 Qubes 系统:

- 登录后,我们将看到 Qubes VM 管理器窗口,它显示了配置的 Qubes 列表。我们可以从列表中启动任何现有的 Qube,或者根据需要使用此 VM 管理器创建新的 Qube:

- 一旦我们创建了不同的虚拟机(也叫做Qubes),就可以开始使用它们。在一个 Qube 内运行的任何应用程序都与另一个 Qube 相互独立,从而提供了隔离性。
它是如何工作的...
Qubes OS 使用 Xen hypervisor 来创建和隔离虚拟机。我们可以在这些虚拟机上工作,以隔离的方式访问相同的应用程序。
我们可以并排使用同一个浏览器的两个不同实例,它们可能运行在不同的安全域中。如果我们使用两个浏览器访问同一个网站,并且其中一个浏览器已登录该网站,则另一个浏览器窗口将不会使用该登录会话,因为它运行在完全不同的虚拟机上。
第九章:Bash 漏洞修复
本章将涵盖以下内容:
-
理解 Bash 漏洞 - Shellshock
-
安全问题 - Shellshock
-
补丁管理系统
-
在 Linux 网络上集成补丁
-
其他知名 Linux 漏洞
理解 Bash 漏洞 - Shellshock
Shellshock或Bashdoor是大多数 Linux 和 Unix 操作系统版本中存在的漏洞。它于 2014 年 9 月 12 日被发现,并影响所有使用 Bash shell 的 Linux 发行版。Shellshock 漏洞使得通过环境变量可以远程执行命令。
准备工作
为了理解 Shellshock,我们需要一个使用 Bash 4.3 之前版本的 Linux 系统,该版本存在此漏洞。
如何操作...
在本节中,我们将展示如何设置系统以理解 Shellshock 漏洞的内部细节:
- 执行的第一步是检查 Linux 系统中 Bash 的版本,以便我们可以找出系统是否易受Shellshock攻击。检查 Bash 版本,请运行以下命令:

通过 4.3 版本的 Bash 已被报告存在 Shellshock 漏洞。在我们的示例中,我们使用的是 Ubuntu 12.04 LTS 桌面版。从前面的截图输出中,我们可以看出该系统是有漏洞的。
- 现在,让我们检查漏洞是否真的存在。为此,我们运行以下代码:

一旦运行了上述命令,如果输出中打印了shellshock,则确认该漏洞的存在。
-
现在,让我们理解这个漏洞的内在原理。为此,首先我们需要了解 Bash shell 变量的基础知识。
-
如果我们想在 bash 中创建一个名为
testvar的变量,并将值'shellshock'存储其中,我们必须运行以下命令:
testvar="shellshock'
现在,如果我们希望打印这个变量的值,可以使用echo命令,如下所示:
echo $testvar
- 现在,我们将通过运行
bash命令打开一个 bash 子进程。然后,再次尝试在子进程中打印变量testvar的值:

我们可以看到,当我们尝试在子进程中打印变量值时,没有任何输出。
-
现在,我们将尝试通过使用 bash 的环境变量来做同样的事情。当我们启动一个新的 bash shell 会话时,会有一些变量可供使用,这些变量被称为环境变量。
-
为了将我们的
testvar变量变成环境变量,我们将进行导出。一旦导出,我们也可以在子 shell 中使用它,如下所示:

- 正如我们已经定义了变量并将其导出一样,类似地,我们也可以定义一个函数并将其导出,以便在子 shell 中使用。以下步骤展示了如何定义函数并导出它:

我们可以在前面的示例中看到,函数x已经被定义,并且使用-f标志进行了导出。
- 现在,我们定义一个新的变量,将其命名为
testfunc,并为其赋值,如下所示:
testfunc='() { echo 'shellshock';}'
之前定义的变量可以像常规变量一样访问:
echo $testfunc
- 接下来,我们将导出这个变量,使其成为一个环境变量,然后尝试从子 shell 中访问它,如下所示:

我们可以在前面的结果中看到一些意外的情况。在父 shell 中,变量作为普通变量访问。然而,在子 shell 中,它被解释为一个函数,并执行函数体。
- 接下来,我们将终止函数的定义,并传递任意命令,如下所示:

在前面的示例中,我们可以看到,一旦启动新的bash shell,定义在函数外的代码会在bash启动时执行。
这是bash shell 中的漏洞。
它是如何工作的...
我们首先检查系统上运行的 bash 版本。然后,运行著名的代码来确认是否存在 shellshock 漏洞。
为了理解 shellshock 漏洞是如何工作的,我们在 bash 中创建一个变量,然后尝试将其导出到子 shell 并在那里执行。接下来,我们尝试创建另一个变量,并将其值赋为'() { echo 'shellshock';}'。做完这个之后,当我们将该变量导出到子 shell 并在其中执行时,我们可以看到它被解释为一个函数并执行函数体。
这就是使 bash 容易受到 shellshock 攻击的原因,其中精心构造的变量可以在启动 bash 时执行任何命令。
安全问题 – Shellshock
在这个几乎所有事物都在线的时代,网络安全是一个主要问题。如今,许多 Web 服务器、网络连接的设备和服务都使用 Linux 作为平台。大多数版本的 Linux 使用 Unix bash shell,因此 Shellshock 漏洞可能影响大量网站和 Web 服务器。
在之前的示例中,我们了解了关于 Shellshock 漏洞的详细信息。现在,我们将理解如何通过 SSH 利用这个漏洞。
准备工作
要利用 Shellshock 漏洞,我们需要两台系统。第一台系统将作为受害者系统,并且应当易受 Shellshock 攻击。在我们的案例中,我们使用 Ubuntu 系统作为脆弱系统。第二台系统将作为攻击者系统,可以运行任何 Linux 版本。对于我们的案例,第二台系统上运行的是 Kali。
受害系统将运行openssh-server包。可以使用以下命令进行安装:
apt-get install openssh-server
然后,我们将配置该系统作为一个脆弱的 SSH 服务器,以展示如何利用 Shellshock 漏洞进行攻击。
如何操作...
要了解如何利用 Shellshock 漏洞攻击 SSH 服务器,我们首先需要将 SSH 服务器配置为易受攻击的系统。为此,我们将按照以下步骤操作:
- 第一步是在 SSH 服务器系统上添加一个名为
user1的新用户帐户。我们还必须将/home/user1设置为其主目录,并将/bin/bash作为其 Shell:

一旦帐户添加完毕,我们通过检查/etc/passwd文件来确认。
- 接下来,我们在
/home下为user1创建一个目录,并将该目录的所有权授予user1账户:

- 现在,我们需要通过授权密钥对攻击者进行身份验证,以便登录到 SSH 服务器。为此,我们将首先在攻击者的系统上生成授权密钥,使用以下命令:

我们可以看到已经生成了公钥/私钥。
- 在生成授权密钥后,我们将通过 SFTP 将公钥发送到远程 SSH 服务器。首先,我们将公钥文件
id_rsa.pub复制到桌面,然后运行以下命令以使用 SFTP 连接到 SSH 服务器:

连接后,我们使用put命令传输文件。
- 现在,在受害者的 SSH 服务器系统上,我们在
/home/user1/内创建一个名为.ssh的目录,然后将id_rsa.pub文件的内容写入/home/user1/.ssh/目录下的authorized_keys文件中:

- 完成后,我们编辑 SSH 的配置文件
etc/ssh/sshd_config,启用PublicKeyAuthentication变量。我们还要检查AuthorizedKeysFile是否正确指定:

- 一旦前面的步骤成功完成,我们可以尝试从攻击者系统登录到 SSH 服务器,看看是否会要求输入密码:

- 现在,我们将创建一个基本的脚本,如果用户尝试传递
date命令作为参数,它会显示消息restricted。然而,如果传递的是其他内容,它将被执行。我们将这个脚本命名为sample.sh:

- 一旦脚本创建完毕,我们可以运行给定的命令来赋予它可执行权限:
chmod +x sample.sh
- 完成后,我们使用
authorized_keys文件中的command选项,通过添加脚本的路径来运行我们的sample.sh脚本:

在authorized_keys文件中标记之前的更改,以限制用户执行一组预定义的命令,这将使得公钥认证变得脆弱。
- 现在,从攻击者的系统尝试通过 SSH 连接到受害者的系统,并传递
date作为参数:

我们可以看到由于我们添加到authorized_keys文件中的脚本,显示了restricted信息。
- 接下来,我们尝试将我们的 Shellshock 漏洞利用作为参数传递,如下所示:

我们可以看到,尽管我们在这个脚本中限制了date命令,但这次它被执行了,并且我们得到了date命令的输出。
-
现在,让我们看看如何利用 Shellshock 漏洞来攻陷运行任何脚本的 Apache 服务器,这些脚本可以触发带有环境变量的 bash shell。
-
如果受害者系统上尚未安装 Apache,我们必须通过运行以下命令来安装它:
apt-get install apache2
安装完成后,我们使用以下命令启动 Apache 服务器:
service apache2 start
- 接下来,我们转到
/usr/lib/cgi-bin/路径,并创建一个名为example.sh的脚本,其中包含以下代码,以显示一些 HTML 输出:

然后我们通过运行以下命令使其可执行:
chmod +x example.sh
现在,从攻击者的系统中,我们尝试使用名为curl -的命令行工具远程访问example.sh文件。
我们按预期获得脚本的输出:Example Page。

- 现在,让我们通过使用 curl 向服务器发送一个恶意请求,以打印受害者系统中
/etc/passwd文件的内容:
curl -A '() { :;}; echo "Content-type: text/plain"; echo; /bin/cat /etc/passwd' http://192.168.1.104/cgi-bin/example.sh

这是输出结果,但被截断:

我们可以看到攻击者系统上的输出,展示了如何利用 Shellshock 漏洞远程访问受害者的系统。在前面的命令中,() { :;} ;表示一个看起来像函数的变量。在这段代码中,函数是单一的:,它被定义为什么都不做,仅仅是一个简单的命令。
- 我们将尝试另一个命令,查看受害者系统当前目录的内容,如下所示:

我们可以在前面的输出中看到受害者系统中root目录的内容。
它是如何工作的……
在我们的 SSH 服务器系统上,我们创建一个新的用户账户,并将 bash shell 设置为其默认 shell。我们还在/home目录下为该新用户账户创建一个目录,并将其所有权分配给该账户。
接下来,我们配置 SSH 服务器系统以使用授权密钥验证另一个系统的连接。
然后,我们创建一个 bash 脚本来限制特定命令,如date,并使用命令选项将该脚本路径添加到authorized_keys中。
之后,当我们尝试从另一个系统连接到 SSH 服务器时,如果我们在连接时传递date命令作为参数,我们会看到该命令被限制。
然而,当相同的date命令与 Shellshock 漏洞一起传递时,我们可以看到它的输出,从而展示了如何使用 Shellshock 来攻击 SSH 服务器。
类似地,我们通过创建一个示例脚本并将其放置在 Apache 系统的 /usr/lib/cgi-bin 目录中来利用 Apache 服务器。
然后,我们尝试从另一个系统使用 curl 工具访问这个脚本。
我们可以看到,当通过 curl 访问脚本时,如果传递 shellshock exploit,我们就能在远程 Apache 服务器上运行我们的命令。
Linux 补丁管理系统
在当前的计算环境中,漏洞和补丁管理是一个永无止境的循环。当计算机因为已知漏洞被利用而遭受攻击时,我们可以看到该漏洞的补丁已经存在,但在系统中并未正确实施,从而导致了攻击的发生。
作为系统管理员,我们必须知道哪些补丁需要安装,哪些可以忽略。
准备就绪
由于补丁管理可以使用 Linux 的内置工具进行,因此在执行这些步骤之前无需配置特定的设置。
如何操作...
保持系统更新的最简单和最高效的方法是使用内置于 Linux 系统中的 Update Manager。在本教程中,我们将探讨 Update Manager 如何在 Ubuntu 系统中工作:
- 要在 Ubuntu 中打开 Update Manager 的图形版本,点击左侧工具栏顶部的超级键,然后输入
update。在下面的截图中,我们可以看到 Update Manager:

- 当我们打开 Update Manager 时,我们会看到以下弹出框,显示了可供安装的不同安全更新:

选择要安装的更新并点击“安装更新”以继续。
-
在同一窗口的左下角,我们有一个设置按钮。点击它后,我们会看到一个名为“软件源”的新窗口,里面有更多配置 Update Manager 的选项。
-
第一个标签为“Ubuntu 软件”,它显示了一个用于下载更新的仓库列表。我们根据需要从列表中选择选项:

- 如果我们点击“下载源”选项,就可以更改用于下载的仓库服务器。如果我们在连接当前选择的服务器时遇到问题,或服务器速度较慢,这个选项非常有用:

- 在下拉菜单中,当我们选择“其他”选项时,我们可以选择服务器,如下所示:

- 下一个标签页,“其他软件”,用于添加 Canonical 的合作伙伴仓库:

- 我们可以从前面截图中显示的列表中选择任何选项,然后点击“编辑”以更改仓库详细信息:

- 更新标签用于定义 Ubuntu 系统如何以及何时接收更新:

- 下一个标签页,认证,包含来自软件仓库维护者的、有关软件提供商认证密钥的详细信息:

- 最后一个标签叫做统计信息,供那些希望匿名向 Ubuntu 开发者项目提供数据的用户使用。这些信息帮助开发者提高软件的性能和体验:

- 在任何标签页下进行更改后,当我们点击关闭时,会弹出一个提示,确认是否要在列表中显示新的更新。点击重新加载或关闭:

- 如果我们想检查更新管理器从哪些位置获取所有包,可以查看
/etc/apt/sources.list文件的内容。我们得到以下结果:

它是如何工作的...
要更新我们的 Linux 系统,我们根据 Linux 发行版使用内置的更新管理器。
在更新管理器中,我们可以选择安装所有可用的更新,或者根据我们的需求通过设置窗口进行配置。
在设置窗口中,我们可以选择显示可以下载更新的仓库列表。
设置窗口中的第二个标签允许我们添加 Canonical 的第三方合作伙伴仓库。
使用下一个标签,我们可以指定何时以及下载什么类型的更新。
我们还可以通过设置窗口检查软件提供商的认证密钥。
最后一个标签页,名为统计信息,帮助我们将数据发送给 Ubuntu 项目开发者,以提高软件的性能。
在 Linux 中应用补丁
每当在任何软件中发现安全漏洞时,都会发布一个安全补丁来修复该漏洞。通常,我们使用 Linux 内置的更新管理器来应用安全更新。然而,对于通过编译源代码安装的软件,更新管理器可能无法提供帮助。
对于这种情况,我们可以将补丁文件应用于原始软件的源代码,然后重新编译软件。
准备工作
由于我们将使用 Linux 的内置命令来创建和应用补丁,因此在开始以下步骤之前不需要做任何准备工作。我们将创建一个 C 语言示例程序来理解创建补丁文件的过程。
如何操作...
在本节中,我们将看到如何使用 diff 命令为程序创建补丁,然后使用 patch 命令应用补丁:
- 我们的第一步将是创建一个简单的 C 程序,名为
example.c,用于打印This is an example,如下所示:

-
现在,我们将创建
example.c的副本,并将其命名为example_new.c -
接下来,我们将编辑新的文件
example_new.c并在其中添加几行额外的代码,具体如下:

-
现在,
example_new.c可以视为example.c的更新版本。 -
我们现在将使用
diff命令创建一个补丁文件,并命名为example.patch,具体如下:

- 如果我们查看补丁文件的内容,将得到如下输出:

- 现在,在应用补丁之前,我们可以通过使用
-b选项备份原始文件,具体如下:

我们可以看到,一个名为example.c.orig的新文件已经被创建,这是备份文件。
- 在实际应用补丁之前,我们可以先进行试运行,检查是否会出现任何错误。为此,我们运行以下命令:

如果没有错误消息,意味着补丁文件现在可以应用到原始文件上。
- 现在,我们运行以下命令将补丁应用到原始文件:
patch < example.patch
- 应用补丁后,如果我们检查
example.c程序的内容,将看到它已更新,包含了在example_new.c中写入的额外代码行:

- 一旦补丁应用到原始文件上,如果我们希望撤销该补丁,可以使用
-R选项,具体如下:

我们可以看到在应用补丁后,再撤销补丁后的文件大小变化。
它是如何工作的...
我们首先创建一个示例 C 程序。然后,我们创建它的副本并添加更多的代码行,使其成为一个更新版本。之后,我们使用diff命令创建补丁文件。在应用补丁之前,我们通过试运行检查它是否存在任何错误。
如果没有错误,我们使用patch命令应用补丁。现在,原始文件的内容与更新后的版本文件相同。
我们还可以使用-R选项撤销补丁。
其他著名的 Linux 漏洞
随着时间的推移,Linux 因其开源特性而获得了广泛的关注。然而,这也带来了日益严重的安全问题。Linux 系统的漏洞问题与其他操作系统(如 Windows)一样普遍,这些漏洞可能源于操作系统本身的缺陷,或由于 Linux 管理员的疏忽。
如何操作...
在本节中,我们将讨论一些最常见的 Linux 漏洞,具体如下:
-
Linux 内核 netfilter: xt_TCPMSS:尽管这是一个较老的漏洞,影响的是 4.11 之前的 Linux 内核版本,以及 4.9.x 版本的 4.9.36 之前的版本,但它仍然存在于许多没有解决该漏洞并且仍在使用较老版本 Linux 内核的组织系统中。此漏洞的 CVE ID 为:CVE-2017-18017,且具有 9.8 的严重漏洞评分。
-
如果该漏洞成功被利用,黑客可以借此发起拒绝服务(DoS)攻击,向目标发送大量通信。
-
Dirty Cow 漏洞:CVE-2016-5195 是该漏洞的官方参考。发现 Linux 内核的内存管理器在处理私有只读内存映射的写时复制(copy-on-write)中存在竞态条件。
该漏洞位于 Linux 内核的一个部分,几乎所有开源操作系统的发行版中都有,且这个漏洞已经存在了近十年:

-
利用此漏洞不会在日志中留下任何异常的痕迹。任何本地用户都可以写入他们能够读取的任何文件,该漏洞至少自 Linux 内核版本 2.6.22 起就存在。
-
如果你想了解更多关于此漏洞的可利用信息,可以查看:
www.exploit-db.com/exploits/40839/。 -
Metasploit 框架,作为最流行的渗透测试框架,也包括了一个针对 Dirty Cow 漏洞的利用模块。更多相关信息可以在这里找到:
github.com/rapid7/metasploit-framework/pull/7476。
它是如何工作的...
Linux 系统中不断发现许多漏洞,无论是与内核相关,还是与操作系统级别的代码有关。
一些漏洞,如 Dirty Cow,已经存在很长时间,攻击者可以轻松利用它们。
这些漏洞中的大多数都有现成的利用方法,因此,保持系统的修补和更新是必要的,以确保安全。
第十章:安全监控与日志记录
在本章中,我们将讨论以下配方:
-
使用 Logcheck 查看和管理日志文件
-
使用 Nmap 进行网络监控
-
使用 Glances 进行系统监控
-
使用 MultiTail 进行日志监控
-
使用系统工具 – whowatch
-
使用系统工具 –
stat -
使用系统工具 –
lsof -
使用系统工具 –
Strace -
使用 IPTraf 进行实时 IP 局域网监控
-
使用 Suricata 进行网络安全监控
-
使用 OpenNMS 进行网络监控
使用 Logcheck 查看和管理日志文件
作为管理员,在检查系统中的恶意活动或软件问题时,日志文件发挥着非常重要的作用。然而,随着软件数量的增加,生成的日志文件数量也随之增加。这使得管理员很难正确地分析日志文件。
在这种情况下,Logcheck 是一个非常好的工具,能够帮助管理员分析和扫描日志文件。Logcheck 根据其文档扫描日志中的有趣行。
这些有趣的行“主要指的是工具检测到的安全问题。
准备就绪
使用 Logcheck 在 Linux 系统上没有特定的要求。
如何做...
在本节中,我们将学习如何安装和配置 Logcheck,以便根据我们的需求使用它:
- 第一步是使用以下命令安装软件包:

- 在安装过程中,会弹出一个窗口,显示有关选择邮件服务器配置类型的信息,如下所示:

按“确定”继续。
- 在下一个窗口中,选择 Internet Site,然后选择“确定”继续:

-
安装完成后,我们需要在配置文件
/etc/logcheck/logcheck.conf中进行更改。 -
我们可以在配置文件中编辑的第一件事是邮件主题中使用的日期/时间戳的格式:

- 接下来,我们可以根据我们的需求更改
REPORTLEVEL变量的值,以控制日志的过滤级别。我们有三种选项,默认情况下,值设置为 server:

工作站值过滤掉大多数消息,信息较少。极端值对于具有高安全性的系统非常有用,这些系统尽可能少地运行服务,并且输出更详细。
- 接下来,我们将更改变量
SENDMAILTO的值,并提供我们的电子邮件地址,以便我们能够接收日志:

- Logcheck 生成的邮件为不同的事件使用不同的主题。如果我们希望修改这些主题行,可以像下面这样编辑变量的值:

- 默认情况下,Logcheck 使用
/etc/logcheck/logcheck.logfiles文件来维护要监控的日志文件列表。如果我们希望使用其他文件来定义该列表,并且它位于其他位置,可以编辑RULEDIR变量以定义新路径:

- 如果我们希望 Logcheck 监控除
/etc/logcheck/logcheck.logfiles文件中已经定义的文件之外的某个特定文件,可以在其中添加以下条目:

在前面的文件中,我们添加了以下行:/var/log/boot.log。
它是如何工作的...
我们首先安装 Logcheck 软件包,安装完成后,编辑其配置文件 /etc/logcheck/logcheck.conf。
在配置文件中,我们修改日志的日期/时间戳格式,并通过修改 REPORTLEVEL 变量编辑 Logcheck 进行过滤的级别。
接下来,我们编辑 SENDMAILTO 变量并输入我们的电子邮件 ID,以便通过电子邮件接收日志。
使用 etc/logcheck/logcheck.logfiles 文件,我们定义了 Logcheck 要监控的日志。
使用 Nmap 监控网络
对于任何网络,无论大小,网络监控和安全都是非常重要的任务。定期监控网络对于保护系统免受攻击,并防止病毒和恶意软件进入网络至关重要。
Nmap,即 网络映射器,是一个免费的开源网络监控工具,是系统/网络管理员使用的最强大的工具。Nmap 可用于执行安全扫描、探索网络、查找远程系统的开放端口并进行网络审计。
准备工作
为了展示 nmap 的工作原理,我们需要至少两台系统组成一个小型网络。我们将在一台系统上安装 nmap 软件包,另一台系统将作为扫描主机使用。
- 如果
nmap尚未安装,可以运行以下命令来安装:

- 如果我们想检查 Nmap 的版本,可以使用以下命令:

如何操作...
在本节中,我们将看到如何使用 Nmap 执行不同类型的扫描,具体步骤如下:
- 一旦安装了
nmap,我们只需输入nmap并按 Enter 键,就可以获得更多有关可以与nmap一起使用的选项的信息。这样会显示以下输出,显示nmap支持的所有选项:

- 我们先通过使用 Nmap 扫描网络中的活跃主机。为此,请运行以下命令:

在前面的输出中,我们可以看到处于活动状态的主机。
- 现在,让我们使用我们要扫描的系统的 IP 地址进行一次简单扫描。执行简单扫描的命令如下:

在前面的示例中,我们正在扫描的系统的 IP 地址是 192.168.43.100。在扫描结果中,我们可以看到目标系统正在运行各种服务。
- Nmap 还可以用于扫描我们自己的系统。为此,我们可以运行以下命令:
nmap localhost
- 如果我们想在同一命令中扫描多个系统,可以使用以下命令来实现:
nmap 192.168.43.100 192.168.43.102
- 如果我们只想限制扫描特定端口,可以告诉
nmap仅扫描该端口,方法是使用-p选项,如下所示:

在前面的示例中,我们扫描了端口 22 和 80,这是 SSH 服务和 HTTP(Web 服务器)服务的默认端口。正如我们在前面的结果中看到的,远程系统同时运行了 SSH 和 Web 服务器。
- 在扫描目标系统时,确定该系统的操作系统非常重要,因为许多漏洞是针对特定操作系统平台的。要了解目标系统的操作系统,我们可以使用
-O选项,如下所示:
nmap -O 192.168.43.100

前面屏幕截图中显示的结果告诉我们,目标系统运行的是基于 Linux 的操作系统,内核版本为 2.6。
- 我们已经看到,通过使用
-p选项,我们可以检查哪个特定端口是开放的。现在,假设目标系统的 22 号端口是开放的,这意味着该系统正在运行 SSH。如果我们想检查远程系统上 SSH 服务的版本,可以使用-sV选项,如下所示:

- 我们可以将 Nmap 扫描的输出保存以便将来分析,并可以选择 Nmap 支持的各种格式。我们使用
-oN选项将输出保存为普通格式:

- 我们可以看到输出文件已经在当前目录中创建:

如果我们检查文件的内容,我们将看到与运行以下命令时,nmap 在屏幕上显示的相同输出:

它是如何工作的...
当 Nmap 仅对 IP 地址进行扫描时,它会执行基本扫描并告诉我们目标系统上开放的端口。通过了解开放的端口,我们可以识别系统上运行的服务。同样,nmap 也用于通过提供本地系统的 IP 地址来扫描本地系统。
Nmap 还可以通过在同一命令中依次列出 IP 地址来同时扫描多个 IP 地址。此外,Nmap 可用于检查网络中哪些系统正在运行。
它还可以用于扫描特定端口,使用 -p 选项,并且如果使用了 -O 选项,它将对目标系统进行指纹识别,以显示该系统上运行的操作系统。
Nmap 也用于执行其他任务,例如识别运行在目标系统上的服务的软件版本。
使用 Glances 进行系统监控
对于管理员来说,系统监控就是通过检查正在运行的进程和服务来监控系统的性能。但由于屏幕空间有限,有时很难显示所有信息。在这种情况下,我们希望有一个工具,可以在有限的屏幕空间内显示关于系统的最大信息,例如 CPU、磁盘 I/O、内存、网络等。
尽管我们有各自独立的工具来监控所有信息,但使用 Glances,管理员可以在最小的空间内查看最多的信息。它可以根据终端窗口的大小动态调整信息,并高亮显示使用最大系统资源的程序。
准备就绪
如果你在 Ubuntu 上安装 Glances,建议使用 Ubuntu 13.04 或更高版本。对于其他版本的 Linux,应该使用最新版本。我们的示例使用的是 Kali Linux 2.0。
如何操作...
为了了解 Glances 的工作原理,我们将按照以下步骤进行:
- 第一步显然是使用以下命令安装软件包:
apt-get install glances
- 安装完成后,我们需要编辑
/etc/default/glances文件,并将RUN的值更改为true,如下截图所示:

这样做会在系统启动时自动运行 Glances。
- 要手动启动该工具,只需运行
glances命令。你将看到以下输出窗口:

在前面的窗口中,我们可以看到不同颜色的文本。Glances 中这些颜色代码的含义如下:
-
绿色:这意味着一切
OK -
蓝色:这种颜色表示
小心,需要注意 -
紫色:这种颜色表示
警告 -
红色:这表示某些东西是
关键
请参考图形包以获取颜色图像代码。
- 这些颜色代码基于 Glances 配置文件中定义的默认阈值进行工作。我们可以通过编辑
/etc/glances/glances.conf文件来更改这些阈值:

- 默认情况下,Glances 每秒刷新一次值。我们可以通过使用
-t选项后跟秒数来更改此值,方法如下:
glances -t 5
- 有时,我们可能无法物理访问我们的系统,但仍然希望监控系统的性能。Glances 可以帮助我们远程做到这一点。为此,我们首先需要通过使用
-s选项启用 Glances 的客户端/服务器模式,并使用-B选项将其绑定到系统的 IP 地址,如下所示:

现在,Glances 服务器正在运行在 IP 地址为192.168.1.102的系统上,默认情况下它运行在端口61209上。如果在启用客户端/服务器模式时提示输入密码,请定义您选择的任何密码。
在远程系统上,如果要访问 Glances,请运行以下命令:
glances -c -P 192.168.1.102
一旦运行此命令,我们将看到以下窗口,左上角显示Connected to Kali - IP 192.168.1.102/24,说明我们现在正在远程访问 Glances:

要让此命令在远程系统上运行,必须确保远程系统上也安装了 Glances。
它是如何工作的...
安装完 Glances 后,我们启用了其在系统启动时自动运行的功能。
我们通过使用glances命令运行它,并通过编辑/etc/glances/glances.conf文件来修改颜色代码的阈值。
通过使用-t选项,我们可以修改刷新时间间隔,通过使用-s选项,我们启用 Glances 的客户端/服务器模式,然后通过-c选项和 Glances 运行系统的 IP 地址远程访问。
使用 MultiTail 监控日志
对于任何系统管理员来说,监控日志文件是一项非常繁琐的任务,如果我们需要同时参考多个日志文件来排查问题,频繁切换日志文件会变得更加困难。
对于这种情况,我们可以使用 MultiTail 工具,它可以让我们在一个窗口或终端中显示多个日志文件,并实时显示日志文件的最新几行。
准备工作
要使用 MultiTail,我们无需在 Linux 系统上进行特别的设置,只需要安装 MultiTail 包即可。可以使用以下命令完成安装:
apt-get install multitail

如何操作...
一旦安装了 MultiTail 工具,我们可以根据需求使用以下命令来开始使用它:
- 如果我们想要使用
multitail查看两个日志文件,我们将运行以下命令:
multitail /var/log/syslog /var/log/boot.log

我们可以看到,屏幕已经分成两部分,每部分显示了单独日志文件的内容。
- 如果我们想在打开的两个文件中滚动,只需按B,然后会弹出一个菜单,如下所示。在这个列表中,我们可以选择想要详细监控的文件:

在弹出的新窗口中,按gg/G可以跳转到滚动窗口的顶部或底部,要退出滚动窗口,按Q。
- 如果我们想在 2 列中查看三个日志文件,可以使用以下命令:
multitail -s 2 /var/log/boot.log /var/log/syslog /var/log/auth.log

上面的截图显示了三个日志文件分为两列。
- MultiTail 允许我们在打开日志文件时自定义每个文件的颜色,并将它们合并显示在同一窗口中。可以使用以下命令来实现:
multitail -ci yellow /var/log/auth.log -ci blue -I /var/log/boot.log

它是如何工作的...
当我们在命令行中提供两个日志文件的名称时,MultiTail 会将这两个文件在同一屏幕上显示,并将屏幕分割成两部分。
使用 MultiTail 查看超过两个日志文件时,我们可以通过使用 -s 选项并指定列数来决定屏幕分割的列数。
MultiTail 还允许我们在同一屏幕上查看多个日志文件,而无需分割屏幕,通过根据颜色区分文件。颜色可以通过使用 -ci 选项来定制。
使用系统工具 – whowatch
在监控网络的同时,管理员还希望监控当前登录系统的用户以及每个用户在机器上执行的操作。
Whowatch 是进行此类任务的完美工具。它使用简单的基于文本的界面,易于操作,并能够显示关于用户的用户名、进程等信息,还可以显示连接类型,如 SSH 和 telnet。
准备工作
由于 Whowatch 不是 Linux 中预安装的包,我们需要安装它才能使用。安装 whowatch 的命令如下:
apt-get install whowatch

如何操作...
为了最大限度地利用 Whowatch 工具,我们需要正确理解工具的详细信息:
- 要开始使用该工具,只需输入
whowatch命令,屏幕会显示如下内容:

前面的屏幕列出了所有已登录的用户账户。
- 在这个列表中,我们可以选择任何用户账户,按 Enter 键后,可以查看该用户正在运行的所有程序的信息:

在同一屏幕上,底部还有更多选项,使用这些选项我们可以获取更多关于用户的信息,以及用户运行的程序:

- 在 Whowatch 的主屏幕上,我们可以看到底部有一个菜单,如下所示:

在前面的截图中,我们可以看到必须使用 F9 键来访问菜单选项。
- 一旦按下 F9,我们将看到屏幕顶部显示一个菜单。使用键盘上的箭头键浏览菜单。当我们选择“进程”选项卡时,会弹出一个子菜单,提供给我们一个信号来终止运行的进程。类似地,我们可以在同一子菜单中看到更多选项:

- 当我们切换到“视图”选项卡时,我们会看到以下选项:

- 最后一项是帮助,下面有“键”选项:

- 当我们按下键时,它会打开一个新窗口,显示用于不同任务的键的详细信息,如下图所示:

- 按下s键可以获取更多关于系统的信息:

- 如果我们按下t键,我们会看到系统上所有进程的树形结构列表,如下图所示:

它是如何工作的
Whowatch 只需在命令行中输入whowatch即可启动。启动后,它会显示一个登录用户的列表。只需在任何用户名上按下Enter键,即可获取该用户下正在运行的所有程序的信息。
要访问 Whowatch 中的更多选项,我们可以按F9键进入主菜单。然后我们会看到各种标签,如“进程”、“视图”、“用户”、“帮助”等等。
过程标签页提供了管理进程的选项,而视图标签页则提供了搜索和查看进程的选项。帮助标签页有查看在 Whowatch 中可用的快捷键的选项。
我们使用不同的键来访问系统信息并获取所有进程的列表。
使用系统工具 – stat
在 Linux 中,最常用的命令是ls,它会列出指定目录中的文件。然而,它只显示关于文件的少量信息。
相比之下,如果我们使用stat命令,与使用ls相比,我们可以获得更多关于文件/目录的信息。因为stat可以从文件的 inode 获取信息,所以它能提供更多文件的详细信息。
准备工作
由于stat是 Linux 的内建命令,因此不需要安装其他任何东西即可使用它。
如何操作...
本节将解释stat命令的选项和使用方法。通过使用stat,我们可以获取特定文件或文件系统的详细状态。
- 假设我们有一个名为
example.txt的文件。当我们使用ls -l命令对这个文件进行长列表显示时,我们会获得关于文件的信息,其中包括文件上次修改的时间。
然而,当我们使用stat命令检查同一文件的详细信息时,它会显示关于文件的额外信息以及差异,如下图所示:

在前面的输出中,我们可以看到修改和更改时间相同,但访问时间已经变化。它还显示了以八进制和 rwx 格式的权限信息,其他许多详细信息也会显示。
- 现在,让我们把文件重命名为
sample.txt。之后,如果我们使用stat检查sample.txt文件的详细信息,我们可以看到更改时间已经更新:

- 现在,假设我们有三个文件,分别叫做
sample.txt、sample1.txt和sample2.txt。如果我们想查看这三个文件的详细信息,我们可以单独使用stat命令查看每个文件,或者使用通配符和stat命令一起查看这三个文件的详细信息,如下所示:

- 我们可以使用
stat命令检查目录的详细信息,如下所示:

在目录的情况下,我们可以看到关于链接数的额外详细信息。
- 如果我们对 Linux 中的任何目录使用
stat命令,例如/etc/,我们会看到链接数会有一个很大的值,如下所示:

- 如果我们想查看文件系统的详细信息,不能使用
ls命令。但是,stat命令也适用于文件系统。我们可以获得与文件相同的文件系统详细信息:

- 如果我们在检查文件系统详细信息时使用
stat命令的-f选项,它会显示文件系统的状态:

如何运作...
我们可以使用stat命令获取文件的详细信息。当文件被重命名时,stat会告诉我们更改的时间。它还可以通过使用通配符在命令中同时提供多个文件的信息。
stat命令也适用于目录和文件系统。在文件系统的情况下,stat可以使用-f选项显示其状态。
使用系统工具 – lsof
有时我们遇到无法卸载磁盘的情况,系统提示文件正在使用,但我们无法理解到底是哪个文件。此时,我们可以查看是哪个进程正在使用哪些文件。
这可以通过lsof命令实现,它的意思是列出打开的文件。由于 Linux 将所有内容(包括目录、设备、套接字等)都视为文件,因此我们可以使用lsof轻松识别所有打开的文件。
准备工作
要使用lsof命令,建议从根账户登录,或者从非根账户使用sudo,以确保lsof命令的输出不受限制。
如何操作...
在本节中,我们将探讨可以与lsof命令一起使用的不同选项,以了解其工作原理:
- 如果我们仅仅运行
lsof,它会列出系统上所有属于任何活动进程的打开文件。如果输出过长,我们可以使用less命令滚动查看输出:
lsof | less

在前面的截图中显示的输出,以列的形式展示了诸如命令、PID、用户、FD、类型、设备等信息,以便更好地理解文件。
FD 列包含有关文件描述符的信息,例如 当前工作目录 (CWD)、根目录 (RTD)、程序文本 (TXT) 等。如果 FD 列包含类似 0u、1u 等信息,数字表示实际的文件描述符,字母表示不同的模式(读取访问、写入访问和读/写访问)。
- 要检查特定用户的所有打开文件列表,我们可以使用
-u选项,后跟用户名,如下所示:
lsof -u tajinder

- 使用
lsof,我们可以检查是否有进程在特定端口上运行。为此,我们必须使用-i选项并运行以下命令:
lsof -i TCP:22

在上面的示例中,我们查看了 22 端口上的运行进程列表,看到 SSH 进程正在运行。
- 如果我们想检查系统上打开文件的确切数量,可以运行以下命令:

在上面的示例中,我们看到有很多打开的文件——具体来说是 5,220 个。
- 要查看哪个用户正在查看哪些文件,以及用户正在运行哪些命令,我们可以使用以下命令:
lsof -i -u tajinder

使用 lsof 时,我们有很多其他选项,可以通过参考 lsof 命令的主页面进行探索。
如何工作...
只运行 lsof 命令会列出系统上所有打开的文件。通过使用 -u 选项并指定用户名,我们可以获取特定用户的打开文件列表。
当我们使用 -i 选项并指定端口号时,我们可以获取该端口上运行的任何进程的信息。
当我们使用 -i 和 -u 选项以及特定用户名时,我们可以获取该用户正在访问的文件和命令的信息。
使用系统工具 – strace
当我们在 Linux 机器上运行任何命令或程序时,可能会想知道它的后台工作原理。为此,我们在 Linux 中有一个非常有用的工具,叫做 strace。
它是一个命令行工具,也可以作为诊断或调试工具使用。Strace 监控进程与 Linux 内核之间的交互,当我们需要调试程序执行时,它非常有用。
准备就绪
这个工具默认适用于所有基于 Linux 的系统。因此,开始使用 strace 不需要进行其他配置。
如何操作...
让我们看看 strace 如何以各种方式跟踪任何程序的执行,从开始到结束:
- 要跟踪任何可执行命令在 Linux 上的执行,只需运行
strace命令,后跟可执行命令。如果我们使用strace跟踪ls命令,得到以下输出:

- 在前面的截图中,显示的输出已经被截断。如果我们查看输出的最后几行,就会看到当前目录列出的
write系统调用:

- 要查看目录列表,我们可以在同一目录下单独运行
ls命令,就会看到与之前截图中相同的列表:

- 如果我们希望以简洁的方式显示
strace命令的统计摘要,可以使用-c选项,如下所示:
strace -c ls

- 我们还可以通过使用
-t选项,在每行输出前显示时间戳,如下所示:

- 默认的
strace命令显示了可执行程序发出的所有系统调用。如果我们只想显示特定的调用,可以使用-e选项。因此,如果我们想查看ls命令的open系统调用,我们需要运行以下命令:
strace -e open ls

- 如果我们希望将
strace命令的输出保存在文件中以便稍后查看,可以使用-o选项,如下所示:
strace -o output.txt ls

这里,output.txt是将创建的文件名,用于保存strace命令的输出。
- 如果我们希望对当前正在运行的任何进程使用
strace,可以通过使用该进程的进程 ID 来实现。在我们的例子中,我们使用的是 Firefox 进程,其 ID 为16301。
我们可以运行以下命令,并使用-o选项将命令的输出保存在firefox_output.txt文件中:

- 然后,我们可以使用
tail命令或任何我们选择的文本编辑器查看输出文件的内容。
工作原理
当strace命令用于其他 Linux 命令或程序时,它会追踪其与 Linux 内核的交互。
当-c选项与strace一起使用时,我们会得到一个统计摘要,如果使用-t选项,则每行输出前会显示时间戳。
使用-e选项,我们可以看到程序执行的特定调用,比如open系统调用。通过使用-o选项,我们可以将strace命令的输出写入文件。
实时 IP 局域网监控,使用 IPTraf
IPTraf 是一个用于网络监控的工具。它允许我们分析 Linux 服务器的进出网络流量。IPTraf 也可以用于分析局域网内的流量,或者查看带宽的利用率。
准备工作
IPTraf 是 Linux 发行版的一部分,可以通过 Linux 的默认软件仓库安装。如果我们使用的是 Ubuntu 系统,可以通过apt-get命令安装 IPTraf 包,如下所示:
apt-get install iptraf

如何操作...
使用Iptraf非常简单。安装完成后,只需运行一个简单命令,就可以从终端启动它。让我们来探索一下这个工具是如何工作的:
- 要启动
Iptraf,只需在终端输入以下命令:
Iptraf
-
这将启动一个基于 ASCII 的菜单界面。按任意键继续。
-
在下一个屏幕中,我们将看到一个菜单系统,其中包含不同的选项,具体如下:

- 我们将选择第一个选项,IP 流量监控,并按Enter键。这将要求我们选择要监听流量的接口:

我们将在前面的列表中选择eth0,并按Enter键。
- IPTraf 现在将显示所有在
eth0接口上发生的 TCP 和 UDP 连接。窗口的上半部分显示 TCP 连接,下半部分显示 UDP 数据包:

- 按X返回上一菜单。我们选择菜单中的“统计细分”选项,并按Enter键:

- 这个功能允许我们按 TCP/UDP 端口对数据包进行排序。我们还可以根据大小对数据包进行排序:

- 退出到主菜单,选择配置选项,并按Enter键。在这里,我们可以配置工具的工作方式。我们可以启用或禁用反向 DNS 查询、服务名称、混杂模式等设置:

在上述截图中,我们已启用反向 DNS 查询。
- 启用反向 DNS 查询后,在监控流量时,我们可以看到输出中显示的是 DNS 名称,而不仅仅是 IP 地址:

- 如果我们想保存网络监控历史记录,可以在配置菜单中启用日志记录功能:

- 启用日志记录后,工具将要求我们指定日志文件的保存路径。我们可以指定路径,也可以使用默认路径:

- 在主菜单中,我们可以选择查看详细的接口统计信息。选择此选项并开始监控:

- 现在,我们可以看到关于所选接口
eth0的完整流量详情,如下所示:

它是如何工作的...
IPTraf 是一个易于使用的工具,用于监控接口上的网络流量。我们可以根据需求配置该工具,甚至将流量日志保存到文件中以供进一步分析。
使用 Suricata 进行网络安全监控
如果我们希望在 Linux 上使用网络入侵检测系统,可以使用 Suricata,这是一款免费且开源的工具。它可以使用规则和签名语言检查网络流量,处理多吉比特的流量并显示在屏幕上。它还可以通过电子邮件发送警报。
准备就绪
在开始安装和配置 Suricata 之前,我们需要安装一些其依赖的包。我们可以使用以下命令安装所有必需的依赖包:
apt-get install libpcre3-dbg libpcre3-dev autoconf automake libtool libpcap-dev libnet1-dev libyaml-dev libjansson4 libcap-ng-dev libmagic-dev libjansson-dev zlib1g-dev
Suricata 的默认工作方式是作为入侵检测系统。如果我们希望将其用作入侵防御系统,则需要一些额外的包,可以使用以下命令安装:
apt-get install libnetfilter-queue-dev libnetfilter-queue1 libnfnetlink-dev
完成包的安装后,我们可以从 Suricata 的官方网站下载最新的稳定版本。我们可以通过浏览器访问该网站并下载文件,或者使用以下命令直接从终端下载:

如何操作...
完成依赖包的安装并下载 Suricata 的源文件后,我们可以开始安装和配置部分。让我们现在探索这些步骤:
- 下载源文件后,打开保存下载文件的目录,然后使用以下命令解压下载的文件:

- 提取完成后,切换到
suricata-4.0.5目录,如下所示:

- 现在,我们将使用以下命令构建带有 IPS 功能的 Suricata:

- 构建完成后,我们将开始安装过程。首先运行
make命令:

- 上述命令完成后,我们可以运行下一个命令,即
make install:

- 下一步是使用以下命令安装 Suricata 的默认配置文件:

- 到目前为止,Suricata 的默认安装已经完成。然而,没有规则,工具是无用的。因此,我们将通过在先前解压的源目录中运行以下命令来安装 Suricata 的 IDS 规则集:

- 我们可以通过列出
/etc/suricata/rules目录中的文件来检查所有已安装的规则集:

- 现在,让我们通过编辑
/etc/suricata/suricata.yaml配置文件来配置工具的使用。编辑HOME_NET变量并根据我们的基础设施要求添加详细信息。我已添加了我们安装工具的 Ubuntu 服务器的 IP 地址。通过此更改,Suricata 将会在任何攻击HOME_NET(即我们的 Ubuntu 服务器)时发出警报:

- 现在,我们将创建一个测试规则集来测试 Suricata。为此,我们将在
/etc/suricata/rules目录下创建一个名为for_test.rules的文件,并在其中添加以下内容:

- 下一步是在
suricata.yaml配置文件中定义前一步创建的规则文件路径:

我们已在 rule-files 部分添加了 for_test.rules。
- 一切设置好后,建议关闭 NIC 上的包卸载功能,Suricata 会在该 NIC 上监听。为此,我们可以运行以下命令:
ethtool -K ens33 gro off
- 最后,我们将使用以下命令在实时模式下启动 Suricata:

我们的 IDS 现在已启动并在 ens33 接口上监听,
-
现在,让我们测试一下是否一切正常。我们将尝试 ping 我们运行 Suricata 的 Ubuntu 服务器。
-
现在,让我们使用以下命令检查 Suricata 服务器的日志:

如果 Suricata 正常工作,我们将看到类似于前面屏幕截图中的输出。
使用 OpenNMS 进行网络监控
当我们想要在单一实例中监控我们网络中的无限设备时,可以使用 OpenNMS。它是一个开源且免费的网络监控 Web 应用系统,能够自动检测和监控网络中的服务或节点。更多的设备或节点也可以轻松添加到 OpenNMS 中。
准备就绪
为了配置 OpenNMS,我们将使用已更新至最新稳定版本的 Ubuntu 服务器。完成服务器更新后,我们需要做一些配置,确保系统准备好安装和配置 OpenNMS:
- 首先,我们将编辑
/etc/hosts文件,为我们的服务器设置一个合适的完全限定域名:

在这里,我们已将 example.OpenNMS.local 添加为我们服务器的域名。
- 接下来,我们编辑
/etc/hostname并更新相同的域名:

- OpenNMS 使用 PostgreSQL 作为其数据库。因此,我们将使用以下命令安装 PostgreSQL:

- 安装完成后,我们将通过编辑
/etc/postgresql/9.5/main/pg_hba.conf文件来允许用户访问我们的 root 账户数据库:

完成这些更改后,保存并关闭文件。
- 现在,重新启动 PostgreSQL 并启用它,以便它在启动时自动启动。使用以下命令来执行此操作:

- 下一步是安装 Java。为此,我们将首先将 PPA 添加到
apt源列表中,如下所示:

- 然后,我们将通过运行
apt-get update命令来更新仓库。完成后,我们将使用以下命令开始安装 Java:

- 安装完成后,我们可以使用以下命令检查 Java 版本:

现在,我们的系统已经准备好,开始安装和配置 OpenNMS。
如何执行...
完成前述 准备工作 部分的先决条件后,我们现在可以开始安装和配置 OpenNMS:
- OpenNMS 在 Ubuntu 的默认仓库中不可用。因此,我们必须在
/etc/apt/sources.list.d目录中添加 OpenNMS 的仓库。为此,我们可以运行以下命令:
nano /etc/apt/sources.list.d/opennms.list
- 在
/etc/apt/sources.list.d/opennms.list目录中添加以下行:

完成后,我们将保存并关闭文件。
- 现在,我们将通过运行以下命令添加 OpenNMS 的密钥:

- 接下来,使用
apt-get update命令更新仓库:

- 我们现在可以使用以下命令安装 OpenNMS:

- 当安装完成时,我们将看到以下屏幕:

- 如前所述,我们现在将运行命令为 OpenNMS 创建数据库,如下所示:

以下是输出结果,已被截断:

- 现在让我们重启 OpenNMS:

- 如果 UFW 防火墙尚未启用,我们先启用它,以便允许 OpenNMS 使用该端口:

我们的 UFW 防火墙现在在服务器上已启用。
- 由于 OpenNMS 运行在端口
8980上,我们将使用以下命令不允许此端口通过 UFW 防火墙:

- 当我们检查 UFW 的状态时,我们可以看到已为端口
8980添加了规则:

- 现在,打开浏览器并输入 URL
http://<IP 地址>:8980访问 OpenNMS。我们应该会看到以下屏幕:

使用默认用户名 admin 和默认密码 admin 登录,开始使用 OpenNMS。
- 登录后,我们将看到以下屏幕:

-
我们可以通过点击右上角的“管理员”,然后从下拉菜单中选择“快速添加节点”来在 OpenNMS 中添加新的服务器节点进行监控。
-
我们将看到以下屏幕,这样我们就可以添加新的服务器节点。输入必要的详细信息以完成该过程:

- 添加节点后,我们可以点击“信息”然后选择“节点”。你可以通过参考标签找到新添加的节点。在这里,我们可以看到节点的状态、通知和事件信息。
它是如何工作的
OpenNMS 用于监控网络中的多个服务器和节点。
要安装和配置 OpenNMS,我们首先需要安装 PostgreSQL 和 Java。我们还必须修改 /etc/hosts 和 /etc/hostname 文件,以设置完全限定的域名,以便我们可以在网络中正确使用 OpenNMS。
完成这些更改后,我们将安装并配置 OpenNMS 以供使用。
第十一章:理解 Linux 服务安全性
在本章中,我们将讨论以下内容:
-
Web 服务器 – HTTPD
-
远程服务登录 – Telnet
-
安全远程登录 – SSH
-
文件传输安全 – FTP
-
安全邮件传输 – SMTP
Web 服务器 – HTTPD
HTTPD 指的是 Apache2 Web 服务器,通常用于 Linux 系统。Web 服务器通常使用 HTTP 协议来传输网页。除了 HTTP,HTTPS 和 FTP 等协议也被支持。
准备工作
配置 Apache 在 Linux 系统上并没有特定要求。
如何操作...
在本节中,我们将学习如何在 Ubuntu 系统上安装和配置 Apache Web 服务器:
- 由于 Apache 在 Ubuntu 的默认软件库中可用,我们可以通过使用
apt安装器轻松安装它。要安装 Apache 及其所有必需的依赖项,我们运行以下命令:

- 在安装过程中,Apache 会将自己注册到 Ubuntu 的默认防火墙 UFW 中。这提供了可以用来启用或禁用通过防火墙访问 Apache 的配置文件。要列出这些配置文件,请输入以下命令:

我们可以看到 Apache 有三个可用的配置文件。Apache 仅引用端口 80,而 Apache Full 引用端口 80 和 443,而 Apache Secure 仅引用端口 443。
- 由于尚未配置 SSL,我们暂时只允许端口
80的流量。为此,我们运行以下命令:

- 现在,我们可以通过检查 UFW 的状态来验证是否已允许 HTTP 流量,如下所示:

- 当 Apache 安装完成后,Ubuntu 会自动启动它。可以通过运行以下命令来确认这一点:

-
Apache 启动并运行后,我们可以启用附加模块以获取扩展功能。
-
要检查附加模块的列表,请查看
/etc/apache2/mods-available目录。 -
假设我们要安装 MySQL 认证模块;可以通过运行以下命令来完成:
apt-get install libapache2-mod-auth-mysql
- 安装完成后,可以通过以下命令启用该模块:
a2enmod auth_mysql
- 接下来,我们需要重启 Apache 以使更改生效:
systemctl restart apache2.service
- 如果我们希望加密由 Apache 服务器发送和接收的流量,可以使用
mod_ssl模块。由于该模块包含在apache2-common包中,我们可以直接通过以下命令启用它:
a2enmod ssl
- 启用 SSL 模块后,需要进行手动配置才能使 SSL 正常工作。我们已经在之前的章节中讨论过这一点。
它是如何工作的...
Apache 是 Ubuntu 上最常用的 web 服务器。我们从 Ubuntu 的软件库中安装它。安装完成后,我们根据需求通过 UFW 防火墙允许访问。
一旦 Apache 启动并运行,我们可以通过安装附加模块并启用它们来定制其配置。
远程服务登录 – Telnet
Telnet 是最早的远程登录协议之一,至今仍在使用。它比今天的大多数系统管理员都要古老,因为它是在 1969 年开发的。Telnet 允许用户在计算机之间建立基于文本的连接。由于 Telnet 没有内建的安全措施,因此它存在各种安全问题。
准备就绪
为了演示 Telnet 的使用,我们将使用两台系统。在第一台系统上,Telnet 服务器将运行,而从第二台系统,我们将检查安全问题。
如何操作...
在本节中,我们将看到 Telnet 如何引发严重的安全问题:
- 使用 Telnet 非常简单。只需打开终端窗口并输入以下命令:
telnet <IP Address> <Port>
这是一个示例:telnet 192.168.43.100 23
- 当 Telnet 在服务器上运行时,攻击者可以利用它执行其他服务的横幅抓取。让我们使用它来查找服务器上运行的 SSH 版本。输入以下命令来实现这一点:

正如我们从前面的截图中看到的,SSH 的版本被清楚地显示出来。
- 我们还可以通过 Telnet 执行 SMTP 横幅抓取。为此,我们运行以下命令:

在前面的输出中,我们可以看到远程服务器使用的是 PostFix 邮件服务器,主机名为 metasploitable.localdomain。
- 一旦攻击者获取了有关 SMTP 服务器的信息,他们可以尝试猜测有效的邮件账户。他们使用
vrfy命令后跟邮件账户来进行猜测。根据结果,他们可以判断邮件账户是否有效:

如果响应代码是 550,则表示猜测的邮件账户无效;如果响应代码是 250、251 或 252,则表示邮件账户有效。
-
由于 Telnet 默认不加密任何通过连接发送的数据,攻击者可以轻松地窃听通信并捕获敏感数据,包括密码。
-
假设某个用户正如图所示连接到 Telnet 服务器:

用户将被提示输入登录信息。一旦输入正确的细节,他们就能登录,如图所示:

- 与此同时,处于同一网络中的攻击者使用 Wireshark 工具嗅探网络流量。我们可以看到这里由 Wireshark 捕获的 Telnet 流量:

- 当我们分析捕获的包时,可以看到登录信息是以明文显示的,如下所示:

- 这清楚地告诉我们 Telnet 是多么不安全。
它是如何工作的...
作为最古老的协议之一,Telnet 没有内置的安全措施。攻击者可以利用 Telnet 进行横幅抓取。
攻击者还可以嗅探通过 Telnet 连接发送的流量,并获得重要信息,因为 Telnet 使用明文通信。
安全远程登录 – SSH
随着互联网的发展,使用 SSH 相关的安全风险也逐渐显现。为了克服这些安全风险,开发人员发布了一种名为 Secure Shell 或 SSH 的新工具。
它提供与 Telnet 相同的功能,但在一个安全的加密隧道中。
准备就绪
对于 Linux 系统,我们可以使用 OpenSSH 来进行 SSH 连接。它是一个免费的 Linux 工具,可以通过 apt 安装。我们在前面的章节中讨论了 OpenSSH 的安装和配置。
如何操作…
在本节中,我们将看到如何使用 SSH 替代 Telnet 来保护我们的数据:
- 一旦 SSH 安装并配置完成,我们可以尝试使用 SSH 连接到服务器,如下所示。在提示时输入密码:

- 同时,如果我们尝试使用 Wireshark 捕获流量,我们会得到以下详细信息:

在前面的截图中,我们可以看到最后几行显示客户端和服务器之间已启动密钥交换。
- 当我们查看捕获的包时,可以看到客户端和服务器之间交换的是加密的包,如下所示。在使用 Telnet 时并没有这种情况:

- 即使我们尝试查看数据包的详细信息,我们也看不到任何明文数据。我们得到的是加密的输出,如下所示:

- 因此,我们可以看到 SSH 如何帮助保护互联网上传输的数据。
文件传输安全 – FTP
文件传输安全(FTP)一直是最常用的文件传输协议。当我们谈论像 FTP 这样的文件传输协议时,意味着该协议用于发送以单个单位存储在特定文件系统中的比特流。然而,这个过程并不完全安全。
FTP 存在许多漏洞,并且不提供任何数据传输加密。
让我们讨论一些与使用 FTP 相关的安全风险:
-
FTP 回显攻击:当通过 FTP 协议进行文件传输时,源服务器将数据发送到客户端,然后客户端将数据传输到目标服务器。然而,在连接较慢的情况下,用户可能会使用 FTP 代理,这使得客户端直接在两个服务器之间传输数据。
-
在这种情况下,黑客可能使用
PORT命令发起请求,通过成为该特定文件传输请求的中间人来访问端口。然后,黑客可以对主机进行端口扫描,并访问通过网络传输的数据。 -
FTP 暴力破解攻击:攻击者可以尝试对 FTP 服务器进行暴力破解攻击,猜测密码。管理员往往使用弱密码,并且在多个 FTP 服务器中重复使用相同的密码。在这种情况下,如果攻击者成功进行暴力破解攻击,所有数据将暴露。
-
数据包捕获(或嗅探):由于 FTP 以明文方式传输数据,任何攻击者都可以通过网络数据包嗅探获取敏感信息,如用户名和密码。
-
欺骗攻击:假设管理员已根据网络地址限制对 FTP 服务器的访问。在这种情况下,攻击者可以使用外部计算机并伪造其地址为企业网络上的任何计算机。一旦发生这种情况,攻击者就能访问所有正在传输的数据。
我们已经看到与 FTP 相关的不同安全风险。现在,让我们讨论几种执行安全数据传输的方法:
-
禁用标准 FTP:许多 Linux 服务器预装了标准 FTP 服务器。作为最佳实践,建议禁用标准 FTP,因为它缺乏隐私性和完整性,使得攻击者更容易访问传输的数据。应使用更安全的替代方案,如 SFTP。
-
使用强加密和哈希:当使用 SFTP 或任何其他安全协议时,确保禁用过时的旧加密算法,如 Blowfish 和 DES,只使用强加密算法,如 AES 和 TDES。
FTP 是一个非常古老的协议,但我们仍然可以在许多网络中看到 FTP 的糟糕实现。作为一个古老的协议,它的安全特性较少,因此容易受到许多安全风险的威胁。
当我们使用如 SFTP 这样的安全协议而不是 FTP 时,攻击的可能性会大大降低。
邮件传输安全 – SMTP
SMTP或简单邮件传输协议是电子邮件服务器使用的协议。每封电子邮件都是通过 SMTP 协议由 SMTP 服务器发送和接收的。像 Postfix 这样的 MTA(邮件传输代理)可以配置为电子邮件服务器。
Postfix 可以在 Linux 系统上用于路由和传递邮件。
准备工作
要安装和配置 Postfix,我们将使用 Ubuntu 服务器。我们还需要在服务器上配置完全限定域名(FQDN)。
如何操作...
在本节中,我们将学习如何在 Ubuntu 服务器上安装和配置 Postfix,并根据我们的需求进行使用:
- 由于 Postfix 包含在 Ubuntu 的默认软件库中,安装它变得非常简单。为了开始安装,我们将运行以下命令,并设置
DEBIAN_PRIORITY=low环境变量,以便在安装过程中回答一些额外的提示:

- 一旦安装开始,首个窗口将询问邮件配置类型。我们将根据需求选择
Internet Site,如下所示:

- 在下一个窗口中,输入将用于
系统邮件名称的主机名,如下所示:

- 接下来,输入将用于转发根账户和邮局管理员邮件的 Linux 用户账户,如下所示:

- 下一个窗口定义了 Postfix 将接受的邮件目的地。确认现有的条目,并在需要时添加其他域:

-
在下一个窗口中,选择
否并继续。 -
下一个窗口指定了邮件服务器配置的转发消息的网络列表:

- 在下一个窗口中,我们可以限制消息的大小。我们将设置为
0,以禁用任何大小限制:

- 在下一步中,选择 Postfix 应该支持的 IP 版本。在我们的例子中,我们将选择
all:

- 完成前面的步骤后,安装将完成,如下所示:

- 现在,我们将开始设置邮箱。为此,我们将
home_mailbox变量设置为Maildir/,如图所示:

这一步将会在用户的主目录下创建一个目录结构。
- 然后,设置
virtual_alias_maps表的位置。此表用于将 Linux 系统账户与电子邮件账户进行映射。我们将运行以下命令来执行此操作:

- 现在,让我们编辑
etc/postfix/virtual文件,将邮件地址映射到 Linux 账户,如下所示:

- 完成后,运行以下命令应用映射:

- 现在,我们将重启 Postfix 服务:

- 我们的下一步是允许 Postfix 通过 UFW 防火墙:

- 现在 Postfix 应该已经配置好,可以发送邮件了。我们可以通过从任何用户账户向 root 邮件账户发送测试邮件来进行测试,如下所示:

- 接下来,我们通过输入
mail命令来检查 root 账户的邮件。我们会看到有一封新邮件等待。当我们按下Enter,可以看到邮件内容,如下所示:

-
在完成之前,我们将对 Postfix 进行加固。
-
在之前的教程中,远程服务登录 - Telnet,我们看到攻击者如何使用
vrfy命令猜测电子邮件账户,如下所示:

- 为了防止此问题,我们需要禁用
vrfy命令。为此,我们运行以下命令:
postconf -e disable_vrfy_command=yes
完成此操作后,我们重启 Postfix 服务以使更改生效。
- 现在,如果攻击者尝试相同的步骤,他们将得到如下所示的输出:

它是如何工作的...
Postfix 用于配置我们的 SMTP 服务器。在配置过程中,我们将邮箱账户与 Linux 系统账户进行映射。
为了提高 Postfix 的安全性,我们禁用了vrfy命令,从而防止攻击者猜测服务器上配置的邮箱账户。
第十二章:扫描和审计 Linux
在本章中,我们将讨论以下内容:
-
在 Linux 上安装杀毒软件
-
使用 ClamAV 扫描
-
查找 rootkit
-
使用 auditd 守护进程
-
使用 ausearch 和 aureport 阅读日志
-
使用 systemctl 审计系统服务
在 Linux 上安装杀毒软件
在今天的环境中,病毒和恶意威胁可以出现在任何系统中,包括 Linux。因此,作为系统管理员,我们可以在 Linux 服务器上使用杀毒软件。
ClamAV 是一种开源杀毒软件,用于检测和清除 Linux 系统上的病毒、木马、恶意软件和其他威胁。
准备工作
ClamAV 可以从 Ubuntu 的默认仓库中安装。不过,如果我们想从源代码安装,可以从以下网址下载官方源代码:www.clamav.net/download.html.
如何操作...
在本节中,我们将看到如何在 Ubuntu 服务器上安装 ClamAV 杀毒软件:
- 在开始安装工具之前,我们将通过运行以下命令来更新仓库:

- 接下来,我们将运行以下命令来安装 ClamAV 杀毒软件:


- 我们也可以使用以下命令安装该工具的 GUI 版本:

- 安装完成后,我们可以通过运行以下命令来检查安装的包版本:

-
命令行版可以通过使用
clamscan后接适当的选项来使用。 -
要打开 ClamAV 的 GUI 版本,请进入主菜单,搜索该工具,如下所示:

- 当我们打开 GUI 版本时,它将如图所示打开:

它是如何工作的...
ClamAV 可以轻松安装在 Linux 系统上,既可以使用 Linux 的默认仓库,也可以从其官方网站下载源代码。
ClamAV 可以通过命令行或 GUI 使用。
使用 ClamAV 扫描
ClamAV 是一个跨平台的杀毒软件,能够检测不同类型的恶意软件,包括病毒。它包含多种工具,如命令行扫描器、数据库更新程序和多线程守护进程,使其成为一个强大的工具。
准备工作
在我们运行系统扫描之前,必须先安装命令行版或 GUI 版的工具。可以按照前面部分讨论的方式进行安装。
如何操作...
在本节中,我们将看到如何根据我们的需求使用 ClamAV 执行扫描。
- 作为第一步,我们将查看工具的帮助菜单,以查看 ClamAV 支持的不同选项,如下所示:

- 如下截图所示,ClamAV 支持在扫描过程中使用的各种选项:

- 我们现在将开始对
/home目录进行扫描,如下所示:

- 扫描完成后,它将显示以下扫描摘要:

- 我们也可以使用 GUI 版本运行扫描。打开工具后,通过点击“设置”来更改扫描设置。这将打开如下所示的窗口:

在前面的窗口中,根据我们的需求选中或取消选中选项。
- 接下来,点击“扫描文件”或“扫描目录”以开始相应的扫描:

- 扫描将开始运行,如下所示:

- 当扫描完成时,它将显示查找到的结果,或者如果没有发现威胁,则会显示以下消息:

- 通过点击“更新”,我们可以检查是否有可用的签名更新:

它是如何工作的...
ClamAV是一个多功能工具,支持多种文件格式和多种签名语言,大多数病毒会利用这些漏洞来攻击系统。它可以执行多线程扫描。
查找 rootkit
现在的服务器面临着日益频繁的网络攻击,作为系统管理员,建议定期检查以确保没有攻击者进入系统。
通过使用不同的工具,我们可以防止恶意软件和 rootkit 被安装到我们的服务器上。
准备工作
在我们的 Linux 系统上使用扫描工具没有特定的要求。
如何操作...
在本节中,我们将看到如何安装和配置 Linux rootkit 扫描工具,并根据我们的需求进行使用:
- 首先,我们将安装
chkrootkit,这是一个经典的 Linux rootkit 扫描工具,如下所示:

- 一旦软件安装完成,我们可以通过运行以下命令检查软件安装路径:

- 接下来,我们查看帮助菜单,了解可以用来运行该工具的选项:

- 如果我们想查看 chkrootkit 中可用的测试列表,可以运行以下命令:

- 现在,让我们按照这里所示开始扫描:

- 如我们在扫描输出中看到的,软件正在检查所有已知的 rootkit 签名:

- 另一个可以用来扫描 rootkit 的知名工具是
rkhunter。通过运行以下命令来安装该工具:

- 接下来,检查帮助菜单,查看运行软件时可以使用的选项:

- 现在,按照此处所示开始扫描:

- 如输出所示,所有已知的 rootkit 签名都已经检查过,且没有找到任何:

- 最后,当扫描完成时,该工具将显示一个扫描摘要,如此处所示:

它是如何工作的...
Chkrootkit 和 rkhunter 都是开源的基于 Linux 的 rootkit 扫描工具,有助于扫描 Linux 机器上可能存在的 rootkit。
这两个工具都使用基于签名的扫描来检查 Linux 系统上的 rootkit 和其他恶意软件。
使用 auditd 守护进程
当我们谈论保护系统时,这包括许多程序,而审计系统就是其中之一。Linux 系统预装了一个名为 auditd 的工具,它负责将审计记录写入磁盘。
准备就绪
在 Linux 系统上使用 auditd 没有任何特定要求。
如何操作...
在本节中,我们将看到如何使用 auditd 来进行审计:
- 如果工具尚未安装在我们的 Linux 发行版上,可以通过运行以下命令来安装:
apt-get install auditd
-
当安装该软件包时,它还会在安装过程中安装一些其他工具。其中一个安装的工具是
auditctl,它帮助控制软件的行为并添加规则。 -
我们可以通过运行以下命令检查工具的版本:

- 当第一次安装 auditd 时,它还没有任何规则可用。可以通过运行以下命令来检查:

- 现在,让我们查看帮助菜单,检查可与该工具一起使用的其他选项:

- 要开始使用
auditd工具,必须有规则。我们可以添加规则来审计文件,如此处所示:

在前面的命令中,-w 选项告诉 auditd 监视指定的文件。p 选项指定 auditd 应该触发的权限。然后,wxa 分别表示读取、写入、执行和属性。
- 我们还可以添加规则来监视目录,如此处所示:

- 如果我们现在检查规则列表,我们会得到以下输出:

它是如何工作的...
auditd 帮助定义规则,根据这些规则,它会监视指定的文件和目录。如果这些文件和目录发生了变化,auditd 将根据已定义的规则触发。
使用 ausearch 和 aureport 阅读日志
在上一节中,我们了解了如何使用 auditd 工具定义规则并监视特定的文件和目录。
要从 auditd 日志文件中提取数据,我们可以使用ausearch工具,通过使用aureport,可以基于这些日志生成报告。
ausearch是一个命令行工具,用于根据事件和其他搜索条件搜索 auditd 守护进程的日志文件。
类似地,aureport也是一个命令行工具,帮助从 auditd 守护进程的日志文件中创建有用的汇总报告。
准备就绪
当我们安装 auditd 守护进程时,它也会一起安装 ausearch 和 aureport 工具。所以不需要额外安装这些工具。
如何操作...
本节将介绍如何使用 ausearch 和 aureport 工具来读取 auditd 守护进程的日志文件,并从中创建报告:
- auditd 日志的默认存储位置是
/var/log/audit/audit.log。如果我们查看这个文件的内容,输出如下所示:

从输出中可以看到,日志包含大量数据,且由于内容较多,直接查看文件内容时很难获取到具体的信息。
- 因此,我们将使用
ausearch以更强大且高效的方式搜索日志。首先,我们查看工具的帮助文件,以了解可以使用的选项:

- 假设我们想查看与某个正在运行的进程相关的日志,可以通过使用
-p标志并传递进程 ID 给ausearch命令来实现,如下所示:

从输出中可以看到,现在只显示了特定进程 ID 的相关信息。
- 如果我们想查看用户账户的登录失败尝试,可以通过运行以下命令来实现:

- 要查找特定用户账户的活动记录,我们可以运行以下命令:

在前面的命令中,pentest是我们想查询的用户名。
- 我们还可以使用
ausearch查询特定时间段内某个用户执行的操作。在以下命令中,我们使用-ts表示开始日期/时间,-te表示结束日期/时间:

- 如果我们想根据 auditd 守护进程添加的审计规则键创建报告,可以使用以下命令,并使用
-k标志:

- 如果我们想将数字实体转换为文本(例如将 UID 转换为账户名),在使用前面命令创建的报告中,我们可以添加
-i标志,如下所示:

- 要创建有关用户认证事件的报告,我们可以使用以下命令:

- 要创建所有登录的报告,我们使用
-l标志,如下所示:

- 如果我们想查看失败的登录事件报告,可以使用以下命令:

- 与
ausearch类似,我们可以使用aureport为特定的时间段创建报告,如下所示:

它是如何工作的……
ausearch和aureport与auditd守护进程一起工作。通过使用auditd记录事件数据的日志文件,ausearch可以根据我们的需求帮助我们读取这些日志。类似地,通过使用aureport,我们可以根据auditd守护进程的日志文件创建有用的报告。
使用 systemctl 审核系统服务
Systemd是一个初始化系统,同时也是一个系统管理工具,已经成为 Linux 系统的新标准。为了控制该初始化系统,我们有一个中央管理工具,称为systemctl。通过使用systemctl,我们可以检查服务状态、管理服务、改变服务的状态,并与它们的配置文件进行操作。
准备工作
大多数 Linux 发行版都已实现systemctl,因此它是预安装的。
如果某个特定的 Linux 发行版没有预安装systemctl,则意味着该 Linux 发行版没有使用该初始化系统。
如何操作……
在本节中,我们将讨论如何使用systemctl命令对服务执行各种操作:
- 要确认我们的 Linux 发行版是否支持
systemctl,我们只需运行命令systemctl,如这里所示:

如果我们得到如图所示的输出,说明命令正在正常工作。如果收到错误信息bash: systemctl is not installed,则意味着系统不支持该命令,因为它使用了其他初始化系统。
- 如果我们想检查某个特定服务的状态,例如 SSHD 服务,可以像这里展示的那样使用
systemctl:

如图所示的输出清楚地告诉我们,SSHD 服务正在正常运行。
- 要停止或启动任何服务,我们使用以下命令:

- 我们可以使用
systemctl重启正在运行的服务。此外,如果某个服务支持重新加载其配置文件(而不需要重启),我们可以使用systemctl命令的reload选项来实现,如这里所示:

- 我们可以使用
systemctl命令查看 systemd 已知的所有活动单元列表,如下所示:

- 有时,我们可能希望查看某个特定服务的依赖树。这可以通过使用
systemctl命令实现,如下所示:

它是如何工作的……
systemctl允许我们与systemd实例进行交互并控制它。我们使用systemctl工具来管理任何类型的服务和系统状态。
使用 systemctl 命令的不同选项,我们可以对服务执行不同的操作。
第十三章:漏洞扫描与入侵检测
在本章中,我们将讨论以下内容:
-
使用 Security Onion 进行网络安全监控
-
使用 OpenVAS 查找漏洞
-
使用 Nikto 进行 Web 服务器扫描
-
使用 Lynis 进行强化
使用 Security Onion 进行网络安全监控
Security Onion是一个基于 Linux 的发行版,旨在用于网络安全监控。监控网络中的安全相关事件可以是主动的,若用于识别漏洞,或者是被动的,如在事件响应中。
Security Onion 通过提供网络流量的洞察和警报的背景信息来帮助我们。
准备就绪
我们在前面的章节中讨论了在系统上安装和配置 Security Onion 的过程。按照这些步骤,我们已经拥有了一个安装了 Security Onion 的正常运行系统。
使用 Security Onion 无需其他先决条件。
如何操作...
在本节中,我们将介绍 Security Onion 中一些可以帮助进行安全监控的工具:
- 完成 Security Onion 中包含的安全工具的设置后,我们需要创建一个用户帐户来使用这些工具。打开终端并运行以下命令来为工具创建一个用户:

在前面的步骤中,我们创建了一个名为pentest1的用户,并为其配置了密码。
-
一旦我们创建了用户帐户,就可以开始使用这些工具。
-
在桌面上,我们可以找到 SGUIL 工具的图标。双击该图标以运行该工具。
-
会出现一个登录界面,如下所示。输入在前一步中配置的用户详细信息,然后点击确定:

- 一旦用户详细信息得到验证,下一窗口将要求选择要监控的网络。从可用选项中选择接口并点击开始 SGUIL以继续:

- 我们将看到如下所示的窗口。这是 SGUIL 工具的主屏幕。在这里,我们可以监控在前一步中选择的网络上发生的实时事件,以及会话数据和原始数据包捕获:

更多关于使用该工具的信息可以在bammv.github.io/sguil/index.html找到。
-
Security Onion 中还包含其他工具,如 Kibana。要访问该工具,我们可以在桌面上找到快捷方式。双击快捷方式后,它会打开指向以下网址的浏览器:
https://localhost/app/kibana。 -
浏览器会显示有关不安全连接/连接不安全的警告,因为使用的是自签名 SSL 证书。忽略此错误,如下所示,点击高级并继续:

- 接下来,Kibana 会要求输入用户详细信息以登录。使用第一步中配置的用户信息。成功登录后,我们将看到以下窗口:

-
Kibana 帮助可视化 Elasticsearch 数据,并且可以在 Elastic 堆栈中进行导航。
-
Security Onion 还包含其他可用于监控网络中各种活动的工具。探索这些工具以获得更多的见解。
它是如何工作的...
Security Onion 是一个开源的 Linux 发行版,主要用于企业安全监控、入侵检测和日志管理。为了帮助管理员进行安全监控,它包含了多种安全工具,例如 Sguil、Kibana、Suricata、Snort、OSSEC、Squert、NetworkMiner 等。
使用 OpenVAS 查找漏洞
作为 Linux 管理员,我们希望跟踪系统中可能存在的漏洞。及时发现这些漏洞有助于在攻击者利用之前修复它们。
为了查找漏洞,我们可以使用像 OpenVAS 这样的漏洞扫描工具。它是最先进的开源漏洞扫描工具之一。
准备工作
要使用 OpenVAS,我们必须首先在系统上安装并配置它。有关安装和配置过程的更多信息,请参考 OpenVAS 的官方网站:www.openvas.org/。
如何操作...
完成 OpenVAS 的安装和初步配置后,我们可以使用它来扫描网络中的服务器。在本节中,我们将了解如何配置并运行扫描:
-
要访问 OpenVAS,请在浏览器中输入此 URL:
https://127.0.0.1:9392。 -
我们将看到如下所示的登录界面。请输入在安装 OpenVAS 时配置的用户详细信息:

- 登录后,我们会看到以下窗口。在顶部菜单中,我们可以找到不同的选项,如 Scan、Assets 和 Configuration:

- 要扫描服务器,我们首先需要将其添加为扫描目标。为此,请点击 Configuration,然后点击 Target,如下所示:

- 我们将看到以下窗口。在左上角,我们可以看到一个星形图标。点击该图标后,它将打开一个新窗口以添加目标服务器:

- 在新窗口中,输入目标服务器的详细信息。为其命名以便于识别目标,然后输入 IP 地址,如下所示:

填写完细节后,点击“创建”以将目标保存到目标列表中。
- 我们可以在目标列表中看到我们的目标服务器:

- 接下来,我们点击 Scan 菜单,然后点击 Tasks 来开始创建扫描任务:

- 在下一个窗口中,点击蓝色星形图标,然后点击新任务以继续:

- 现在,我们将为我们创建的扫描任务命名,然后通过扫描目标菜单下的列表选择我们的目标服务器,如下所示:

对于调度选项,勾选“仅一次”框以仅运行一次扫描。根据需求,我们可以安排扫描多次运行。接下来,点击“创建”。
- 一旦我们点击“创建”,我们的扫描任务就已创建并可以在任务列表中看到,如下所示:

- 在我们创建的扫描结果的最右侧,可以看到操作栏中的一些按钮,如下所示。在这里,我们可以启动或暂停之前创建的扫描任务:

-
一旦我们点击前面截图中显示的开始或播放按钮,扫描将开始运行。根据网络速度和其他资源的不同,完成扫描的时间可能会有所不同。
-
扫描完成后,它可以在扫描任务列表中看到,如下所示:

- 严重性栏显示扫描的摘要。它根据严重性显示发现问题的数量。

- 要查看扫描仪发现的完整漏洞列表,我们可以点击扫描名称,然后我们将看到 OpenVAS 发现的漏洞列表,如下所示:

OpenVAS 找到的漏洞列表
它是如何工作的...
OpenVAS 允许我们使用目标选项添加我们希望扫描的服务器。添加服务器后,我们通过扫描菜单创建一个扫描任务。在扫描任务中,我们选择之前创建的目标,并对其进行扫描。
当扫描任务成功配置后,我们运行扫描。扫描完成后,我们可以看到 OpenVAS 发现的漏洞列表。
使用 Nikto 进行 Web 服务器扫描
如果我们的 Linux 服务器配置为 Web 服务器,Web 服务器和托管在 Web 服务器上的 Web 应用程序可能存在漏洞。在这种情况下,我们可以使用 Web 应用程序扫描工具来识别这些漏洞,Nikto 就是其中一个开源 Web 扫描器。
它可以与任何 Web 服务器配合使用,并且能够扫描大量项目以检测漏洞、配置错误、风险文件等。
准备工作
要使用 Nikto 扫描我们的 Web 服务器,首先需要在我们的系统上安装它,扫描将在该系统上进行。如果我们使用 Kali Linux,Nikto 已经预安装在其中。对于其他 Linux 发行版,我们可以使用以下命令安装该工具:

如何操作...
在本节中,我们将演示如何使用 Nikto 检查 Web 服务器并报告潜在的漏洞:
- 要查看 Nikto 支持的选项的更多详细信息,我们运行以下命令:

- Nikto 支持多种插件来查找不同的漏洞。如果我们想查看插件列表,可以使用以下命令:

- 现在,让我们使用 Nikto 对我们 IP 地址为
192.168.43.100的 Web 服务器进行扫描。我们使用以下命令开始扫描:

一旦我们运行命令,扫描将开始运行。根据网络速度和可能存在的漏洞数量,完成扫描的时间可能会有所不同。
- 我们可以从下面的截图看到,Nikto 已经在我们的 Web 服务器上识别出了一些漏洞。它还告诉我们,Web 服务器正在运行 Apache 2.2.8,如之前所见:

它是如何工作的...
Nikto 配备了超过 6,700 个插件,使用这些插件可以测试 Web 服务器中可能存在的安全问题。
一旦我们启动扫描,Nikto 使用这些插件检查所有漏洞,并在发现时报告它们。
使用 Lynis 进行系统硬化
Lynis 是一款开源安全工具,用于审计类 Unix 系统。它对系统进行全面扫描,并根据结果提供系统硬化和合规性测试的指导。
Lynis 可以用于多种目的,包括漏洞检测、渗透测试、安全审计、合规性测试和系统硬化。
准备工作
Lynis 支持几乎所有基于 Unix 的操作系统和版本。我们可以通过访问以下链接从官方网站获取 Lynis 的副本:
cisofy.com/documentation/lynis/get-started/
对于我们的示例,我们正在使用 Ubuntu 系统安装 Lynis。我们运行以下命令来安装该工具:

如何操作...
在本节中,我们将演示如何使用 Lynis 对系统的安全性和配置进行详细审计:
- 一旦 Lynis 安装在我们的系统上,我们可以运行
lynis命令,如下所示,以查看该工具支持的更多选项信息:

- 我们可以通过运行以下命令来检查 Lynis 版本是否为最新版本:

我们可以从输出中看到当前版本是 211,而最新版本是 266。如果我们希望更新版本,可以按照输出中显示的步骤继续操作。
- 现在,我们将开始扫描,以审计我们的系统并通过运行以下命令识别其中的漏洞:

- 随着扫描的进行,我们可以在这里看到扫描结果:

- 在以下输出中,我们可以看到 Lynis 已经识别出服务器缺少的模块:

- 扫描完成后,我们可以在这里看到扫描的总结:

它是如何工作的...
当我们使用 Lynis 审计系统时,它首先初始化并执行基本检查,以确定操作系统和工具。随后,Lynis 会根据定义的类别运行启用的插件和安全测试。
Lynis 执行了数百个测试,这有助于确定系统的安全状态。
扫描完成后,Lynis 会报告扫描的状态。






































浙公网安备 33010602011771号