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,77 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'openssl'
|
4
|
+
require 'utils/file_reader'
|
5
|
+
|
6
|
+
class DhParams < Inspec.resource(1)
|
7
|
+
name 'dh_params'
|
8
|
+
supports platform: 'unix'
|
9
|
+
desc '
|
10
|
+
Use the `dh_params` InSpec audit resource to test Diffie-Hellman (DH)
|
11
|
+
parameters.
|
12
|
+
'
|
13
|
+
|
14
|
+
example "
|
15
|
+
describe dh_params('/path/to/file.dh_pem') do
|
16
|
+
it { should be_dh_params }
|
17
|
+
it { should be_valid }
|
18
|
+
its('generator') { should eq 2 }
|
19
|
+
its('modulus') { should eq '00:91:a0:15:89:e5:bc:38:93:12:02:fc:...' }
|
20
|
+
its('prime_length') { should eq 2048 }
|
21
|
+
its('pem') { should eq '-----BEGIN DH PARAMETERS...' }
|
22
|
+
its('text') { should eq 'PKCS#3 DH Parameters: (2048 bit)...' }
|
23
|
+
end
|
24
|
+
"
|
25
|
+
|
26
|
+
include FileReader
|
27
|
+
|
28
|
+
def initialize(filename)
|
29
|
+
@dh_params_path = filename
|
30
|
+
@dh_params = OpenSSL::PKey::DH.new read_file_content(@dh_params_path)
|
31
|
+
end
|
32
|
+
|
33
|
+
# it { should be_dh_params }
|
34
|
+
def dh_params?
|
35
|
+
!@dh_params.nil?
|
36
|
+
end
|
37
|
+
|
38
|
+
# its('generator') { should eq 2 }
|
39
|
+
def generator
|
40
|
+
return if @dh_params.nil?
|
41
|
+
@dh_params.g.to_i
|
42
|
+
end
|
43
|
+
|
44
|
+
# its('modulus') { should eq '00:91:a0:15:89:e5:bc:38:93:12:02:fc:...' }
|
45
|
+
def modulus
|
46
|
+
return if @dh_params.nil?
|
47
|
+
'00:' + @dh_params.p.to_s(16).downcase.scan(/.{2}/).join(':')
|
48
|
+
end
|
49
|
+
|
50
|
+
# its('pem') { should eq '-----BEGIN DH PARAMETERS...' }
|
51
|
+
def pem
|
52
|
+
return if @dh_params.nil?
|
53
|
+
@dh_params.to_pem
|
54
|
+
end
|
55
|
+
|
56
|
+
# its('prime_length') { should be 2048 }
|
57
|
+
def prime_length
|
58
|
+
return if @dh_params.nil?
|
59
|
+
@dh_params.p.num_bits
|
60
|
+
end
|
61
|
+
|
62
|
+
# its('text') { should eq 'human-readable-text' }
|
63
|
+
def text
|
64
|
+
return if @dh_params.nil?
|
65
|
+
@dh_params.to_text
|
66
|
+
end
|
67
|
+
|
68
|
+
# it { should be_valid }
|
69
|
+
def valid?
|
70
|
+
return if @dh_params.nil?
|
71
|
+
@dh_params.params_ok?
|
72
|
+
end
|
73
|
+
|
74
|
+
def to_s
|
75
|
+
"dh_params #{@dh_params_path}"
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'resources/file'
|
4
|
+
|
5
|
+
module Inspec::Resources
|
6
|
+
class Directory < FileResource
|
7
|
+
name 'directory'
|
8
|
+
supports platform: 'unix'
|
9
|
+
supports platform: 'windows'
|
10
|
+
desc 'Use the directory InSpec audit resource to test if the file type is a directory. This is equivalent to using the file InSpec audit resource and the be_directory matcher, but provides a simpler and more direct way to test directories. All of the matchers available to file may be used with directory.'
|
11
|
+
example "
|
12
|
+
describe directory('path') do
|
13
|
+
it { should be_directory }
|
14
|
+
end
|
15
|
+
"
|
16
|
+
|
17
|
+
def exist?
|
18
|
+
file.exist? && file.directory?
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
"Directory #{source_path}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,236 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Copyright 2017, Christoph Hartmann
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'utils/filter'
|
7
|
+
require 'hashie/mash'
|
8
|
+
|
9
|
+
module Inspec::Resources
|
10
|
+
class DockerContainerFilter
|
11
|
+
# use filtertable for containers
|
12
|
+
filter = FilterTable.create
|
13
|
+
filter.add_accessor(:where)
|
14
|
+
.add_accessor(:entries)
|
15
|
+
.add(:commands, field: 'command')
|
16
|
+
.add(:ids, field: 'id')
|
17
|
+
.add(:images, field: 'image')
|
18
|
+
.add(:labels, field: 'labels')
|
19
|
+
.add(:local_volumes, field: 'localvolumes')
|
20
|
+
.add(:mounts, field: 'mounts')
|
21
|
+
.add(:names, field: 'names')
|
22
|
+
.add(:networks, field: 'networks')
|
23
|
+
.add(:ports, field: 'ports')
|
24
|
+
.add(:running_for, field: 'runningfor')
|
25
|
+
.add(:sizes, field: 'size')
|
26
|
+
.add(:status, field: 'status')
|
27
|
+
.add(:exists?) { |x| !x.entries.empty? }
|
28
|
+
.add(:running?) { |x|
|
29
|
+
x.where { status.downcase.start_with?('up') }
|
30
|
+
}
|
31
|
+
filter.connect(self, :containers)
|
32
|
+
|
33
|
+
attr_reader :containers
|
34
|
+
def initialize(containers)
|
35
|
+
@containers = containers
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class DockerImageFilter
|
40
|
+
filter = FilterTable.create
|
41
|
+
filter.add_accessor(:where)
|
42
|
+
.add_accessor(:entries)
|
43
|
+
.add(:ids, field: 'id')
|
44
|
+
.add(:repositories, field: 'repository')
|
45
|
+
.add(:tags, field: 'tag')
|
46
|
+
.add(:sizes, field: 'size')
|
47
|
+
.add(:digests, field: 'digest')
|
48
|
+
.add(:created, field: 'createdat')
|
49
|
+
.add(:created_since, field: 'createdsize')
|
50
|
+
.add(:exists?) { |x| !x.entries.empty? }
|
51
|
+
filter.connect(self, :images)
|
52
|
+
|
53
|
+
attr_reader :images
|
54
|
+
def initialize(images)
|
55
|
+
@images = images
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class DockerServiceFilter
|
60
|
+
filter = FilterTable.create
|
61
|
+
filter.add_accessor(:where)
|
62
|
+
.add_accessor(:entries)
|
63
|
+
.add(:ids, field: 'id')
|
64
|
+
.add(:names, field: 'name')
|
65
|
+
.add(:modes, field: 'mode')
|
66
|
+
.add(:replicas, field: 'replicas')
|
67
|
+
.add(:images, field: 'image')
|
68
|
+
.add(:ports, field: 'ports')
|
69
|
+
.add(:exists?) { |x| !x.entries.empty? }
|
70
|
+
filter.connect(self, :services)
|
71
|
+
|
72
|
+
attr_reader :services
|
73
|
+
def initialize(services)
|
74
|
+
@services = services
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# This resource helps to parse information from the docker host
|
79
|
+
# For compatability with Serverspec we also offer the following resouses:
|
80
|
+
# - docker_container
|
81
|
+
# - docker_image
|
82
|
+
class Docker < Inspec.resource(1)
|
83
|
+
name 'docker'
|
84
|
+
supports platform: 'unix'
|
85
|
+
desc "
|
86
|
+
A resource to retrieve information about docker
|
87
|
+
"
|
88
|
+
|
89
|
+
example "
|
90
|
+
describe docker.containers do
|
91
|
+
its('images') { should_not include 'u12:latest' }
|
92
|
+
end
|
93
|
+
|
94
|
+
describe docker.images do
|
95
|
+
its('repositories') { should_not include 'inssecure_image' }
|
96
|
+
end
|
97
|
+
|
98
|
+
describe docker.services do
|
99
|
+
its('images') { should_not include 'inssecure_image' }
|
100
|
+
end
|
101
|
+
|
102
|
+
describe docker.version do
|
103
|
+
its('Server.Version') { should cmp >= '1.12'}
|
104
|
+
its('Client.Version') { should cmp >= '1.12'}
|
105
|
+
end
|
106
|
+
|
107
|
+
describe docker.object(id) do
|
108
|
+
its('Configuration.Path') { should eq 'value' }
|
109
|
+
end
|
110
|
+
|
111
|
+
docker.containers.ids.each do |id|
|
112
|
+
# call docker inspect for a specific container id
|
113
|
+
describe docker.object(id) do
|
114
|
+
its(%w(HostConfig Privileged)) { should cmp false }
|
115
|
+
its(%w(HostConfig Privileged)) { should_not cmp true }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
"
|
119
|
+
|
120
|
+
def containers
|
121
|
+
DockerContainerFilter.new(parse_containers)
|
122
|
+
end
|
123
|
+
|
124
|
+
def images
|
125
|
+
DockerImageFilter.new(parse_images)
|
126
|
+
end
|
127
|
+
|
128
|
+
def services
|
129
|
+
DockerServiceFilter.new(parse_services)
|
130
|
+
end
|
131
|
+
|
132
|
+
def version
|
133
|
+
return @version if defined?(@version)
|
134
|
+
data = {}
|
135
|
+
cmd = inspec.command('docker version --format \'{{ json . }}\'')
|
136
|
+
data = JSON.parse(cmd.stdout) if cmd.exit_status == 0
|
137
|
+
@version = Hashie::Mash.new(data)
|
138
|
+
rescue JSON::ParserError => _e
|
139
|
+
return Hashie::Mash.new({})
|
140
|
+
end
|
141
|
+
|
142
|
+
def info
|
143
|
+
return @info if defined?(@info)
|
144
|
+
data = {}
|
145
|
+
# docke info format is only supported for Docker 17.03+
|
146
|
+
cmd = inspec.command('docker info --format \'{{ json . }}\'')
|
147
|
+
data = JSON.parse(cmd.stdout) if cmd.exit_status == 0
|
148
|
+
@info = Hashie::Mash.new(data)
|
149
|
+
rescue JSON::ParserError => _e
|
150
|
+
return Hashie::Mash.new({})
|
151
|
+
end
|
152
|
+
|
153
|
+
# returns information about docker objects
|
154
|
+
def object(id)
|
155
|
+
return @inspect if defined?(@inspect)
|
156
|
+
data = JSON.parse(inspec.command("docker inspect #{id}").stdout)
|
157
|
+
data = data[0] if data.is_a?(Array)
|
158
|
+
@inspect = Hashie::Mash.new(data)
|
159
|
+
rescue JSON::ParserError => _e
|
160
|
+
return Hashie::Mash.new({})
|
161
|
+
end
|
162
|
+
|
163
|
+
def to_s
|
164
|
+
'Docker Host'
|
165
|
+
end
|
166
|
+
|
167
|
+
private
|
168
|
+
|
169
|
+
def parse_json_command(labels, subcommand)
|
170
|
+
# build command
|
171
|
+
format = labels.map { |label| "\"#{label}\": {{json .#{label}}}" }
|
172
|
+
raw = inspec.command("docker #{subcommand} --format '{#{format.join(', ')}}'").stdout
|
173
|
+
output = []
|
174
|
+
# since docker is not outputting valid json, we need to parse each row
|
175
|
+
raw.each_line { |entry|
|
176
|
+
# convert all keys to lower_case to work well with ruby and filter table
|
177
|
+
j = JSON.parse(entry).map { |k, v|
|
178
|
+
[k.downcase, v]
|
179
|
+
}.to_h
|
180
|
+
|
181
|
+
# ensure all keys are there
|
182
|
+
j = ensure_keys(j, labels)
|
183
|
+
|
184
|
+
# strip off any linked container names
|
185
|
+
# Depending on how it was linked, the actual container name may come before
|
186
|
+
# or after the link information, so we'll just look for the first name that
|
187
|
+
# does not include a slash since that is not a valid character in a container name
|
188
|
+
j['names'] = j['names'].split(',').find { |c| !c.include?('/') } if j.key?('names')
|
189
|
+
|
190
|
+
output.push(j)
|
191
|
+
}
|
192
|
+
output
|
193
|
+
rescue JSON::ParserError => _e
|
194
|
+
warn "Could not parse `docker #{subcommand}` output"
|
195
|
+
[]
|
196
|
+
end
|
197
|
+
|
198
|
+
def parse_containers
|
199
|
+
# @see https://github.com/moby/moby/issues/20625, works for docker 1.13+
|
200
|
+
# raw_containers = inspec.command('docker ps -a --no-trunc --format \'{{ json . }}\'').stdout
|
201
|
+
# therefore we stick with older approach
|
202
|
+
labels = %w{Command CreatedAt ID Image Labels Mounts Names Ports RunningFor Size Status}
|
203
|
+
|
204
|
+
# Networks LocalVolumes work with 1.13+ only
|
205
|
+
if !version.empty? && Gem::Version.new(version['Client']['Version']) >= Gem::Version.new('1.13')
|
206
|
+
labels.push('Networks')
|
207
|
+
labels.push('LocalVolumes')
|
208
|
+
end
|
209
|
+
parse_json_command(labels, 'ps -a --no-trunc')
|
210
|
+
end
|
211
|
+
|
212
|
+
def parse_services
|
213
|
+
parse_json_command(%w{ID Name Mode Replicas Image Ports}, 'service ls')
|
214
|
+
end
|
215
|
+
|
216
|
+
def ensure_keys(entry, labels)
|
217
|
+
labels.each { |key|
|
218
|
+
entry[key.downcase] = nil if !entry.key?(key.downcase)
|
219
|
+
}
|
220
|
+
entry
|
221
|
+
end
|
222
|
+
|
223
|
+
def parse_images
|
224
|
+
# docker does not support the `json .` function here, therefore we need to emulate that behavior.
|
225
|
+
raw_images = inspec.command('docker images -a --no-trunc --format \'{ "id": {{json .ID}}, "repository": {{json .Repository}}, "tag": {{json .Tag}}, "size": {{json .Size}}, "digest": {{json .Digest}}, "createdat": {{json .CreatedAt}}, "createdsize": {{json .CreatedSince}} }\'').stdout
|
226
|
+
c_images = []
|
227
|
+
raw_images.each_line { |entry|
|
228
|
+
c_images.push(JSON.parse(entry))
|
229
|
+
}
|
230
|
+
c_images
|
231
|
+
rescue JSON::ParserError => _e
|
232
|
+
warn 'Could not parse `docker images` output'
|
233
|
+
[]
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Copyright 2017, Christoph Hartmann
|
4
|
+
|
5
|
+
require_relative 'docker_object'
|
6
|
+
|
7
|
+
module Inspec::Resources
|
8
|
+
class DockerContainer < Inspec.resource(1)
|
9
|
+
include Inspec::Resources::DockerObject
|
10
|
+
|
11
|
+
name 'docker_container'
|
12
|
+
supports platform: 'unix'
|
13
|
+
desc ''
|
14
|
+
example "
|
15
|
+
describe docker_container('an-echo-server') do
|
16
|
+
it { should exist }
|
17
|
+
it { should be_running }
|
18
|
+
its('id') { should_not eq '' }
|
19
|
+
its('image') { should eq 'busybox:latest' }
|
20
|
+
its('repo') { should eq 'busybox' }
|
21
|
+
its('tag') { should eq 'latest' }
|
22
|
+
its('ports') { should eq [] }
|
23
|
+
its('command') { should eq 'nc -ll -p 1234 -e /bin/cat' }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe docker_container(id: 'e2c52a183358') do
|
27
|
+
it { should exist }
|
28
|
+
it { should be_running }
|
29
|
+
end
|
30
|
+
"
|
31
|
+
|
32
|
+
def initialize(opts = {})
|
33
|
+
# if a string is provided, we expect it is the name
|
34
|
+
if opts.is_a?(String)
|
35
|
+
@opts = { name: opts }
|
36
|
+
else
|
37
|
+
@opts = opts
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def running?
|
42
|
+
status.downcase.start_with?('up') if object_info.entries.length == 1
|
43
|
+
end
|
44
|
+
|
45
|
+
def status
|
46
|
+
object_info.status[0] if object_info.entries.length == 1
|
47
|
+
end
|
48
|
+
|
49
|
+
def labels
|
50
|
+
object_info.labels[0] if object_info.entries.length == 1
|
51
|
+
end
|
52
|
+
|
53
|
+
def ports
|
54
|
+
object_info.ports[0] if object_info.entries.length == 1
|
55
|
+
end
|
56
|
+
|
57
|
+
def command
|
58
|
+
return unless object_info.entries.length == 1
|
59
|
+
|
60
|
+
cmd = object_info.commands[0]
|
61
|
+
cmd.slice(1, cmd.length - 2)
|
62
|
+
end
|
63
|
+
|
64
|
+
def image
|
65
|
+
object_info.images[0] if object_info.entries.length == 1
|
66
|
+
end
|
67
|
+
|
68
|
+
def repo
|
69
|
+
parse_components_from_image(image)[:repo] if object_info.entries.size == 1
|
70
|
+
end
|
71
|
+
|
72
|
+
def tag
|
73
|
+
parse_components_from_image(image)[:tag] if object_info.entries.size == 1
|
74
|
+
end
|
75
|
+
|
76
|
+
def to_s
|
77
|
+
name = @opts[:name] || @opts[:id]
|
78
|
+
"Docker Container #{name}"
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def object_info
|
84
|
+
return @info if defined?(@info)
|
85
|
+
opts = @opts
|
86
|
+
@info = inspec.docker.containers.where { names == opts[:name] || (!id.nil? && !opts[:id].nil? && (id == opts[:id] || id.start_with?(opts[:id]))) }
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Copyright 2017, Christoph Hartmann
|
4
|
+
|
5
|
+
require_relative 'docker_object'
|
6
|
+
|
7
|
+
module Inspec::Resources
|
8
|
+
class DockerImage < Inspec.resource(1)
|
9
|
+
include Inspec::Resources::DockerObject
|
10
|
+
|
11
|
+
name 'docker_image'
|
12
|
+
supports platform: 'unix'
|
13
|
+
desc ''
|
14
|
+
example "
|
15
|
+
describe docker_image('alpine:latest') do
|
16
|
+
it { should exist }
|
17
|
+
its('id') { should_not eq '' }
|
18
|
+
its('image') { should eq 'alpine:latest' }
|
19
|
+
its('repo') { should eq 'alpine' }
|
20
|
+
its('tag') { should eq 'latest' }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe docker_image('alpine:latest') do
|
24
|
+
it { should exist }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe docker_image(id: '4a415e366388') do
|
28
|
+
it { should exist }
|
29
|
+
end
|
30
|
+
"
|
31
|
+
|
32
|
+
def initialize(opts = {})
|
33
|
+
# do sanitizion of input values
|
34
|
+
o = opts.dup
|
35
|
+
o = { image: opts } if opts.is_a?(String)
|
36
|
+
@opts = sanitize_options(o)
|
37
|
+
end
|
38
|
+
|
39
|
+
def image
|
40
|
+
"#{repo}:#{tag}" if object_info.entries.size == 1
|
41
|
+
end
|
42
|
+
|
43
|
+
def repo
|
44
|
+
object_info.repositories[0] if object_info.entries.size == 1
|
45
|
+
end
|
46
|
+
|
47
|
+
def tag
|
48
|
+
object_info.tags[0] if object_info.entries.size == 1
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_s
|
52
|
+
img = @opts[:image] || @opts[:id]
|
53
|
+
"Docker Image #{img}"
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def sanitize_options(opts)
|
59
|
+
opts.merge!(parse_components_from_image(opts[:image]))
|
60
|
+
|
61
|
+
# assume a "latest" tag if we don't have one
|
62
|
+
opts[:tag] ||= 'latest'
|
63
|
+
|
64
|
+
# if the ID isn't nil and doesn't contain a hash indicator (indicated by the presence
|
65
|
+
# of a colon, which separates the indicator from the actual hash), we assume it's sha256.
|
66
|
+
opts[:id] = 'sha256:' + opts[:id] unless opts[:id].nil? || opts[:id].include?(':')
|
67
|
+
|
68
|
+
# Assemble/reassemble the image from the repo and tag
|
69
|
+
opts[:image] = "#{opts[:repo]}:#{opts[:tag]}" unless opts[:repo].nil?
|
70
|
+
|
71
|
+
# return the santized opts back to the caller
|
72
|
+
opts
|
73
|
+
end
|
74
|
+
|
75
|
+
def object_info
|
76
|
+
return @info if defined?(@info)
|
77
|
+
opts = @opts
|
78
|
+
@info = inspec.docker.images.where {
|
79
|
+
(repository == opts[:repo] && tag == opts[:tag]) || (!id.nil? && !opts[:id].nil? && (id == opts[:id] || id.start_with?(opts[:id])))
|
80
|
+
}
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|