如何在Ubuntu18.04上使用InSpec审计PostgreSQL数据库

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。

介绍

InSpec 是一个开源的自动化测试框架,用于测试和审核您的系统,以确保符合集成、安全和其他策略要求。 开发人员可以使用 InSpec 代码针对目标状态测试其基础架构和应用程序的实际状态。

为了指定您正在测试的策略要求,InSpec 包含 审计控制 。 传统上,开发人员手动强制执行策略要求,并且通常在将更改部署到生产之前就执行此操作。 然而,使用 InSpec,开发人员可以在产品开发的每个阶段持续评估合规性,这有助于在开发过程的早期解决问题。 InSpec DSL (Domain Specific Language) 建立在 RSpec 之上,这是一个用 Ruby 编写的 DSL 测试工具,指定了用于编写审计控制的语法。

InSpec 还包括一组 资源,以帮助配置系统的特定部分并简化审计控制。 当您需要定义不可用的特定解决方案时,有一个功能可以编写您自己的自定义资源。 通用匹配器 允许您将资源值与所有 InSpec 测试中的期望值进行比较。

在本教程中,您将在运行 Ubuntu 18.04 的服务器上安装 InSpec。 您将首先编写一个验证服务器操作系统系列的测试,然后您将从头开始创建一个 PostgreSQL 审计配置文件。 此审核配置文件首先检查您是否在服务器上安装了 PostgreSQL 并且其服务正在运行。 然后,您将添加测试以检查 PostgreSQL 服务是否使用正确的端口、地址、协议和用户运行。 接下来,您将测试特定的 PostgreSQL 配置参数,最后,您将审核客户端身份验证配置。

先决条件

在学习本教程之前,您将需要以下内容:

第 1 步 — 准备环境

在此步骤中,您将下载最新的 InSpec 稳定版本并将其解压缩到您的主目录中。 InSpec 在其 下载 页面上提供了可安装的二进制文件。

导航到您的主目录:

cd ~

现在使用 curl 下载二进制文件:

curl -LO https://packages.chef.io/files/stable/inspec/3.7.11/ubuntu/18.04/inspec_3.7.11-1<^>_amd64.deb

接下来,使用 sha256sum 命令生成下载文件的校验和。 这是为了验证下载文件的完整性和真实性。

sha256sum inspec_3.7.11-1_amd64.deb

InSpec 下载页面 中列出了每个二进制文件的校验和,因此请访问下载页面以与此命令的输出进行比较。

Outpute665948f9c0441e8648b08f8d3c8d34a86f9e994609877a7e4853c012dbc7523 inspec_3.7.11-1_amd64.deb

如果校验和不同,请删除下载的文件并重复下载过程。

接下来,您将安装下载的二进制文件。 为此,您将使用可用于包管理的 dpkg 命令,默认情况下,该命令随所有基于 Debian 的系统(例如 Ubuntu)一起提供。 -i 标志提示 dpkg 命令安装包文件。

sudo dpkg -i inspec_3.7.11-1_amd64.deb

如果没有错误,则说明您已成功安装 InSpec。 要验证安装,请输入以下命令:

inspec version

您将收到显示您刚刚安装的 InSpec 版本的输出:

Output3.7.11

如果您没有看到显示的版本号,请再次运行第 1 步。

在此之后,您可以删除 inspec_3.7.11-1_amd64.deb 因为您不再需要它,因为您已经安装了软件包:

rm inspec_3.7.11-1_amd64.deb

您已在服务器上成功安装 InSpec。 在下一步中,您将编写一个测试来验证您的服务器的操作系统系列。

第 2 步 — 完成您的第一个 InSpec 测试

在此步骤中,您将完成您的第一个 InSpec 测试,该测试将测试您的操作系统系列是否为 debian

您将使用 os 资源,这是一个内置的 InSpec 审计资源,用于测试系统运行的平台。 您还将使用 eq 匹配器。 eq 匹配器是一个通用匹配器,用于测试两个值是否完全相等。

InSpec 测试由 describe 块组成,其中包含一个或多个 itits 语句,每个语句都验证资源的一项功能。 每个语句都将系统特定条件的期望描述为 assertions。 可以包含两个用于进行断言的关键字是 shouldshould_not,它们分别断言条件应该为真和假。

创建一个名为 os_family.rb 的文件来保存您的测试并使用文本编辑器打开它:

nano os_family.rb

