inspec通过编写ruby dsl测试代码验证linux服务器安全合规性,支持ssh等连接方式,内置资源自动检查文件权限、ssh配置等,以profile组织扫描并输出html报告,可集成ci/cd与定时巡检,实现“ansible修复、inspec验证”的协同闭环。

用InSpec实现Linux服务器部署后的自动化安全审计,核心是把合规要求写成可执行的测试代码,再让InSpec在目标机器上运行并比对实际状态。它不改配置,只验证“是否合规”,适合上线后快速确认加固效果或定期巡检。
安装与连接目标服务器
InSpec支持本地、SSH、Docker等多种目标类型。生产环境最常用SSH方式:
- 在管理机上安装InSpec(推荐用官方脚本):
curl https://chefdownload-commercial.chef.io/install.sh | sudo bash -s -- -P inspec - 确保目标Linux服务器已启用SSH,且管理机可通过密钥免密登录(如
ssh user@192.168.1.100能直连) - 首次验证连通性:
inspec exec --target ssh://user@192.168.1.100 --password 'xxx' --sudo(建议后续改用密钥,避免明文密码)
编写符合基线的测试控制项(Control)
一个Control就是一个具体的安全检查点,比如“/etc/shadow权限必须为600”。用人类可读的Ruby DSL编写,放在controls/os_security.rb中:
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 检查关键文件权限:
describe file('/etc/shadow') do
it { should exist }
its('mode') { should cmp '0600' }
its('owner') { should eq 'root' }
end - 验证SSH服务配置:
describe sshd_config do
its('PermitRootLogin') { should eq 'no' }
its('Protocol') { should include '2' }
its('PasswordAuthentication') { should eq 'no' }
end - 确认密码策略生效:
describe command('grep PASS_MAX_DAYS /etc/login.defs') do
its('stdout') { should match /PASS_MAX_DAYS\s+90/ }
end
所有检查都基于InSpec内置资源(如file、sshd_config、command),无需自己解析文本或调用shell命令判断。
组织为可复用的Profile并执行扫描
将多个Control归入一个Profile目录,便于版本管理和复用:
- 创建结构:
my-cis-profile/
inspec.yml # 声明元数据,如name: "CIS Ubuntu 22.04"
controls/
os_security.rb # 上面写的控制项
attributes.yml # 可选:定义变量,如ssh_port: 2222 - 执行扫描:
inspec exec my-cis-profile --target ssh://admin@192.168.1.100 --sudo --format html --report-path report.html - 输出含通过/失败项、失败原因(如“expected mode to cmp == \"0600\", got \"0644\"”)、影响等级(high/medium),直接定位问题
集成进运维流程提升实效性
单次扫描价值有限,关键是嵌入持续环节:
- 加入CI/CD流水线:在Ansible Playbook部署完成后,自动触发
inspec exec,失败则阻断发布 - 定时巡检:用cron每天凌晨跑一次,输出HTML报告存档,配合
--diff参数可对比历史变化 - 对接现有基线标准:直接使用社区成熟Profile,例如
inspec archive https://github.com/dev-sec/linux-baseline/archive/master.tar.gz,省去从零编写 - 与修复动作联动:InSpec只做“验”,修复交给Ansible;两者分工明确——Ansible改配置,InSpec证结果










