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,68 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'securerandom'
|
4
|
+
|
5
|
+
module Inspec::Resources
|
6
|
+
# This resource allows users to run vbscript on windows machines. We decided
|
7
|
+
# not to use scriptcontrol, due to the fact that it works on 32 bit systems only:
|
8
|
+
# $script = new-object -comobject MSScriptControl.ScriptControl
|
9
|
+
# $script.language = "vbscript"
|
10
|
+
# $script.ExecuteStatement($Cmd)
|
11
|
+
#
|
12
|
+
# For that reason, we call csript.exe directy with the script. Vbscript is
|
13
|
+
# embedded in Powershell to ease the file transfer and reuse powershell
|
14
|
+
# encodedCommand since train does not allow file upload yet.
|
15
|
+
#
|
16
|
+
# We run cscript with /nologo option to get the expected output only with the
|
17
|
+
# version information.
|
18
|
+
#
|
19
|
+
# Since Windows does not delete tmp files automatically, we remove the VBScript
|
20
|
+
# after we executed it
|
21
|
+
# @see https://msdn.microsoft.com/en-us/library/aa364991.aspx
|
22
|
+
class VBScript < PowershellScript
|
23
|
+
name 'vbscript'
|
24
|
+
supports platform: 'windows'
|
25
|
+
desc ''
|
26
|
+
example "
|
27
|
+
script = <<-EOH
|
28
|
+
# you vbscript
|
29
|
+
EOH
|
30
|
+
|
31
|
+
describe vbscript(script) do
|
32
|
+
its('stdout') { should eq 'output' }
|
33
|
+
end
|
34
|
+
"
|
35
|
+
|
36
|
+
def initialize(vbscript)
|
37
|
+
@seperator = SecureRandom.uuid
|
38
|
+
cmd = <<~EOH
|
39
|
+
$vbscript = @"
|
40
|
+
#{vbscript}
|
41
|
+
Wscript.Stdout.Write "#{@seperator}"
|
42
|
+
"@
|
43
|
+
$filename = [System.IO.Path]::GetTempFileName() + ".vbs"
|
44
|
+
New-Item $filename -type file -force -value $vbscript | Out-Null
|
45
|
+
cscript.exe /nologo $filename
|
46
|
+
Remove-Item $filename | Out-Null
|
47
|
+
EOH
|
48
|
+
super(cmd)
|
49
|
+
end
|
50
|
+
|
51
|
+
def result
|
52
|
+
@result ||= parse_stdout
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_s
|
56
|
+
'Windows VBScript'
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def parse_stdout
|
62
|
+
res = inspec.backend.run_command(@command)
|
63
|
+
parsed_result = res.stdout.gsub(/#{@seperator}\r\n$/, '')
|
64
|
+
res.stdout = parsed_result
|
65
|
+
res
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,247 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'hashie/mash'
|
4
|
+
|
5
|
+
module Inspec::Resources
|
6
|
+
class Virtualization < Inspec.resource(1)
|
7
|
+
name 'virtualization'
|
8
|
+
supports platform: 'linux'
|
9
|
+
desc 'Use the virtualization InSpec audit resource to test the virtualization platform on which the system is running'
|
10
|
+
example "
|
11
|
+
describe virtualization do
|
12
|
+
its('system') { should eq 'docker' }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe virtualization do
|
16
|
+
its('role') { should eq 'guest' }
|
17
|
+
end
|
18
|
+
|
19
|
+
control 'test' do
|
20
|
+
describe file('/var/tmp/foo') do
|
21
|
+
it { should be_file }
|
22
|
+
end
|
23
|
+
only_if { virtualization.system == 'docker' }
|
24
|
+
end
|
25
|
+
"
|
26
|
+
|
27
|
+
def initialize
|
28
|
+
@virtualization_data = Hashie::Mash.new
|
29
|
+
collect_data_linux
|
30
|
+
end
|
31
|
+
|
32
|
+
# add helper methods for easy access of properties
|
33
|
+
# allows users to use virtualization.role, virtualization.system
|
34
|
+
%w{role system}.each do |property|
|
35
|
+
define_method(property.to_sym) do
|
36
|
+
@virtualization_data[property.to_sym]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def params
|
41
|
+
collect_data_linux
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
'Virtualization Detection'
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def lxc_version_exists?
|
51
|
+
inspec.command('lxc-version').exist?
|
52
|
+
end
|
53
|
+
|
54
|
+
def docker_exists?
|
55
|
+
inspec.command('docker').exist?
|
56
|
+
end
|
57
|
+
|
58
|
+
def nova_exists?
|
59
|
+
inspec.command('nova').exist?
|
60
|
+
end
|
61
|
+
|
62
|
+
# Detect Xen
|
63
|
+
# /proc/xen is an empty dir for EL6 + Linode Guests + Paravirt EC2 instances
|
64
|
+
# Notes:
|
65
|
+
# - cpuid of guests, if we could get it, would also be a clue
|
66
|
+
# - may be able to determine if under paravirt from /dev/xen/evtchn (See OHAI-253)
|
67
|
+
# - Additional edge cases likely should not change the above assumptions
|
68
|
+
# but rather be additive - btm
|
69
|
+
def detect_xen
|
70
|
+
return false unless inspec.file('/proc/xen').exist?
|
71
|
+
@virtualization_data[:system] = 'xen'
|
72
|
+
@virtualization_data[:role] = 'guest'
|
73
|
+
|
74
|
+
# This file should exist on most Xen systems, normally empty for guests
|
75
|
+
if inspec.file('/proc/xen/capabilities').exist? &&
|
76
|
+
inspec.file('/proc/xen/capabilities').content =~ /control_d/i # rubocop:disable Layout/MultilineOperationIndentation
|
77
|
+
@virtualization_data[:role] = 'host'
|
78
|
+
end
|
79
|
+
true
|
80
|
+
end
|
81
|
+
|
82
|
+
# Detect Virtualbox from kernel module
|
83
|
+
def detect_virtualbox
|
84
|
+
return false unless inspec.file('/proc/modules').exist?
|
85
|
+
modules = inspec.file('/proc/modules').content
|
86
|
+
if modules =~ /^vboxdrv/
|
87
|
+
Inspec::Log.debug('Plugin Virtualization: /proc/modules contains vboxdrv. Detecting as vbox host')
|
88
|
+
@virtualization_data[:system] = 'vbox'
|
89
|
+
@virtualization_data[:role] = 'host'
|
90
|
+
elsif modules =~ /^vboxguest/
|
91
|
+
Inspec::Log.debug('Plugin Virtualization: /proc/modules contains vboxguest. Detecting as vbox guest')
|
92
|
+
@virtualization_data[:system] = 'vbox'
|
93
|
+
@virtualization_data[:role] = 'guest'
|
94
|
+
else
|
95
|
+
return false
|
96
|
+
end
|
97
|
+
true
|
98
|
+
end
|
99
|
+
|
100
|
+
# if nova binary is present we're on an openstack host
|
101
|
+
def detect_openstack
|
102
|
+
return false unless nova_exists?
|
103
|
+
@virtualization_data[:system] = 'openstack'
|
104
|
+
@virtualization_data[:role] = 'host'
|
105
|
+
true
|
106
|
+
end
|
107
|
+
|
108
|
+
# Detect paravirt KVM/QEMU from cpuinfo, report as KVM
|
109
|
+
def detect_kvm_from_cpuinfo
|
110
|
+
return false unless inspec.file('/proc/cpuinfo').content =~ /QEMU Virtual CPU|Common KVM processor|Common 32-bit KVM processor/
|
111
|
+
@virtualization_data[:system] = 'kvm'
|
112
|
+
@virtualization_data[:role] = 'guest'
|
113
|
+
true
|
114
|
+
end
|
115
|
+
|
116
|
+
# Detect KVM systems via /sys
|
117
|
+
# guests will have the hypervisor cpu feature that hosts don't have
|
118
|
+
def detect_kvm_from_sys
|
119
|
+
return false unless inspec.file('/sys/devices/virtual/misc/kvm').exist?
|
120
|
+
@virtualization_data[:system] = 'kvm'
|
121
|
+
if inspec.file('/proc/cpuinfo').content =~ /hypervisor/
|
122
|
+
@virtualization_data[:role] = 'guest'
|
123
|
+
else
|
124
|
+
@virtualization_data[:role] = 'host'
|
125
|
+
end
|
126
|
+
true
|
127
|
+
end
|
128
|
+
|
129
|
+
# Detect OpenVZ / Virtuozzo.
|
130
|
+
# http://wiki.openvz.org/BC_proc_entries
|
131
|
+
def detect_openvz
|
132
|
+
if inspec.file('/proc/bc/0').exist?
|
133
|
+
@virtualization_data[:system] = 'openvz'
|
134
|
+
@virtualization_data[:role] = 'host'
|
135
|
+
elsif inspec.file('/proc/vz').exist?
|
136
|
+
@virtualization_data[:system] = 'openvz'
|
137
|
+
@virtualization_data[:role] = 'guest'
|
138
|
+
else
|
139
|
+
return false
|
140
|
+
end
|
141
|
+
true
|
142
|
+
end
|
143
|
+
|
144
|
+
# Detect Parallels virtual machine from pci devices
|
145
|
+
def detect_parallels
|
146
|
+
return false unless inspec.file('/proc/bus/pci/devices').content =~ /1ab84000/
|
147
|
+
@virtualization_data[:system] = 'parallels'
|
148
|
+
@virtualization_data[:role] = 'guest'
|
149
|
+
true
|
150
|
+
end
|
151
|
+
|
152
|
+
# Detect Linux-VServer
|
153
|
+
def detect_linux_vserver
|
154
|
+
return false unless inspec.file('/proc/self/status').exist?
|
155
|
+
proc_self_status = inspec.file('/proc/self/status').content
|
156
|
+
vxid = proc_self_status.match(/^(s_context|VxID):\s*(\d+)$/)
|
157
|
+
return false unless vxid && vxid[2]
|
158
|
+
@virtualization_data[:system] = 'linux-vserver'
|
159
|
+
if vxid[2] == '0'
|
160
|
+
@virtualization_data[:role] = 'host'
|
161
|
+
else
|
162
|
+
@virtualization_data[:role] = 'guest'
|
163
|
+
end
|
164
|
+
true
|
165
|
+
end
|
166
|
+
|
167
|
+
# Detect LXC/Docker
|
168
|
+
#
|
169
|
+
# /proc/self/cgroup will look like this inside a docker container:
|
170
|
+
# <index #>:<subsystem>:/lxc/<hexadecimal container id>
|
171
|
+
#
|
172
|
+
# /proc/self/cgroup could have a name including alpha/digit/dashes
|
173
|
+
# <index #>:<subsystem>:/lxc/<named container id>
|
174
|
+
#
|
175
|
+
# /proc/self/cgroup could have a non-lxc cgroup name indicating other uses
|
176
|
+
# of cgroups. This is probably not LXC/Docker.
|
177
|
+
# <index #>:<subsystem>:/Charlie
|
178
|
+
#
|
179
|
+
# A host which supports cgroups, and has capacity to host lxc containers,
|
180
|
+
# will show the subsystems and root (/) namespace.
|
181
|
+
# <index #>:<subsystem>:/
|
182
|
+
#
|
183
|
+
# Full notes, https://tickets.opscode.com/browse/OHAI-551
|
184
|
+
# Kernel docs, https://www.kernel.org/doc/Documentation/cgroups
|
185
|
+
def detect_lxc_docker
|
186
|
+
return false unless inspec.file('/proc/self/cgroup').exist?
|
187
|
+
cgroup_content = inspec.file('/proc/self/cgroup').content
|
188
|
+
if cgroup_content =~ %r{^\d+:[^:]+:/(lxc|docker)/.+$} ||
|
189
|
+
cgroup_content =~ %r{^\d+:[^:]+:/[^/]+/(lxc|docker)-.+$} # rubocop:disable Layout/MultilineOperationIndentation
|
190
|
+
@virtualization_data[:system] = $1 # rubocop:disable Style/PerlBackrefs
|
191
|
+
@virtualization_data[:role] = 'guest'
|
192
|
+
elsif lxc_version_exists? && cgroup_content =~ %r{\d:[^:]+:/$}
|
193
|
+
# lxc-version shouldn't be installed by default
|
194
|
+
# Even so, it is likely we are on an LXC capable host that is not being used as such
|
195
|
+
# So we're cautious here to not overwrite other existing values (OHAI-573)
|
196
|
+
unless @virtualization_data[:system] && @virtualization_data[:role]
|
197
|
+
@virtualization_data[:system] = 'lxc'
|
198
|
+
@virtualization_data[:role] = 'host'
|
199
|
+
end
|
200
|
+
else
|
201
|
+
return false
|
202
|
+
end
|
203
|
+
true
|
204
|
+
end
|
205
|
+
|
206
|
+
def detect_docker
|
207
|
+
return false unless inspec.file('/.dockerenv').exist? || inspec.file('/.dockerinit').exist?
|
208
|
+
@virtualization_data[:system] = 'docker'
|
209
|
+
@virtualization_data[:role] = 'guest'
|
210
|
+
true
|
211
|
+
end
|
212
|
+
|
213
|
+
# Detect LXD
|
214
|
+
# See https://github.com/lxc/lxd/blob/master/doc/dev-lxd.md
|
215
|
+
def detect_lxd
|
216
|
+
if inspec.file('/dev/lxd/sock').exist?
|
217
|
+
@virtualization_data[:system] = 'lxd'
|
218
|
+
@virtualization_data[:role] = 'guest'
|
219
|
+
elsif inspec.file('/var/lib/lxd/devlxd').exist?
|
220
|
+
@virtualization_data[:system] = 'lxd'
|
221
|
+
@virtualization_data[:role] = 'host'
|
222
|
+
else
|
223
|
+
return false
|
224
|
+
end
|
225
|
+
true
|
226
|
+
end
|
227
|
+
|
228
|
+
def collect_data_linux # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
229
|
+
# This avoids doing multiple detections in a single test
|
230
|
+
return unless @virtualization_data.empty?
|
231
|
+
|
232
|
+
# each detect method will return true if it matched and was successfully
|
233
|
+
# able to populate @virtualization_data with stuff.
|
234
|
+
return if detect_xen
|
235
|
+
return if detect_virtualbox
|
236
|
+
return if detect_openstack
|
237
|
+
return if detect_kvm_from_cpuinfo
|
238
|
+
return if detect_kvm_from_sys
|
239
|
+
return if detect_openvz
|
240
|
+
return if detect_parallels
|
241
|
+
return if detect_linux_vserver
|
242
|
+
return if detect_lxc_docker
|
243
|
+
return if detect_docker
|
244
|
+
return if detect_lxd
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# check for a Windows feature
|
4
|
+
# Usage:
|
5
|
+
# describe windows_feature('DHCP Server') do
|
6
|
+
# it{ should be_installed }
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
# deprecated serverspec syntax:
|
10
|
+
# describe windows_feature('IIS-Webserver') do
|
11
|
+
# it{ should be_installed.by("dism") }
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# describe windows_feature('Web-Webserver') do
|
15
|
+
# it{ should be_installed.by("powershell") }
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# This implementation uses the Get-WindowsFeature commandlet:
|
19
|
+
# Get-WindowsFeature | Where-Object {$_.Name -eq 'XPS Viewer' -or $_.DisplayName -eq 'XPS Viewe
|
20
|
+
# r'} | Select-Object -Property Name,DisplayName,Description,Installed,InstallState | ConvertTo-Json
|
21
|
+
# {
|
22
|
+
# "Name": "XPS-Viewer",
|
23
|
+
# "DisplayName": "XPS Viewer",
|
24
|
+
# "Description": "The XPS Viewer is used to read, set permissions for, and digitally sign XPS documents.",
|
25
|
+
# "Installed": false,
|
26
|
+
# "InstallState": 0
|
27
|
+
# }
|
28
|
+
module Inspec::Resources
|
29
|
+
class WindowsFeature < Inspec.resource(1)
|
30
|
+
name 'windows_feature'
|
31
|
+
supports platform: 'windows'
|
32
|
+
desc 'Use the windows_feature InSpec audit resource to test features on Microsoft Windows.'
|
33
|
+
example "
|
34
|
+
describe windows_feature('dhcp') do
|
35
|
+
it { should be_installed }
|
36
|
+
end
|
37
|
+
"
|
38
|
+
|
39
|
+
def initialize(feature)
|
40
|
+
@feature = feature
|
41
|
+
@cache = nil
|
42
|
+
|
43
|
+
# verify that this resource is only supported on Windows
|
44
|
+
return skip_resource 'The `windows_feature` resource is not supported on your OS.' if !inspec.os.windows?
|
45
|
+
end
|
46
|
+
|
47
|
+
# returns true if the package is installed
|
48
|
+
def installed?(_provider = nil, _version = nil)
|
49
|
+
info[:installed] == true
|
50
|
+
end
|
51
|
+
|
52
|
+
# returns the package description
|
53
|
+
def info
|
54
|
+
return @cache if !@cache.nil?
|
55
|
+
features_cmd = "Get-WindowsFeature | Where-Object {$_.Name -eq '#{@feature}' -or $_.DisplayName -eq '#{@feature}'} | Select-Object -Property Name,DisplayName,Description,Installed,InstallState | ConvertTo-Json"
|
56
|
+
cmd = inspec.command(features_cmd)
|
57
|
+
|
58
|
+
@cache = {
|
59
|
+
name: @feature,
|
60
|
+
type: 'windows-feature',
|
61
|
+
}
|
62
|
+
|
63
|
+
# cannot rely on exit code for now, successful command returns exit code 1
|
64
|
+
# return nil if cmd.exit_status != 0
|
65
|
+
# try to parse json
|
66
|
+
begin
|
67
|
+
params = JSON.parse(cmd.stdout)
|
68
|
+
rescue JSON::ParserError => _e
|
69
|
+
return @cache
|
70
|
+
end
|
71
|
+
|
72
|
+
@cache = {
|
73
|
+
name: params['Name'],
|
74
|
+
description: params['Description'],
|
75
|
+
installed: params['Installed'],
|
76
|
+
type: 'windows-feature',
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
def to_s
|
81
|
+
"Windows Feature '#{@feature}'"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Inspec::Resources
|
4
|
+
class WindowsHotfix < Inspec.resource(1)
|
5
|
+
name 'windows_hotfix'
|
6
|
+
supports platform: 'windows'
|
7
|
+
desc 'Use the windows_hotfix InSpec audit resource to test if the hotfix has been installed on the Windows system.'
|
8
|
+
example "
|
9
|
+
describe windows_hotfix('KB4012212') do
|
10
|
+
it { should be_installed }
|
11
|
+
end
|
12
|
+
"
|
13
|
+
|
14
|
+
attr_accessor :content
|
15
|
+
|
16
|
+
def initialize(hotfix_id = nil)
|
17
|
+
@id = hotfix_id.upcase
|
18
|
+
@content = nil
|
19
|
+
os = inspec.os
|
20
|
+
return skip_resource 'The `windows_hotfix` resource is not a feature of your OS.' unless os.windows?
|
21
|
+
query = "get-hotfix -id #{@id}"
|
22
|
+
cmd = inspec.powershell(query)
|
23
|
+
@content = cmd.stdout
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
"Windows Hotfix #{@id}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def installed?
|
31
|
+
return false if @content.nil?
|
32
|
+
@content.include?(@id)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Inspec::Resources
|
3
|
+
class WindowsTasks < Inspec.resource(1)
|
4
|
+
name 'windows_task'
|
5
|
+
supports platform: 'windows'
|
6
|
+
desc 'Use the windows_task InSpec audit resource to test task schedules on Microsoft Windows.'
|
7
|
+
example "
|
8
|
+
describe windows_task('\\Microsoft\\Windows\\Time Synchronization\\SynchronizeTime') do
|
9
|
+
it { should be_enabled }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe windows_task('\\Microsoft\\Windows\\AppID\\PolicyConverter') do
|
13
|
+
it { should be_disabled }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe windows_task('\\Microsoft\\Windows\\Defrag\\ScheduledDefrag') do
|
17
|
+
it { should exist }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe windows_task('\\Microsoft\\Windows\\AppID\\PolicyConverter') do
|
21
|
+
its('logon_mode') { should eq 'Interactive/Background' }
|
22
|
+
its('last_result') { should eq '1' }
|
23
|
+
its('task_to_run') { should cmp '%Windir%\\system32\\appidpolicyconverter.exe' }
|
24
|
+
its('run_as_user') { should eq 'LOCAL SERVICE' }
|
25
|
+
end
|
26
|
+
"
|
27
|
+
|
28
|
+
def initialize(taskuri)
|
29
|
+
@taskuri = taskuri
|
30
|
+
@cache = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
def exists?
|
34
|
+
return true unless info.nil? || info[:uri].nil?
|
35
|
+
false
|
36
|
+
end
|
37
|
+
|
38
|
+
# rubocop:disable Style/WordArray
|
39
|
+
def enabled?
|
40
|
+
return false if info.nil? || info[:state].nil?
|
41
|
+
['Ready', 'Running'].include?(info[:state])
|
42
|
+
end
|
43
|
+
|
44
|
+
def disabled?
|
45
|
+
return false if info.nil? || info[:state].nil?
|
46
|
+
info[:scheduled_task_state] == 'Disabled' || info[:state] == 'Disabled'
|
47
|
+
end
|
48
|
+
|
49
|
+
def logon_mode
|
50
|
+
info[:logon_mode]
|
51
|
+
end
|
52
|
+
|
53
|
+
def last_result
|
54
|
+
info[:last_result]
|
55
|
+
end
|
56
|
+
|
57
|
+
def task_to_run
|
58
|
+
info[:task_to_run].to_s.strip
|
59
|
+
end
|
60
|
+
|
61
|
+
def run_as_user
|
62
|
+
info[:run_as_user]
|
63
|
+
end
|
64
|
+
|
65
|
+
def type
|
66
|
+
info[:type] unless info.nil?
|
67
|
+
end
|
68
|
+
|
69
|
+
def info
|
70
|
+
return @cache unless @cache.nil?
|
71
|
+
# PowerShell v5 has Get-ScheduledTask cmdlet,
|
72
|
+
# _using something with backward support to v3_
|
73
|
+
# script = "Get-ScheduledTask | ? { $_.URI -eq '#{@taskuri}' } | Select-Object URI,@{N='State';E={$_.State.ToString()}} | ConvertTo-Json"
|
74
|
+
|
75
|
+
# Using schtasks as suggested by @modille but aligning property names to match cmdlet to future proof.
|
76
|
+
script = "schtasks /query /v /fo csv /tn '#{@taskuri}' | ConvertFrom-Csv | Select @{N='URI';E={$_.TaskName}},@{N='State';E={$_.Status.ToString()}},'Logon Mode','Last Result','Task To Run','Run As User','Scheduled Task State' | ConvertTo-Json -Compress"
|
77
|
+
|
78
|
+
cmd = inspec.powershell(script)
|
79
|
+
|
80
|
+
begin
|
81
|
+
params = JSON.parse(cmd.stdout)
|
82
|
+
rescue JSON::ParserError => _e
|
83
|
+
return nil
|
84
|
+
end
|
85
|
+
|
86
|
+
@cache = {
|
87
|
+
uri: params['URI'],
|
88
|
+
state: params['State'],
|
89
|
+
logon_mode: params['Logon Mode'],
|
90
|
+
last_result: params['Last Result'],
|
91
|
+
task_to_run: params['Task To Run'],
|
92
|
+
run_as_user: params['Run As User'],
|
93
|
+
scheduled_task_state: params['Scheduled Task State'],
|
94
|
+
type: 'windows-task',
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
def to_s
|
99
|
+
"Windows Task '#{@taskuri}'"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|