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安全测试自托管配置2026/10/24

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。实测两处证据:

  1. deb 包安装后 dpkg -L lynis 显示 /etc/lynis/ 下只有 default.prf 与 developer.prf 两个 profile 文件,没有 lynis.conf;
  2. 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 运行行为参数

参数默认值(实测)作用改法示例
quickyes审计中不等待按键(无人值守必开)quick=no(交互逐步跑)
pause-between-tests0每个测试之间的停顿秒数pause-between-tests=1(演示/观察用)
colors1输出是否带颜色colors=no(cron/重定向时更干净)
verboseno输出更多执行细节verbose=yes
show-tool-tipsyes结尾是否显示 TIP 提示(如加 --logfile 的提示)show-tool-tips=no
show-report-solutionyes建议条目是否附带 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-modefull扫描深度:light/normal/full,影响执行测试数量test-scan-mode=light(快速摸底)
refresh-repositoriesyes漏洞扫描前刷新系统软件源索引无源环境可设 no 省时间
skip-pluginsno是否跳过全部插件yes
profile-nameDefault Audit Templateprofile 的展示名自定义 profile 起个名字
machine-roleserver系统角色: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;

要点:

  1. 期望值支持多值:用 | 分隔,如 kernel.yama.ptrace_scope 期望 1|2|3(三者任一都算达标)、kernel.perf_event_paranoid 期望 2|3|4;
  2. 实测本机 kernel.randomize_va_space=2、kernel.kptr_restrict=2 与期望一致(OK),kernel.sysrq=1 与期望 0 不一致(DIFFERENT,产生 KRNL-6000 建议)——期望值即"你们团队的基线",可以按需修改;
  3. default.prf 同时含 FreeBSD(security.bsd.、net.inet.)与 Linux(net.ipv4.、net.ipv6.、fs.、kernel.)的键,Lynis 按平台自动取用;
  4. 修改基线请复制该行到 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 写法测试执行建议
基线(无)610 条
整块豁免 SSH-7408skip-test=SSH-740850 条
只豁免 PermitRootLoginskip-test=SSH-7408:permitrootlogin69 条

实践建议:优先用选项级——它保留测试其余项的可见性,审计报告仍能反映"其余 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(中文输出不完整,建议英文)

七、参考链接