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,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Christoph Hartmann
|
3
|
+
# author: Dominik Richter
|
4
|
+
|
5
|
+
libdir = File.dirname(__FILE__)
|
6
|
+
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
7
|
+
|
8
|
+
module Compliance
|
9
|
+
autoload :Configuration, 'inspec-compliance/configuration'
|
10
|
+
autoload :HTTP, 'inspec-compliance/http'
|
11
|
+
autoload :Support, 'inspec-compliance/support'
|
12
|
+
autoload :API, 'inspec-compliance/api'
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'inspec-compliance/cli'
|
16
|
+
require 'inspec-compliance/target'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
driver:
|
3
|
+
name: vagrant
|
4
|
+
synced_folders:
|
5
|
+
- ['../../../', '/inspec']
|
6
|
+
network:
|
7
|
+
- ['private_network', {ip: '192.168.251.2'}]
|
8
|
+
|
9
|
+
provisioner:
|
10
|
+
name: shell
|
11
|
+
|
12
|
+
verifier:
|
13
|
+
name: inspec
|
14
|
+
|
15
|
+
platforms:
|
16
|
+
- name: ubuntu-14.04
|
17
|
+
suites:
|
18
|
+
- name: default
|
19
|
+
run_list:
|
20
|
+
attributes:
|
@@ -0,0 +1,193 @@
|
|
1
|
+
# InSpec Extension for Chef Compliance
|
2
|
+
|
3
|
+
This extensions offers the following features:
|
4
|
+
|
5
|
+
- list available profiles in Chef Automate/Chef Compliance
|
6
|
+
- execute profiles directly from Chef Automate/Chef Compliance locally
|
7
|
+
- upload a local profile to Chef Automate/Chef Compliance
|
8
|
+
|
9
|
+
To use the CLI, this InSpec add-on adds the following commands:
|
10
|
+
|
11
|
+
* `$ inspec compliance login` - authentication of the API token against Chef Automate/Chef Compliance
|
12
|
+
* `$ inspec compliance profiles` - list all available Compliance profiles
|
13
|
+
* `$ inspec exec compliance://profile` - runs a Compliance profile
|
14
|
+
* `$ inspec compliance upload path/to/local/profile` - uploads a local profile to Chef Automate/Chef Compliance
|
15
|
+
* `$ inspec compliance logout` - logout of Chef Automate/Chef Compliance
|
16
|
+
|
17
|
+
Compliance profiles can be executed in two ways:
|
18
|
+
|
19
|
+
- via compliance exec: `inspec compliance exec profile`
|
20
|
+
- via compliance scheme: `inspec exec compliance://profile`
|
21
|
+
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
### Command options
|
26
|
+
|
27
|
+
```
|
28
|
+
$ inspec compliance
|
29
|
+
Commands:
|
30
|
+
inspec compliance download PROFILE # downloads a profile from Chef Compliance
|
31
|
+
inspec compliance exec PROFILE # executes a Chef Compliance profile
|
32
|
+
inspec compliance help [COMMAND] # Describe subcommands or one specific subcommand
|
33
|
+
inspec compliance login SERVER # Log in to a Chef Automate/Chef Compliance SERVER
|
34
|
+
inspec compliance logout # user logout from Chef Compliance
|
35
|
+
inspec compliance profiles # list all available profiles in Chef Compliance
|
36
|
+
inspec compliance upload PATH # uploads a local profile to Chef Compliance
|
37
|
+
inspec compliance version # displays the version of the Chef Compliance server
|
38
|
+
```
|
39
|
+
|
40
|
+
### Login with Chef Automate2
|
41
|
+
|
42
|
+
You will need an API token for authentication. You can retrieve one via the admin section of your A2 web gui.
|
43
|
+
|
44
|
+
```
|
45
|
+
$ inspec compliance login https://automate2.compliance.test --insecure --user 'admin' --token 'zuop..._KzE'
|
46
|
+
```
|
47
|
+
|
48
|
+
### Login with Chef Automate
|
49
|
+
|
50
|
+
You will need an access token for authentication. You can retrieve one via [UI](https://docs.chef.io/api_delivery.html) or [CLI](https://docs.chef.io/ctl_delivery.html#delivery-token).
|
51
|
+
|
52
|
+
```
|
53
|
+
$ inspec compliance login https://automate.compliance.test --insecure --user 'admin' --ent 'brewinc' --token 'zuop..._KzE'
|
54
|
+
```
|
55
|
+
|
56
|
+
### Login with Chef Compliance
|
57
|
+
|
58
|
+
You will need an access token for authentication. You can retrieve one via:
|
59
|
+
|
60
|
+

|
61
|
+
|
62
|
+
You can choose the access token (`--token`) or the refresh token (`--refresh_token`)
|
63
|
+
|
64
|
+
```
|
65
|
+
$ inspec compliance login https://compliance.test --user admin --insecure --token '...'
|
66
|
+
```
|
67
|
+
|
68
|
+
### List available profiles via Chef Compliance / Automate
|
69
|
+
|
70
|
+
```
|
71
|
+
$ inspec compliance profiles
|
72
|
+
Available profiles:
|
73
|
+
-------------------
|
74
|
+
* base/apache
|
75
|
+
* base/linux
|
76
|
+
* base/mysql
|
77
|
+
* base/postgres
|
78
|
+
* base/ssh
|
79
|
+
* base/windows
|
80
|
+
* cis/cis-centos6-level1
|
81
|
+
* cis/cis-centos6-level2
|
82
|
+
* cis/cis-centos7-level1
|
83
|
+
* cis/cis-centos7-level2
|
84
|
+
* cis/cis-rhel7-level1
|
85
|
+
* cis/cis-rhel7-level2
|
86
|
+
* cis/cis-ubuntu12.04lts-level1
|
87
|
+
* cis/cis-ubuntu12.04lts-level2
|
88
|
+
* cis/cis-ubuntu14.04lts-level1
|
89
|
+
* cis/cis-ubuntu14.04lts-level2
|
90
|
+
```
|
91
|
+
|
92
|
+
### Upload a profile to Chef Compliance / Automate
|
93
|
+
|
94
|
+
```
|
95
|
+
$ inspec compliance version
|
96
|
+
Chef Compliance version: 1.0.11
|
97
|
+
➜ inspec git:(chris-rock/cc-error-not-loggedin) ✗ b inspec compliance upload examples/profile
|
98
|
+
I, [2016-05-06T14:27:20.907547 #37592] INFO -- : Checking profile in examples/profile
|
99
|
+
I, [2016-05-06T14:27:20.907668 #37592] INFO -- : Metadata OK.
|
100
|
+
I, [2016-05-06T14:27:20.968584 #37592] INFO -- : Found 4 controls.
|
101
|
+
I, [2016-05-06T14:27:20.968638 #37592] INFO -- : Control definitions OK.
|
102
|
+
Profile is valid
|
103
|
+
Generate temporary profile archive at /var/folders/jy/2bnrfb4s36jbjtzllvhhyqhw0000gn/T/profile20160506-37592-1tf326f.tar.gz
|
104
|
+
I, [2016-05-06T14:27:21.020017 #37592] INFO -- : Generate archive /var/folders/jy/2bnrfb4s36jbjtzllvhhyqhw0000gn/T/profile20160506-37592-1tf326f.tar.gz.
|
105
|
+
I, [2016-05-06T14:27:21.024837 #37592] INFO -- : Finished archive generation.
|
106
|
+
Start upload to admin/profile
|
107
|
+
Uploading to Chef Compliance
|
108
|
+
Successfully uploaded profile
|
109
|
+
|
110
|
+
# display all profiles
|
111
|
+
$ inspec compliance profiles
|
112
|
+
Available profiles:
|
113
|
+
-------------------
|
114
|
+
* admin/profile
|
115
|
+
* base/apache
|
116
|
+
* base/linux
|
117
|
+
* base/mysql
|
118
|
+
* base/postgres
|
119
|
+
* base/ssh
|
120
|
+
* base/windows
|
121
|
+
* cis/cis-centos6-level1
|
122
|
+
* cis/cis-centos6-level2
|
123
|
+
* cis/cis-centos7-level1
|
124
|
+
* cis/cis-centos7-level2
|
125
|
+
* cis/cis-rhel7-level1
|
126
|
+
* cis/cis-rhel7-level2
|
127
|
+
* cis/cis-ubuntu12.04lts-level1
|
128
|
+
* cis/cis-ubuntu12.04lts-level2
|
129
|
+
* cis/cis-ubuntu14.04lts-level1
|
130
|
+
* cis/cis-ubuntu14.04lts-level2
|
131
|
+
```
|
132
|
+
|
133
|
+
### Run a profile from Chef Compliance / Chef Automate on Workstation
|
134
|
+
|
135
|
+
```
|
136
|
+
$ inspec exec compliance://admin/profile
|
137
|
+
.*...
|
138
|
+
|
139
|
+
Pending: (Failures listed here are expected and do not affect your suite's status)
|
140
|
+
|
141
|
+
1) gordon_config Can't find file "/tmp/gordon/config.yaml"
|
142
|
+
# Not yet implemented
|
143
|
+
# ./lib/inspec/runner.rb:157
|
144
|
+
|
145
|
+
|
146
|
+
Finished in 0.02862 seconds (files took 0.62628 seconds to load)
|
147
|
+
5 examples, 0 failures, 1 pending
|
148
|
+
```
|
149
|
+
|
150
|
+
Exec a specific version(2.0.1) of a profile when logged in with Automate:
|
151
|
+
|
152
|
+
```
|
153
|
+
$ inspec exec compliance://admin/apache-baseline#2.0.1
|
154
|
+
```
|
155
|
+
|
156
|
+
Download a specific version(2.0.2) of a profile when logged in with Automate:
|
157
|
+
```
|
158
|
+
$ inspec compliance download compliance://admin/apache-baseline#2.0.2
|
159
|
+
```
|
160
|
+
|
161
|
+
### To Logout from Chef Compliance
|
162
|
+
|
163
|
+
```
|
164
|
+
$ inspec compliance logout
|
165
|
+
Successfully logged out
|
166
|
+
```
|
167
|
+
|
168
|
+
## Integration Tests
|
169
|
+
|
170
|
+
At this point of time, InSpec is not able to pick up the token directly, therefore the integration test is semi-automatic at this point of time:
|
171
|
+
|
172
|
+
* run `kitchen converge`
|
173
|
+
* open https://192.168.251.2 and log in with user `admin` and password `admin`
|
174
|
+
* click on user->about and obtain the access token and the refresh token
|
175
|
+
* run `kitchen verify` with the required env variables:
|
176
|
+
|
177
|
+
```
|
178
|
+
# both token need to be set, since the test suite runs for each token type
|
179
|
+
export COMPLIANCE_ACCESSTOKEN='mycompliancetoken'
|
180
|
+
export COMPLIANCE_REFRESHTOKEN='myrefreshtoken'
|
181
|
+
kitchen verify
|
182
|
+
-----> Starting Kitchen (v1.7.3)
|
183
|
+
-----> Verifying <default-ubuntu-1404>...
|
184
|
+
Search `/Users/chartmann/Development/compliance/inspec/lib/bundles/inspec-compliance/test/integration/default` for tests
|
185
|
+
..................................
|
186
|
+
|
187
|
+
Finished in 6.35 seconds (files took 0.40949 seconds to load)
|
188
|
+
34 examples, 0 failures
|
189
|
+
|
190
|
+
Finished verifying <default-ubuntu-1404> (0m6.62s).
|
191
|
+
-----> Kitchen is finished. (0m7.02s)
|
192
|
+
zlib(finalizer): the stream was freed prematurely.
|
193
|
+
```
|
@@ -0,0 +1,360 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Christoph Hartmann
|
3
|
+
# author: Dominik Richter
|
4
|
+
|
5
|
+
require 'net/http'
|
6
|
+
require 'uri'
|
7
|
+
require 'json'
|
8
|
+
|
9
|
+
require_relative 'api/login'
|
10
|
+
|
11
|
+
module Compliance
|
12
|
+
class ServerConfigurationMissing < StandardError; end
|
13
|
+
|
14
|
+
# API Implementation does not hold any state by itself,
|
15
|
+
# everything will be stored in local Configuration store
|
16
|
+
class API
|
17
|
+
extend Compliance::API::Login
|
18
|
+
|
19
|
+
# return all compliance profiles available for the user
|
20
|
+
# the user is either specified in the options hash or by default
|
21
|
+
# the username of the account is used that is logged in
|
22
|
+
def self.profiles(config) # rubocop:disable PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/MethodLength
|
23
|
+
owner = config['owner'] || config['user']
|
24
|
+
|
25
|
+
# Chef Compliance
|
26
|
+
if is_compliance_server?(config)
|
27
|
+
url = "#{config['server']}/user/compliance"
|
28
|
+
# Chef Automate2
|
29
|
+
elsif is_automate2_server?(config)
|
30
|
+
url = "#{config['server']}/compliance/profiles/search"
|
31
|
+
# Chef Automate
|
32
|
+
elsif is_automate_server?(config)
|
33
|
+
url = "#{config['server']}/profiles/#{owner}"
|
34
|
+
else
|
35
|
+
raise ServerConfigurationMissing
|
36
|
+
end
|
37
|
+
|
38
|
+
headers = get_headers(config)
|
39
|
+
|
40
|
+
if is_automate2_server?(config)
|
41
|
+
body = { owner: owner }.to_json
|
42
|
+
response = Compliance::HTTP.post_with_headers(url, headers, body, config['insecure'])
|
43
|
+
else
|
44
|
+
response = Compliance::HTTP.get(url, headers, config['insecure'])
|
45
|
+
end
|
46
|
+
data = response.body
|
47
|
+
response_code = response.code
|
48
|
+
case response_code
|
49
|
+
when '200'
|
50
|
+
msg = 'success'
|
51
|
+
profiles = JSON.parse(data)
|
52
|
+
# iterate over profiles
|
53
|
+
if is_compliance_server?(config)
|
54
|
+
mapped_profiles = []
|
55
|
+
profiles.values.each { |org|
|
56
|
+
mapped_profiles += org.values
|
57
|
+
}
|
58
|
+
# Chef Automate pre 0.8.0
|
59
|
+
elsif is_automate_server_pre_080?(config)
|
60
|
+
mapped_profiles = profiles.values.flatten
|
61
|
+
elsif is_automate2_server?(config)
|
62
|
+
mapped_profiles = []
|
63
|
+
profiles['profiles'].each { |p|
|
64
|
+
mapped_profiles << p
|
65
|
+
}
|
66
|
+
else
|
67
|
+
mapped_profiles = profiles.map { |e|
|
68
|
+
e['owner_id'] = owner
|
69
|
+
e
|
70
|
+
}
|
71
|
+
end
|
72
|
+
return msg, mapped_profiles
|
73
|
+
when '401'
|
74
|
+
msg = '401 Unauthorized. Please check your token.'
|
75
|
+
return msg, []
|
76
|
+
else
|
77
|
+
msg = "An unexpected error occurred (HTTP #{response_code}): #{response.message}"
|
78
|
+
return msg, []
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# return the server api version
|
83
|
+
# NB this method does not use Compliance::Configuration to allow for using
|
84
|
+
# it before we know the version (e.g. oidc or not)
|
85
|
+
def self.version(config)
|
86
|
+
url = config['server']
|
87
|
+
insecure = config['insecure']
|
88
|
+
|
89
|
+
raise ServerConfigurationMissing if url.nil?
|
90
|
+
|
91
|
+
headers = get_headers(config)
|
92
|
+
response = Compliance::HTTP.get(url+'/version', headers, insecure)
|
93
|
+
return {} if response.code == '404'
|
94
|
+
|
95
|
+
data = response.body
|
96
|
+
return {} if data.nil? || data.empty?
|
97
|
+
|
98
|
+
parsed = JSON.parse(data)
|
99
|
+
return {} unless parsed.key?('version') && !parsed['version'].empty?
|
100
|
+
|
101
|
+
parsed
|
102
|
+
end
|
103
|
+
|
104
|
+
# verifies that a profile
|
105
|
+
def self.exist?(config, profile)
|
106
|
+
owner, id, ver = profile_split(profile)
|
107
|
+
|
108
|
+
# ensure that we do not manipulate the configuration object
|
109
|
+
user_config = config.dup
|
110
|
+
user_config['owner'] = owner
|
111
|
+
_msg, profiles = Compliance::API.profiles(user_config)
|
112
|
+
|
113
|
+
if !profiles.empty?
|
114
|
+
profiles.any? do |p|
|
115
|
+
profile_owner = p['owner_id'] || p['owner']
|
116
|
+
profile_owner == owner &&
|
117
|
+
p['name'] == id &&
|
118
|
+
(ver.nil? || p['version'] == ver)
|
119
|
+
end
|
120
|
+
else
|
121
|
+
false
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.upload(config, owner, profile_name, archive_path)
|
126
|
+
# Chef Compliance
|
127
|
+
if is_compliance_server?(config)
|
128
|
+
url = "#{config['server']}/owners/#{owner}/compliance/#{profile_name}/tar"
|
129
|
+
# Chef Automate pre 0.8.0
|
130
|
+
elsif is_automate_server_pre_080?(config)
|
131
|
+
url = "#{config['server']}/#{owner}"
|
132
|
+
elsif is_automate2_server?(config)
|
133
|
+
url = "#{config['server']}/compliance/profiles?owner=#{owner}"
|
134
|
+
# Chef Automate
|
135
|
+
else
|
136
|
+
url = "#{config['server']}/profiles/#{owner}"
|
137
|
+
end
|
138
|
+
|
139
|
+
headers = get_headers(config)
|
140
|
+
if is_automate2_server?(config)
|
141
|
+
res = Compliance::HTTP.post_multipart_file(url, headers, archive_path, config['insecure'])
|
142
|
+
else
|
143
|
+
res = Compliance::HTTP.post_file(url, headers, archive_path, config['insecure'])
|
144
|
+
end
|
145
|
+
|
146
|
+
[res.is_a?(Net::HTTPSuccess), res.body]
|
147
|
+
end
|
148
|
+
|
149
|
+
# Use username and refresh_token to get an API access token
|
150
|
+
def self.get_token_via_refresh_token(url, refresh_token, insecure)
|
151
|
+
uri = URI.parse("#{url}/login")
|
152
|
+
req = Net::HTTP::Post.new(uri.path)
|
153
|
+
req.body = { token: refresh_token }.to_json
|
154
|
+
access_token = nil
|
155
|
+
response = Compliance::HTTP.send_request(uri, req, insecure)
|
156
|
+
data = response.body
|
157
|
+
if response.code == '200'
|
158
|
+
begin
|
159
|
+
tokendata = JSON.parse(data)
|
160
|
+
access_token = tokendata['access_token']
|
161
|
+
msg = 'Successfully fetched API access token'
|
162
|
+
success = true
|
163
|
+
rescue JSON::ParserError => e
|
164
|
+
success = false
|
165
|
+
msg = e.message
|
166
|
+
end
|
167
|
+
else
|
168
|
+
success = false
|
169
|
+
msg = "Failed to authenticate to #{url} \n\
|
170
|
+
Response code: #{response.code}\n Body: #{response.body}"
|
171
|
+
end
|
172
|
+
|
173
|
+
[success, msg, access_token]
|
174
|
+
end
|
175
|
+
|
176
|
+
# Use username and password to get an API access token
|
177
|
+
def self.get_token_via_password(url, username, password, insecure)
|
178
|
+
uri = URI.parse("#{url}/login")
|
179
|
+
req = Net::HTTP::Post.new(uri.path)
|
180
|
+
req.body = { userid: username, password: password }.to_json
|
181
|
+
access_token = nil
|
182
|
+
response = Compliance::HTTP.send_request(uri, req, insecure)
|
183
|
+
data = response.body
|
184
|
+
if response.code == '200'
|
185
|
+
access_token = data
|
186
|
+
msg = 'Successfully fetched an API access token valid for 12 hours'
|
187
|
+
success = true
|
188
|
+
else
|
189
|
+
success = false
|
190
|
+
msg = "Failed to authenticate to #{url} \n\
|
191
|
+
Response code: #{response.code}\n Body: #{response.body}"
|
192
|
+
end
|
193
|
+
|
194
|
+
[success, msg, access_token]
|
195
|
+
end
|
196
|
+
|
197
|
+
def self.get_headers(config)
|
198
|
+
token = get_token(config)
|
199
|
+
if is_automate_server?(config) || is_automate2_server?(config)
|
200
|
+
headers = { 'chef-delivery-enterprise' => config['automate']['ent'] }
|
201
|
+
if config['automate']['token_type'] == 'dctoken'
|
202
|
+
headers['x-data-collector-token'] = token
|
203
|
+
else
|
204
|
+
headers['chef-delivery-user'] = config['user']
|
205
|
+
headers['chef-delivery-token'] = token
|
206
|
+
end
|
207
|
+
else
|
208
|
+
headers = { 'Authorization' => "Bearer #{token}" }
|
209
|
+
end
|
210
|
+
headers
|
211
|
+
end
|
212
|
+
|
213
|
+
def self.get_token(config)
|
214
|
+
return config['token'] unless config['refresh_token']
|
215
|
+
_success, _msg, token = get_token_via_refresh_token(config['server'], config['refresh_token'], config['insecure'])
|
216
|
+
token
|
217
|
+
end
|
218
|
+
|
219
|
+
def self.target_url(config, profile)
|
220
|
+
owner, id, ver = profile_split(profile)
|
221
|
+
|
222
|
+
return "#{config['server']}/compliance/profiles/tar" if is_automate2_server?(config)
|
223
|
+
return "#{config['server']}/owners/#{owner}/compliance/#{id}/tar" unless is_automate_server?(config)
|
224
|
+
|
225
|
+
if ver.nil?
|
226
|
+
"#{config['server']}/profiles/#{owner}/#{id}/tar"
|
227
|
+
else
|
228
|
+
"#{config['server']}/profiles/#{owner}/#{id}/version/#{ver}/tar"
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def self.profile_split(profile)
|
233
|
+
owner, id = profile.split('/')
|
234
|
+
id, version = id.split('#')
|
235
|
+
[owner, id, version]
|
236
|
+
end
|
237
|
+
|
238
|
+
# returns a parsed url for `admin/profile` or `compliance://admin/profile`
|
239
|
+
def self.sanitize_profile_name(profile)
|
240
|
+
if URI(profile).scheme == 'compliance'
|
241
|
+
uri = URI(profile)
|
242
|
+
else
|
243
|
+
uri = URI("compliance://#{profile}")
|
244
|
+
end
|
245
|
+
uri.to_s.sub(%r{^compliance:\/\/}, '')
|
246
|
+
end
|
247
|
+
|
248
|
+
def self.is_compliance_server?(config)
|
249
|
+
config['server_type'] == 'compliance'
|
250
|
+
end
|
251
|
+
|
252
|
+
def self.is_automate_server_pre_080?(config)
|
253
|
+
# Automate versions before 0.8.x do not have a valid version in the config
|
254
|
+
return false unless config['server_type'] == 'automate'
|
255
|
+
server_version_from_config(config).nil?
|
256
|
+
end
|
257
|
+
|
258
|
+
def self.is_automate_server_080_and_later?(config)
|
259
|
+
# Automate versions 0.8.x and later will have a "version" key in the config
|
260
|
+
# that is properly parsed out via server_version_from_config below
|
261
|
+
return false unless config['server_type'] == 'automate'
|
262
|
+
!server_version_from_config(config).nil?
|
263
|
+
end
|
264
|
+
|
265
|
+
def self.is_automate2_server?(config)
|
266
|
+
config['server_type'] == 'automate2'
|
267
|
+
end
|
268
|
+
|
269
|
+
def self.is_automate_server?(config)
|
270
|
+
config['server_type'] == 'automate'
|
271
|
+
end
|
272
|
+
|
273
|
+
def self.server_version_from_config(config)
|
274
|
+
# Automate versions 0.8.x and later will have a "version" key in the config
|
275
|
+
# that looks like: "version":{"api":"compliance","version":"0.8.24"}
|
276
|
+
return nil unless config.key?('version')
|
277
|
+
return nil unless config['version'].is_a?(Hash)
|
278
|
+
config['version']['version']
|
279
|
+
end
|
280
|
+
|
281
|
+
def self.determine_server_type(url, insecure)
|
282
|
+
if target_is_automate2_server?(url, insecure)
|
283
|
+
:automate2
|
284
|
+
elsif target_is_automate_server?(url, insecure)
|
285
|
+
:automate
|
286
|
+
elsif target_is_compliance_server?(url, insecure)
|
287
|
+
:compliance
|
288
|
+
else
|
289
|
+
Inspec::Log.debug('Could not determine server type using known endpoints')
|
290
|
+
nil
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
def self.target_is_automate2_server?(url, insecure)
|
295
|
+
automate_endpoint = '/dex/auth'
|
296
|
+
response = Compliance::HTTP.get(url + automate_endpoint, nil, insecure)
|
297
|
+
if response.code == '400'
|
298
|
+
Inspec::Log.debug(
|
299
|
+
"Received 400 from #{url}#{automate_endpoint} - " \
|
300
|
+
'assuming target is a Chef Automate2 instance',
|
301
|
+
)
|
302
|
+
true
|
303
|
+
else
|
304
|
+
false
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
def self.target_is_automate_server?(url, insecure)
|
309
|
+
automate_endpoint = '/compliance/version'
|
310
|
+
response = Compliance::HTTP.get(url + automate_endpoint, nil, insecure)
|
311
|
+
case response.code
|
312
|
+
when '401'
|
313
|
+
Inspec::Log.debug(
|
314
|
+
"Received 401 from #{url}#{automate_endpoint} - " \
|
315
|
+
'assuming target is a Chef Automate instance',
|
316
|
+
)
|
317
|
+
true
|
318
|
+
when '200'
|
319
|
+
# Chef Automate currently returns 401 for `/compliance/version` but some
|
320
|
+
# versions of OpsWorks Chef Automate return 200 and a Chef Manage page
|
321
|
+
# when unauthenticated requests are received.
|
322
|
+
if response.body.include?('Are You Looking For the Chef Server?')
|
323
|
+
Inspec::Log.debug(
|
324
|
+
"Received 200 from #{url}#{automate_endpoint} - " \
|
325
|
+
'assuming target is an OpsWorks Chef Automate instance',
|
326
|
+
)
|
327
|
+
true
|
328
|
+
else
|
329
|
+
Inspec::Log.debug(
|
330
|
+
"Received 200 from #{url}#{automate_endpoint} " \
|
331
|
+
'but did not receive the Chef Manage page - ' \
|
332
|
+
'assuming target is not a Chef Automate instance',
|
333
|
+
)
|
334
|
+
false
|
335
|
+
end
|
336
|
+
else
|
337
|
+
Inspec::Log.debug(
|
338
|
+
"Received unexpected status code #{response.code} " \
|
339
|
+
"from #{url}#{automate_endpoint} - " \
|
340
|
+
'assuming target is not a Chef Automate instance',
|
341
|
+
)
|
342
|
+
false
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
def self.target_is_compliance_server?(url, insecure)
|
347
|
+
# All versions of Chef Compliance return 200 for `/api/version`
|
348
|
+
compliance_endpoint = '/api/version'
|
349
|
+
|
350
|
+
response = Compliance::HTTP.get(url + compliance_endpoint, nil, insecure)
|
351
|
+
return false unless response.code == '200'
|
352
|
+
|
353
|
+
Inspec::Log.debug(
|
354
|
+
"Received 200 from #{url}#{compliance_endpoint} - " \
|
355
|
+
'assuming target is a Compliance server',
|
356
|
+
)
|
357
|
+
true
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|