Как провести аудит базы данных PostgreSQL с помощью InSpec в Ubuntu 18.04

Автор выбралFree and Open Source Fund для получения пожертвования в рамках программыWrite for DOnations.

Вступление

InSpec - это автоматизированная среда тестирования с открытым исходным кодом для тестирования и аудита вашей системы, чтобы гарантировать соответствие интеграции, безопасности и другим требованиям политик. Разработчики могут проверить фактическое состояние своей инфраструктуры и приложений на соответствие целевому состоянию с помощью кода InSpec.

Чтобы указать требования к политике, которые вы проверяете, InSpec включаетaudit controls. Традиционно разработчики вручную применяют требования политики и часто делают это прямо перед развертыванием изменений в рабочей среде. Однако с InSpec разработчики могут постоянно оценивать соответствие на каждом этапе разработки продукта, что помогает в решении проблем на ранних этапах разработки. InSpec DSL (Domain Specific Language), построенный наRSpec, инструменте тестирования DSL, написанном на Ruby, определяет синтаксис, используемый для написания элементов управления аудитом.

InSpec также включает наборresources, чтобы помочь в настройке определенных частей вашей системы и упростить выполнение контрольных проверок. Существует возможность написать свои собственные ресурсы, когда вам нужно определить конкретное решение, которое недоступно. Universal matchers позволяет сравнивать значения ресурсов с ожидаемыми во всех тестах InSpec.

В этом руководстве вы инсталлируете InSpec на сервер под управлением Ubuntu 18.04. Вы начнете с написания теста, который проверяет семейство операционных систем сервера, а затем создадите профиль аудита PostgreSQL с нуля. Этот профиль аудита начинается с проверки того, что на сервере установлен PostgreSQL и запущены ли его службы. Затем вы добавите тесты, чтобы убедиться, что служба PostgreSQL работает с правильным портом, адресом, протоколом и пользователем. Далее вы протестируете конкретные параметры конфигурации PostgreSQL и, наконец, вы будете проверять конфигурацию аутентификации клиента.

Предпосылки

Прежде чем следовать этому уроку, вам понадобится следующее:

  • Один сервер Ubuntu 18.04, настроенный с использованиемInitial Server Setup with Ubuntu 18.04, включая пользователя sudo без полномочий root и брандмауэр.

  • Рабочая установка PostgreSQL 10 после этогоinstallation guide.

[[step-1 -—- prepare-the-environment]] == Шаг 1. Подготовка окружающей среды

На этом этапе вы загрузите и распакуете последнюю стабильную версию InSpec в свой домашний каталог. InSpec предоставляет устанавливаемые двоичные файлы на своей страницеdownloads.

Перейдите в свой домашний каталог:

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 downloads page, поэтому посетите страницу загрузок, чтобы сравнить с выводом этой команды.

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 на свой сервер. На следующем шаге вы напишите тест для проверки семейства операционных систем вашего сервера.

[[step-2 -—- complete-your-first-inspec-test]] == Шаг 2 - завершение вашего первого теста InSpec

На этом этапе вы завершите свой первый тест InSpec, который будет проверять, что ваше семейство операционной системы -debian.

Вы будете использовать ресурсos, который является встроенным ресурсом аудита InSpec, для тестирования платформы, на которой работает система. Вы также будете использовать сопоставительeq. Сопоставительeq - это универсальный сопоставитель, который проверяет точное равенство двух значений.

Тест InSpec состоит из блокаdescribe, который содержит один или несколько операторовit иits, каждый из которых проверяет одну из характеристик ресурса. Каждый оператор описывает ожидание определенного состояния системы какassertions. Два ключевых слова, которые вы можете включить для утверждения, - этоshould иshould_not, которые утверждают, что условие должно быть истинным и ложным соответственно.

Создайте файл с именемos_family.rb для проведения теста и откройте его в текстовом редакторе:

nano os_family.rb

Добавьте следующее в ваш файл:

os_family.rb

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

