Lynis 配置参数详解(default.prf 与 custom.prf 实测)
Lynis 3.1.7 配置体系详解:澄清 3.x 无 lynis.conf、profile 发现与合并机制,default.prf 全参数分组解析(skip-test 双粒度/config-data sysctl 六字段/permfile 权限基线/插件声明与实体),附 skip-test 测试级与选项级差分实测(6→5 测试、10→9 建议)。
Lynis 配置参数详解(default.prf 与 custom.prf 实测)
目标:讲透 Lynis 3.1.7 的配置体系——为什么没有 lynis.conf、profile 如何发现与合并、default.prf 每一类参数的作用与改法,并用两组差分实验实证 skip-test 的测试级/选项级两种粒度。全部结论基于 Ubuntu 22.04.4 LTS(内核 6.8.0、x86_64)服务器实测,Lynis 版本 3.1.7(官方 deb 包 3.1.7-100,安装方式见《Ubuntu 22.04 安装 Lynis 3.1.7 指南》)。
一、环境信息
- 操作系统:Ubuntu 22.04.4 LTS(主机名 ops,内核 6.8.0-138-generic,x86_64)
- Lynis 版本:3.1.7(CISOfy 官方 apt 源 deb 包)
- 配置文件:
/etc/lynis/default.prf(系统级默认 profile,来自 deb 包,435 行);自定义覆盖文件/etc/lynis/custom.prf(手工创建) - 查询日期:2026-10-24(官方仓库与文档取证)
- 实测方法:创建两个只含一行
skip-test的自定义 profile,分别配合--profile参数跑audit system --tests-from-group ssh,与基线输出逐项比对
二、配置体系总览
2.1 先澄清一个高频误解:3.x 没有 lynis.conf
网上大量旧教程提到 /etc/lynis/lynis.conf。实测澄清:Lynis 3.x 不存在也不读取 lynis.conf。实测两处证据:
- deb 包安装后
dpkg -L lynis显示/etc/lynis/下只有default.prf与developer.prf两个 profile 文件,没有 lynis.conf; - Lynis 主脚本中 profile 发现逻辑(include/functions 的 DiscoverProfiles)搜索的是
default.prf与custom.prf两个文件名。
lynis.conf 是 1.x/2.x 早期版本的历史产物,3.x 起配置统一收敛到 profile 体系(.prf 文件)。
2.2 profile 的发现路径与合并顺序
Lynis 启动时按固定顺序在以下目录查找 profile(源码 include/functions DiscoverProfiles 实读):
/usr/local/etc/lynis → /etc/lynis → /usr/local/lynis → .(当前工作目录)
找到的 default.prf 与 custom.prf 依次加入 PROFILES 列表。实测验证:
lynis show profiles
实测输出(deb 包安装后):
[=/etc/lynis/default.prf]
2.3 多 profile 叠加规则
--profile 参数可以把额外 profile 追加进加载列表(不是替换)。实测:给审计指定自定义 profile 后,输出头部的 Profiles 行变成两个文件:
Profiles: /etc/lynis/default.prf /opt/data/lynis/custom-skip-test.prf
合并语义:两个 profile 的键都生效,后加载的覆盖先加载的同名简单键(如 quick=no 覆盖 default 的 quick=yes);skip-test 与 config-data 等列表型键则是叠加(两个 profile 的跳过项都算数)。这就是官方推荐"不改 default.prf、只写 custom.prf 增量"的机制基础。
⚠️ 注意:官方明确警告不要直接修改
/etc/lynis/default.prf——deb 包升级会覆盖它,你的改动将丢失。所有定制都写进独立的 custom.prf。
三、profile 文件语法
profile 是纯文本键值文件,语法规则简单:
# 行首井号为注释
键=值 # 布尔:yes/no;整数;字符串
plugin=名称 # 列表型键:一行一个实例,可重复出现
skip-test=TEST-ID # 同上,可重复多行
其中 config-data= 是特殊的多字段键(见 4.3 节)。改完 profile 无需重启任何服务(Lynis 是一次性进程),下次审计立即生效。
四、default.prf 参数分组详解
以下逐组解析 default.prf(435 行)中的全部参数,示例均摘自实测文件的原文。
4.1 运行行为参数
| 参数 | 默认值(实测) | 作用 | 改法示例 |
|---|---|---|---|
quick | yes | 审计中不等待按键(无人值守必开) | quick=no(交互逐步跑) |
pause-between-tests | 0 | 每个测试之间的停顿秒数 | pause-between-tests=1(演示/观察用) |
colors | 1 | 输出是否带颜色 | colors=no(cron/重定向时更干净) |
verbose | no | 输出更多执行细节 | verbose=yes |
show-tool-tips | yes | 结尾是否显示 TIP 提示(如加 --logfile 的提示) | show-tool-tips=no |
show-report-solution | yes | 建议条目是否附带 Solution 字段 | no 可让输出更短 |
language | 自动检测 | 报告语言(可用值见 lynis show language,实测含 en/cn/fr/nl 等) | language=en(中文环境实测会先报 no language file found for 'zh',因为检测到 zh 而内置清单是 cn,显式指定可消除) |
error-on-warnings | 默认未启用 | 出现任何 Warning 时以非零码退出 | error-on-warnings=yes(CI 卡点用) |
test-scan-mode | full | 扫描深度:light/normal/full,影响执行测试数量 | test-scan-mode=light(快速摸底) |
refresh-repositories | yes | 漏洞扫描前刷新系统软件源索引 | 无源环境可设 no 省时间 |
skip-plugins | no | 是否跳过全部插件 | yes |
profile-name | Default Audit Template | profile 的展示名 | 自定义 profile 起个名字 |
machine-role | server | 系统角色:personal/workstation/server,影响部分测试取舍 | 桌面机改 workstation |
💡 CLI 参数(如
--quick、--verbose)与 profile 键是同源的:CLI 优先级更高,适合临时覆盖;profile 适合固化。
4.2 测试裁剪参数(skip-test 系列)
这是实践中最重要的参数。两种粒度(default.prf 原文注释给出):
# Skip a test (one per line)
#skip-test=SSH-7408
# Skip a particular option within a test (when applicable)
#skip-test=SSH-7408:loglevel
#skip-test=SSH-7408:permitrootlogin
- 测试级
skip-test=TEST-ID:整个测试不执行; - 选项级
skip-test=TEST-ID:option:测试仍执行,但豁免其中某个选项的检查(小写)。
skip-test=KRNL-6000:<sysctl-key> 还有一个特别用途:KRNL-6000 测试按 profile 期望值逐项比对 sysctl(见 4.3),当你接受某个值偏离基线(如业务需要 kernel.sysrq=1)时,可以只豁免这一项而不是放弃整个 KRNL-6000。实测审计输出原文:
- kernel.ctrl-alt-del (exp: 0) [ OK ]
- kernel.sysrq (exp: 0) [ DIFFERENT ]
* One or more sysctl values differ from the scan profile and could be tweaked [KRNL-6000]
- Solution : Change sysctl value or disable test (skip-test=KRNL-6000:<sysctl-key>)
(第五、六、七章会以差分实验实证这两种粒度的真实效果。)
4.3 内核加固期望值(config-data=sysctl 六字段格式)
default.prf 中最大的参数块是 config-data=,格式为分号分隔六字段:
config-data=sysctl;<sysctl键>;<期望值>;<加固点数>;<描述>;<相关文件或命令>;category:security;
default.prf 原文示例(Linux 部分节选):
config-data=sysctl;kernel.randomize_va_space;2;1;Randomize of memory address locations (ASLR);sysctl -a;url:https;//www.kernel.org/doc/Documentation/sysctl/kernel.txt;category:security;
config-data=sysctl;kernel.sysrq;0;1;Disable magic SysRQ;sysctl -a;url:https;//www.kernel.org/doc/Documentation/sysctl/kernel.txt;category:security;
config-data=sysctl;kernel.kptr_restrict;2;1;Restrict access to kernel symbols;sysctl -a;url:https;//www.kernel.org/doc/Documentation/sysctl/kernel.txt;category:security;
config-data=sysctl;kernel.yama.ptrace_scope;1|2|3;1;Disable process tracing for everyone;-;category:security;
要点:
- 期望值支持多值:用
|分隔,如kernel.yama.ptrace_scope期望1|2|3(三者任一都算达标)、kernel.perf_event_paranoid期望2|3|4; - 实测本机
kernel.randomize_va_space=2、kernel.kptr_restrict=2与期望一致(OK),kernel.sysrq=1与期望0不一致(DIFFERENT,产生 KRNL-6000 建议)——期望值即"你们团队的基线",可以按需修改; - default.prf 同时含 FreeBSD(security.bsd.、net.inet.)与 Linux(net.ipv4.、net.ipv6.、fs.、kernel.)的键,Lynis 按平台自动取用;
- 修改基线请复制该行到 custom.prf 修改,不要动 default.prf。
4.4 文件与目录权限基线(permfile/permdir)
default.prf 内置了一份敏感文件权限基线(实测原文节选):
# 格式:permfile=文件:权限:属主:属组:动作(NOTICE 或 WARN)
permfile=/etc/crontab:rw-------:root:-:WARN:
permfile=/etc/passwd:rw-r--r--:root:-:WARN:
permfile=/etc/ssh/sshd_config:rw-------:root:-:WARN:
permfile=/boot/grub/grub.cfg:rw-------:root:root:WARN:
# 目录基线:permdir=目录:权限:属主:属组:动作
permdir=/root/.ssh:rwx------:root:-:WARN:
permdir=/etc/cron.d:rwx------:root:root:WARN:
实测本机审计的 DBS-1828 警告(PostgreSQL 配置文件 world readable)即由该机制判定产生:
! PostgreSQL configuration file /etc/postgresql/18/main/start.conf is world readable
and might leak sensitive details [DBS-1828]
- Details : /etc/postgresql/18/main/start.conf
- Solution : Use chmod 600 to change file permissions
想加入自有敏感文件(如 /etc/app/credentials.conf)的检查,在 custom.prf 加一行同格式 permfile= 即可。
4.5 SSL 证书扫描路径
ssl-certificate-paths=/etc/apache2:/etc/dovecot:/etc/httpd:/etc/letsencrypt:/etc/pki:/etc/postfix:...(冒号分隔多路径)
ssl-certificate-paths-to-ignore=/etc/letsencrypt/archive:
ssl-certificate-include-packages=no
自签 CA 或私有服务证书放在非默认路径时,把路径追加到 ssl-certificate-paths(冒号分隔)即可让 CERT-9xxx 系列测试覆盖到;to-ignore 用于排除重复计数(如 letsencrypt 的 archive 原始层)。
4.6 插件配置
plugin=authentication
plugin=pam
plugin=systemd
...(default.prf 实测声明 26 个插件名)
#disable-plugin=authentication # 覆盖启用(优先级更高)
要点:
- profile 中的
plugin=只是声明;真正执行还要有插件实体文件(.sh)位于/etc/lynis/plugins/或/usr/share/lynis/plugins/,声明了但缺实体时静默跳过(官方注释:"Nothing happens if plugin isn't available"); - 实测差异佐证:同一份 default.prf,git 版运行(自带 pam/systemd 实体)显示
Plugins enabled : 2,deb 版运行(包内无实体)显示Plugins enabled : 0; - 自研插件放入
/etc/lynis/plugins/后在 profile 加plugin=名称即生效;自带插件(pam/systemd)实体只在 git 仓库的plugins/目录。
4.7 主机身份与资产分组(Enterprise 相关)
#hostid=40-char-hash # 40 位十六进制,覆盖自动生成的主机 ID
#hostid2=64-char-hash # 64 位十六进制(实测 lynis show hostids 输出 sha2 值)
machine-role=server
#system-groups=groupname1,groupname2
#tags=db,production,ssn-1304
#system-customer-name=mycustomer
#allow-auto-purge=yes # 短生命周期机器允许被 Enterprise 自动清理
社区版下这些键无害但基本无用(上传与分组是 Enterprise 管理台的概念);machine-role 例外,它影响审计取舍(桌面机不按服务器标准扣分)。
4.8 合规标准
compliance-standards=cis,hipaa,iso27001,pci-dss
实测 default.prf 默认值即包含四个标准。这决定审计时是否做合规映射;社区版的结果以报告文件中的原始数据呈现,深度合规报表是 Lynis Enterprise 的功能。
4.9 上传通道(Enterprise/自建收集端)
upload=no # 是否上传报告
upload-server= # 接收端地址(IP 或主机名)
upload-options= # 附加 cURL 参数(如 --insecure 跳过自签证书校验)
license-key= # Enterprise 许可证
#proxy-protocol=https
#proxy-server=10.0.1.250
#proxy-port=3128
社区版保持 upload=no 不动即可;自建 Lynis Enterprise(self-hosted)时才需要配这组。
4.10 操作系统特定与其他
#freebsd-skip-portaudit=yes # FreeBSD:跳过 portaudit
#debian-skip-security-repository=yes # Debian 系:跳过安全源检查(离线环境)
#ignore-home-dir=/home/user # 跳过某个家目录的权限/SSH 检查
#if_promisc:pflog0:pf log daemon interface: # 声明合法的混杂模式接口
#control-url-protocol=https / #control-url-prepend=cisofy.com/control/ ... # 自定义控制项链接前缀
五、实操:custom.prf 差分实验(skip-test 两种粒度)
下面用两个最小实验实证 4.2 节两种粒度的真实效果。实验对象是 ssh 组(--tests-from-group ssh,实测 6 项测试),三组对照全部在本机实测。
5.1 基线
lynis audit system --quick --tests-from-group ssh
实测结果要点:
Profiles: /etc/lynis/default.prf
Suggestions (10): —— 全部来自 SSH-7408(AllowTcpForwarding、ClientAliveCountMax、
LogLevel、MaxAuthTries、MaxSessions、PermitRootLogin、
Port、TCPKeepAlive、X11Forwarding、AllowAgentForwarding)
Hardening index : 54 [########## ]
Tests performed : 6
5.2 实验一:测试级跳过(skip-test=SSH-7408)
创建只含一行的自定义 profile:
echo "skip-test=SSH-7408" > /opt/data/lynis/custom-skip-test.prf
lynis audit system --quick --tests-from-group ssh --profile /opt/data/lynis/custom-skip-test.prf
实测结果要点:
Profiles: /etc/lynis/default.prf /opt/data/lynis/custom-skip-test.prf
Great, no warnings
No suggestions
Details:
Hardening index : 1 [# ]
Tests performed : 5
对比基线:执行测试 6→5(SSH-7408 被整体跳过),10 条建议全部消失(输出变为 "No suggestions")。适合"该项我明确不打算整改"的整块豁免。
5.3 实验二:选项级跳过(skip-test=SSH-7408:permitrootlogin)
echo "skip-test=SSH-7408:permitrootlogin" > /opt/data/lynis/custom-skip-option.prf
lynis audit system --quick --tests-from-group ssh --profile /opt/data/lynis/custom-skip-option.prf
实测结果要点:
Profiles: /etc/lynis/default.prf /opt/data/lynis/custom-skip-option.prf
Suggestions (9): —— PermitRootLogin 一项消失,其余 9 项保留:
AllowTcpForwarding、ClientAliveCountMax、LogLevel、MaxAuthTries、
MaxSessions、Port、TCPKeepAlive、X11Forwarding、AllowAgentForwarding
Hardening index : 56 [########### ]
Tests performed : 6
对比基线:执行测试仍为 6(测试本身照跑),建议 10→9(只豁免 PermitRootLogin 这一个 sshd 选项),加固指数 54→56。适合"其他项要整改,仅个别选项因业务原因豁免"的精细场景,这也是被审计方与安全团队之间对基线分歧的常用落点。
5.4 实验结论
| 场景 | skip-test 写法 | 测试执行 | 建议 |
|---|---|---|---|
| 基线 | (无) | 6 | 10 条 |
| 整块豁免 SSH-7408 | skip-test=SSH-7408 | 5 | 0 条 |
| 只豁免 PermitRootLogin | skip-test=SSH-7408:permitrootlogin | 6 | 9 条 |
实践建议:优先用选项级——它保留测试其余项的可见性,审计报告仍能反映"其余 9 个 sshd 选项仍未达标";只有整项测试都无意义时才用测试级。所有豁免都应写入 custom.prf 并在文件头注释豁免原因与有效期,方便下次复审。
六、参数速查表
| 想做的事 | 参数 |
|---|---|
| cron/CI 无人值守 | quick=yes(或 CLI --cronjob) |
| 快速摸底 | test-scan-mode=light |
| 警告即失败(CI 卡点) | error-on-warnings=yes |
| 跳过某个测试 | skip-test=TEST-ID |
| 跳过测试内某个选项 | skip-test=TEST-ID:option(小写) |
| 修改 sysctl 基线 | 复制 config-data=sysctl;... 行到 custom.prf 改期望值 |
| 只豁免一个 sysctl 项 | skip-test=KRNL-6000:<sysctl-key> |
| 增加自有敏感文件权限检查 | permfile=/path/file:权限:属主:属组:WARN: |
| 增加自有敏感目录检查 | permdir=/path/dir:权限:属主:属组:WARN: |
| 证书放非默认路径 | ssl-certificate-paths= 追加路径(冒号分隔) |
| 启用自研插件 | 实体放 /etc/lynis/plugins/ + plugin=名称 |
| 禁用某插件 | disable-plugin=名称 |
| 豁免某家目录 | ignore-home-dir=/home/user |
| 离线机器跳过安全源检查 | debian-skip-security-repository=yes |
| 报告语言 | language=en(中文输出不完整,建议英文) |
七、参考链接
- 官方 profile 说明:https://cisofy.com/documentation/lynis/configuration/
- 官方测试控制项库(按编号检索):https://cisofy.com/lynis/controls/
- default.prf 原文件(官方仓库):https://github.com/CISOfy/lynis/blob/master/default.prf
- 本系列配套文档:《Lynis 介绍与选型指南》《Ubuntu 22.04 安装 Lynis 3.1.7 指南》《Lynis 常用 CLI 命令详解》