将以下内容添加到您的文件中:

os_family.rb

describe os.family do
  it {should eq 'debian'}
end

此测试确保目标系统的操作系统系列为 debian。 其他可能的值为 windowsunixbsd 等。 您可以在 os 资源文档 中找到完整列表。 保存并退出文件。

接下来,使用以下命令运行测试:

inspec exec os_family.rb

测试将通过,您将收到类似于以下内容的输出:

OutputProfile: tests from os_family.rb (tests from os_family.rb)
Version: (not specified)
Target:  local://

  debian
     ✔  should eq "debian"

Test Summary: 1 successful, 0 failures, 0 skipped

在您的输出中, Profile 包含刚刚执行的配置文件的名称。 由于该测试不包含在配置文件中,因此 InSpec 从测试的文件名 tests from os_family.rb 生成默认配置文件名称。 (您将在下一节中使用 InSpec profiles 开始构建 PostgreSQL InSpec 配置文件。)这里 InSpec 将 Version 显示为 not specified,因为您可以仅在配置文件中指定版本。

Target 字段指定执行测试的目标系统,可以是本地系统,也可以是通过 ssh 的远程系统。 在这种情况下,您已经在本地系统上执行了测试,因此目标显示 local://

有用的是,输出还显示已执行的测试,左侧带有复选标记 (✔),表示测试成功。 如果测试失败,输出将显示一个十字符号 (✘)。

最后,测试摘要提供了有关有多少测试成功、失败和跳过的总体详细信息。 在这种情况下,您有一个成功的测试。

现在您将看到失败测试的输出。 打开os_family.rb

nano os_family.rb

在此步骤前面创建的测试中,您现在将操作系统系列的预期值从 debian 更改为 windows。 在此之后您的文件内容将如下所示:

os_family.rb

describe os.family do
  it {should eq 'windows'}
end

保存并退出文件。

接下来,使用以下命令运行更新后的测试:

inspec exec os_family.rb

您将获得类似于以下内容的输出:

OutputProfile: tests from os_family.fail.rb (tests from os_family.fail.rb)
Version: (not specified)
Target:  local://

  debian
     (✘)  should eq "windows"

     expected: "windows"
          got: "debian"

     (compared using ==)


Test Summary: 0 successful, 1 failure, 0 skipped

正如预期的那样,测试失败了。 输出表明您的预期 (windows) 和实际 (debian) 值与 os.family 属性不匹配。 (compared using ==) 输出表明 eq 匹配器在两个值之间执行了字符串比较以得出此结果。

在这一步中,您已经编写了一个成功的测试来验证服务器的操作系统系列。 您还创建了一个失败的测试,以查看失败测试的 InSpec 输出是什么样的。 在下一步中,您将开始构建审计配置文件以测试您的 PostgreSQL 安装。

第 3 步 — 审核您的 PostgreSQL 安装

现在,您将审核您的 PostgreSQL 安装。 您将首先检查您是否安装了 PostgreSQL 并且其服务运行正常。 最后,您将审核 PostgreSQL 系统端口和进程。 对于您的 PostgreSQL 审计,您将在名为 PostgreSQL 的 InSpec profile 中创建各种 InSpec 控件。

InSpec control 是相关测试的高级分组。 在一个控件中,您可以拥有多个 describe 块,以及用于描述您的测试的元数据,例如影响级别、标题、描述和标签。 InSpec 配置文件组织控件以支持依赖项管理和代码重用,这两者都有助于管理测试复杂性。 它们还可用于通过 Chef Supermarket 与公众打包和共享测试。 您可以使用配置文件来定义您将作为常规 Ruby 类实现的自定义资源。

要创建 InSpec 配置文件,您将使用 init 命令。 输入此命令以创建 PostgreSQL 配置文件:

inspec init profile PostgreSQL

这将在与您的配置文件同名的新目录中创建配置文件,在本例中为 PostgreSQL。 现在,进入新目录:

cd PostgreSQL/

目录结构将如下所示:

PostgreSQL/
├── controls
│   └── example.rb
├── inspec.yml
├── libraries
└── README.md

controls/example.rb 文件包含一个示例控件,用于测试目标系统上是否存在 /tmp 文件夹。 这仅作为样本存在,您将用自己的测试替换它。

您的第一个测试将是确保您的系统上安装了包 postgresql-10 并且您已安装、启用并运行了 postgresql 服务。

