inspec-core 2.1.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3136 -0
- data/Gemfile +56 -0
- data/LICENSE +14 -0
- data/MAINTAINERS.md +33 -0
- data/MAINTAINERS.toml +52 -0
- data/README.md +453 -0
- data/bin/inspec +12 -0
- data/docs/.gitignore +2 -0
- data/docs/README.md +40 -0
- data/docs/dev/control-eval.md +62 -0
- data/docs/dsl_inspec.md +258 -0
- data/docs/dsl_resource.md +100 -0
- data/docs/glossary.md +99 -0
- data/docs/habitat.md +192 -0
- data/docs/inspec_and_friends.md +114 -0
- data/docs/matchers.md +169 -0
- data/docs/migration.md +293 -0
- data/docs/platforms.md +119 -0
- data/docs/plugin_kitchen_inspec.md +50 -0
- data/docs/profiles.md +378 -0
- data/docs/reporters.md +105 -0
- data/docs/resources/aide_conf.md.erb +76 -0
- data/docs/resources/apache.md.erb +67 -0
- data/docs/resources/apache_conf.md.erb +68 -0
- data/docs/resources/apt.md.erb +71 -0
- data/docs/resources/audit_policy.md.erb +47 -0
- data/docs/resources/auditd.md.erb +79 -0
- data/docs/resources/auditd_conf.md.erb +68 -0
- data/docs/resources/bash.md.erb +75 -0
- data/docs/resources/bond.md.erb +90 -0
- data/docs/resources/bridge.md.erb +57 -0
- data/docs/resources/bsd_service.md.erb +67 -0
- data/docs/resources/chocolatey_package.md.erb +58 -0
- data/docs/resources/command.md.erb +138 -0
- data/docs/resources/cpan.md.erb +79 -0
- data/docs/resources/cran.md.erb +64 -0
- data/docs/resources/crontab.md.erb +89 -0
- data/docs/resources/csv.md.erb +54 -0
- data/docs/resources/dh_params.md.erb +205 -0
- data/docs/resources/directory.md.erb +30 -0
- data/docs/resources/docker.md.erb +219 -0
- data/docs/resources/docker_container.md.erb +103 -0
- data/docs/resources/docker_image.md.erb +94 -0
- data/docs/resources/docker_service.md.erb +114 -0
- data/docs/resources/elasticsearch.md.erb +242 -0
- data/docs/resources/etc_fstab.md.erb +125 -0
- data/docs/resources/etc_group.md.erb +75 -0
- data/docs/resources/etc_hosts.md.erb +78 -0
- data/docs/resources/etc_hosts_allow.md.erb +74 -0
- data/docs/resources/etc_hosts_deny.md.erb +74 -0
- data/docs/resources/file.md.erb +526 -0
- data/docs/resources/filesystem.md.erb +41 -0
- data/docs/resources/firewalld.md.erb +107 -0
- data/docs/resources/gem.md.erb +79 -0
- data/docs/resources/group.md.erb +61 -0
- data/docs/resources/grub_conf.md.erb +101 -0
- data/docs/resources/host.md.erb +86 -0
- data/docs/resources/http.md.erb +197 -0
- data/docs/resources/iis_app.md.erb +122 -0
- data/docs/resources/iis_site.md.erb +135 -0
- data/docs/resources/inetd_conf.md.erb +94 -0
- data/docs/resources/ini.md.erb +76 -0
- data/docs/resources/interface.md.erb +58 -0
- data/docs/resources/iptables.md.erb +64 -0
- data/docs/resources/json.md.erb +63 -0
- data/docs/resources/kernel_module.md.erb +120 -0
- data/docs/resources/kernel_parameter.md.erb +53 -0
- data/docs/resources/key_rsa.md.erb +85 -0
- data/docs/resources/launchd_service.md.erb +57 -0
- data/docs/resources/limits_conf.md.erb +75 -0
- data/docs/resources/login_defs.md.erb +71 -0
- data/docs/resources/mount.md.erb +69 -0
- data/docs/resources/mssql_session.md.erb +60 -0
- data/docs/resources/mysql_conf.md.erb +99 -0
- data/docs/resources/mysql_session.md.erb +74 -0
- data/docs/resources/nginx.md.erb +79 -0
- data/docs/resources/nginx_conf.md.erb +138 -0
- data/docs/resources/npm.md.erb +60 -0
- data/docs/resources/ntp_conf.md.erb +60 -0
- data/docs/resources/oneget.md.erb +53 -0
- data/docs/resources/oracledb_session.md.erb +52 -0
- data/docs/resources/os.md.erb +141 -0
- data/docs/resources/os_env.md.erb +91 -0
- data/docs/resources/package.md.erb +120 -0
- data/docs/resources/packages.md.erb +67 -0
- data/docs/resources/parse_config.md.erb +103 -0
- data/docs/resources/parse_config_file.md.erb +138 -0
- data/docs/resources/passwd.md.erb +141 -0
- data/docs/resources/pip.md.erb +67 -0
- data/docs/resources/port.md.erb +137 -0
- data/docs/resources/postgres_conf.md.erb +79 -0
- data/docs/resources/postgres_hba_conf.md.erb +93 -0
- data/docs/resources/postgres_ident_conf.md.erb +76 -0
- data/docs/resources/postgres_session.md.erb +69 -0
- data/docs/resources/powershell.md.erb +102 -0
- data/docs/resources/processes.md.erb +109 -0
- data/docs/resources/rabbitmq_config.md.erb +41 -0
- data/docs/resources/registry_key.md.erb +158 -0
- data/docs/resources/runit_service.md.erb +57 -0
- data/docs/resources/security_policy.md.erb +47 -0
- data/docs/resources/service.md.erb +121 -0
- data/docs/resources/shadow.md.erb +146 -0
- data/docs/resources/ssh_config.md.erb +73 -0
- data/docs/resources/sshd_config.md.erb +83 -0
- data/docs/resources/ssl.md.erb +119 -0
- data/docs/resources/sys_info.md.erb +42 -0
- data/docs/resources/systemd_service.md.erb +57 -0
- data/docs/resources/sysv_service.md.erb +57 -0
- data/docs/resources/upstart_service.md.erb +57 -0
- data/docs/resources/user.md.erb +140 -0
- data/docs/resources/users.md.erb +127 -0
- data/docs/resources/vbscript.md.erb +55 -0
- data/docs/resources/virtualization.md.erb +57 -0
- data/docs/resources/windows_feature.md.erb +47 -0
- data/docs/resources/windows_hotfix.md.erb +53 -0
- data/docs/resources/windows_task.md.erb +95 -0
- data/docs/resources/wmi.md.erb +81 -0
- data/docs/resources/x509_certificate.md.erb +151 -0
- data/docs/resources/xinetd_conf.md.erb +156 -0
- data/docs/resources/xml.md.erb +85 -0
- data/docs/resources/yaml.md.erb +69 -0
- data/docs/resources/yum.md.erb +98 -0
- data/docs/resources/zfs_dataset.md.erb +53 -0
- data/docs/resources/zfs_pool.md.erb +47 -0
- data/docs/ruby_usage.md +203 -0
- data/docs/shared/matcher_be.md.erb +1 -0
- data/docs/shared/matcher_cmp.md.erb +43 -0
- data/docs/shared/matcher_eq.md.erb +3 -0
- data/docs/shared/matcher_include.md.erb +1 -0
- data/docs/shared/matcher_match.md.erb +1 -0
- data/docs/shell.md +217 -0
- data/examples/README.md +8 -0
- data/examples/inheritance/README.md +65 -0
- data/examples/inheritance/controls/example.rb +14 -0
- data/examples/inheritance/inspec.yml +15 -0
- data/examples/kitchen-ansible/.kitchen.yml +25 -0
- data/examples/kitchen-ansible/Gemfile +19 -0
- data/examples/kitchen-ansible/README.md +53 -0
- data/examples/kitchen-ansible/files/nginx.repo +6 -0
- data/examples/kitchen-ansible/tasks/main.yml +16 -0
- data/examples/kitchen-ansible/test/integration/default/default.yml +5 -0
- data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -0
- data/examples/kitchen-chef/.kitchen.yml +20 -0
- data/examples/kitchen-chef/Berksfile +3 -0
- data/examples/kitchen-chef/Gemfile +19 -0
- data/examples/kitchen-chef/README.md +27 -0
- data/examples/kitchen-chef/metadata.rb +7 -0
- data/examples/kitchen-chef/recipes/default.rb +6 -0
- data/examples/kitchen-chef/recipes/nginx.rb +30 -0
- data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -0
- data/examples/kitchen-puppet/.kitchen.yml +23 -0
- data/examples/kitchen-puppet/Gemfile +20 -0
- data/examples/kitchen-puppet/Puppetfile +25 -0
- data/examples/kitchen-puppet/README.md +53 -0
- data/examples/kitchen-puppet/manifests/site.pp +33 -0
- data/examples/kitchen-puppet/metadata.json +11 -0
- data/examples/kitchen-puppet/modules/.gitkeep +0 -0
- data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -0
- data/examples/meta-profile/README.md +37 -0
- data/examples/meta-profile/controls/example.rb +13 -0
- data/examples/meta-profile/inspec.yml +13 -0
- data/examples/profile-attribute.yml +2 -0
- data/examples/profile-attribute/README.md +14 -0
- data/examples/profile-attribute/controls/example.rb +11 -0
- data/examples/profile-attribute/inspec.yml +8 -0
- data/examples/profile-sensitive/README.md +29 -0
- data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -0
- data/examples/profile-sensitive/controls/sensitive.rb +9 -0
- data/examples/profile-sensitive/inspec.yml +8 -0
- data/examples/profile/README.md +48 -0
- data/examples/profile/controls/example.rb +23 -0
- data/examples/profile/controls/gordon.rb +36 -0
- data/examples/profile/controls/meta.rb +34 -0
- data/examples/profile/inspec.yml +10 -0
- data/examples/profile/libraries/gordon_config.rb +59 -0
- data/inspec-core.gemspec +43 -0
- data/lib/bundles/README.md +3 -0
- data/lib/bundles/inspec-artifact.rb +7 -0
- data/lib/bundles/inspec-artifact/README.md +1 -0
- data/lib/bundles/inspec-artifact/cli.rb +277 -0
- data/lib/bundles/inspec-compliance.rb +16 -0
- data/lib/bundles/inspec-compliance/.kitchen.yml +20 -0
- data/lib/bundles/inspec-compliance/README.md +193 -0
- data/lib/bundles/inspec-compliance/api.rb +360 -0
- data/lib/bundles/inspec-compliance/api/login.rb +193 -0
- data/lib/bundles/inspec-compliance/bootstrap.sh +41 -0
- data/lib/bundles/inspec-compliance/cli.rb +260 -0
- data/lib/bundles/inspec-compliance/configuration.rb +103 -0
- data/lib/bundles/inspec-compliance/http.rb +125 -0
- data/lib/bundles/inspec-compliance/images/cc-token.png +0 -0
- data/lib/bundles/inspec-compliance/support.rb +36 -0
- data/lib/bundles/inspec-compliance/target.rb +106 -0
- data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -0
- data/lib/bundles/inspec-habitat.rb +12 -0
- data/lib/bundles/inspec-habitat/cli.rb +36 -0
- data/lib/bundles/inspec-habitat/log.rb +10 -0
- data/lib/bundles/inspec-habitat/profile.rb +391 -0
- data/lib/bundles/inspec-init.rb +8 -0
- data/lib/bundles/inspec-init/README.md +31 -0
- data/lib/bundles/inspec-init/cli.rb +97 -0
- data/lib/bundles/inspec-init/templates/profile/README.md +3 -0
- data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -0
- data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -0
- data/lib/bundles/inspec-init/templates/profile/libraries/.gitkeep +0 -0
- data/lib/bundles/inspec-supermarket.rb +13 -0
- data/lib/bundles/inspec-supermarket/README.md +45 -0
- data/lib/bundles/inspec-supermarket/api.rb +84 -0
- data/lib/bundles/inspec-supermarket/cli.rb +73 -0
- data/lib/bundles/inspec-supermarket/target.rb +34 -0
- data/lib/fetchers/git.rb +163 -0
- data/lib/fetchers/local.rb +74 -0
- data/lib/fetchers/mock.rb +35 -0
- data/lib/fetchers/url.rb +247 -0
- data/lib/inspec.rb +24 -0
- data/lib/inspec/archive/tar.rb +29 -0
- data/lib/inspec/archive/zip.rb +19 -0
- data/lib/inspec/backend.rb +93 -0
- data/lib/inspec/base_cli.rb +368 -0
- data/lib/inspec/cached_fetcher.rb +66 -0
- data/lib/inspec/cli.rb +292 -0
- data/lib/inspec/completions/bash.sh.erb +45 -0
- data/lib/inspec/completions/fish.sh.erb +34 -0
- data/lib/inspec/completions/zsh.sh.erb +61 -0
- data/lib/inspec/control_eval_context.rb +179 -0
- data/lib/inspec/dependencies/cache.rb +72 -0
- data/lib/inspec/dependencies/dependency_set.rb +92 -0
- data/lib/inspec/dependencies/lockfile.rb +115 -0
- data/lib/inspec/dependencies/requirement.rb +123 -0
- data/lib/inspec/dependencies/resolver.rb +86 -0
- data/lib/inspec/describe.rb +27 -0
- data/lib/inspec/dsl.rb +66 -0
- data/lib/inspec/dsl_shared.rb +33 -0
- data/lib/inspec/env_printer.rb +157 -0
- data/lib/inspec/errors.rb +14 -0
- data/lib/inspec/exceptions.rb +12 -0
- data/lib/inspec/expect.rb +45 -0
- data/lib/inspec/fetcher.rb +45 -0
- data/lib/inspec/file_provider.rb +275 -0
- data/lib/inspec/formatters.rb +3 -0
- data/lib/inspec/formatters/base.rb +259 -0
- data/lib/inspec/formatters/json_rspec.rb +20 -0
- data/lib/inspec/formatters/show_progress.rb +12 -0
- data/lib/inspec/library_eval_context.rb +58 -0
- data/lib/inspec/log.rb +11 -0
- data/lib/inspec/metadata.rb +247 -0
- data/lib/inspec/method_source.rb +24 -0
- data/lib/inspec/objects.rb +14 -0
- data/lib/inspec/objects/attribute.rb +75 -0
- data/lib/inspec/objects/control.rb +61 -0
- data/lib/inspec/objects/describe.rb +92 -0
- data/lib/inspec/objects/each_loop.rb +36 -0
- data/lib/inspec/objects/list.rb +15 -0
- data/lib/inspec/objects/or_test.rb +40 -0
- data/lib/inspec/objects/ruby_helper.rb +15 -0
- data/lib/inspec/objects/tag.rb +27 -0
- data/lib/inspec/objects/test.rb +87 -0
- data/lib/inspec/objects/value.rb +27 -0
- data/lib/inspec/plugins.rb +60 -0
- data/lib/inspec/plugins/cli.rb +24 -0
- data/lib/inspec/plugins/fetcher.rb +86 -0
- data/lib/inspec/plugins/resource.rb +135 -0
- data/lib/inspec/plugins/secret.rb +15 -0
- data/lib/inspec/plugins/source_reader.rb +40 -0
- data/lib/inspec/polyfill.rb +12 -0
- data/lib/inspec/profile.rb +513 -0
- data/lib/inspec/profile_context.rb +208 -0
- data/lib/inspec/profile_vendor.rb +66 -0
- data/lib/inspec/reporters.rb +60 -0
- data/lib/inspec/reporters/automate.rb +76 -0
- data/lib/inspec/reporters/base.rb +25 -0
- data/lib/inspec/reporters/cli.rb +356 -0
- data/lib/inspec/reporters/json.rb +116 -0
- data/lib/inspec/reporters/json_min.rb +48 -0
- data/lib/inspec/reporters/junit.rb +78 -0
- data/lib/inspec/require_loader.rb +33 -0
- data/lib/inspec/resource.rb +190 -0
- data/lib/inspec/rule.rb +280 -0
- data/lib/inspec/runner.rb +345 -0
- data/lib/inspec/runner_mock.rb +41 -0
- data/lib/inspec/runner_rspec.rb +175 -0
- data/lib/inspec/runtime_profile.rb +26 -0
- data/lib/inspec/schema.rb +213 -0
- data/lib/inspec/secrets.rb +19 -0
- data/lib/inspec/secrets/yaml.rb +30 -0
- data/lib/inspec/shell.rb +220 -0
- data/lib/inspec/shell_detector.rb +90 -0
- data/lib/inspec/source_reader.rb +29 -0
- data/lib/inspec/version.rb +8 -0
- data/lib/matchers/matchers.rb +339 -0
- data/lib/resources/aide_conf.rb +151 -0
- data/lib/resources/apache.rb +48 -0
- data/lib/resources/apache_conf.rb +149 -0
- data/lib/resources/apt.rb +149 -0
- data/lib/resources/audit_policy.rb +63 -0
- data/lib/resources/auditd.rb +231 -0
- data/lib/resources/auditd_conf.rb +46 -0
- data/lib/resources/bash.rb +35 -0
- data/lib/resources/bond.rb +69 -0
- data/lib/resources/bridge.rb +122 -0
- data/lib/resources/chocolatey_package.rb +78 -0
- data/lib/resources/command.rb +73 -0
- data/lib/resources/cpan.rb +58 -0
- data/lib/resources/cran.rb +64 -0
- data/lib/resources/crontab.rb +169 -0
- data/lib/resources/csv.rb +56 -0
- data/lib/resources/dh_params.rb +77 -0
- data/lib/resources/directory.rb +25 -0
- data/lib/resources/docker.rb +236 -0
- data/lib/resources/docker_container.rb +89 -0
- data/lib/resources/docker_image.rb +83 -0
- data/lib/resources/docker_object.rb +57 -0
- data/lib/resources/docker_service.rb +90 -0
- data/lib/resources/elasticsearch.rb +169 -0
- data/lib/resources/etc_fstab.rb +94 -0
- data/lib/resources/etc_group.rb +154 -0
- data/lib/resources/etc_hosts.rb +66 -0
- data/lib/resources/etc_hosts_allow_deny.rb +112 -0
- data/lib/resources/file.rb +298 -0
- data/lib/resources/filesystem.rb +31 -0
- data/lib/resources/firewalld.rb +143 -0
- data/lib/resources/gem.rb +70 -0
- data/lib/resources/groups.rb +215 -0
- data/lib/resources/grub_conf.rb +227 -0
- data/lib/resources/host.rb +306 -0
- data/lib/resources/http.rb +253 -0
- data/lib/resources/iis_app.rb +101 -0
- data/lib/resources/iis_site.rb +148 -0
- data/lib/resources/inetd_conf.rb +54 -0
- data/lib/resources/ini.rb +29 -0
- data/lib/resources/interface.rb +129 -0
- data/lib/resources/iptables.rb +80 -0
- data/lib/resources/json.rb +111 -0
- data/lib/resources/kernel_module.rb +107 -0
- data/lib/resources/kernel_parameter.rb +58 -0
- data/lib/resources/key_rsa.rb +63 -0
- data/lib/resources/limits_conf.rb +46 -0
- data/lib/resources/login_def.rb +57 -0
- data/lib/resources/mount.rb +88 -0
- data/lib/resources/mssql_session.rb +101 -0
- data/lib/resources/mysql.rb +82 -0
- data/lib/resources/mysql_conf.rb +127 -0
- data/lib/resources/mysql_session.rb +85 -0
- data/lib/resources/nginx.rb +96 -0
- data/lib/resources/nginx_conf.rb +226 -0
- data/lib/resources/npm.rb +48 -0
- data/lib/resources/ntp_conf.rb +51 -0
- data/lib/resources/oneget.rb +71 -0
- data/lib/resources/oracledb_session.rb +139 -0
- data/lib/resources/os.rb +36 -0
- data/lib/resources/os_env.rb +86 -0
- data/lib/resources/package.rb +370 -0
- data/lib/resources/packages.rb +111 -0
- data/lib/resources/parse_config.rb +112 -0
- data/lib/resources/passwd.rb +76 -0
- data/lib/resources/pip.rb +130 -0
- data/lib/resources/platform.rb +109 -0
- data/lib/resources/port.rb +771 -0
- data/lib/resources/postgres.rb +131 -0
- data/lib/resources/postgres_conf.rb +114 -0
- data/lib/resources/postgres_hba_conf.rb +90 -0
- data/lib/resources/postgres_ident_conf.rb +79 -0
- data/lib/resources/postgres_session.rb +71 -0
- data/lib/resources/powershell.rb +67 -0
- data/lib/resources/processes.rb +204 -0
- data/lib/resources/rabbitmq_conf.rb +51 -0
- data/lib/resources/registry_key.rb +297 -0
- data/lib/resources/security_policy.rb +180 -0
- data/lib/resources/service.rb +794 -0
- data/lib/resources/shadow.rb +159 -0
- data/lib/resources/ssh_conf.rb +97 -0
- data/lib/resources/ssl.rb +99 -0
- data/lib/resources/sys_info.rb +28 -0
- data/lib/resources/toml.rb +32 -0
- data/lib/resources/users.rb +654 -0
- data/lib/resources/vbscript.rb +68 -0
- data/lib/resources/virtualization.rb +247 -0
- data/lib/resources/windows_feature.rb +84 -0
- data/lib/resources/windows_hotfix.rb +35 -0
- data/lib/resources/windows_task.rb +102 -0
- data/lib/resources/wmi.rb +110 -0
- data/lib/resources/x509_certificate.rb +137 -0
- data/lib/resources/xinetd.rb +106 -0
- data/lib/resources/xml.rb +46 -0
- data/lib/resources/yaml.rb +43 -0
- data/lib/resources/yum.rb +180 -0
- data/lib/resources/zfs_dataset.rb +60 -0
- data/lib/resources/zfs_pool.rb +49 -0
- data/lib/source_readers/flat.rb +39 -0
- data/lib/source_readers/inspec.rb +75 -0
- data/lib/utils/command_wrapper.rb +27 -0
- data/lib/utils/convert.rb +12 -0
- data/lib/utils/database_helpers.rb +77 -0
- data/lib/utils/enumerable_delegation.rb +9 -0
- data/lib/utils/erlang_parser.rb +192 -0
- data/lib/utils/file_reader.rb +25 -0
- data/lib/utils/filter.rb +273 -0
- data/lib/utils/filter_array.rb +27 -0
- data/lib/utils/find_files.rb +47 -0
- data/lib/utils/hash.rb +41 -0
- data/lib/utils/json_log.rb +18 -0
- data/lib/utils/latest_version.rb +22 -0
- data/lib/utils/modulator.rb +12 -0
- data/lib/utils/nginx_parser.rb +105 -0
- data/lib/utils/object_traversal.rb +49 -0
- data/lib/utils/parser.rb +274 -0
- data/lib/utils/pkey_reader.rb +15 -0
- data/lib/utils/plugin_registry.rb +93 -0
- data/lib/utils/simpleconfig.rb +120 -0
- data/lib/utils/spdx.rb +13 -0
- data/lib/utils/spdx.txt +344 -0
- metadata +713 -0
@@ -0,0 +1,131 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2015, Vulcano Security GmbH
|
3
|
+
|
4
|
+
module Inspec::Resources
|
5
|
+
class Postgres < Inspec.resource(1)
|
6
|
+
name 'postgres'
|
7
|
+
supports platform: 'unix'
|
8
|
+
desc 'The \'postgres\' resource is a helper for the \'postgres_conf\', \'postgres_hba_conf\', \'postgres_ident_conf\' & \'postgres_session\' resources. Please use those instead.'
|
9
|
+
|
10
|
+
attr_reader :service, :data_dir, :conf_dir, :conf_path, :version, :cluster
|
11
|
+
def initialize
|
12
|
+
if inspec.os.debian?
|
13
|
+
#
|
14
|
+
# https://wiki.debian.org/PostgreSql
|
15
|
+
#
|
16
|
+
# Debian allows multiple versions of postgresql to be
|
17
|
+
# installed as well as multiple "clusters" to be configured.
|
18
|
+
#
|
19
|
+
@version = version_from_psql || version_from_dir('/etc/postgresql')
|
20
|
+
@cluster = cluster_from_dir("/etc/postgresql/#{@version}")
|
21
|
+
@conf_dir = "/etc/postgresql/#{@version}/#{@cluster}"
|
22
|
+
@data_dir = "/var/lib/postgresql/#{@version}/#{@cluster}"
|
23
|
+
else
|
24
|
+
@version = version_from_psql
|
25
|
+
if @version.nil?
|
26
|
+
if inspec.directory('/var/lib/pgsql/data').exist?
|
27
|
+
warn 'Unable to determine PostgreSQL version: psql did not return
|
28
|
+
a version number and unversioned data directories were found.'
|
29
|
+
nil
|
30
|
+
else
|
31
|
+
@version = version_from_dir('/var/lib/pgsql')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
@data_dir = locate_data_dir_location_by_version(@version)
|
35
|
+
end
|
36
|
+
|
37
|
+
@service = 'postgresql'
|
38
|
+
@service += "-#{@version}" if @version.to_f >= 9.4
|
39
|
+
@conf_dir ||= @data_dir
|
40
|
+
|
41
|
+
verify_dirs
|
42
|
+
if !@version.nil? && !@conf_dir.empty?
|
43
|
+
@conf_path = File.join @conf_dir, 'postgresql.conf'
|
44
|
+
else
|
45
|
+
@conf_path = nil
|
46
|
+
return skip_resource 'Seems like PostgreSQL is not installed on your system'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_s
|
51
|
+
'PostgreSQL'
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def verify_dirs
|
57
|
+
warn "Default postgresql configuration directory: #{@conf_dir} does not exist. " \
|
58
|
+
"Postgresql may not be installed or we've misidentified the configuration " \
|
59
|
+
'directory.' unless inspec.directory(@conf_dir).exist?
|
60
|
+
|
61
|
+
warn "Default postgresql data directory: #{@data_dir} does not exist. " \
|
62
|
+
"Postgresql may not be installed or we've misidentified the data " \
|
63
|
+
'directory.' unless inspec.directory(@data_dir).exist?
|
64
|
+
end
|
65
|
+
|
66
|
+
def version_from_psql
|
67
|
+
return unless inspec.command('psql').exist?
|
68
|
+
inspec.command("psql --version | awk '{ print $NF }' | awk -F. '{ print $1\".\"$2 }'").stdout.strip
|
69
|
+
end
|
70
|
+
|
71
|
+
def locate_data_dir_location_by_version(ver = @version)
|
72
|
+
data_dir_loc = nil
|
73
|
+
dir_list = [
|
74
|
+
"/var/lib/pgsql/#{ver}/data",
|
75
|
+
'/var/lib/pgsql/data',
|
76
|
+
'/var/lib/postgres/data',
|
77
|
+
'/var/lib/postgresql/data',
|
78
|
+
]
|
79
|
+
|
80
|
+
dir_list.each do |dir|
|
81
|
+
data_dir_loc = dir if inspec.directory(dir).exist?
|
82
|
+
break
|
83
|
+
end
|
84
|
+
|
85
|
+
if data_dir_loc.nil?
|
86
|
+
warn 'Unable to find the PostgreSQL data_dir in expected location(s), please
|
87
|
+
execute "psql -t -A -p <port> -h <host> -c "show hba_file";" as the PostgreSQL
|
88
|
+
DBA to find the non-standard data_dir location.'
|
89
|
+
end
|
90
|
+
data_dir_loc
|
91
|
+
end
|
92
|
+
|
93
|
+
def version_from_dir(dir)
|
94
|
+
dirs = inspec.command("ls -d #{dir}/*/").stdout
|
95
|
+
entries = dirs.lines.count
|
96
|
+
case entries
|
97
|
+
when 0
|
98
|
+
warn "Could not determine version of installed postgresql by inspecting #{dir}"
|
99
|
+
nil
|
100
|
+
when 1
|
101
|
+
warn "Using #{dirs}: #{dir_to_version(dirs)}"
|
102
|
+
dir_to_version(dirs)
|
103
|
+
else
|
104
|
+
warn "Multiple versions of postgresql installed or incorrect base dir #{dir}"
|
105
|
+
first = dir_to_version(dirs.lines.first)
|
106
|
+
warn "Using the first version found: #{first}"
|
107
|
+
first
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def dir_to_version(dir)
|
112
|
+
dir.chomp.split('/').last
|
113
|
+
end
|
114
|
+
|
115
|
+
def cluster_from_dir(dir)
|
116
|
+
# Main is the default cluster name on debian use it if it
|
117
|
+
# exists.
|
118
|
+
if inspec.directory("#{dir}/main").exist?
|
119
|
+
'main'
|
120
|
+
else
|
121
|
+
dirs = inspec.command("ls -d #{dir}/*/").stdout.lines
|
122
|
+
first = dirs.first.chomp.split('/').last
|
123
|
+
if dirs.count > 1
|
124
|
+
warn "Multiple postgresql clusters configured or incorrect base dir #{dir}"
|
125
|
+
warn "Using the first directory found: #{first}"
|
126
|
+
end
|
127
|
+
first
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2015, Vulcano Security GmbH
|
3
|
+
|
4
|
+
require 'utils/simpleconfig'
|
5
|
+
require 'utils/find_files'
|
6
|
+
require 'utils/file_reader'
|
7
|
+
require 'resources/postgres'
|
8
|
+
|
9
|
+
module Inspec::Resources
|
10
|
+
class PostgresConf < Inspec.resource(1)
|
11
|
+
name 'postgres_conf'
|
12
|
+
supports platform: 'unix'
|
13
|
+
supports platform: 'windows'
|
14
|
+
desc 'Use the postgres_conf InSpec audit resource to test the contents of the configuration file for PostgreSQL, typically located at /etc/postgresql/<version>/main/postgresql.conf or /var/lib/postgres/data/postgresql.conf, depending on the platform.'
|
15
|
+
example "
|
16
|
+
describe postgres_conf do
|
17
|
+
its('max_connections') { should eq '5' }
|
18
|
+
end
|
19
|
+
"
|
20
|
+
|
21
|
+
include FindFiles
|
22
|
+
include FileReader
|
23
|
+
include ObjectTraverser
|
24
|
+
|
25
|
+
def initialize(conf_path = nil)
|
26
|
+
@conf_path = conf_path || inspec.postgres.conf_path
|
27
|
+
if @conf_path.nil?
|
28
|
+
return skip_resource 'PostgreSQL conf path is not set'
|
29
|
+
end
|
30
|
+
@conf_dir = File.expand_path(File.dirname(@conf_path))
|
31
|
+
@files_contents = {}
|
32
|
+
@content = nil
|
33
|
+
@params = nil
|
34
|
+
read_content
|
35
|
+
end
|
36
|
+
|
37
|
+
def content
|
38
|
+
@content ||= read_content
|
39
|
+
end
|
40
|
+
|
41
|
+
def params(*opts)
|
42
|
+
@params || read_content
|
43
|
+
res = @params
|
44
|
+
opts.each do |opt|
|
45
|
+
res = res[opt] unless res.nil?
|
46
|
+
end
|
47
|
+
res
|
48
|
+
end
|
49
|
+
|
50
|
+
def value(key)
|
51
|
+
extract_value(key, @params)
|
52
|
+
end
|
53
|
+
|
54
|
+
def method_missing(*keys)
|
55
|
+
keys.shift if keys.is_a?(Array) && keys[0] == :[]
|
56
|
+
param = value(keys)
|
57
|
+
return nil if param.nil?
|
58
|
+
# extract first value if we have only one value in array
|
59
|
+
return param[0] if param.length == 1
|
60
|
+
param
|
61
|
+
end
|
62
|
+
|
63
|
+
def to_s
|
64
|
+
'PostgreSQL Configuration'
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def read_content
|
70
|
+
@content = ''
|
71
|
+
@params = {}
|
72
|
+
|
73
|
+
to_read = [@conf_path]
|
74
|
+
until to_read.empty?
|
75
|
+
base_dir = File.dirname(to_read[0])
|
76
|
+
raw_conf = read_file(to_read[0])
|
77
|
+
@content += raw_conf
|
78
|
+
|
79
|
+
opts = {
|
80
|
+
assignment_regex: /^\s*([^=]*?)\s*=\s*[']?\s*(.*?)\s*[']?\s*$/,
|
81
|
+
}
|
82
|
+
params = SimpleConfig.new(raw_conf, opts).params
|
83
|
+
@params.merge!(params)
|
84
|
+
|
85
|
+
to_read = to_read.drop(1)
|
86
|
+
# see if there is more config files to include
|
87
|
+
|
88
|
+
to_read += include_files(params, base_dir).find_all do |fp|
|
89
|
+
not @files_contents.key? fp
|
90
|
+
end
|
91
|
+
end
|
92
|
+
@content
|
93
|
+
end
|
94
|
+
|
95
|
+
def include_files(params, base_dir)
|
96
|
+
include_files = Array(params['include']) || []
|
97
|
+
include_files += Array(params['include_if_exists']) || []
|
98
|
+
include_files.map! do |f|
|
99
|
+
Pathname.new(f).absolute? ? f : File.join(base_dir, f)
|
100
|
+
end
|
101
|
+
|
102
|
+
dirs = Array(params['include_dir']) || []
|
103
|
+
dirs.each do |dir|
|
104
|
+
dir = File.join(base_dir, dir) if dir[0] != '/'
|
105
|
+
include_files += find_files(dir, depth: 1, type: 'file')
|
106
|
+
end
|
107
|
+
include_files
|
108
|
+
end
|
109
|
+
|
110
|
+
def read_file(path)
|
111
|
+
@files_contents[path] ||= read_file_content(path)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'resources/postgres'
|
4
|
+
require 'utils/file_reader'
|
5
|
+
|
6
|
+
module Inspec::Resources
|
7
|
+
class PostgresHbaConf < Inspec.resource(1)
|
8
|
+
name 'postgres_hba_conf'
|
9
|
+
supports platform: 'unix'
|
10
|
+
desc 'Use the `postgres_hba_conf` InSpec audit resource to test the client
|
11
|
+
authentication data defined in the pg_hba.conf file.'
|
12
|
+
example "
|
13
|
+
describe postgres_hba_conf.where { type == 'local' } do
|
14
|
+
its('auth_method') { should eq ['peer'] }
|
15
|
+
end
|
16
|
+
"
|
17
|
+
|
18
|
+
include FileReader
|
19
|
+
|
20
|
+
attr_reader :conf_file, :params
|
21
|
+
|
22
|
+
# @todo add checks to ensure that we have data in our file
|
23
|
+
def initialize(hba_conf_path = nil)
|
24
|
+
@conf_file = hba_conf_path || File.expand_path('pg_hba.conf', inspec.postgres.conf_dir)
|
25
|
+
@content = ''
|
26
|
+
@params = {}
|
27
|
+
read_content
|
28
|
+
end
|
29
|
+
|
30
|
+
filter = FilterTable.create
|
31
|
+
filter.add_accessor(:where)
|
32
|
+
.add_accessor(:entries)
|
33
|
+
.add(:type, field: 'type')
|
34
|
+
.add(:database, field: 'database')
|
35
|
+
.add(:user, field: 'user')
|
36
|
+
.add(:address, field: 'address')
|
37
|
+
.add(:auth_method, field: 'auth_method')
|
38
|
+
.add(:auth_params, field: 'auth_params')
|
39
|
+
|
40
|
+
filter.connect(self, :params)
|
41
|
+
|
42
|
+
def to_s
|
43
|
+
"Postgres Hba Config #{@conf_file}"
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def clean_conf_file(conf_file = @conf_file)
|
49
|
+
data = read_file_content(conf_file).to_s.lines
|
50
|
+
content = []
|
51
|
+
data.each do |line|
|
52
|
+
line.chomp!
|
53
|
+
content << line unless line.match(/^\s*#/) || line.empty?
|
54
|
+
end
|
55
|
+
content
|
56
|
+
end
|
57
|
+
|
58
|
+
def read_content(config_file = @conf_file)
|
59
|
+
# @todo use SimpleConfig here if we can
|
60
|
+
# ^\s*(\S+)\s+(\S+)\s+(\S+)\s(?:(\d*.\d*.\d*.\d*\/\d*)|(::\/\d+))\s+(\S+)\s*(.*)?\s*$
|
61
|
+
|
62
|
+
@content = clean_conf_file(config_file)
|
63
|
+
@params = parse_conf(@content)
|
64
|
+
@params.each do |line|
|
65
|
+
if line['type'] == 'local'
|
66
|
+
line['auth_method'] = line['address']
|
67
|
+
line['address'] = ''
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def parse_conf(content)
|
73
|
+
content.map do |line|
|
74
|
+
parse_line(line)
|
75
|
+
end.compact
|
76
|
+
end
|
77
|
+
|
78
|
+
def parse_line(line)
|
79
|
+
x = line.split(/\s+/)
|
80
|
+
{
|
81
|
+
'type' => x[0],
|
82
|
+
'database' => x[1],
|
83
|
+
'user' => x[2],
|
84
|
+
'address' => x[3],
|
85
|
+
'auth_method' => x[4],
|
86
|
+
'auth_params' => ('' if x.length == 4) || x[5..-1].join(' '),
|
87
|
+
}
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'utils/file_reader'
|
4
|
+
require 'resources/postgres'
|
5
|
+
|
6
|
+
module Inspec::Resources
|
7
|
+
class PostgresIdentConf < Inspec.resource(1)
|
8
|
+
name 'postgres_ident_conf'
|
9
|
+
supports platform: 'unix'
|
10
|
+
desc 'Use the postgres_ident_conf InSpec audit resource to test the client
|
11
|
+
authentication data is controlled by a pg_ident.conf file.'
|
12
|
+
example "
|
13
|
+
describe postgres_ident_conf.where { pg_username == 'acme_user' } do
|
14
|
+
its('map_name') { should eq ['ssl-test'] }
|
15
|
+
end
|
16
|
+
"
|
17
|
+
|
18
|
+
include FileReader
|
19
|
+
|
20
|
+
attr_reader :params, :conf_file
|
21
|
+
|
22
|
+
def initialize(ident_conf_path = nil)
|
23
|
+
@conf_file = ident_conf_path || File.expand_path('pg_ident.conf', inspec.postgres.conf_dir)
|
24
|
+
@content = nil
|
25
|
+
@params = nil
|
26
|
+
read_content
|
27
|
+
end
|
28
|
+
|
29
|
+
filter = FilterTable.create
|
30
|
+
filter.add_accessor(:where)
|
31
|
+
.add_accessor(:entries)
|
32
|
+
.add(:map_name, field: 'map_name')
|
33
|
+
.add(:system_username, field: 'system_username')
|
34
|
+
.add(:pg_username, field: 'pg_username')
|
35
|
+
|
36
|
+
filter.connect(self, :params)
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
"PostgreSQL Ident Config #{@conf_file}"
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def filter_comments(data)
|
45
|
+
content = []
|
46
|
+
data.each do |line|
|
47
|
+
line.chomp!
|
48
|
+
content << line unless line.match(/^\s*#/) || line.empty?
|
49
|
+
end
|
50
|
+
content
|
51
|
+
end
|
52
|
+
|
53
|
+
def read_content
|
54
|
+
@content = ''
|
55
|
+
@params = {}
|
56
|
+
@content = filter_comments(read_file(@conf_file))
|
57
|
+
@params = parse_conf(@content)
|
58
|
+
end
|
59
|
+
|
60
|
+
def parse_conf(content)
|
61
|
+
content.map do |line|
|
62
|
+
parse_line(line)
|
63
|
+
end.compact
|
64
|
+
end
|
65
|
+
|
66
|
+
def parse_line(line)
|
67
|
+
x = line.split(/\s+/)
|
68
|
+
{
|
69
|
+
'map_name' => x[0],
|
70
|
+
'system_username' => x[1],
|
71
|
+
'pg_username' => x[2],
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
def read_file(conf_file = @conf_file)
|
76
|
+
read_file_content(conf_file, allow_empty: true).lines
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2015, Vulcano Security GmbH
|
3
|
+
|
4
|
+
require 'shellwords'
|
5
|
+
|
6
|
+
module Inspec::Resources
|
7
|
+
class Lines
|
8
|
+
attr_reader :output
|
9
|
+
|
10
|
+
def initialize(raw, desc)
|
11
|
+
@output = raw
|
12
|
+
@desc = desc
|
13
|
+
end
|
14
|
+
|
15
|
+
def lines
|
16
|
+
output.split("\n")
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
@desc
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class PostgresSession < Inspec.resource(1)
|
25
|
+
name 'postgres_session'
|
26
|
+
supports platform: 'unix'
|
27
|
+
supports platform: 'windows'
|
28
|
+
desc 'Use the postgres_session InSpec audit resource to test SQL commands run against a PostgreSQL database.'
|
29
|
+
example "
|
30
|
+
sql = postgres_session('username', 'password', 'host')
|
31
|
+
query('sql_query', ['database_name'])` contains the query and (optional) database to execute
|
32
|
+
|
33
|
+
# default values:
|
34
|
+
# username: 'postgres'
|
35
|
+
# host: 'localhost'
|
36
|
+
# db: databse == db_user running the sql query
|
37
|
+
|
38
|
+
describe sql.query('SELECT * FROM pg_shadow WHERE passwd IS NULL;') do
|
39
|
+
its('output') { should eq '' }
|
40
|
+
end
|
41
|
+
"
|
42
|
+
|
43
|
+
def initialize(user, pass, host = nil)
|
44
|
+
@user = user || 'postgres'
|
45
|
+
@pass = pass
|
46
|
+
@host = host || 'localhost'
|
47
|
+
end
|
48
|
+
|
49
|
+
def query(query, db = [])
|
50
|
+
psql_cmd = create_psql_cmd(query, db)
|
51
|
+
cmd = inspec.command(psql_cmd)
|
52
|
+
out = cmd.stdout + "\n" + cmd.stderr
|
53
|
+
if cmd.exit_status != 0 || out =~ /could not connect to .*/ || out.downcase =~ /^error:.*/
|
54
|
+
Lines.new(out, "PostgreSQL query with errors: #{query}")
|
55
|
+
else
|
56
|
+
Lines.new(cmd.stdout.strip, "PostgreSQL query: #{query}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def escaped_query(query)
|
63
|
+
Shellwords.escape(query)
|
64
|
+
end
|
65
|
+
|
66
|
+
def create_psql_cmd(query, db = [])
|
67
|
+
dbs = db.map { |x| "-d #{x}" }.join(' ')
|
68
|
+
"PGPASSWORD='#{@pass}' psql -U #{@user} #{dbs} -h #{@host} -A -t -c #{escaped_query(query)}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|