作者选择了自由和开放源码基金作为为国家写作计划的一部分接受捐赠。
简介
InSpec是一个开源的自动测试框架,用于测试和审计系统,以确保符合集成、安全和其他策略要求。开发人员可以使用 InSpec 代码根据目标状态测试基础设施和应用程序的实际状态。
要指定测试的策略要求,InSpec 包括_审计控件_。传统上,开发人员需要手动执行策略要求,而且往往是在将变更部署到生产环境之前执行。但有了 InSpec,开发人员就可以在产品开发的每个阶段持续评估合规性,从而有助于在开发过程中尽早解决问题。InSpec DSL(领域专用语言)](https://www.inspec.io/docs/reference/dsl_inspec) 基于RSpec(一种用 Ruby 编写的 DSL 测试工具),它指定了用于编写审计控制的语法。
InSpec 还包括一个 resources 集合,可帮助配置系统的特定部分,并简化审计控制。当你需要定义一个没有可用的特定解决方案时,还可以编写自己的自定义资源。通过 Universal matchers,您可以在所有 InSpec 测试中将资源值与预期值进行比较。
在本教程中,你将在运行 Ubuntu 18.04 的服务器上安装 InSpec。首先要编写一个验证服务器操作系统系列的测试,然后从头开始创建 PostgreSQL 审计配置文件。这个审计配置文件首先要检查服务器上安装了 PostgreSQL 及其服务是否在运行。然后添加测试,检查 PostgreSQL 服务是否以正确的端口、地址、协议和用户运行。然后测试特定的 PostgreSQL 配置参数,最后审核客户端身份验证配置。
先决条件
在学习本教程之前,您需要准备以下材料:
- 一台 Ubuntu 18.04 服务器,使用Initial Server Setup with Ubuntu 18.04进行设置,包括一个 sudo 非 root 用户和一个防火墙。
- 按照安装指南安装 PostgreSQL 10。
步骤 1 - 准备环境
在此步骤中,您将下载并解压最新稳定版 InSpec 到您的主目录。InSpec 在其 downloads 页面上提供了可安装的二进制文件。
导航至您的主目录:
1cd ~
现在用 curl
下载二进制文件:
1curl -LO https://packages.chef.io/files/stable/inspec/3.7.11/ubuntu/18.04/inspec_3.7.11-1_amd64.deb
接下来,使用 sha256sum
命令生成下载文件的校验和。这是为了验证下载文件的完整性和真实性。
1sha256sum inspec_3.7.11-1_amd64.deb
每个二进制文件的校验和都列在 InSpec 下载页面,因此请访问下载页面,与本命令的输出结果进行比较。
1[secondary_label Output]
2e665948f9c0441e8648b08f8d3c8d34a86f9e994609877a7e4853c012dbc7523 inspec_3.7.11-1_amd64.deb
如果校验和不同,请删除已下载的文件并重复下载过程。
接下来,你要安装下载的二进制文件。为此,你将使用 dpkg
命令来进行软件包管理,所有基于 Debian 的系统(如 Ubuntu)默认都带有该命令。i "标志会提示 dpkg 命令安装软件包文件。
1sudo dpkg -i inspec_3.7.11-1_amd64.deb
如果没有错误,说明已成功安装 InSpec。要验证安装,请输入以下命令:
1inspec version
您将收到显示刚刚安装的 InSpec 版本的输出结果:
1[secondary_label Output]
23.7.11
如果没有显示版本号,请重新执行步骤 1。
之后,你可以删除 inspec_3.7.11-1_amd64.deb
因为你已经安装了软件包,不再需要它了:
1rm inspec_3.7.11-1_amd64.deb
您已成功在服务器上安装了 InSpec。下一步,您将编写一个测试来验证服务器的操作系统系列。
步骤 2 - 完成首次 InSpec 测试
在此步骤中,您将完成第一个 InSpec 测试,即测试操作系统系列是否为 "debian"。
您将使用 os
资源,这是 InSpec 内置的审计资源,用于测试系统运行的平台。您还将使用 eq
匹配器。eq "匹配器是一种通用匹配器,用于测试两个值是否完全相等。
InSpec 测试由 "describe "块组成,该块包含一个或多个 "it "和 "its "语句,每个语句验证一个资源特性。每个语句都以_断言_的形式描述了对系统特定条件的期望。断言中可以包含的两个关键字是 should
和 should_not
,它们分别断言条件应为真和假。
创建一个名为 os_family.rb
的文件来保存测试,然后用文本编辑器打开它:
1nano os_family.rb
在文件中添加以下内容
1[label os_family.rb]
2describe os.family do
3 it {should eq 'debian'}
4end
该测试确保目标系统的操作系统系列为 debian
。其他可能的值包括 windows
、unix
、bsd
等。你可以在 os
资源文档 中找到完整的列表。保存并退出文件。
接下来,使用以下命令运行测试:
1inspec exec os_family.rb
测试将通过,您将收到类似下面的输出:
1[secondary_label Output]
2Profile: tests from os_family.rb (tests from os_family.rb)
3Version: (not specified)
4Target: local://
5
6 debian
7 ✔ should eq "debian"
8
9Test Summary: 1 successful, 0 failures, 0 skipped
在输出中,Profile
包含了刚刚执行的配置文件的名称。由于这个测试没有包含在配置文件中,InSpec 会根据测试的文件名 "tests from os_family.rb "生成默认的配置文件名称。(在下一节中,你将开始创建 PostgreSQL InSpec 配置文件,并使用 InSpec_profiles_)。这里 InSpec 将 "版本 "显示为 "未指定",因为你只能在配置文件中指定版本。
目标 "字段指定了执行测试的目标系统,可以是本地系统,也可以是通过 "ssh "连接的远程系统。在本例中,您在本地系统上执行了测试,因此目标显示为 local://
。
有用的是,输出还显示已执行的测试,左侧的复选标记符号 (✔) 表示测试成功。如果测试失败,输出将显示一个叉号 (✘)。
最后,测试摘要提供了测试成功、失败和跳过的总体详情。在本例中,您只成功进行了一次测试。
现在你将看到失败测试的输出结果。打开 os_family.rb
:
1nano os_family.rb
在本步骤前面创建的测试中,现在将操作系统系列的预期值从 debian
改为 windows
。之后的文件内容如下:
1[label os_family.rb]
2describe os.family do
3 it {should eq 'windows'}
4end
保存并退出文件。
接下来,使用以下命令运行更新后的测试:
1inspec exec os_family.rb
您将得到类似下面的输出结果:
1[secondary_label Output]
2Profile: tests from os_family.fail.rb (tests from os_family.fail.rb)
3Version: (not specified)
4Target: local://
5
6 debian
7 (✘) should eq "windows"
8
9 expected: "windows"
10 got: "debian"
11
12 (compared using ==)
13
14Test Summary: 0 successful, 1 failure, 0 skipped
不出所料,测试失败。输出结果表明,对于 os.family
属性,预期值(windows
)和实际值(debian
)不匹配。输出中的"(使用 == 进行比较)"表明,"eq "匹配器在两个值之间进行了字符串比较,得出了这个结果。
在此步骤中,您编写了一个成功的测试,用于验证服务器的操作系统系列。你还创建了一个失败的测试,以便查看失败测试的 InSpec 输出是什么样的。下一步,你将开始创建审计配置文件,以测试 PostgreSQL 的安装。
第 3 步 - 审核 PostgreSQL 安装
现在,您将审核 PostgreSQL 的安装。首先要检查 PostgreSQL 是否已安装,其服务是否正常运行。最后,审核 PostgreSQL 系统端口和进程。为了对 PostgreSQL 进行审计,您将在名为 "PostgreSQL "的 InSpec "配置文件 "中创建各种 InSpec 控件。
InSpec 控件是相关测试的高级分组。在控件中,您可以拥有多个 "描述 "块,以及描述测试的元数据,如影响级别、标题、描述和标签。InSpec 配置文件对控件进行组织,以支持依赖性管理和代码重用,这都有助于管理测试的复杂性。它们还有助于通过 Chef Supermarket 将测试打包并与公众共享。您可以使用配置文件定义自定义资源,将其作为常规的 Ruby 类来实现。
要创建 InSpec 配置文件,需要使用 init
命令。输入该命令以创建 PostgreSQL
配置文件:
1inspec init profile PostgreSQL
这会在一个新目录中创建配置文件,该目录的名称与配置文件相同,在本例中为 PostgreSQL
。现在,进入新目录:
1cd PostgreSQL/
目录结构如下
1PostgreSQL/
2├── controls
3│ └── example.rb
4├── inspec.yml
5├── libraries
6└── README.md
controls/example.rb "文件包含一个示例控件,用于测试目标系统中是否存在"/tmp "文件夹。该示例仅作为示例出现,您将用自己的测试替换它。
第一项测试是确保系统中安装了软件包 postgresql-10
并安装、启用和运行了 postgresql
服务。
将controls/example.rb
文件重命名为controls/postgresql.rb
:
1mv controls/example.rb controls/postgresql.rb
然后,用文本编辑器打开文件:
1nano controls/postgresql.rb
用以下内容替换文件内容:
1[label controls/postgresql.rb]
2control '1-audit_installation' do
3 impact 1.0
4 title 'Audit PostgreSQL Installation'
5 desc 'Postgres should be installed and running'
6
7 describe package('postgresql-10') do
8 it {should be_installed}
9 its('version') {should cmp >= '10'}
10 end
11
12 describe service('postgresql@10-main') do
13 it {should be_enabled}
14 it {should be_installed}
15 it {should be_running}
16 end
17end
在前面的代码块中,首先定义了控件的名称和元数据。
在第一个 describe
块中,您使用了 package
资源,并将 PostgreSQL 软件包名称 postgresql-10
作为资源参数传入。package 资源提供了匹配器
be_installed,用于测试系统是否安装了命名的软件包。如果已安装软件包,则返回 **true** ,否则返回 ** false** 。接下来,你使用了
its语句来验证已安装的 PostgreSQL 软件包的版本至少是 10。你使用了
cmp而不是
eq,因为软件包版本字符串除了数字版本外,通常还包含其他属性。只有在完全匹配的情况下,
eq才返回** true** ,而
cmp`的限制较少。
在第二个 "describe "代码块中,使用 "service "资源,并将 PostgreSQL 10 服务名称 "postgresql@10-main "作为资源参数传入。service
资源提供了匹配器 be_enabled
、be_installed
和 be_running
,如果在目标系统上安装、启用和运行了命名的服务,它们将分别返回true 。
保存并退出文件。
接下来,运行配置文件。在运行以下命令前,请确保已进入 ~/PostgreSQL
目录:
1inspec exec .
由于您已完成 PostgreSQL 前提教程,因此测试将通过。您的输出将类似于下面的内容:
1[secondary_label Output]
2Profile: InSpec Profile (PostgreSQL)
3Version: 0.1.0
4Target: local://
5
6 ✔ 1-audit_installation: Audit PostgreSQL Installation
7 ✔ System Package postgresql-10 should be installed
8 ✔ System Package postgresql-10 version should cmp >= "10"
9 ✔ Service postgresql@10-main should be enabled
10 ✔ Service postgresql@10-main should be installed
11 ✔ Service postgresql@10-main should be running
12
13Profile Summary: 1 successful control, 0 control failures, 0 controls skipped
14Test Summary: 5 successful, 0 failures, 0 skipped
输出结果表明您的控制成功了。当且仅当一个控件中的所有测试都成功时,该控件才算成功。输出结果也确认了所有测试都成功了。
既然已经确认 PostgreSQL 安装了正确的版本,服务也没有问题,那么就需要创建一个新控件,确保 PostgreSQL 在正确的端口、地址和协议上监听。
在本测试中,您还将使用 attributes(属性)。InSpec 属性用于对配置文件进行参数化,以方便在不同环境或目标系统中重复使用。您将定义 PORT
属性。
用文本编辑器打开 inspec.yml
文件:
1nano inspec.yml
在文件末尾添加 port
属性。在文件末尾添加以下内容:
1[label inspec.yml]
2...
3attributes:
4 - name: port
5 type: string
6 default: '5432'
在前面的代码块中,你添加了 port
属性,并将其设置为默认值 5432
,因为这是 PostgreSQL 默认监听的端口。
保存并退出文件。然后运行 inspec check
验证配置文件是否仍然有效,因为您刚刚编辑了 inspec.yml
:
1inspec check .
如果没有错误,就可以继续。否则,请打开 inspec.yml
文件,确保属性位于文件末尾。
现在要创建一个控件,用于检查 PostgreSQL 进程是否正在运行,并配置正确的用户。在文本编辑器中打开 controls/postgresql.rb
:
1nano controls/postgresql.rb
将以下控件添加到当前测试文件 controls/postgresql.rb
的末尾:
1[label controls/postgresql.rb]
2...
3PORT = attribute('port')
4
5control '2-audit_address_port' do
6 impact 1.0
7 title 'Audit Process and Port'
8 desc 'Postgres port should be listening and the process should be running'
9
10 describe port(PORT) do
11 it {should be_listening}
12 its('addresses') {should include '127.0.0.1'}
13 its('protocols') {should cmp 'tcp'}
14 end
15
16 describe processes('postgres') do
17 it {should exist}
18 its('users') {should include 'postgres'}
19 end
20
21 describe user('postgres') do
22 it {should exist}
23 end
24end
在这里,您首先要声明一个 PORT
变量来保存 port
配置文件属性的值。然后声明控件及其元数据。
在第一个 describe
代码块中,包含 port
资源以测试基本端口属性。端口 "资源提供了匹配器 "be_listening"、"addresses "和 "protocols"。使用 be_listening
匹配器可测试指定端口是否在目标系统上监听。如果端口 5432
正在监听,则返回 true ,否则返回 ** false** 。地址 "匹配器测试指定地址是否与端口相关联。在这种情况下,PostgreSQL 将监听本地地址 127.0.0.1
。
protocols "匹配器测试端口监听的互联网协议,可以是 "icmp"、"tcp"/"tcp6 "或 "udp"/"udp6"。PostgreSQL 将监听 tcp
连接。
在第二个 describe
块中,您将包含 processes
资源。使用 processes
资源可以测试系统中正在运行的程序的属性。首先,验证系统中是否存在 postgres
进程,然后使用 users
匹配器测试 postgres
用户是否拥有 postgres
进程。
在第三个 describe
块中,有 user
资源。包含 user
资源可测试用户的用户属性,如用户是否存在、用户所属组等。使用该资源,可以测试系统中是否存在 postgres
用户。保存并退出 controls/postgresql.rb
。
接下来,使用以下命令运行您的配置文件:
1inspec exec .
测试通过后,输出结果将如下所示:
1[secondary_label Output]
2Profile: InSpec Profile (PostgreSQL)
3Version: 0.1.0
4Target: local://
5
6 ✔ 1-audit_installation: Audit PostgreSQL Installation
7 ✔ System Package postgresql-10 should be installed
8 ✔ System Package postgresql-10 version should cmp >= "10"
9 ✔ Service postgresql@10-main should be enabled
10 ✔ Service postgresql@10-main should be installed
11 ✔ Service postgresql@10-main should be running
12 ✔ 2-audit_address_port: Audit Process and Port
13 ✔ Port 5432 should be listening
14 ✔ Port 5432 addresses should include "127.0.0.1"
15 ✔ Port 5432 protocols should cmp == "tcp"
16 ✔ Processes postgres should exist
17 ✔ Processes postgres users should include "postgres"
18 ✔ User postgres should exist
19
20Profile Summary: 2 successful controls, 0 control failures, 0 controls skipped
21Test Summary: 11 successful, 0 failures, 0 skipped
输出结果表明,您的两个控制和所有测试都成功了。
在本节中,您创建了第一个 InSpec 配置文件和控件,并用它们来组织测试。您还使用了一些 InSpec 资源,以确保安装了正确版本的 PostgreSQL、启用并正确运行了 PostgreSQL 服务,以及系统中存在 PostgreSQL 用户。完成这些设置后,您就可以审核您的配置了。
第 4 步 - 审核 PostgreSQL 配置
在这一步中,你将审核一些 PostgreSQL 配置值,这将为你处理这些配置文件打下基础,使你可以根据需要审核任何 PostgreSQL 配置参数。
现在你已经完成了对 PostgreSQL 安装的审计测试,接下来就要审计 PostgreSQL 配置本身了。PostgreSQL 有几个配置参数,你可以根据需要对其进行调整,这些参数存储在默认配置文件中,位置是 /etc/postgresql/10/main/postgresql.conf
。您可能对 PostgreSQL 的配置有不同的要求,如日志记录、密码加密、SSL 和复制策略等,您可以在配置文件中指定这些要求。
您将使用 postgres_conf
资源,该资源可根据 PostgreSQL 配置文件内容中的预期值测试特定的命名配置选项。
该测试将假定您手动设置的一些非默认 PostgreSQL 配置值。
用你喜欢的文本编辑器打开 PostgreSQL 配置文件:
1sudo nano /etc/postgresql/10/main/postgresql.conf
设置以下配置值。如果选项已存在于文件中,但被注释掉了,请删除 "# "取消注释,并设置所提供的值:
1[label /etc/postgresql/10/main/postgresql.conf]
2password_encryption = scram-sha-256
3logging_collector = on
4log_connections = on
5log_disconnections = on
6log_duration = on
您设置的配置值:
- 确保保存的密码始终使用 scram-sha-256 算法加密。
- 启用 "日志收集器",它是一个后台进程,可从标准错误("stderr")中捕获日志信息,并将其重定向到日志文件。
- 启用 PostgreSQL 服务器连接尝试和成功连接的日志记录。
- 启用会话终止日志。
- 记录每条已完成语句的持续时间。
保存并退出配置文件。然后重启 PostgreSQL 服务:
1sudo service postgresql@10-main restart
你将只测试几个配置选项,但你可以使用 postgres_conf
资源测试任何 PostgreSQL 配置选项。
你将使用一个新的配置文件属性 "postgres_conf_dir "来传递你的 PostgreSQL 配置目录(位于 /etc/postgresql/10/main
)。这个配置目录在所有操作系统和平台上都不一样,因此将它作为配置文件属性传入,就能让这个配置文件在不同环境中更容易重用。
打开 inspec.yml
文件:
1nano inspec.yml
将此新属性添加到 inspec.yml
的 attributes
部分:
1[label inspec.yml]
2...
3 - name: postgres_conf_dir
4 type: string
5 default: '/etc/postgresql/10/main'
保存并退出文件。然后运行以下命令验证 InSpec 配置文件是否仍然有效,因为您刚刚编辑了 inspec.yml
:
1inspec check .
如果没有错误,就可以继续。否则,请打开 inspec.yml
文件,确保文件末尾有上述几行。
现在,您将创建一个控件来审核您强制执行的配置值。将以下控件添加到测试文件 controls/postgresql.rb
的末尾:
1[label controls/postgresql.rb]
2...
3POSTGRES_CONF_DIR = attribute('postgres_conf_dir')
4POSTGRES_CONF_PATH = File.join(POSTGRES_CONF_DIR, 'postgresql.conf')
5
6control '3-postgresql' do
7 impact 1.0
8 title 'Audit PostgreSQL Configuration'
9 desc 'Audits specific configuration options'
10
11 describe postgres_conf(POSTGRES_CONF_PATH) do
12 its('port') {should eq PORT}
13 its('password_encryption') {should eq 'scram-sha-256'}
14 its('ssl') {should eq 'on'}
15 its('logging_collector') {should eq 'on'}
16 its('log_connections') {should eq 'on'}
17 its('log_disconnections') {should eq 'on'}
18 its('log_duration') {should eq 'on'}
19 end
20end
在这里,您需要定义两个变量:
POSTGRES_CONF_DIR
保存配置文件配置中定义的postgres_conf_dir
属性。POSTGRES_CONF_PATH
保存配置文件的绝对路径,方法是使用File.join
将配置文件名和配置目录连接起来。
接下来,用控件名称和元数据定义控件。然后使用 postgres_conf
资源和 eq
匹配器来确保配置选项的所需值正确无误。保存并退出 controls/postgresql.rb
。
接下来,您将使用以下命令运行测试:
1inspec exec .
测试通过后,输出结果将如下所示:
1[secondary_label Output]
2Profile: InSpec Profile (PostgreSQL)
3Version: 0.1.0
4Target: local://
5
6 ✔ 1-audit_installation: Audit PostgreSQL Installation
7 ✔ System Package postgresql-10 should be installed
8 ✔ System Package postgresql-10 version should cmp >= "10"
9 ✔ Service postgresql@10-main should be enabled
10 ✔ Service postgresql@10-main should be installed
11 ✔ Service postgresql@10-main should be running
12 ✔ 2-audit_address_port: Audit Process and Port
13 ✔ Port 5432 should be listening
14 ✔ Port 5432 addresses should include "127.0.0.1"
15 ✔ Port 5432 protocols should cmp == "tcp"
16 ✔ Processes postgres should exist
17 ✔ Processes postgres users should include "postgres"
18 ✔ User postgres should exist
19 ✔ 3-postgresql: Audit PostgreSQL Configuration
20 ✔ PostgreSQL Configuration port should eq "5432"
21 ✔ PostgreSQL Configuration password_encryption should eq "scram-sha-256"
22 ✔ PostgreSQL Configuration ssl should eq "on"
23 ✔ PostgreSQL Configuration logging_collector should eq "on"
24 ✔ PostgreSQL Configuration log_connections should eq "on"
25 ✔ PostgreSQL Configuration log_disconnections should eq "on"
26 ✔ PostgreSQL Configuration log_duration should eq "on"
27
28Profile Summary: 3 successful controls, 0 control failures, 0 controls skipped
29Test Summary: 18 successful, 0 failures, 0 skipped
输出结果表明,您的三个控制和所有测试都很成功,没有跳过任何测试或控制。
在这一步中,你添加了一个新的 InSpec 控件,使用 postgres_conf
资源测试配置文件中的特定 PostgreSQL 配置值。你在本节审核了几个值,但你也可以用它来测试配置文件中的任何配置选项。
第 5 步 - 审核 PostgreSQL 客户端身份验证
现在,你已经为 PostgreSQL 配置编写了一些测试,你将为客户端身份验证编写一些测试。这对于需要确保不同类型用户使用特定身份验证方法的安装很重要;例如,确保本地连接 PostgreSQL 的客户端始终需要使用密码进行身份验证,或拒绝来自特定 IP 地址或 IP 地址范围的连接,等等。
对安全性要求较高的 PostgreSQL 安装来说,一个重要的配置是只允许加密密码验证。PostgreSQL 10 支持两种密码加密方法 用于客户端身份验证:md5和scram-sha-256。本测试要求对所有客户端进行密码加密,这意味着客户端配置文件中所有客户端的 METHOD
字段必须设置为 md5
或 scram-sha-256
。对于这些测试,您将使用 scram-sha-256
,因为它比 md5
更安全。
默认情况下,"本地 "客户端在 "pg_hba.conf "文件中使用 "对等 "身份验证方法。测试时,需要将其更改为 scram-sha-256
。打开 /etc/postgresql/10/main/pg_hba.conf
文件:
1sudo nano /etc/postgresql/10/main/pg_hba.conf
文件顶部包含注释。向下滚动并查找未注释的验证类型为 "local "的行,将验证方法从 "peer "改为 "scram-sha-256"。例如,更改
1[label /etc/postgresql/10/main/pg_hba.conf]
2...
3local all postgres peer
4...
到:
1[label /etc/postgresql/10/main/pg_hba.conf]
2...
3local all postgres scram-sha-256
4...
最后,您的 pg_hba.conf
配置将如下所示:
1[label /etc/postgresql/10/main/pg_hba.conf]
2...
3local all postgres scram-sha-256
4
5# TYPE DATABASE USER ADDRESS METHOD
6
7# "local" is for Unix domain socket connections only
8local all all scram-sha-256
9# IPv4 local connections:
10host all all 127.0.0.1/32 scram-sha-256
11# IPv6 local connections:
12host all all ::1/128 scram-sha-256
13# Allow replication connections from localhost, by a user with the
14# replication privilege.
15local replication all scram-sha-256
16host replication all 127.0.0.1/32 scram-sha-256
17host replication all ::1/128 scram-sha-256
18...
保存并退出配置文件。然后重启 PostgreSQL 服务:
1sudo service postgresql@10-main restart
本次测试将使用 postgres_hba_conf
资源。该资源用于测试 pg_hba.conf
文件中定义的客户端身份验证数据。您将把 pg_hba.conf
文件的路径作为参数传递给该资源。
您的控件将由两个 describe
块组成,它们将分别检查 local
和 host
客户端的 auth_method
字段,以确保它们都等于 scram-sha-256
。在文本编辑器中打开 controls/postgresql.rb
:
1nano controls/postgresql.rb
将以下控件添加到测试文件 controls/postgresql.rb
的末尾:
1[label controls/postgresql.rb]
2POSTGRES_HBA_CONF_FILE = File.join(POSTGRES_CONF_DIR, 'pg_hba.conf')
3
4control '4-postgres_hba' do
5 impact 1.0
6 title 'Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf'
7 desc 'Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf. Do not allow untrusted authentication methods.'
8
9 describe postgres_hba_conf(POSTGRES_HBA_CONF_FILE).where { type == 'local' } do
10 its('auth_method') { should all eq 'scram-sha-256' }
11 end
12
13 describe postgres_hba_conf(POSTGRES_HBA_CONF_FILE).where { type == 'host' } do
14 its('auth_method') { should all eq 'scram-sha-256' }
15 end
16end
在这个代码块中,你定义了一个新变量 POSTGRES_HBA_CONF_FILE
来存储 pg_hba.conf
文件的绝对位置。File.join
是一种 Ruby 方法,用于用/
连接两个文件路径段。在这里,我们使用它将上一节中声明的 POSTGRES_CONF_DIR
变量与 PostgreSQL 配置文件 pg_hba.conf
连接起来。这将产生一个 pg_hba.conf
文件的绝对文件路径,并将其存储在 POSTGRES_HBA_CONF_FILE
变量中。
然后,声明并配置控件及其元数据。第一个 describe
块检查所有客户端类型为local
的配置项是否也使用scram-sha-256
作为其身份验证方法。第二个 "describe "块对客户端类型为 "host "的情况进行同样的检查。保存并退出 controls/postgresql.rb
。
您将以 postgres
用户身份执行此控制,因为对 PostgreSQL HBA 配置的 "读取 "权限仅授予所有者和组,也就是 postgres
用户。通过运行执行配置文件:
1sudo -u postgres inspec exec .
输出结果如下
1[secondary_label Output]
2Profile: InSpec Profile (PostgreSQL)
3Version: 0.1.0
4Target: local://
5
6 ✔ 1-audit_installation: Audit PostgreSQL Installation
7 ✔ System Package postgresql-10 should be installed
8 ✔ System Package postgresql-10 version should cmp >= "10"
9 ✔ Service postgresql@10-main should be enabled
10 ✔ Service postgresql@10-main should be installed
11 ✔ Service postgresql@10-main should be running
12 ✔ 2-audit_address_port: Audit Process and Port
13 ✔ Port 5432 should be listening
14 ✔ Port 5432 addresses should include "127.0.0.1"
15 ✔ Port 5432 protocols should cmp == "tcp"
16 ✔ Processes postgres should exist
17 ✔ Processes postgres users should include "postgres"
18 ✔ User postgres should exist
19 ✔ 3-postgresql: Audit PostgreSQL Configuration
20 ✔ PostgreSQL Configuration port should eq "5432"
21 ✔ PostgreSQL Configuration password_encryption should eq "scram-sha-256"
22 ✔ PostgreSQL Configuration ssl should eq "on"
23 ✔ PostgreSQL Configuration logging_collector should eq "on"
24 ✔ PostgreSQL Configuration log_connections should eq "on"
25 ✔ PostgreSQL Configuration log_disconnections should eq "on"
26 ✔ PostgreSQL Configuration log_duration should eq "on"
27 ✔ 4-postgres_hba: Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf
28 ✔ Postgres Hba Config /etc/postgresql/10/main/pg_hba.conf with type == "local" auth_method should all eq "scram-sha-256"
29 ✔ Postgres Hba Config /etc/postgresql/10/main/pg_hba.conf with type == "host" auth_method should all eq "scram-sha-256"
30
31Profile Summary: 4 successful controls, 0 control failures, 0 controls skipped
32Test Summary: 20 successful, 0 failures, 0 skipped
该输出结果表明,您添加的新控件和之前的所有控件都成功了。它还表明您配置文件中的所有测试都成功了。
在此步骤中,您已在配置文件中添加了一个控件,该控件成功审核了 PostgreSQL 客户端身份验证配置,确保所有客户端都使用 postgres_hba_conf
资源通过 scram-sha-256
进行身份验证。
结论
您已安装 InSpec 并成功审核了 PostgreSQL 10 安装。在此过程中,您使用了一些 InSpec 工具,如:InSpec DSL、匹配器、资源、配置文件、属性和 CLI。在此基础上,您可以使用 InSpec 文档资源部分中提供的其他资源。InSpec 还提供了一种机制,用于根据具体需要定义自定义资源。这些自定义资源是以普通 Ruby 类的形式编写的。
您还可以浏览Chef supermarket中的Compliance Profiles
部分,其中包含公开共享的 InSpec 配置文件,您可以直接执行或在自己的配置文件中扩展这些配置文件。您还可以在[Chef Supermarket]中与公众共享自己的配置文件。
您还可以进一步探索 Chef 宇宙中的其他工具,如 Chef
和 Habitat
。InSpec已与Habitat集成,因此可以将合规控制与Habitat打包的应用程序一起发送并持续运行。您可以在tutorials页面上浏览官方和社区 InSpec 教程。如需更多高级 InSpec 参考资料,请查阅官方InSpec 文档。