Этот тест гарантирует, что семейство операционной системы целевой системыdebian. Другие возможные значения:windows,unix,bsd и так далее. Вы можете найти полный список вos resource documentation. Сохраните и выйдите из файла.

Затем запустите тест с помощью следующей команды:

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. (Вы будете работать с InSpecprofiles в следующем разделе, где вы начнете создавать свой профиль 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.

[[step-3 -—- auditing-your-postgresql-installation]] == Шаг 3. Аудит установки PostgreSQL

Теперь вы будете проверять вашу установку PostgreSQL. Вы начнете с проверки, что у вас установлен PostgreSQL и его служба работает правильно. Наконец, вы будете проверять порт и процесс системы PostgreSQL. Для аудита PostgreSQL вы создадите различные элементы управления InSpec, все в InSpecprofile с именемPostgreSQL.

InSpeccontrol - это группа связанных тестов высокого уровня. В элементе управления вы можете иметь несколько блоков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

Замените содержимое файла следующим:

controls/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 и передаете имя пакета PostgreSQLpostgresql-10 в качестве аргумента ресурса. Ресурсpackage предоставляет сопоставлениеbe_installed для проверки того, что указанный пакет установлен в системе. Он возвращаетtrue, если у вас установлен пакет, иfalse в противном случае. Затем вы использовали операторits для проверки того, что версия установленного пакета PostgreSQL не ниже 10. Вы используетеcmp вместоeq, потому что строки версии пакета обычно содержат другие атрибуты, кроме числовой версии. eq возвращаетtrue, только если есть точное совпадение, в то время какcmp менее ограничивает.

Во втором блокеdescribe вы используете ресурсservice и передаете имя службы PostgreSQL 10postgresql@10-main в качестве аргумента ресурса. Ресурсservice предоставляет сопоставителиbe_enabled,be_installed иbe_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 правильного порта, адреса и протокола.

Для этого теста вы также будете использоватьattributes. Атрибут InSpec используется для параметризации профиля, чтобы обеспечить легкое повторное использование в различных средах или целевых системах. Вы определите атрибутPORT.

Откройте файлinspec.yml в текстовом редакторе:

nano inspec.yml

Вы добавите атрибутport в конец файла. Добавьте следующее в конец вашего файла:

inspec.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:

controls/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_listening,addresses иprotocols. Вы используете сопоставительbe_listening, чтобы проверить, что указанный порт прослушивает целевую систему. Он возвращаетtrue, если порт5432 слушает, и возвращаетfalse в противном случае. Сопоставительaddresses проверяет, связан ли указанный адрес с портом. В этом случае 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.

Затем запустите свой профиль с помощью следующей команды:

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 существует в системе. С этой настройкой вы готовы к аудиту вашей конфигурации.

[[step-4 -—- auditing-your-postgresql-configuration]] == Шаг 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

Вы протестируете только несколько вариантов конфигурации, но вы можете протестировать любой вариант конфигурации PostgreSQL с помощью ресурсаpostgres_conf.

Вы передадите свой каталог конфигурации PostgreSQL, который находится в/etc/postgresql/10/main, используя новый атрибут профиля,postgres_conf_dir. Этот каталог конфигурации не одинаков для всех операционных систем и платформ, поэтому, передав его в качестве атрибута профиля, вы упростите повторное использование этого профиля в различных средах.

Откройте ваш файлinspec.yml:

nano inspec.yml

Добавьте этот новый атрибут в разделattributesinspec.yml:

inspec.yml

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

Сохраните и выйдите из файла. Затем выполните следующую команду, чтобы убедиться, что профиль InSpec все еще действителен, поскольку вы только что отредактировалиinspec.yml:

inspec check .

Если ошибок нет, вы можете продолжить. В противном случае откройте файлinspec.yml и убедитесь, что указанные выше строки присутствуют в конце файла.

Теперь вы создадите элемент управления, который проверяет значения конфигурации, которые вы применяете. Добавьте следующий элемент управления в конец файла тестовcontrols/postgresql.rb:

controls/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, который проверяет определенные значения конфигурации PostgreSQL из файла конфигурации с использованием ресурсаpostgres_conf. Вы провели аудит нескольких значений в этом разделе, но вы можете использовать его для проверки любого параметра конфигурации из файла конфигурации.

[[step-5 -—- auditing-postgresql-client-authentication]] == Шаг 5. Аудит аутентификации клиента PostgreSQL

Теперь, когда вы написали несколько тестов для своей конфигурации PostgreSQL, вы напишите несколько тестов для аутентификации клиента. Это важно для установок, которые должны обеспечить определенные методы аутентификации для разных типов пользователей; например, чтобы клиенты, подключающиеся к PostgreSQL локально, всегда должны проходить проверку подлинности с помощью пароля или отклонять подключения с определенного IP-адреса или диапазона IP-адресов и т. д.

Важной конфигурацией для установок PostgreSQL, в которых важна безопасность, является разрешение только аутентификации зашифрованных паролей. PostgreSQL 10supports two password encryption methods для аутентификации клиента:md5 иscram-sha-256. Этот тест потребует шифрования паролей для всех клиентов, поэтому это означает, что в полеMETHOD для всех клиентов в файле конфигурации клиента должно быть установлено значениеmd5 илиscram-sha-256. Для этих тестов вы будете использоватьscram-sha-256, поскольку он более безопасен, чемmd5.

По умолчанию клиентыlocal имеют свой метод аутентификацииpeer в файлеpg_hba.conf. Для теста вам нужно изменить их на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
...

to:

/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, которые проверяют поляauth_method для клиентовlocal иhost соответственно, чтобы убедиться, что они оба равныscram-sha-256. Откройтеcontrols/postgresql.rb в текстовом редакторе:

nano controls/postgresql.rb

Добавьте следующий элемент управления в конец тестового файлаcontrols/postgresql.rb:

controls/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, объявленную в предыдущем разделе, с файлом конфигурации PostgreSQLpg_hba.conf. Это создаст абсолютный путь к файлуpg_hba.conf и сохранит его в переменнойPOSTGRES_HBA_CONF_FILE.

После этого вы объявляете и настраиваете элемент управления и его метаданные. Первый блокdescribe проверяет, что все записи конфигурации, где тип клиентаlocal, также имеютscram-sha-256 в качестве методов аутентификации. Второй блокdescribe делает то же самое для случаев, когда тип клиентаhost. Сохраните и выйдите изcontrols/postgresql.rb.

Вы будете выполнять этот элемент управления как пользовательpostgres, потому что доступRead к конфигурации PostgreSQL HBA предоставляется только владельцу и группе, то есть пользователю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, чтобы гарантировать, что все клиенты аутентифицированы черезscram-sha-256 с использованием ресурсаpostgres_hba_conf.

Заключение

Вы настроили InSpec и успешно провели аудит установки PostgreSQL 10. При этом вы использовали набор инструментов InSpec, таких как: InSpec DSL, средства сопоставления, ресурсы, профили, атрибуты и интерфейс командной строки. Отсюда вы можете включить другие ресурсы, которые InSpec предоставляет вResources section своей документации. InSpec также предоставляет механизм для определенияcustom resources для ваших конкретных нужд. Эти пользовательские ресурсы написаны как обычный класс Ruby.

Вы также можете изучить разделCompliance ProfilesChef supermarket, содержащий общедоступные профили InSpec, которые вы можете выполнять напрямую или расширять в своих собственных профилях. Вы также можете поделиться своими профилями с широкой публикой в ​​супермаркете Chef.

Вы можете пойти дальше, изучив другие инструменты вселенной Chef, такие какChef иHabitat. InSpec is integrated with Habitat, и это дает возможность поставлять средства контроля соответствия вместе с приложениями, упакованными в Habitat, и непрерывно их запускать. Вы можете изучить официальные руководства InSpec и руководства сообщества на страницеtutorials. Более подробные ссылки на InSpec можно найти в официальномInSpec documentation.

Related