controls/example.rb 文件重命名为 controls/postgresql.rb

mv controls/example.rb controls/postgresql.rb

接下来,使用文本编辑器打开文件:

nano controls/postgresql.rb

将文件内容替换为以下内容:

控制/postgresql.rb

control '1-audit_installation' do
  impact 1.0
  title 'Audit PostgreSQL Installation'
  desc 'Postgres should be installed and running'

  describe package('postgresql-10') do
    it {should be_installed}
    its('version') {should cmp >= '10'}
  end

  describe service('postgresql@10-main') do
    it {should be_enabled}
    it {should be_installed}
    it {should be_running}
  end
end

在前面的代码块中,您首先使用其名称和元数据定义控件。

在第一个 describe 块中,您使用 package 资源并传入 PostgreSQL 包名称 postgresql-10 作为资源参数。 package 资源提供匹配器 be_installed 来测试指定的包是否安装在系统上。 如果您安装了软件包,则返回 true,否则返回 false。 接下来,您使用 its 语句验证安装的 PostgreSQL 包的版本至少为 10。 您正在使用 cmp 而不是 eq 因为包版本字符串通常包含除数字版本之外的其他属性。 eq 仅当存在完全匹配而 cmp 限制较少时才返回 true

在第二个 describe 块中,您使用 service 资源并传入 PostgreSQL 10 服务名称 postgresql@10-main 作为资源参数。 service 资源提供匹配器 be_enabledbe_installedbe_running 如果您安装了命名服务,它们将返回 true,启用,并分别在目标系统上运行。

保存并退出您的文件。

接下来,您将运行您的配置文件。 在运行以下命令之前,请确保您位于 ~/PostgreSQL 目录中:

inspec exec .

由于您完成了 PostgreSQL 必备教程,因此您的测试将通过。 您的输出将类似于以下内容:

OutputProfile: InSpec Profile (PostgreSQL)
Version: 0.1.0
Target:  local://

  ✔  1-audit_installation: Audit PostgreSQL Installation
     ✔  System Package postgresql-10 should be installed
     ✔  System Package postgresql-10 version should cmp >= "10"
     ✔  Service postgresql@10-main should be enabled
     ✔  Service postgresql@10-main should be installed
     ✔  Service postgresql@10-main should be running


Profile Summary: 1 successful control, 0 control failures, 0 controls skipped
Test Summary: 5 successful, 0 failures, 0 skipped

输出表明您的控制是成功的。 当且仅当其中的所有测试都成功时,一个控件才是成功的。 输出还确认您的所有测试都成功了。

现在您已验证安装了正确版本的 PostgreSQL 并且服务正常,您将创建一个新控件以确保 PostgreSQL 正在侦听正确的端口、地址和协议。

对于此测试,您还将使用 属性 。 InSpec 属性用于参数化配置文件,以便在不同环境或目标系统中轻松重用。 您将定义 PORT 属性。

在文本编辑器中打开 inspec.yml 文件:

nano inspec.yml

您需要将 port 属性附加到文件的末尾。 在文件末尾添加以下内容:

检查.yml

...
attributes:
  - name: port
    type: string
    default: '5432'

在前面的代码块中,您添加了 port 属性并将其设置为默认值 5432,因为这是 PostgreSQL 默认侦听的端口。

保存并退出文件。 然后运行 inspec check 以验证配置文件仍然有效,因为您刚刚编辑了 inspec.yml

inspec check .

如果没有错误,您可以继续。 否则,打开 inspec.yml 文件并确保该属性出现在文件末尾。

现在您将创建用于检查 PostgreSQL 进程是否正在运行并使用正确的用户配置的控件。 在文本编辑器中打开 controls/postgresql.rb

nano controls/postgresql.rb

将以下控件附加到当前测试文件 controls/postgresql.rb 的末尾:

控制/postgresql.rb

...
PORT = attribute('port')

control '2-audit_address_port' do
  impact 1.0
  title 'Audit Process and Port'
  desc 'Postgres port should be listening and the process should be running'

  describe port(PORT) do
    it {should be_listening}
    its('addresses') {should include '127.0.0.1'}
    its('protocols') {should cmp 'tcp'}
  end

  describe processes('postgres') do
    it {should exist}
    its('users') {should include 'postgres'}
  end

  describe user('postgres') do
    it {should exist}
  end
end

在这里,您首先声明一个 PORT 变量来保存 port 配置文件属性的值。 然后声明控件及其元数据。

