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,103 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Christoph Hartmann
|
3
|
+
# author: Dominik Richter
|
4
|
+
|
5
|
+
module Compliance
|
6
|
+
# stores configuration on local filesystem
|
7
|
+
class Configuration
|
8
|
+
def initialize
|
9
|
+
@config_path = File.join(Dir.home, '.inspec', 'compliance')
|
10
|
+
# ensure the directory is available
|
11
|
+
unless File.directory?(@config_path)
|
12
|
+
FileUtils.mkdir_p(@config_path)
|
13
|
+
end
|
14
|
+
# set config file path
|
15
|
+
@config_file = File.join(@config_path, '/config.json')
|
16
|
+
@config = {}
|
17
|
+
|
18
|
+
# load the data
|
19
|
+
get
|
20
|
+
end
|
21
|
+
|
22
|
+
# direct access to config
|
23
|
+
def [](key)
|
24
|
+
@config[key]
|
25
|
+
end
|
26
|
+
|
27
|
+
def []=(key, value)
|
28
|
+
@config[key] = value
|
29
|
+
end
|
30
|
+
|
31
|
+
def key?(key)
|
32
|
+
@config.key?(key)
|
33
|
+
end
|
34
|
+
|
35
|
+
def clean
|
36
|
+
@config = {}
|
37
|
+
end
|
38
|
+
|
39
|
+
# return the json data
|
40
|
+
def get
|
41
|
+
if File.exist?(@config_file)
|
42
|
+
file = File.read(@config_file)
|
43
|
+
@config = JSON.parse(file)
|
44
|
+
end
|
45
|
+
@config
|
46
|
+
end
|
47
|
+
|
48
|
+
# stores a hash to json
|
49
|
+
def store
|
50
|
+
File.open(@config_file, 'w') do |f|
|
51
|
+
f.chmod(0600)
|
52
|
+
f.write(@config.to_json)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# deletes data
|
57
|
+
def destroy
|
58
|
+
if File.exist?(@config_file)
|
59
|
+
File.delete(@config_file)
|
60
|
+
else
|
61
|
+
true
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# return if the (stored) api version does not support a certain feature
|
66
|
+
def supported?(feature)
|
67
|
+
sup = version_with_support(feature)
|
68
|
+
|
69
|
+
# we do not know the version, therefore we do not know if its possible to use the feature
|
70
|
+
return if self['version'].nil? || self['version']['version'].nil?
|
71
|
+
|
72
|
+
if sup.is_a?(Array)
|
73
|
+
Gem::Version.new(self['version']['version']) >= sup[0] &&
|
74
|
+
Gem::Version.new(self['version']['version']) < sup[1]
|
75
|
+
else
|
76
|
+
Gem::Version.new(self['version']['version']) >= sup
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# exit 1 if the version of compliance that we're working with doesn't support odic
|
81
|
+
def legacy_check!(feature)
|
82
|
+
return if supported?(feature)
|
83
|
+
|
84
|
+
puts "This feature (#{feature}) is not available for legacy installations."
|
85
|
+
puts 'Please upgrade to a recent version of Chef Compliance.'
|
86
|
+
exit 1
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
# for a feature, returns either:
|
92
|
+
# - a version v0: v supports v0 iff v0 <= v
|
93
|
+
# - an array [v0, v1] of two versions: v supports [v0, v1] iff v0 <= v < v1
|
94
|
+
def version_with_support(feature)
|
95
|
+
case feature.to_sym
|
96
|
+
when :oidc
|
97
|
+
Gem::Version.new('0.16.19')
|
98
|
+
else
|
99
|
+
Gem::Version.new('0.0.0')
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Christoph Hartmann
|
3
|
+
# author: Dominik Richter
|
4
|
+
|
5
|
+
require 'net/http'
|
6
|
+
require 'uri'
|
7
|
+
|
8
|
+
module Compliance
|
9
|
+
# implements a simple http abstraction on top of Net::HTTP
|
10
|
+
class HTTP
|
11
|
+
# generic get requires
|
12
|
+
def self.get(url, headers = nil, insecure)
|
13
|
+
uri = _parse_url(url)
|
14
|
+
req = Net::HTTP::Get.new(uri.path)
|
15
|
+
headers&.each do |key, value|
|
16
|
+
req.add_field(key, value)
|
17
|
+
end
|
18
|
+
send_request(uri, req, insecure)
|
19
|
+
end
|
20
|
+
|
21
|
+
# generic post request
|
22
|
+
def self.post(url, token, insecure, basic_auth = false)
|
23
|
+
# form request
|
24
|
+
uri = _parse_url(url)
|
25
|
+
req = Net::HTTP::Post.new(uri.path)
|
26
|
+
if basic_auth
|
27
|
+
req.basic_auth token, ''
|
28
|
+
else
|
29
|
+
req['Authorization'] = "Bearer #{token}"
|
30
|
+
end
|
31
|
+
req.form_data={}
|
32
|
+
|
33
|
+
send_request(uri, req, insecure)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.post_with_headers(url, headers, body, insecure)
|
37
|
+
uri = _parse_url(url)
|
38
|
+
req = Net::HTTP::Post.new(uri.path)
|
39
|
+
req.body = body unless body.nil?
|
40
|
+
headers&.each do |key, value|
|
41
|
+
req.add_field(key, value)
|
42
|
+
end
|
43
|
+
send_request(uri, req, insecure)
|
44
|
+
end
|
45
|
+
|
46
|
+
# post a file
|
47
|
+
def self.post_file(url, headers, file_path, insecure)
|
48
|
+
uri = _parse_url(url)
|
49
|
+
raise "Unable to parse URL: #{url}" if uri.nil? || uri.host.nil?
|
50
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
51
|
+
|
52
|
+
# set connection flags
|
53
|
+
http.use_ssl = (uri.scheme == 'https')
|
54
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if insecure
|
55
|
+
|
56
|
+
req = Net::HTTP::Post.new(uri.path)
|
57
|
+
headers.each do |key, value|
|
58
|
+
req.add_field(key, value)
|
59
|
+
end
|
60
|
+
|
61
|
+
req.body_stream=File.open(file_path, 'rb')
|
62
|
+
req.add_field('Content-Length', File.size(file_path))
|
63
|
+
req.add_field('Content-Type', 'application/x-gtar')
|
64
|
+
|
65
|
+
boundary = 'INSPEC-PROFILE-UPLOAD'
|
66
|
+
req.add_field('session', boundary)
|
67
|
+
res=http.request(req)
|
68
|
+
res
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.post_multipart_file(url, headers, file_path, insecure)
|
72
|
+
uri = _parse_url(url)
|
73
|
+
raise "Unable to parse URL: #{url}" if uri.nil? || uri.host.nil?
|
74
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
75
|
+
|
76
|
+
# set connection flags
|
77
|
+
http.use_ssl = (uri.scheme == 'https')
|
78
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if insecure
|
79
|
+
|
80
|
+
req = Net::HTTP::Post.new(uri)
|
81
|
+
headers.each do |key, value|
|
82
|
+
req.add_field(key, value)
|
83
|
+
end
|
84
|
+
|
85
|
+
boundry = 'AaB03x'
|
86
|
+
req.add_field('Content-Type', "multipart/form-data; boundary=#{boundry}")
|
87
|
+
|
88
|
+
post_body = []
|
89
|
+
post_body << "--#{boundry}\r\n"
|
90
|
+
post_body << "Content-Disposition: form-data; name=\"file\"; filename=\"#{File.basename(file_path)}\"\r\n"
|
91
|
+
post_body << "Content-Type: application/x-gtar\r\n\r\n"
|
92
|
+
post_body << File.read(file_path)
|
93
|
+
post_body << "\r\n\r\n--#{boundry}--\r\n"
|
94
|
+
req.body = post_body.join
|
95
|
+
|
96
|
+
res=http.request(req)
|
97
|
+
res
|
98
|
+
end
|
99
|
+
|
100
|
+
# sends a http requests
|
101
|
+
def self.send_request(uri, req, insecure)
|
102
|
+
opts = {
|
103
|
+
use_ssl: uri.scheme == 'https',
|
104
|
+
}
|
105
|
+
opts[:verify_mode] = OpenSSL::SSL::VERIFY_NONE if insecure
|
106
|
+
|
107
|
+
raise "Unable to parse URI: #{uri}" if uri.nil? || uri.host.nil?
|
108
|
+
res = Net::HTTP.start(uri.host, uri.port, opts) { |http|
|
109
|
+
http.request(req)
|
110
|
+
}
|
111
|
+
res
|
112
|
+
rescue OpenSSL::SSL::SSLError => e
|
113
|
+
raise e unless e.message.include? 'certificate verify failed'
|
114
|
+
|
115
|
+
puts "Error: Failed to connect to #{uri}."
|
116
|
+
puts 'If the server uses a self-signed certificate, please re-run the login command with the --insecure option.'
|
117
|
+
exit 1
|
118
|
+
end
|
119
|
+
|
120
|
+
def self._parse_url(url)
|
121
|
+
url = "https://#{url}" if URI.parse(url).scheme.nil?
|
122
|
+
URI.parse(url)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
Binary file
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Christoph Hartmann
|
3
|
+
# author: Dominik Richter
|
4
|
+
|
5
|
+
module Compliance
|
6
|
+
# is a helper that provides information which version of compliance supports
|
7
|
+
# which feature
|
8
|
+
class Support
|
9
|
+
# for a feature, returns either:
|
10
|
+
# - a version v0: v supports v0 iff v0 <= v
|
11
|
+
# - an array [v0, v1] of two versions: v supports [v0, v1] iff v0 <= v < v1
|
12
|
+
def self.version_with_support(feature)
|
13
|
+
case feature.to_sym
|
14
|
+
when :oidc # open id connect authentication
|
15
|
+
Gem::Version.new('0.16.19')
|
16
|
+
else
|
17
|
+
Gem::Version.new('0.0.0')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# determines if the given version support a certain feature
|
22
|
+
def self.supported?(feature, version)
|
23
|
+
sup = version_with_support(feature)
|
24
|
+
|
25
|
+
if sup.is_a?(Array)
|
26
|
+
Gem::Version.new(version) >= sup[0] &&
|
27
|
+
Gem::Version.new(version) < sup[1]
|
28
|
+
else
|
29
|
+
Gem::Version.new(version) >= sup
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# we do not know the version, therefore we do not know if its possible to use the feature
|
34
|
+
# return if self['version'].nil? || self['version']['version'].nil?
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Christoph Hartmann
|
3
|
+
# author: Dominik Richter
|
4
|
+
|
5
|
+
require 'uri'
|
6
|
+
require 'inspec/fetcher'
|
7
|
+
require 'inspec/errors'
|
8
|
+
|
9
|
+
# InSpec Target Helper for Chef Compliance
|
10
|
+
# reuses UrlHelper, but it knows the target server and the access token already
|
11
|
+
# similar to `inspec exec http://localhost:2134/owners/%base%/compliance/%ssh%/tar --user %token%`
|
12
|
+
module Compliance
|
13
|
+
class Fetcher < Fetchers::Url
|
14
|
+
name 'compliance'
|
15
|
+
priority 500
|
16
|
+
def self.resolve(target) # rubocop:disable PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize
|
17
|
+
uri = if target.is_a?(String) && URI(target).scheme == 'compliance'
|
18
|
+
URI(target)
|
19
|
+
elsif target.respond_to?(:key?) && target.key?(:compliance)
|
20
|
+
URI("compliance://#{target[:compliance]}")
|
21
|
+
end
|
22
|
+
|
23
|
+
return nil if uri.nil?
|
24
|
+
|
25
|
+
# we have detailed information available in our lockfile, no need to ask the server
|
26
|
+
if target.respond_to?(:key?) && target.key?(:url)
|
27
|
+
profile_fetch_url = target[:url]
|
28
|
+
config = {}
|
29
|
+
else
|
30
|
+
# check if we have a compliance token
|
31
|
+
config = Compliance::Configuration.new
|
32
|
+
if config['token'].nil? && config['refresh_token'].nil?
|
33
|
+
if config['server_type'] == 'automate'
|
34
|
+
server = 'automate'
|
35
|
+
msg = 'inspec compliance login https://your_automate_server --user USER --ent ENT --dctoken DCTOKEN or --token USERTOKEN'
|
36
|
+
elsif config['server_type'] == 'automate2'
|
37
|
+
server = 'automate2'
|
38
|
+
msg = 'inspec compliance login https://your_automate2_server --user USER --token APITOKEN'
|
39
|
+
else
|
40
|
+
server = 'compliance'
|
41
|
+
msg = "inspec compliance login https://your_compliance_server --user admin --insecure --token 'PASTE TOKEN HERE' "
|
42
|
+
end
|
43
|
+
raise Inspec::FetcherFailure, <<~EOF
|
44
|
+
|
45
|
+
Cannot fetch #{uri} because your #{server} token has not been
|
46
|
+
configured.
|
47
|
+
|
48
|
+
Please login using
|
49
|
+
|
50
|
+
#{msg}
|
51
|
+
EOF
|
52
|
+
end
|
53
|
+
|
54
|
+
# verifies that the target e.g base/ssh exists
|
55
|
+
profile = Compliance::API.sanitize_profile_name(uri)
|
56
|
+
if !Compliance::API.exist?(config, profile)
|
57
|
+
raise Inspec::FetcherFailure, "The compliance profile #{profile} was not found on the configured compliance server"
|
58
|
+
end
|
59
|
+
profile_fetch_url = Compliance::API.target_url(config, profile)
|
60
|
+
end
|
61
|
+
# We need to pass the token to the fetcher
|
62
|
+
config['token'] = Compliance::API.get_token(config)
|
63
|
+
|
64
|
+
# Needed for automate2 post request
|
65
|
+
profile_stub = profile || target[:compliance]
|
66
|
+
config['profile'] = Compliance::API.profile_split(profile_stub)
|
67
|
+
|
68
|
+
new(profile_fetch_url, config)
|
69
|
+
rescue URI::Error => _e
|
70
|
+
nil
|
71
|
+
end
|
72
|
+
|
73
|
+
# We want to save compliance: in the lockfile rather than url: to
|
74
|
+
# make sure we go back through the Compliance API handling.
|
75
|
+
def resolved_source
|
76
|
+
@resolved_source ||= {
|
77
|
+
compliance: compliance_profile_name,
|
78
|
+
url: @target,
|
79
|
+
sha256: sha256,
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
def to_s
|
84
|
+
'Chef Compliance Profile Loader'
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
# determine the owner_id and the profile name from the url
|
90
|
+
def compliance_profile_name
|
91
|
+
m = if Compliance::API.is_automate_server_pre_080?(@config)
|
92
|
+
%r{^#{@config['server']}/(?<owner>[^/]+)/(?<id>[^/]+)/tar$}
|
93
|
+
elsif Compliance::API.is_automate_server_080_and_later?(@config)
|
94
|
+
%r{^#{@config['server']}/profiles/(?<owner>[^/]+)/(?<id>[^/]+)/tar$}
|
95
|
+
else
|
96
|
+
%r{^#{@config['server']}/owners/(?<owner>[^/]+)/compliance/(?<id>[^/]+)/tar$}
|
97
|
+
end.match(@target)
|
98
|
+
|
99
|
+
raise 'Unable to determine compliance profile name. This can be caused by ' \
|
100
|
+
'an incorrect server in your configuration. Try to login to compliance ' \
|
101
|
+
'via the `inspec compliance login` command.' if m.nil?
|
102
|
+
|
103
|
+
"#{m[:owner]}/#{m[:id]}"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# options
|
4
|
+
inspec_bin = 'BUNDLE_GEMFILE=/inspec/Gemfile bundle exec inspec'
|
5
|
+
api_url = 'https://0.0.0.0'
|
6
|
+
profile = '/inspec/examples/profile'
|
7
|
+
|
8
|
+
user = command('whoami').stdout.strip
|
9
|
+
pwd = command('pwd').stdout.strip
|
10
|
+
puts "Run test as #{user} in path #{pwd}"
|
11
|
+
|
12
|
+
# TODO: determine tokens automatically, define in kitchen yml
|
13
|
+
access_token = ENV['COMPLIANCE_ACCESSTOKEN']
|
14
|
+
refresh_token = ENV['COMPLIANCE_REFRESHTOKEN']
|
15
|
+
|
16
|
+
%w{refresh_token access_token}.each do |type| # rubocop:disable Metrics/BlockLength
|
17
|
+
case type
|
18
|
+
when 'access_token'
|
19
|
+
token_options = "--token '#{access_token}'"
|
20
|
+
when 'refresh_token'
|
21
|
+
token_options = "--refresh_token '#{refresh_token}'"
|
22
|
+
end
|
23
|
+
|
24
|
+
# verifies that the help command works
|
25
|
+
describe command("#{inspec_bin} compliance help") do
|
26
|
+
its('stdout') { should include 'inspec compliance help [COMMAND]' }
|
27
|
+
its('stderr') { should eq '' }
|
28
|
+
its('exit_status') { should eq 0 }
|
29
|
+
end
|
30
|
+
|
31
|
+
# version command fails gracefully when server not configured
|
32
|
+
describe command("#{inspec_bin} compliance version") do
|
33
|
+
its('stdout') { should include 'Server configuration information is missing' }
|
34
|
+
its('stderr') { should eq '' }
|
35
|
+
its('exit_status') { should eq 1 }
|
36
|
+
end
|
37
|
+
|
38
|
+
# submitting a wrong token should have an exit of 0
|
39
|
+
describe command("#{inspec_bin} compliance login #{api_url} --insecure --user 'admin' --token 'wrong-token'") do
|
40
|
+
its('stdout') { should include 'token stored' }
|
41
|
+
end
|
42
|
+
|
43
|
+
# compliance login --help should give an accurate message for login
|
44
|
+
describe command("#{inspec_bin} compliance login --help") do
|
45
|
+
its('stdout') { should include "inspec compliance login SERVER --insecure --user='USER' --token='TOKEN'" }
|
46
|
+
its('exit_status') { should eq 0 }
|
47
|
+
end
|
48
|
+
|
49
|
+
# profiles command fails gracefully when token/server info is incorrect
|
50
|
+
describe command("#{inspec_bin} compliance profiles") do
|
51
|
+
its('stdout') { should include '401 Unauthorized. Please check your token' }
|
52
|
+
its('stderr') { should eq '' }
|
53
|
+
its('exit_status') { should eq 1 }
|
54
|
+
end
|
55
|
+
|
56
|
+
# login via access token token
|
57
|
+
describe command("#{inspec_bin} compliance login #{api_url} --insecure --user 'admin' #{token_options}") do
|
58
|
+
its('stdout') { should include 'token', 'stored' }
|
59
|
+
its('stdout') { should_not include 'Your server supports --user and --password only' }
|
60
|
+
its('stderr') { should eq '' }
|
61
|
+
its('exit_status') { should eq 0 }
|
62
|
+
end
|
63
|
+
|
64
|
+
# see available resources
|
65
|
+
describe command("#{inspec_bin} compliance profiles") do
|
66
|
+
its('stdout') { should include 'base/ssh' }
|
67
|
+
its('stderr') { should eq '' }
|
68
|
+
its('exit_status') { should eq 0 }
|
69
|
+
end
|
70
|
+
|
71
|
+
# upload a compliance profile
|
72
|
+
describe command("#{inspec_bin} compliance upload #{profile} --overwrite") do
|
73
|
+
its('stdout') { should include 'Profile is valid' }
|
74
|
+
its('stdout') { should include 'Successfully uploaded profile' }
|
75
|
+
its('stdout') { should_not include 'error(s)' }
|
76
|
+
its('stderr') { should eq '' }
|
77
|
+
its('exit_status') { should eq 0 }
|
78
|
+
end
|
79
|
+
|
80
|
+
# returns the version of the server
|
81
|
+
describe command("#{inspec_bin} compliance version") do
|
82
|
+
its('stdout') { should include 'Chef Compliance version:' }
|
83
|
+
its('stderr') { should eq '' }
|
84
|
+
its('exit_status') { should eq 0 }
|
85
|
+
end
|
86
|
+
|
87
|
+
# logout
|
88
|
+
describe command("#{inspec_bin} compliance logout") do
|
89
|
+
its('stdout') { should include 'Successfully logged out' }
|
90
|
+
its('stderr') { should eq '' }
|
91
|
+
its('exit_status') { should eq 0 }
|
92
|
+
end
|
93
|
+
end
|