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,66 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'utils/parser'
|
4
|
+
require 'utils/file_reader'
|
5
|
+
|
6
|
+
class EtcHosts < Inspec.resource(1)
|
7
|
+
name 'etc_hosts'
|
8
|
+
supports platform: 'linux'
|
9
|
+
supports platform: 'bsd'
|
10
|
+
supports platform: 'windows'
|
11
|
+
desc 'Use the etc_hosts InSpec audit resource to find an
|
12
|
+
ip_address and its associated hosts'
|
13
|
+
example "
|
14
|
+
describe etc_hosts.where { ip_address == '127.0.0.1' } do
|
15
|
+
its('ip_address') { should cmp '127.0.0.1' }
|
16
|
+
its('primary_name') { should cmp 'localhost' }
|
17
|
+
its('all_host_names') { should eq [['localhost', 'localhost.localdomain', 'localhost4', 'localhost4.localdomain4']] }
|
18
|
+
end
|
19
|
+
"
|
20
|
+
|
21
|
+
attr_reader :params
|
22
|
+
|
23
|
+
include CommentParser
|
24
|
+
include FileReader
|
25
|
+
|
26
|
+
DEFAULT_UNIX_PATH = '/etc/hosts'.freeze
|
27
|
+
DEFAULT_WINDOWS_PATH = 'C:\windows\system32\drivers\etc\hosts'.freeze
|
28
|
+
|
29
|
+
def initialize(hosts_path = nil)
|
30
|
+
content = read_file_content(hosts_path || default_hosts_file_path)
|
31
|
+
|
32
|
+
@params = parse_conf(content.lines)
|
33
|
+
end
|
34
|
+
|
35
|
+
FilterTable.create
|
36
|
+
.add_accessor(:where)
|
37
|
+
.add_accessor(:entries)
|
38
|
+
.add(:ip_address, field: 'ip_address')
|
39
|
+
.add(:primary_name, field: 'primary_name')
|
40
|
+
.add(:all_host_names, field: 'all_host_names')
|
41
|
+
.connect(self, :params)
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def default_hosts_file_path
|
46
|
+
inspec.os.windows? ? DEFAULT_WINDOWS_PATH : DEFAULT_UNIX_PATH
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse_conf(lines)
|
50
|
+
lines.reject(&:empty?).reject(&comment?).map(&parse_data).map(&format_data)
|
51
|
+
end
|
52
|
+
|
53
|
+
def comment?
|
54
|
+
parse_options = { comment_char: '#', standalone_comments: false }
|
55
|
+
|
56
|
+
->(data) { parse_comment_line(data, parse_options).first.empty? }
|
57
|
+
end
|
58
|
+
|
59
|
+
def parse_data
|
60
|
+
->(data) { [data.split[0], data.split[1], data.split[1..-1]] }
|
61
|
+
end
|
62
|
+
|
63
|
+
def format_data
|
64
|
+
->(data) { %w{ip_address primary_name all_host_names}.zip(data).to_h }
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'utils/parser'
|
4
|
+
require 'utils/file_reader'
|
5
|
+
|
6
|
+
module Inspec::Resources
|
7
|
+
class EtcHostsAllow < Inspec.resource(1)
|
8
|
+
name 'etc_hosts_allow'
|
9
|
+
supports platform: 'unix'
|
10
|
+
desc 'Use the etc_hosts_allow InSpec audit resource to test the connections
|
11
|
+
the client will allow. Controlled by the /etc/hosts.allow file.'
|
12
|
+
example "
|
13
|
+
describe etc_hosts_allow.where { daemon == 'ALL' } do
|
14
|
+
its('client_list') { should include ['127.0.0.1', '[::1]'] }
|
15
|
+
its('options') { should eq [[]] }
|
16
|
+
end
|
17
|
+
"
|
18
|
+
|
19
|
+
attr_reader :params
|
20
|
+
|
21
|
+
include CommentParser
|
22
|
+
include FileReader
|
23
|
+
|
24
|
+
def initialize(hosts_allow_path = nil)
|
25
|
+
@conf_path = hosts_allow_path || '/etc/hosts.allow'
|
26
|
+
@content = nil
|
27
|
+
@params = nil
|
28
|
+
read_content
|
29
|
+
end
|
30
|
+
|
31
|
+
filter = FilterTable.create
|
32
|
+
filter.add_accessor(:where)
|
33
|
+
.add_accessor(:entries)
|
34
|
+
.add(:daemon, field: 'daemon')
|
35
|
+
.add(:client_list, field: 'client_list')
|
36
|
+
.add(:options, field: 'options')
|
37
|
+
|
38
|
+
filter.connect(self, :params)
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def read_content
|
43
|
+
@content = ''
|
44
|
+
@params = {}
|
45
|
+
@content = split_daemons(read_file(@conf_path))
|
46
|
+
@params = parse_conf(@content)
|
47
|
+
end
|
48
|
+
|
49
|
+
def split_daemons(content)
|
50
|
+
split_daemons_list = []
|
51
|
+
content.each do |line|
|
52
|
+
data, = parse_comment_line(line, comment_char: '#', standalone_comments: false)
|
53
|
+
next unless data != ''
|
54
|
+
data.split(':')[0].split(',').each do |daemon|
|
55
|
+
split_daemons_list.push("#{daemon} : " + line.split(':', 2)[1])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
split_daemons_list
|
59
|
+
end
|
60
|
+
|
61
|
+
def parse_conf(content)
|
62
|
+
content.map do |line|
|
63
|
+
data, = parse_comment_line(line, comment_char: '#', standalone_comments: false)
|
64
|
+
parse_line(data) unless data == ''
|
65
|
+
end.compact
|
66
|
+
end
|
67
|
+
|
68
|
+
def parse_line(line)
|
69
|
+
daemon, clients_and_options = line.split(/:\s+/, 2)
|
70
|
+
daemon = daemon.strip
|
71
|
+
|
72
|
+
clients_and_options ||= ''
|
73
|
+
clients, options = clients_and_options.split(/\s+:\s+/, 2)
|
74
|
+
client_list = clients.split(/,/).map(&:strip)
|
75
|
+
|
76
|
+
options ||= ''
|
77
|
+
options_list = options.split(/:\s+/).map(&:strip)
|
78
|
+
|
79
|
+
{
|
80
|
+
'daemon' => daemon,
|
81
|
+
'client_list' => client_list,
|
82
|
+
'options' => options_list,
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
def read_file(conf_path = @conf_path)
|
87
|
+
read_file_content(conf_path).lines
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class EtcHostsDeny < EtcHostsAllow
|
92
|
+
name 'etc_hosts_deny'
|
93
|
+
supports platform: 'unix'
|
94
|
+
desc 'Use the etc_hosts_deny InSpec audit resource to test the connections
|
95
|
+
the client will deny. Controlled by the /etc/hosts.deny file.'
|
96
|
+
example "
|
97
|
+
describe etc_hosts_deny.where { daemon_list == 'ALL' } do
|
98
|
+
its('client_list') { should eq [['127.0.0.1', '[::1]']] }
|
99
|
+
its('options') { should eq [] }
|
100
|
+
end
|
101
|
+
"
|
102
|
+
|
103
|
+
def initialize(path = nil)
|
104
|
+
return skip_resource '`etc_hosts_deny` is not supported on your OS' unless inspec.os.linux?
|
105
|
+
super(path || '/etc/hosts.deny')
|
106
|
+
end
|
107
|
+
|
108
|
+
def to_s
|
109
|
+
'hosts.deny Configuration'
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,298 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2015, Vulcano Security GmbH
|
3
|
+
|
4
|
+
require 'shellwords'
|
5
|
+
|
6
|
+
module Inspec::Resources
|
7
|
+
module FilePermissionsSelector
|
8
|
+
def select_file_perms_style(os)
|
9
|
+
if os.unix?
|
10
|
+
UnixFilePermissions.new(inspec)
|
11
|
+
elsif os.windows?
|
12
|
+
WindowsFilePermissions.new(inspec)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class FileResource < Inspec.resource(1)
|
18
|
+
include FilePermissionsSelector
|
19
|
+
include LinuxMountParser
|
20
|
+
|
21
|
+
name 'file'
|
22
|
+
supports platform: 'unix'
|
23
|
+
supports platform: 'windows'
|
24
|
+
desc 'Use the file InSpec audit resource to test all system file types, including files, directories, symbolic links, named pipes, sockets, character devices, block devices, and doors.'
|
25
|
+
example "
|
26
|
+
describe file('path') do
|
27
|
+
it { should exist }
|
28
|
+
it { should be_file }
|
29
|
+
it { should be_readable }
|
30
|
+
it { should be_writable }
|
31
|
+
it { should be_executable.by_user('root') }
|
32
|
+
it { should be_owned_by 'root' }
|
33
|
+
its('mode') { should cmp '0644' }
|
34
|
+
end
|
35
|
+
"
|
36
|
+
|
37
|
+
attr_reader :file, :mount_options
|
38
|
+
def initialize(path)
|
39
|
+
# select permissions style
|
40
|
+
@perms_provider = select_file_perms_style(inspec.os)
|
41
|
+
@file = inspec.backend.file(path)
|
42
|
+
end
|
43
|
+
|
44
|
+
%w{
|
45
|
+
type exist? file? block_device? character_device? socket? directory?
|
46
|
+
symlink? pipe? mode mode? owner owned_by? group grouped_into?
|
47
|
+
link_path linked_to? mtime size selinux_label immutable?
|
48
|
+
product_version file_version version? md5sum sha256sum
|
49
|
+
path basename source source_path uid gid
|
50
|
+
}.each do |m|
|
51
|
+
define_method m.to_sym do |*args|
|
52
|
+
file.method(m.to_sym).call(*args)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def content
|
57
|
+
res = file.content
|
58
|
+
return nil if res.nil?
|
59
|
+
res.force_encoding('utf-8')
|
60
|
+
end
|
61
|
+
|
62
|
+
def contain(*_)
|
63
|
+
raise 'Contain is not supported. Please use standard RSpec matchers.'
|
64
|
+
end
|
65
|
+
|
66
|
+
def readable?(by_usergroup, by_specific_user)
|
67
|
+
return false unless exist?
|
68
|
+
return skip_resource '`readable?` is not supported on your OS yet.' if @perms_provider.nil?
|
69
|
+
|
70
|
+
file_permission_granted?('read', by_usergroup, by_specific_user)
|
71
|
+
end
|
72
|
+
|
73
|
+
def writable?(by_usergroup, by_specific_user)
|
74
|
+
return false unless exist?
|
75
|
+
return skip_resource '`writable?` is not supported on your OS yet.' if @perms_provider.nil?
|
76
|
+
|
77
|
+
file_permission_granted?('write', by_usergroup, by_specific_user)
|
78
|
+
end
|
79
|
+
|
80
|
+
def executable?(by_usergroup, by_specific_user)
|
81
|
+
return false unless exist?
|
82
|
+
return skip_resource '`executable?` is not supported on your OS yet.' if @perms_provider.nil?
|
83
|
+
|
84
|
+
file_permission_granted?('execute', by_usergroup, by_specific_user)
|
85
|
+
end
|
86
|
+
|
87
|
+
def allowed?(permission, opts = {})
|
88
|
+
return false unless exist?
|
89
|
+
return skip_resource '`allowed?` is not supported on your OS yet.' if @perms_provider.nil?
|
90
|
+
|
91
|
+
file_permission_granted?(permission, opts[:by], opts[:by_user])
|
92
|
+
end
|
93
|
+
|
94
|
+
def mounted?(expected_options = nil, identical = false)
|
95
|
+
mounted = file.mounted
|
96
|
+
|
97
|
+
# return if no additional parameters have been provided
|
98
|
+
return file.mounted? if expected_options.nil?
|
99
|
+
|
100
|
+
# deprecation warning, this functionality will be removed in future version
|
101
|
+
warn "[DEPRECATION] `be_mounted.with and be_mounted.only_with` are deprecated. Please use `mount('#{source_path}')` instead."
|
102
|
+
|
103
|
+
# we cannot read mount data on non-Linux systems
|
104
|
+
return nil if !inspec.os.linux?
|
105
|
+
|
106
|
+
# parse content if we are on linux
|
107
|
+
@mount_options ||= parse_mount_options(mounted.stdout, true)
|
108
|
+
|
109
|
+
if identical
|
110
|
+
# check if the options should be identical
|
111
|
+
@mount_options == expected_options
|
112
|
+
else
|
113
|
+
# otherwise compare the selected values
|
114
|
+
@mount_options.contains(expected_options)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def suid
|
119
|
+
(mode & 04000) > 0
|
120
|
+
end
|
121
|
+
|
122
|
+
alias setuid? suid
|
123
|
+
|
124
|
+
def sgid
|
125
|
+
(mode & 02000) > 0
|
126
|
+
end
|
127
|
+
|
128
|
+
alias setgid? sgid
|
129
|
+
|
130
|
+
def sticky
|
131
|
+
(mode & 01000) > 0
|
132
|
+
end
|
133
|
+
|
134
|
+
alias sticky? sticky
|
135
|
+
|
136
|
+
def to_s
|
137
|
+
"File #{source_path}"
|
138
|
+
end
|
139
|
+
|
140
|
+
private
|
141
|
+
|
142
|
+
def file_permission_granted?(access_type, by_usergroup, by_specific_user)
|
143
|
+
raise '`file_permission_granted?` is not supported on your OS' if @perms_provider.nil?
|
144
|
+
if by_specific_user.nil? || by_specific_user.empty?
|
145
|
+
@perms_provider.check_file_permission_by_mask(file, access_type, by_usergroup, by_specific_user)
|
146
|
+
else
|
147
|
+
@perms_provider.check_file_permission_by_user(access_type, by_specific_user, source_path)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
class FilePermissions
|
153
|
+
attr_reader :inspec
|
154
|
+
def initialize(inspec)
|
155
|
+
@inspec = inspec
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
class UnixFilePermissions < FilePermissions
|
160
|
+
def permission_flag(access_type)
|
161
|
+
case access_type
|
162
|
+
when 'read'
|
163
|
+
'r'
|
164
|
+
when 'write'
|
165
|
+
'w'
|
166
|
+
when 'execute'
|
167
|
+
'x'
|
168
|
+
else
|
169
|
+
raise 'Invalid access_type provided'
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def usergroup_for(usergroup, specific_user)
|
174
|
+
if usergroup == 'others'
|
175
|
+
'other'
|
176
|
+
elsif (usergroup.nil? || usergroup.empty?) && specific_user.nil?
|
177
|
+
'all'
|
178
|
+
else
|
179
|
+
usergroup
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def check_file_permission_by_mask(file, access_type, usergroup, specific_user)
|
184
|
+
usergroup = usergroup_for(usergroup, specific_user)
|
185
|
+
flag = permission_flag(access_type)
|
186
|
+
mask = file.unix_mode_mask(usergroup, flag)
|
187
|
+
raise 'Invalid usergroup/owner provided' if mask.nil?
|
188
|
+
(file.mode & mask) != 0
|
189
|
+
end
|
190
|
+
|
191
|
+
def check_file_permission_by_user(access_type, user, path)
|
192
|
+
flag = permission_flag(access_type)
|
193
|
+
if inspec.os.linux?
|
194
|
+
perm_cmd = "su -s /bin/sh -c \"test -#{flag} #{path}\" #{user}"
|
195
|
+
elsif inspec.os.bsd? || inspec.os.solaris?
|
196
|
+
perm_cmd = "sudo -u #{user} test -#{flag} #{path}"
|
197
|
+
elsif inspec.os.aix?
|
198
|
+
perm_cmd = "su #{user} -c test -#{flag} #{path}"
|
199
|
+
elsif inspec.os.hpux?
|
200
|
+
perm_cmd = "su #{user} -c \"test -#{flag} #{path}\""
|
201
|
+
else
|
202
|
+
return skip_resource 'The `file` resource does not support `by_user` on your OS.'
|
203
|
+
end
|
204
|
+
|
205
|
+
cmd = inspec.command(perm_cmd)
|
206
|
+
cmd.exit_status == 0 ? true : false
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
class WindowsFilePermissions < FilePermissions
|
211
|
+
def check_file_permission_by_mask(_file, _access_type, _usergroup, _specific_user)
|
212
|
+
raise '`check_file_permission_by_mask` is not supported on Windows'
|
213
|
+
end
|
214
|
+
|
215
|
+
def check_file_permission_by_user(access_type, user, path)
|
216
|
+
access_rule = translate_perm_names(access_type)
|
217
|
+
access_rule = convert_to_powershell_array(access_rule)
|
218
|
+
|
219
|
+
cmd = inspec.command("@(@((Get-Acl '#{path}').access | Where-Object {$_.AccessControlType -eq 'Allow' -and $_.IdentityReference -eq '#{user}' }) | Where-Object {($_.FileSystemRights.ToString().Split(',') | % {$_.trim()} | ? {#{access_rule} -contains $_}) -ne $null}) | measure | % { $_.Count }")
|
220
|
+
cmd.stdout.chomp == '0' ? false : true
|
221
|
+
end
|
222
|
+
|
223
|
+
private
|
224
|
+
|
225
|
+
def convert_to_powershell_array(arr)
|
226
|
+
if arr.empty?
|
227
|
+
'@()'
|
228
|
+
else
|
229
|
+
%{@('#{arr.join("', '")}')}
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
# Translates a developer-friendly string into a list of acceptable
|
234
|
+
# FileSystemRights that match it, because Windows has a fun heirarchy
|
235
|
+
# of permissions that are able to be noted in multiple ways.
|
236
|
+
#
|
237
|
+
# See also: https://www.codeproject.com/Reference/871338/AccessControl-FileSystemRights-Permissions-Table
|
238
|
+
def translate_perm_names(access_type)
|
239
|
+
names = translate_common_perms(access_type)
|
240
|
+
names ||= translate_granular_perms(access_type)
|
241
|
+
names ||= translate_uncommon_perms(access_type)
|
242
|
+
raise 'Invalid access_type provided' unless names
|
243
|
+
|
244
|
+
names
|
245
|
+
end
|
246
|
+
|
247
|
+
def translate_common_perms(access_type)
|
248
|
+
case access_type
|
249
|
+
when 'full-control'
|
250
|
+
%w{FullControl}
|
251
|
+
when 'modify'
|
252
|
+
translate_perm_names('full-control') + %w{Modify}
|
253
|
+
when 'read'
|
254
|
+
translate_perm_names('modify') + %w{ReadAndExecute Read}
|
255
|
+
when 'write'
|
256
|
+
translate_perm_names('modify') + %w{Write}
|
257
|
+
when 'execute'
|
258
|
+
translate_perm_names('modify') + %w{ReadAndExecute ExecuteFile Traverse}
|
259
|
+
when 'delete'
|
260
|
+
translate_perm_names('modify') + %w{Delete}
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def translate_uncommon_perms(access_type)
|
265
|
+
case access_type
|
266
|
+
when 'delete-subdirectories-and-files'
|
267
|
+
translate_perm_names('full-control') + %w{DeleteSubdirectoriesAndFiles}
|
268
|
+
when 'change-permissions'
|
269
|
+
translate_perm_names('full-control') + %w{ChangePermissions}
|
270
|
+
when 'take-ownership'
|
271
|
+
translate_perm_names('full-control') + %w{TakeOwnership}
|
272
|
+
when 'synchronize'
|
273
|
+
translate_perm_names('full-control') + %w{Synchronize}
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def translate_granular_perms(access_type)
|
278
|
+
case access_type
|
279
|
+
when 'write-data', 'create-files'
|
280
|
+
translate_perm_names('write') + %w{WriteData CreateFiles}
|
281
|
+
when 'append-data', 'create-directories'
|
282
|
+
translate_perm_names('write') + %w{CreateDirectories AppendData}
|
283
|
+
when 'write-extended-attributes'
|
284
|
+
translate_perm_names('write') + %w{WriteExtendedAttributes}
|
285
|
+
when 'write-attributes'
|
286
|
+
translate_perm_names('write') + %w{WriteAttributes}
|
287
|
+
when 'read-data', 'list-directory'
|
288
|
+
translate_perm_names('read') + %w{ReadData ListDirectory}
|
289
|
+
when 'read-attributes'
|
290
|
+
translate_perm_names('read') + %w{ReadAttributes}
|
291
|
+
when 'read-extended-attributes'
|
292
|
+
translate_perm_names('read') + %w{ReadExtendedAttributes}
|
293
|
+
when 'read-permissions'
|
294
|
+
translate_perm_names('read') + %w{ReadPermissions}
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|