在第一个 describe 块中,您包含 port 资源以测试基本端口属性。 port 资源提供匹配器 be_listeningaddressesprotocols。 您使用 be_listening 匹配器来测试指定端口是否正在侦听目标系统。 如果端口 5432 正在侦听,则返回 true,否则返回 falseaddresses 匹配器测试指定的地址是否与端口相关联。 在这种情况下,PostgreSQL 将监听本地地址,127.0.0.1protocols 匹配器测试端口正在侦听的 Internet 协议,可以是 icmptcp/tcp6udp/ udp6。 PostgreSQL 将监听 tcp 连接。

在第二个 describe 块中,您包含 processes 资源。 您使用 processes 资源来测试系统上运行的程序的属性。 首先,验证系统上是否存在 postgres 进程,然后使用 users 匹配器来测试 postgres 用户是否拥有 postgres 进程。

在第三个 describe 块中,您拥有 user 资源。 您包含 user 资源来测试用户的用户属性,例如用户是否存在、用户所属的组等。 使用此资源,您可以测试系统上是否存在 postgres 用户。 保存并退出controls/postgresql.rb

接下来,使用以下命令运行您的配置文件:

inspec exec .

测试将通过,您的输出将类似于以下内容:

OutputProfile: InSpec Profile (PostgreSQL)
Version: 0.1.0
Target:  local://

  ✔  1-audit_installation: Audit PostgreSQL Installation
     ✔  System Package postgresql-10 should be installed
     ✔  System Package postgresql-10 version should cmp >= "10"
     ✔  Service postgresql@10-main should be enabled
     ✔  Service postgresql@10-main should be installed
     ✔  Service postgresql@10-main should be running
  ✔  2-audit_address_port: Audit Process and Port
     ✔  Port 5432 should be listening
     ✔  Port 5432 addresses should include "127.0.0.1"
     ✔  Port 5432 protocols should cmp == "tcp"
     ✔  Processes postgres should exist
     ✔  Processes postgres users should include "postgres"
     ✔  User postgres should exist


Profile Summary: 2 successful controls, 0 control failures, 0 controls skipped
Test 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 配置文件:

sudo nano /etc/postgresql/10/main/postgresql.conf

设置以下配置值。 如果该选项已存在于文件中但被注释掉,请通过删除 # 取消注释,并按提供的值设置:

/etc/postgresql/10/main/postgresql.conf

password_encryption = scram-sha-256
logging_collector = on
log_connections = on
log_disconnections = on
log_duration = on

您设置的配置值:

  • 确保保存的密码始终使用 scram-sha-256 算法进行加密。
  • 启用 logging collector,这是一个后台进程,它从标准错误 (stderr) 中捕获日志消息并将它们重定向到日志文件。
  • 启用对 PostgreSQL 服务器的连接尝试以及成功连接的记录。
  • 启用会话终止记录。
  • 启用记录每个已完成语句的持续时间。

保存并退出配置文件。 然后重启 PostgreSQL 服务:

sudo service postgresql@10-main restart

您将只测试几个配置选项,但您可以使用 postgres_conf 资源测试任何 PostgreSQL 配置选项。

您将使用新的配置文件属性 postgres_conf_dir 传入位于 /etc/postgresql/10/main 的 PostgreSQL 配置目录。 此配置目录在所有操作系统和平台上都不相同,因此通过将其作为配置文件属性传入,您将让此配置文件更易于在不同环境中重用。

打开您的 inspec.yml 文件:

nano inspec.yml

将此新属性添加到 inspec.ymlattributes 部分:

检查.yml

...
  - name: postgres_conf_dir
    type: string
    default: '/etc/postgresql/10/main'

保存并退出您的文件。 然后运行以下命令来验证 InSpec 配置文件是否仍然有效,因为您刚刚编辑了 inspec.yml

inspec check .

如果没有错误,您可以继续。 否则,打开 inspec.yml 文件并确保上述行出现在文件末尾。

现在,您将创建审核您正在强制执行的配置值的控件。 将以下控件附加到测试文件 controls/postgresql.rb 的末尾:

控制/postgresql.rb

...
POSTGRES_CONF_DIR = attribute('postgres_conf_dir')
POSTGRES_CONF_PATH = File.join(POSTGRES_CONF_DIR, 'postgresql.conf')

