PostgreSQL STIG Compliance Validator (pgStigCheck) for InSpec is an open source compliance testing solution for PostgreSQL.
Developed in order to reduce the time it takes to secure Authority to Operate (ATO) certification for cloud services, pgStickCheck technology leverages open source software to provide automated compliance testing in real time. pgStigCheck uses the InSpec, which provides an open source compliance, security and policy testing framework that dynamically extracts system configuration information.
STIG Baseline: PostgreSQL 9.x STIG Version 1, Release 6
The PostgreSQL Security Technical Implementation Guide (STIG) by the United States Defense Information Systems Agency (DISA) offers security-conscious enterprises a comprehensive guide for the configuration and operation of open source PostgreSQL.
STIGs are the configuration standards for United States Department of Defense (DoD) Information Assurance (IA) and IA-enabled devices/systems published by the United States Defense Information Systems Agency (DISA). Since 1998, DISA has played a critical role enhancing the security posture of DoD's security systems by providing the STIGs. The STIGs contain technical guidance to "lock down" information systems/software that might otherwise be vulnerable to a malicious computer attack.
The requirements associated with the PostgreSQL STIG are derived from the National Institute of Standards and Technology (NIST) Special Publication (SP) 800-53, Revision 4 and related documents.
While the PostgreSQL STIG was developed to provide technical guidance to "lock down" information systems used within the DoD, the guidance applies to all organizations that need to meet internal security as well as compliance standards.
The PostgreSQL STIG provides guidance on the configuration of PostgreSQL to address requirements associated with:
- Authentication
- Access Controls
- Data encryption at rest and over the wire
- Auditing
- Logging
- Administration
- Protection against SQL Injection
To run the PostgreSQL STIG Compliance Validator, there are specific requirements on both the database host as will as the STIG valudation host.
- PostgreSQL 9.5+ cluster running on *nix host
- Remote access to PostgreSQL Server
- lsof
- netstat
- Linux VM or Host
- sudo access to install packages
- git
- ssh
- InSpec
The InSpec community and chef provide packages for all major platforms. The installation package will bring all needed libraries and components needed by InSpec.
This is recommended for production and LTS environments.
Goto https://downloads.chef.io/inspec/stable and copy download link
For example:
sudo yum insall https://packages.chef.io/files/stable/inspec/4.18.51/el/7/inspec-4.18.51-1.el7.x86_64.rpm
inspec --version
If you already have an existing Ruby environment configured on your system, or use RVM to manage your Ruby environments, you can always just install the InSpec gem and its dependencies using GEM.
$ curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
$ curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
$ curl -L get.rvm.io | bash -s stable
$ rvm install 2.4.0
$ rvm use 2.4.0 --default
$ source ${HOME}/.rvm/scripts/rvm
gem install inspec
inspec --version
The core
or shared
attributes are set in the inspec.yml
file in the profile. This stores the default values for the
shared attributes that the profile uses to examine your system.
These attributes should not be edited directly!
If you need to override the default values for the core attributes to better match your system under evaluation, please:
- Review the attributes and their defaults in the
inspec.yml
and note the attributes/inputs you need to tailor for your installation. - Create a
system
orinstance
specificattributes.yml
- such asattributes.mysystem.yml
and override the attributes with this file. - When you run the profile, you can load your updated attributes using the
--attrs
flag on theinspec exec
command (see below)
The recommend way to store sensitive information is to use one of the environmental variables outlined below. For instance, you can set the password for the PostgreSQL user with the PG_USER_PWD
environmental variable.
Alternatively, you can set these variables in your attributes.mysystem.yml
file, but again, this is not recommended for sensitive information like passwords.
- PG_OWNER
- PG_OWNER_GRP
- PG_OWNER_PWD
- PG_DBA
- PG_DBA_PWD
- PG_USER
- PG_USER_PWD
- PG_HOST
- PG_PORT
- LOGIN_USER
- LOGIN_HOST
- PG_SYSLOG_OWNER
pg_owner: "postgres"
pg_group: "postgres"
# password set via `env_var`
pg_dba: "dba"
# password set via `env_var`
pg_user: "<username>"
# password set via `env_var`
pg_host: "127.0.0.1"
pg_port: "5432"
pg_db: "test_db"
pg_table: "test_table"
login_user: "<user on remote DB server>"
login_host: "<DB Host IP>"
pg_version: "9.5"
pg_data_dir: "/var/lib/pgsql/9.5/data"
pg_conf_file: "/var/lib/pgsql/9.5/data/postgresql.conf"
pg_user_defined_conf: "/var/lib/pgsql/9.5/data/stig-postgresql.conf"
pg_hba_conf_file: "/var/lib/pgsql/9.5/data/pg_hba.conf"
pg_ident_conf_file: "/var/lib/pgsql/9.5/data/pg_ident.conf"
pg_shared_dirs:
[
"/usr/pgsql-9.5",
"/usr/pgsql-9.5/bin",
"/usr/pgsql-9.5/lib",
"/usr/pgsql-9.5/share",
]
pg_conf_mode: "0600"
pg_ssl: "on"
pg_log_dest: "syslog"
pg_syslog_facility: ["local0"]
pg_syslog_owner: "postgres"
pgaudit_log_items: ["ddl", "role", "read", "write"]
pgaudit_log_line_items: ["%m", "%u", "%c"]
pg_superusers: ["postgres"]
pg_users: []
pg_replicas: ["192.168.1.3/32"]
pg_max_connections: "100"
pg_timezone: "UTC"
(See: https://www.inspec.io/docs/reference/cli/)
Note: replace the profile's directory name - e.g. - pgstigcheck-inspec
with .
if you are in the profile's root directory.
inspec exec pgstigcheck-inspec/controls/V-72845.rb --input-files=attributes.mysystem.yml -i <your ssh private key> -t ssh://<user>@<db host>:<port> --reporter cli json:myresults.json
or use the --controls
flag
inspec exec pgstigcheck-inspec --controls=V-72845 V-72861 --input-file=attributes.mysystem.yml -i <your ssh private key> -t ssh://<user>@<db host>:<port> --reporter cli json:myresults.json
inspec exec pgstigcheck-inspec --controls=V-72845 --input-file=attributes.mysystem.yml -i <your ssh private key> --sudo --sudo-options="-u postgres" -t ssh://<user>@<db host>:<port> --reporter cli html:myresults.html
inspec exec pgstigcheck-inspec --input-file=attributes.yml -i <your ssh private key> --sudo --sudo-password=<sudo user password> --sudo-options="-u postgres" -t ssh://<user>@<db host>:<port> --reporter cli json:myresults.json
inspec exec pgstigcheck-inspec --input-files=attributes.yml -i <your ssh private key> --sudo --sudo-password=<sudo user password> --sudo-options="-u postgres" -t ssh://<user>@<db host>:<port> --reporter cli html:myresults.html
You can review your results from above in many ways, as you saw your results came back in multiple outputs - on the cli and in either json
or html
.
You can learn more about the different InSpec Reporters on the inspec.io site.
The --reporters
flags must always be at the end of your inspec exec
cli command as they can user either =
or spaces
and so they must be at the end of the command.
If you used the examples above, you should have a myresults.json
or myresults.html
which you can review.
The myresults.html
in our examples - aka the InSpec HTML Reporter - is a working html
file report but its output is very technical
and is not recommended for security review or accreditation discussions.
Use the JSON
InSpec Reporter output and the MITRE Heimdall-Lite for the best possible view of the results.
The recommended review format for for security review or accreditation discussions is the JSON
results format using the InSpec JSON
reporter and the MITRE heimdall-lite
viewer.
You can use heimdall-lite any-time anywhere from: http://mitre.github.io/heimdall-lite/. Heimdall-Lite is a Single Page Client Side JavaScript app that runs completely in your browser and was designed to help make reviewing, sorting and sharing your InSpec results easier.
You can also download the .html
files via a simple save as
from your browser should you need to use heimdall-lite
in a disconnected setting.
Heimdall-Lite is a VueJS powered client side only view of your data for teams and devs doing their security compliance work.
If you need a more ongoing compliance view of your InSpec results, get the full MITRE Hiemdall application / server which provides enhanced capabilities - like storage, timelines and more - and is powered by Rails and CrunchyDB PostgreSQL.
You can find out more about the InSpec Tools and Open Source applications at http://inspec.mitre.org.
Crunchy Data is pleased to sponsor pgstigcheck-inspec and many other open-source projects to help promote support the PostgreSQL community and software ecosystem.
The MITRE Corporation is pleased to support our Sponsors and CrunchyData in the creation of the PostgreSQL 9.x STIG and the pgstigcheck-inspec validation profile. MITRE also supports many other inspec validation baselines on the MITRE GitHub (https://github.com/mitre/) in the Public Interest.
Copyright © 2019 Crunchy Data Solutions, Inc.
CRUNCHY DATA SOLUTIONS, INC. PROVIDES THIS GUIDE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF NON INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Crunchy, Crunchy Data Solutions, Inc. and the Crunchy Hippo Logo are trademarks of Crunchy Data Solutions, Inc.