这是一系列安全与监控脚本,可用于监控您的 Linux 安装中的安全相关事件,或用于调查。每个脚本独立运行,且不依赖其他脚本。这些脚本可以配置为直接打印结果、通过邮件发送给您,或使用 AlertR 作为通知渠道。
脚本位于 scripts/ 目录下。每个脚本的文件头部都包含一段简短摘要,描述其功能、当检测结果不明确时的解释方式以及已知问题。如果脚本有需要安装的依赖项,也会一并列出,同时会注明该脚本的灵感来源(如果有)。
每个脚本在 scripts/config/ 目录下都有一个对应的配置文件。如果在脚本执行期间未找到配置文件,脚本将回退到默认设置并打印结果。因此,并非必须提供配置文件。
scripts/lib/ 目录包含多个脚本之间共享的代码。
使用 monitor_ 前缀的脚本会保持状态,仅用于监控目的。单独使用它们进行一次调查只会显示 Linux 系统的当前状态,而不会显示可能对系统安全有影响的变更。如果您希望将这些脚本的当前系统状态标记为良性,可以使用 --init 参数。
使用 search_ 前缀的脚本用于搜索入侵指标。这些脚本可用于调查目的。如果您希望将它们用于监控目的,可以使用 --monitoring 参数来保持状态,仅输出新发现。
查看您要执行的脚本的头部。它包含一段简短描述,说明该脚本的功能以及所需的要求(如果需要的话)。如果需要依赖项,请在运行脚本之前安装它们。
共享配置文件 scripts/config/config.py 包含所有脚本通用的设置。此外,每个脚本可以通过 scripts/config/ 目录下对应的配置文件进行配置。如果未找到配置文件,将使用默认设置并打印结果。
最后,您可以通过执行 start_search.py(位于主目录下)或手动执行每个脚本来运行所有已配置的脚本。运行脚本需要 Python3 解释器。
如果您希望持续使用这些脚本来监控您的 Linux 系统,需要执行以下步骤:
设置一个脚本支持的通知渠道(目前支持:打印输出、邮件或 AlertR)。
使用 scripts/config/ 目录下的配置文件配置您要运行的脚本。
使用 --init 参数执行 start_search.py,以初始化带有 monitor_ 前缀的脚本,并让它们建立系统的状态。但请注意,这假设您的系统当前未被入侵。如果您不确定,应验证系统的当前状态。
以 root 用户身份设置一个 cron 任务,定期执行 start_search.py --monitoring(例如:0 * * * * root /opt/LSMS/start_search.py --monitoring 表示每小时执行一次搜索)。--monitoring 参数让脚本仅报告新发现,从而避免重复报告相同问题。
| 名称 | 脚本 |
|---|
| 监控 cron 文件 | monitor_cron.py |
| 监控 /etc/hosts 文件 | monitor_hosts_file.py |
| 监控 /etc/ld.so.preload 文件 | monitor_ld_preload.py |
| 监控 /etc/passwd 文件 | monitor_passwd.py |
| 监控内核模块 | monitor_modules.py |
| 监控 SSH authorized_keys 文件 | monitor_ssh_authorized_keys.py |
| 监控 systemd 单元文件 | monitor_systemd_units.py |
| 搜索正在运行的已删除程序 | search_deleted_exe.py |
| 搜索 /dev/shm 中的可执行文件 | search_dev_shm.py |
| 搜索隐藏的 ELF 文件 | search_hidden_exe.py |
| 搜索不可变文件 | search_immutable_files.py |
| 搜索 utmp 日志中缺失的 lastlog 条目 | search_lastlog_in_utmp.py |
| 搜索无文件程序(memfd_create) | search_memfd_create.py |
| 搜索冒充内核线程的进程 | search_non_kthreads.py |
| 搜索由已断开的 SSH 会话启动的进程 | search_ssh_leftover_processes.py |
| 搜索内核模块污染标志中的可疑组合 | search_tainted_modules.py |
| 搜索 utmp 日志被篡改的迹象 | search_utmp_tampering.py |
| 测试脚本,用于检查告警功能是否正常 | test_alert.py |
| 验证已安装 .deb 包的完整性 | verify_deb_packages.py |