control '3-postgresql' do
  impact 1.0
  title 'Audit PostgreSQL Configuration'
  desc 'Audits specific configuration options'

  describe postgres_conf(POSTGRES_CONF_PATH) do
    its('port') {should eq PORT}
    its('password_encryption') {should eq 'scram-sha-256'}
    its('ssl') {should eq 'on'}
    its('logging_collector') {should eq 'on'}
    its('log_connections') {should eq 'on'}
    its('log_disconnections') {should eq 'on'}
    its('log_duration') {should eq 'on'}
  end
end

在这里定义两个变量:

  • POSTGRES_CONF_DIR 包含配置文件配置中定义的 postgres_conf_dir 属性。
  • POSTGRES_CONF_PATH 通过使用 File.join 将配置文件名与配置目录连接起来,保存配置文件的绝对路径。

接下来,您使用其名称和元数据定义控件。 然后将 postgres_conf 资源与 eq 匹配器一起使用,以确保配置选项所需的值正确。 保存并退出controls/postgresql.rb

接下来,您将使用以下命令运行测试:

inspec exec .

测试将通过,您的输出将类似于以下内容:

OutputProfile: InSpec Profile (PostgreSQL)
Version: 0.1.0
Target:  local://

  ✔  1-audit_installation: Audit PostgreSQL Installation
     ✔  System Package postgresql-10 should be installed
     ✔  System Package postgresql-10 version should cmp >= "10"
     ✔  Service postgresql@10-main should be enabled
     ✔  Service postgresql@10-main should be installed
     ✔  Service postgresql@10-main should be running
  ✔  2-audit_address_port: Audit Process and Port
     ✔  Port 5432 should be listening
     ✔  Port 5432 addresses should include "127.0.0.1"
     ✔  Port 5432 protocols should cmp == "tcp"
     ✔  Processes postgres should exist
     ✔  Processes postgres users should include "postgres"
     ✔  User postgres should exist
  ✔  3-postgresql: Audit PostgreSQL Configuration
     ✔  PostgreSQL Configuration port should eq "5432"
     ✔  PostgreSQL Configuration password_encryption should eq "scram-sha-256"
     ✔  PostgreSQL Configuration ssl should eq "on"
     ✔  PostgreSQL Configuration logging_collector should eq "on"
     ✔  PostgreSQL Configuration log_connections should eq "on"
     ✔  PostgreSQL Configuration log_disconnections should eq "on"
     ✔  PostgreSQL Configuration log_duration should eq "on"


Profile Summary: 3 successful controls, 0 control failures, 0 controls skipped
Test Summary: 18 successful, 0 failures, 0 skipped

输出表明您的三个控件和所有测试都成功,没有任何跳过的测试或控件。

在此步骤中,您添加了一个新的 InSpec 控件,该控件使用 postgres_conf 资源测试配置文件中的特定 PostgreSQL 配置值。 您在本节中审核了一些值,但您可以使用它来测试配置文件中的任何配置选项。

第 5 步 — 审核 PostgreSQL 客户端身份验证

现在您已经为您的 PostgreSQL 配置编写了一些测试,您将编写一些用于客户端身份验证的测试。 这对于需要确保针对不同类型用户的特定身份验证方法的安装很重要; 例如,为了确保本地连接到 PostgreSQL 的客户端始终需要使用密码进行身份验证,或者拒绝来自特定 IP 地址或 IP 地址范围的连接,等等。

PostgreSQL 安装的一个重要配置是只允许加密的密码验证。 PostgreSQL 10 支持两种密码加密方式 进行客户端认证:md5scram-sha-256。 此测试需要对所有客户端进行密码加密,因此这意味着客户端配置文件中所有客户端的 METHOD 字段必须设置为 md5scram-sha-256。 对于这些测试,您将使用 scram-sha-256,因为它比 md5 更安全。

默认情况下,local 客户端在 pg_hba.conf 文件中有他们的 peer 认证方法。 对于测试,您需要将这些更改为 scram-sha-256。 打开/etc/postgresql/10/main/pg_hba.conf文件:

sudo nano /etc/postgresql/10/main/pg_hba.conf

文件的顶部包含注释。 向下滚动并查找身份验证类型为 local 的未注释行,并将身份验证方法从 peer 更改为 scram-sha-256。 例如,更改:

/etc/postgresql/10/main/pg_hba.conf

...
local   all             postgres                                peer
...

到:

/etc/postgresql/10/main/pg_hba.conf

