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,31 @@
|
|
1
|
+
module Inspec::Resources
|
2
|
+
class FileSystemResource < Inspec.resource(1)
|
3
|
+
name 'filesystem'
|
4
|
+
supports platform: 'linux'
|
5
|
+
desc 'Use the filesystem InSpec resource to test file system'
|
6
|
+
example "
|
7
|
+
describe filesystem('/') do
|
8
|
+
its('size') { should be >= 32000 }
|
9
|
+
end
|
10
|
+
"
|
11
|
+
attr_reader :partition
|
12
|
+
|
13
|
+
def initialize(partition)
|
14
|
+
@partition = partition
|
15
|
+
end
|
16
|
+
|
17
|
+
def size
|
18
|
+
@size ||= begin
|
19
|
+
cmd = inspec.command("df #{partition} --output=size")
|
20
|
+
raise Inspec::Exceptions::ResourceFailed, "Unable to get available space for partition #{partition}" if cmd.stdout.nil? || cmd.stdout.empty? || !cmd.exit_status.zero?
|
21
|
+
|
22
|
+
value = cmd.stdout.gsub(/\dK-blocks[\r\n]/, '').strip
|
23
|
+
value.to_i
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
"Filesystem #{partition}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Inspec::Resources
|
4
|
+
class FirewallD < Inspec.resource(1)
|
5
|
+
###
|
6
|
+
# This recourse assumes that the file sudo vim /etc/polkit-1/rules.d/49-nopasswd_global.rules has been
|
7
|
+
# set to allow users in group "wheel" to perform any commands without authentication.
|
8
|
+
###
|
9
|
+
|
10
|
+
name 'firewalld'
|
11
|
+
supports platform: 'linux'
|
12
|
+
desc 'Use the firewalld resource to check and see if firewalld is configured to grand or deny access to specific hosts or services'
|
13
|
+
example "
|
14
|
+
describe firewalld do
|
15
|
+
it { should be_running }
|
16
|
+
its('default_zone') { should eq 'public' }
|
17
|
+
it { should have_service_enabled_in_zone('ssh', 'public') }
|
18
|
+
it { should have_rule_enabled('rule family=ipv4 source address=192.168.0.14 accept', 'public') }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe firewalld.where { zone == 'public' } do
|
22
|
+
its('interfaces') { should cmp ['enp0s3', 'eno2'] }
|
23
|
+
its('sources') { should cmp ['ssh', 'icmp'] }
|
24
|
+
its('services') { should cmp ['192.168.1.0/24', '192.168.1.2'] }
|
25
|
+
end
|
26
|
+
"
|
27
|
+
|
28
|
+
attr_reader :params
|
29
|
+
|
30
|
+
filter = FilterTable.create
|
31
|
+
filter.add_accessor(:where)
|
32
|
+
.add_accessor(:entries)
|
33
|
+
.add(:zone, field: 'zone')
|
34
|
+
.add(:interfaces, field: 'interfaces')
|
35
|
+
.add(:sources, field: 'sources')
|
36
|
+
.add(:services, field: 'services')
|
37
|
+
|
38
|
+
filter.connect(self, :params)
|
39
|
+
|
40
|
+
def initialize
|
41
|
+
@params = parse_active_zones(active_zones)
|
42
|
+
end
|
43
|
+
|
44
|
+
def installed?
|
45
|
+
inspec.command('firewall-cmd').exist?
|
46
|
+
end
|
47
|
+
|
48
|
+
def has_zone?(query_zone)
|
49
|
+
return false unless installed?
|
50
|
+
result = firewalld_command('--get-zones').split(' ')
|
51
|
+
result.include?(query_zone)
|
52
|
+
end
|
53
|
+
|
54
|
+
def running?
|
55
|
+
return false unless installed?
|
56
|
+
result = firewalld_command('--state')
|
57
|
+
result =~ /^running/ ? true : false
|
58
|
+
end
|
59
|
+
|
60
|
+
def default_zone
|
61
|
+
# return: word associated with the name of the default zone
|
62
|
+
# example: 'public'
|
63
|
+
firewalld_command('--get-default-zone')
|
64
|
+
end
|
65
|
+
|
66
|
+
def has_service_enabled_in_zone?(query_service, query_zone = default_zone)
|
67
|
+
firewalld_command("--zone=#{query_zone} --query-service=#{query_service}") == 'yes'
|
68
|
+
end
|
69
|
+
|
70
|
+
def service_ports_enabled_in_zone(query_service, query_zone = default_zone)
|
71
|
+
# return: String of ports open
|
72
|
+
# example: ['22/tcp', '4722/tcp']
|
73
|
+
firewalld_command("--zone=#{query_zone} --service=#{query_service} --get-ports --permanent").split(' ')
|
74
|
+
end
|
75
|
+
|
76
|
+
def service_protocols_enabled_in_zone(query_service, query_zone = default_zone)
|
77
|
+
# return: String of protocoals open
|
78
|
+
# example: ['icmp', 'ipv4', 'igmp']
|
79
|
+
firewalld_command("--zone=#{query_zone} --service=#{query_service} --get-protocols --permanent").split(' ')
|
80
|
+
end
|
81
|
+
|
82
|
+
def has_port_enabled_in_zone?(query_port, query_zone = default_zone)
|
83
|
+
firewalld_command("--zone=#{query_zone} --query-port=#{query_port}") == 'yes'
|
84
|
+
end
|
85
|
+
|
86
|
+
def has_rule_enabled?(rule, query_zone = default_zone)
|
87
|
+
rule = "rule #{rule}" unless rule.start_with?('rule')
|
88
|
+
firewalld_command("--zone=#{query_zone} --query-rich-rule='#{rule}'") == 'yes'
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def active_zones
|
94
|
+
# return syntax:
|
95
|
+
# [default-zone-name]
|
96
|
+
# interfaces: [open interfases]
|
97
|
+
#
|
98
|
+
# example:
|
99
|
+
# public
|
100
|
+
# interfaces: enp0s3
|
101
|
+
firewalld_command('--get-active-zones')
|
102
|
+
end
|
103
|
+
|
104
|
+
def parse_active_zones(content)
|
105
|
+
# Split by every second line, which contains the zone and the interfaces.
|
106
|
+
content = content.split(/\n/).each_slice(2).map { |slice| slice.join("\n") }
|
107
|
+
content.map do |line|
|
108
|
+
parse_line(line)
|
109
|
+
end.compact
|
110
|
+
end
|
111
|
+
|
112
|
+
def parse_line(line)
|
113
|
+
zone = line.split("\n")[0]
|
114
|
+
{
|
115
|
+
'zone' => zone,
|
116
|
+
'interfaces' => line.split(':')[1].split(' '),
|
117
|
+
'services' => services_bound(zone),
|
118
|
+
'sources' => sources_bound(zone),
|
119
|
+
}
|
120
|
+
end
|
121
|
+
|
122
|
+
def sources_bound(query_zone)
|
123
|
+
# result: a list containing either an ip address or ip address with a mask, or a ipset or an ipset with the ipset prefix.
|
124
|
+
# example: ['192.168.0.4', '192.168.0.0/16', '2111:DB28:ABC:12::', '2111:db89:ab3d:0112::0/64']
|
125
|
+
firewalld_command("--zone=#{query_zone} --list-sources").split(' ')
|
126
|
+
end
|
127
|
+
|
128
|
+
def services_bound(query_zone)
|
129
|
+
# result: a list of services bound to a zone.
|
130
|
+
# example: ['ssh', 'dhcpv6-client']
|
131
|
+
firewalld_command("--zone=#{query_zone} --list-services").split(' ')
|
132
|
+
end
|
133
|
+
|
134
|
+
def firewalld_command(command)
|
135
|
+
command = "firewall-cmd #{command}"
|
136
|
+
result = inspec.command(command)
|
137
|
+
if result.stderr != ''
|
138
|
+
return "Error on command #{command}: #{result.stderr}"
|
139
|
+
end
|
140
|
+
result.stdout.strip
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Inspec::Resources
|
4
|
+
class GemPackage < Inspec.resource(1)
|
5
|
+
name 'gem'
|
6
|
+
supports platform: 'unix'
|
7
|
+
supports platform: 'windows'
|
8
|
+
desc 'Use the gem InSpec audit resource to test if a global gem package is installed.'
|
9
|
+
example "
|
10
|
+
describe gem('rubocop') do
|
11
|
+
it { should be_installed }
|
12
|
+
its('version') { should eq '0.33.0' }
|
13
|
+
end
|
14
|
+
"
|
15
|
+
|
16
|
+
attr_reader :gem_binary
|
17
|
+
|
18
|
+
def initialize(package_name, gem_binary = nil)
|
19
|
+
@package_name = package_name
|
20
|
+
@gem_binary = case gem_binary
|
21
|
+
when nil
|
22
|
+
'gem'
|
23
|
+
when :chef
|
24
|
+
if inspec.os.windows?
|
25
|
+
'c:\opscode\chef\embedded\bin\gem.bat'
|
26
|
+
else
|
27
|
+
'/opt/chef/embedded/bin/gem'
|
28
|
+
end
|
29
|
+
when :chef_server
|
30
|
+
'/opt/opscode/embedded/bin/gem'
|
31
|
+
else
|
32
|
+
gem_binary
|
33
|
+
end
|
34
|
+
skip_resource 'Unable to retrieve gem information' if info.empty?
|
35
|
+
end
|
36
|
+
|
37
|
+
def info
|
38
|
+
return @info if defined?(@info)
|
39
|
+
|
40
|
+
cmd = inspec.command("#{@gem_binary} list --local -a -q \^#{@package_name}\$")
|
41
|
+
return {} unless cmd.exit_status.zero?
|
42
|
+
|
43
|
+
# extract package name and version
|
44
|
+
# parses data like winrm (1.3.4, 1.3.3)
|
45
|
+
params = /^\s*([^\(]*?)\s*\((.*?)\)\s*$/.match(cmd.stdout.chomp)
|
46
|
+
@info = {
|
47
|
+
installed: !params.nil?,
|
48
|
+
type: 'gem',
|
49
|
+
}
|
50
|
+
return @info unless @info[:installed]
|
51
|
+
|
52
|
+
versions = params[2].split(',')
|
53
|
+
@info[:name] = params[1]
|
54
|
+
@info[:version] = versions[0]
|
55
|
+
@info
|
56
|
+
end
|
57
|
+
|
58
|
+
def installed?
|
59
|
+
info[:installed] == true
|
60
|
+
end
|
61
|
+
|
62
|
+
def version
|
63
|
+
info[:version]
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_s
|
67
|
+
"gem package #{@package_name}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,215 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'utils/filter'
|
4
|
+
|
5
|
+
module Inspec::Resources
|
6
|
+
# This file contains two resources, the `group` and `groups` resource.
|
7
|
+
# The `group` resource is optimized for requests that verify specific groups
|
8
|
+
# that you know upfront for testing. If you need to query all groups or search
|
9
|
+
# specific groups with certain properties, use the `groups` resource.
|
10
|
+
module GroupManagementSelector
|
11
|
+
# select group provider based on the operating system
|
12
|
+
# returns nil, if no group manager was found for the operating system
|
13
|
+
def select_group_manager(os)
|
14
|
+
@group_provider = if os.darwin?
|
15
|
+
DarwinGroup.new(inspec)
|
16
|
+
elsif os.unix?
|
17
|
+
UnixGroup.new(inspec)
|
18
|
+
elsif os.windows?
|
19
|
+
WindowsGroup.new(inspec)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Groups < Inspec.resource(1)
|
25
|
+
include GroupManagementSelector
|
26
|
+
|
27
|
+
name 'groups'
|
28
|
+
supports platform: 'unix'
|
29
|
+
supports platform: 'windows'
|
30
|
+
desc 'Use the group InSpec audit resource to test groups on the system. Groups can be filtered.'
|
31
|
+
example "
|
32
|
+
describe groups.where { name == 'root'} do
|
33
|
+
its('names') { should eq ['root'] }
|
34
|
+
its('gids') { should eq [0] }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe groups.where { name == 'Administrators'} do
|
38
|
+
its('names') { should eq ['Administrators'] }
|
39
|
+
its('gids') { should eq ['S-1-5-32-544'] }
|
40
|
+
end
|
41
|
+
"
|
42
|
+
|
43
|
+
def initialize
|
44
|
+
# select group manager
|
45
|
+
@group_provider = select_group_manager(inspec.os)
|
46
|
+
return skip_resource 'The `groups` resource is not supported on your OS yet.' if @group_provider.nil?
|
47
|
+
end
|
48
|
+
|
49
|
+
filter = FilterTable.create
|
50
|
+
filter.add_accessor(:where)
|
51
|
+
.add_accessor(:entries)
|
52
|
+
.add(:names, field: 'name')
|
53
|
+
.add(:gids, field: 'gid')
|
54
|
+
.add(:domains, field: 'domain')
|
55
|
+
.add(:exists?) { |x| !x.entries.empty? }
|
56
|
+
filter.connect(self, :collect_group_details)
|
57
|
+
|
58
|
+
def to_s
|
59
|
+
'Groups'
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# collects information about every group
|
65
|
+
def collect_group_details
|
66
|
+
return @groups_cache ||= @group_provider.groups unless @group_provider.nil?
|
67
|
+
[]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Usage:
|
72
|
+
# describe group('root') do
|
73
|
+
# it { should exist }
|
74
|
+
# its('gid') { should eq 0 }
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# deprecated has matcher
|
78
|
+
# describe group('root') do
|
79
|
+
# it { should have_gid 0 }
|
80
|
+
# end
|
81
|
+
class Group < Inspec.resource(1)
|
82
|
+
include GroupManagementSelector
|
83
|
+
|
84
|
+
name 'group'
|
85
|
+
supports platform: 'unix'
|
86
|
+
supports platform: 'windows'
|
87
|
+
desc 'Use the group InSpec audit resource to test groups on the system.'
|
88
|
+
example "
|
89
|
+
describe group('root') do
|
90
|
+
it { should exist }
|
91
|
+
its('gid') { should eq 0 }
|
92
|
+
end
|
93
|
+
"
|
94
|
+
|
95
|
+
def initialize(groupname)
|
96
|
+
@group = groupname
|
97
|
+
|
98
|
+
# select group manager
|
99
|
+
@group_provider = select_group_manager(inspec.os)
|
100
|
+
return skip_resource 'The `group` resource is not supported on your OS yet.' if @group_provider.nil?
|
101
|
+
end
|
102
|
+
|
103
|
+
# verifies if a group exists
|
104
|
+
def exists?
|
105
|
+
!group_info.entries.empty?
|
106
|
+
end
|
107
|
+
|
108
|
+
def gid
|
109
|
+
gids = group_info.gids
|
110
|
+
if gids.empty?
|
111
|
+
nil
|
112
|
+
# the default case should be one group
|
113
|
+
elsif gids.size == 1
|
114
|
+
gids.entries[0]
|
115
|
+
else
|
116
|
+
raise 'found more than one group with the same name, please use `groups` resource'
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# implements rspec has matcher, to be compatible with serverspec
|
121
|
+
def has_gid?(compare_gid)
|
122
|
+
gid == compare_gid
|
123
|
+
end
|
124
|
+
|
125
|
+
def local
|
126
|
+
# at this point the implementation only returns local groups
|
127
|
+
true
|
128
|
+
end
|
129
|
+
|
130
|
+
def to_s
|
131
|
+
"Group #{@group}"
|
132
|
+
end
|
133
|
+
|
134
|
+
private
|
135
|
+
|
136
|
+
def group_info
|
137
|
+
# we need a local copy for the block
|
138
|
+
group = @group.dup
|
139
|
+
@groups_cache ||= inspec.groups.where { name == group }
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class GroupInfo
|
144
|
+
attr_reader :inspec
|
145
|
+
def initialize(inspec)
|
146
|
+
@inspec = inspec
|
147
|
+
end
|
148
|
+
|
149
|
+
def groups
|
150
|
+
raise 'group provider must implement the `groups` method'
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# implements generic unix groups via /etc/group
|
155
|
+
class UnixGroup < GroupInfo
|
156
|
+
def groups
|
157
|
+
inspec.etc_group.entries
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# OSX uses opendirectory for groups, so `/etc/group` may not be fully accurate
|
162
|
+
# This uses `dscacheutil` to get the group info instead of `etc_group`
|
163
|
+
class DarwinGroup < GroupInfo
|
164
|
+
def groups
|
165
|
+
group_info = inspec.command('dscacheutil -q group').stdout.split("\n\n")
|
166
|
+
|
167
|
+
groups = []
|
168
|
+
regex = /^([^:]*?)\s*:\s(.*?)\s*$/
|
169
|
+
group_info.each do |data|
|
170
|
+
groups << inspec.parse_config(data, assignment_regex: regex).params
|
171
|
+
end
|
172
|
+
|
173
|
+
# Convert the `dscacheutil` groups to match `inspec.etc_group.entries`
|
174
|
+
groups.each { |g| g['gid'] = g['gid'].to_i }
|
175
|
+
groups.each do |g|
|
176
|
+
next if g['users'].nil?
|
177
|
+
g['members'] = g.delete('users')
|
178
|
+
g['members'].tr!(' ', ',')
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
class WindowsGroup < GroupInfo
|
184
|
+
# returns all local groups
|
185
|
+
def groups
|
186
|
+
script = <<~EOH
|
187
|
+
Function ConvertTo-SID { Param([byte[]]$BinarySID)
|
188
|
+
(New-Object System.Security.Principal.SecurityIdentifier($BinarySID,0)).Value
|
189
|
+
}
|
190
|
+
|
191
|
+
$Computername = $Env:Computername
|
192
|
+
$adsi = [ADSI]"WinNT://$Computername"
|
193
|
+
$groups = $adsi.Children | where {$_.SchemaClassName -eq 'group'} | ForEach {
|
194
|
+
$name = $_.Name[0]
|
195
|
+
$sid = ConvertTo-SID -BinarySID $_.ObjectSID[0]
|
196
|
+
$group =[ADSI]$_.Path
|
197
|
+
new-object psobject -property @{name = $group.Name[0]; gid = $sid; domain=$Computername}
|
198
|
+
}
|
199
|
+
$groups | ConvertTo-Json -Depth 3
|
200
|
+
EOH
|
201
|
+
cmd = inspec.powershell(script)
|
202
|
+
# cannot rely on exit code for now, successful command returns exit code 1
|
203
|
+
# return nil if cmd.exit_status != 0, try to parse json
|
204
|
+
begin
|
205
|
+
groups = JSON.parse(cmd.stdout)
|
206
|
+
rescue JSON::ParserError => _e
|
207
|
+
return []
|
208
|
+
end
|
209
|
+
|
210
|
+
# ensure we have an array of groups
|
211
|
+
groups = [groups] if !groups.is_a?(Array)
|
212
|
+
groups
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|