...
local   all             postgres                                scram-sha-256
...

最后,您的 pg_hba.conf 配置将类似于以下内容:

/etc/postgresql/10/main/pg_hba.conf

...
local   all             postgres                                scram-sha-256

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     scram-sha-256
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     scram-sha-256
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256
...

保存并退出配置文件。 然后重启 PostgreSQL 服务:

sudo service postgresql@10-main restart

对于此测试,您将使用 postgres_hba_conf 资源。 此资源用于测试 pg_hba.conf 文件中定义的客户端身份验证数据。 您将 pg_hba.conf 文件的路径作为参数传递给此资源。

您的控件将包含两个 describe 块,它们分别检查 localhost 客户端的 auth_method 字段,以确保它们都等于 [X174X ]。 在文本编辑器中打开 controls/postgresql.rb

nano controls/postgresql.rb

将以下控件附加到测试文件 controls/postgresql.rb 的末尾:

控制/postgresql.rb

POSTGRES_HBA_CONF_FILE = File.join(POSTGRES_CONF_DIR, 'pg_hba.conf')

control '4-postgres_hba' do
  impact 1.0
  title 'Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf'
  desc 'Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf. Do not allow untrusted authentication methods.'

  describe postgres_hba_conf(POSTGRES_HBA_CONF_FILE).where { type == 'local' } do
    its('auth_method') { should all eq 'scram-sha-256' }
  end

  describe postgres_hba_conf(POSTGRES_HBA_CONF_FILE).where { type == 'host' } do
    its('auth_method') { should all eq 'scram-sha-256' }
  end
end

在此代码块中,您定义了一个新变量 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 作为其身份验证方法。 对于客户端类型为 host 的情况,第二个 describe 块执行相同的操作。 保存并退出controls/postgresql.rb

您将以 postgres 用户身份执行此控件,因为对 PostgreSQL HBA 配置的 Read 访问权限仅授予所有者和组,即 postgres 用户。 通过运行执行配置文件:

sudo -u postgres inspec exec .

您的输出将类似于以下内容:

OutputProfile: InSpec Profile (PostgreSQL)
Version: 0.1.0
Target:  local://

  ✔  1-audit_installation: Audit PostgreSQL Installation
     ✔  System Package postgresql-10 should be installed
     ✔  System Package postgresql-10 version should cmp >= "10"
     ✔  Service postgresql@10-main should be enabled
     ✔  Service postgresql@10-main should be installed
     ✔  Service postgresql@10-main should be running
  ✔  2-audit_address_port: Audit Process and Port
     ✔  Port 5432 should be listening
     ✔  Port 5432 addresses should include "127.0.0.1"
     ✔  Port 5432 protocols should cmp == "tcp"
     ✔  Processes postgres should exist
     ✔  Processes postgres users should include "postgres"
     ✔  User postgres should exist
  ✔  3-postgresql: Audit PostgreSQL Configuration
     ✔  PostgreSQL Configuration port should eq "5432"
     ✔  PostgreSQL Configuration password_encryption should eq "scram-sha-256"
     ✔  PostgreSQL Configuration ssl should eq "on"
     ✔  PostgreSQL Configuration logging_collector should eq "on"
     ✔  PostgreSQL Configuration log_connections should eq "on"
     ✔  PostgreSQL Configuration log_disconnections should eq "on"
     ✔  PostgreSQL Configuration log_duration should eq "on"
  ✔  4-postgres_hba: Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf
     ✔  Postgres Hba Config /etc/postgresql/10/main/pg_hba.conf with type == "local" auth_method should all eq "scram-sha-256"
     ✔  Postgres Hba Config /etc/postgresql/10/main/pg_hba.conf with type == "host" auth_method should all eq "scram-sha-256"


Profile Summary: 4 successful controls, 0 control failures, 0 controls skipped
Test 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 超市Compliance Profiles 部分,其中包含公开共享的 InSpec 配置文件,您可以直接执行或在自己的配置文件中扩展。 您还可以在 Chef Supermarket 中与公众分享您自己的个人资料。

您可以进一步探索 Chef 世界中的其他工具,例如 ChefHabitatInSpec 与 Habitat 集成,这提供了将合规控制与 Habitat 打包应用程序一起交付并持续运行它们的能力。 您可以在 tutorials 页面上探索官方和社区 InSpec 教程。 如需更高级的 InSpec 参考资料,请查看官方 InSpec 文档