inspec 2.0.32 → 2.0.45
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 +4 -4
- data/.rubocop.yml +101 -101
- data/CHANGELOG.md +2991 -2970
- data/Gemfile +55 -55
- data/LICENSE +14 -14
- data/MAINTAINERS.md +33 -33
- data/MAINTAINERS.toml +52 -52
- data/README.md +446 -437
- data/Rakefile +322 -322
- data/bin/inspec +12 -12
- data/docs/.gitignore +2 -2
- data/docs/README.md +40 -40
- data/docs/dsl_inspec.md +258 -258
- data/docs/dsl_resource.md +93 -93
- data/docs/glossary.md +99 -99
- data/docs/habitat.md +191 -191
- data/docs/inspec_and_friends.md +107 -107
- data/docs/matchers.md +169 -168
- data/docs/migration.md +293 -293
- data/docs/platforms.md +118 -118
- data/docs/plugin_kitchen_inspec.md +49 -49
- data/docs/profiles.md +370 -370
- data/docs/reporters.md +105 -105
- data/docs/resources/aide_conf.md.erb +75 -75
- data/docs/resources/apache.md.erb +67 -67
- data/docs/resources/apache_conf.md.erb +68 -68
- data/docs/resources/apt.md.erb +71 -71
- data/docs/resources/audit_policy.md.erb +47 -47
- data/docs/resources/auditd.md.erb +79 -79
- data/docs/resources/auditd_conf.md.erb +68 -68
- data/docs/resources/aws_cloudtrail_trail.md.erb +140 -140
- data/docs/resources/aws_cloudtrail_trails.md.erb +81 -81
- data/docs/resources/aws_cloudwatch_alarm.md.erb +86 -86
- data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +151 -151
- data/docs/resources/aws_config_recorder.md.erb +71 -71
- data/docs/resources/aws_ec2_instance.md.erb +106 -106
- data/docs/resources/aws_iam_access_key.md.erb +123 -123
- data/docs/resources/aws_iam_access_keys.md.erb +198 -198
- data/docs/resources/aws_iam_group.md.erb +46 -46
- data/docs/resources/aws_iam_groups.md.erb +43 -43
- data/docs/resources/aws_iam_password_policy.md.erb +76 -76
- data/docs/resources/aws_iam_policies.md.erb +82 -82
- data/docs/resources/aws_iam_policy.md.erb +144 -144
- data/docs/resources/aws_iam_role.md.erb +63 -63
- data/docs/resources/aws_iam_root_user.md.erb +58 -58
- data/docs/resources/aws_iam_user.md.erb +64 -64
- data/docs/resources/aws_iam_users.md.erb +89 -89
- data/docs/resources/aws_kms_keys.md.erb +84 -84
- data/docs/resources/aws_route_table.md.erb +47 -47
- data/docs/resources/aws_s3_bucket.md.erb +134 -134
- data/docs/resources/aws_security_group.md.erb +151 -151
- data/docs/resources/aws_security_groups.md.erb +91 -91
- data/docs/resources/aws_sns_topic.md.erb +63 -63
- data/docs/resources/aws_subnet.md.erb +133 -133
- data/docs/resources/aws_subnets.md.erb +126 -126
- data/docs/resources/aws_vpc.md.erb +120 -120
- data/docs/resources/aws_vpcs.md.erb +48 -48
- data/docs/resources/azure_generic_resource.md.erb +170 -170
- data/docs/resources/azure_resource_group.md.erb +284 -284
- data/docs/resources/azure_virtual_machine.md.erb +347 -347
- data/docs/resources/azure_virtual_machine_data_disk.md.erb +224 -224
- data/docs/resources/bash.md.erb +75 -75
- data/docs/resources/bond.md.erb +90 -90
- data/docs/resources/bridge.md.erb +57 -57
- data/docs/resources/bsd_service.md.erb +67 -67
- data/docs/resources/command.md.erb +138 -138
- data/docs/resources/cpan.md.erb +79 -79
- data/docs/resources/cran.md.erb +64 -64
- data/docs/resources/crontab.md.erb +89 -89
- data/docs/resources/csv.md.erb +54 -54
- data/docs/resources/dh_params.md.erb +205 -205
- data/docs/resources/directory.md.erb +30 -30
- data/docs/resources/docker.md.erb +219 -219
- data/docs/resources/docker_container.md.erb +104 -104
- data/docs/resources/docker_image.md.erb +94 -94
- data/docs/resources/docker_service.md.erb +114 -114
- data/docs/resources/elasticsearch.md.erb +242 -242
- data/docs/resources/etc_fstab.md.erb +125 -125
- data/docs/resources/etc_group.md.erb +75 -75
- data/docs/resources/etc_hosts.md.erb +78 -78
- data/docs/resources/etc_hosts_allow.md.erb +74 -74
- data/docs/resources/etc_hosts_deny.md.erb +74 -74
- data/docs/resources/file.md.erb +526 -515
- data/docs/resources/filesystem.md.erb +41 -41
- data/docs/resources/firewalld.md.erb +107 -107
- data/docs/resources/gem.md.erb +79 -79
- data/docs/resources/group.md.erb +61 -61
- data/docs/resources/grub_conf.md.erb +101 -101
- data/docs/resources/host.md.erb +86 -86
- data/docs/resources/http.md.erb +196 -196
- data/docs/resources/iis_app.md.erb +122 -122
- data/docs/resources/iis_site.md.erb +135 -135
- data/docs/resources/inetd_conf.md.erb +94 -94
- data/docs/resources/ini.md.erb +76 -76
- data/docs/resources/interface.md.erb +58 -58
- data/docs/resources/iptables.md.erb +64 -64
- data/docs/resources/json.md.erb +63 -63
- data/docs/resources/kernel_module.md.erb +120 -120
- data/docs/resources/kernel_parameter.md.erb +53 -53
- data/docs/resources/key_rsa.md.erb +85 -85
- data/docs/resources/launchd_service.md.erb +57 -57
- data/docs/resources/limits_conf.md.erb +75 -75
- data/docs/resources/login_def.md.erb +71 -71
- data/docs/resources/mount.md.erb +69 -69
- data/docs/resources/mssql_session.md.erb +60 -60
- data/docs/resources/mysql_conf.md.erb +99 -99
- data/docs/resources/mysql_session.md.erb +74 -74
- data/docs/resources/nginx.md.erb +79 -79
- data/docs/resources/nginx_conf.md.erb +128 -128
- data/docs/resources/npm.md.erb +60 -60
- data/docs/resources/ntp_conf.md.erb +60 -60
- data/docs/resources/oneget.md.erb +53 -53
- data/docs/resources/oracledb_session.md.erb +52 -52
- data/docs/resources/os.md.erb +141 -141
- data/docs/resources/os_env.md.erb +78 -78
- data/docs/resources/package.md.erb +120 -120
- data/docs/resources/packages.md.erb +67 -67
- data/docs/resources/parse_config.md.erb +103 -103
- data/docs/resources/parse_config_file.md.erb +138 -138
- data/docs/resources/passwd.md.erb +141 -141
- data/docs/resources/pip.md.erb +67 -67
- data/docs/resources/port.md.erb +137 -137
- data/docs/resources/postgres_conf.md.erb +79 -79
- data/docs/resources/postgres_hba_conf.md.erb +93 -93
- data/docs/resources/postgres_ident_conf.md.erb +76 -76
- data/docs/resources/postgres_session.md.erb +69 -69
- data/docs/resources/powershell.md.erb +102 -102
- data/docs/resources/processes.md.erb +109 -109
- data/docs/resources/rabbitmq_config.md.erb +41 -41
- data/docs/resources/registry_key.md.erb +158 -158
- data/docs/resources/runit_service.md.erb +57 -57
- data/docs/resources/security_policy.md.erb +47 -47
- data/docs/resources/service.md.erb +121 -121
- data/docs/resources/shadow.md.erb +146 -144
- data/docs/resources/ssh_config.md.erb +80 -80
- data/docs/resources/sshd_config.md.erb +83 -83
- data/docs/resources/ssl.md.erb +119 -119
- data/docs/resources/sys_info.md.erb +42 -42
- data/docs/resources/systemd_service.md.erb +57 -57
- data/docs/resources/sysv_service.md.erb +57 -57
- data/docs/resources/upstart_service.md.erb +57 -57
- data/docs/resources/user.md.erb +140 -140
- data/docs/resources/users.md.erb +127 -127
- data/docs/resources/vbscript.md.erb +55 -55
- data/docs/resources/virtualization.md.erb +57 -57
- data/docs/resources/windows_feature.md.erb +47 -47
- data/docs/resources/windows_hotfix.md.erb +53 -53
- data/docs/resources/windows_task.md.erb +95 -95
- data/docs/resources/wmi.md.erb +81 -81
- data/docs/resources/x509_certificate.md.erb +151 -151
- data/docs/resources/xinetd_conf.md.erb +156 -156
- data/docs/resources/xml.md.erb +85 -85
- data/docs/resources/yaml.md.erb +69 -69
- data/docs/resources/yum.md.erb +98 -98
- data/docs/resources/zfs_dataset.md.erb +53 -53
- data/docs/resources/zfs_pool.md.erb +47 -47
- data/docs/ruby_usage.md +203 -203
- data/docs/shared/matcher_be.md.erb +1 -1
- data/docs/shared/matcher_cmp.md.erb +43 -43
- data/docs/shared/matcher_eq.md.erb +3 -3
- data/docs/shared/matcher_include.md.erb +1 -1
- data/docs/shared/matcher_match.md.erb +1 -1
- data/docs/shell.md +215 -215
- data/examples/README.md +8 -8
- data/examples/inheritance/README.md +65 -65
- data/examples/inheritance/controls/example.rb +14 -14
- data/examples/inheritance/inspec.yml +15 -15
- data/examples/kitchen-ansible/.kitchen.yml +25 -25
- data/examples/kitchen-ansible/Gemfile +19 -19
- data/examples/kitchen-ansible/README.md +53 -53
- data/examples/kitchen-ansible/files/nginx.repo +6 -6
- data/examples/kitchen-ansible/tasks/main.yml +16 -16
- data/examples/kitchen-ansible/test/integration/default/default.yml +5 -5
- data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -28
- data/examples/kitchen-chef/.kitchen.yml +20 -20
- data/examples/kitchen-chef/Berksfile +3 -3
- data/examples/kitchen-chef/Gemfile +19 -19
- data/examples/kitchen-chef/README.md +27 -27
- data/examples/kitchen-chef/metadata.rb +7 -7
- data/examples/kitchen-chef/recipes/default.rb +6 -6
- data/examples/kitchen-chef/recipes/nginx.rb +30 -30
- data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -28
- data/examples/kitchen-puppet/.kitchen.yml +22 -22
- data/examples/kitchen-puppet/Gemfile +20 -20
- data/examples/kitchen-puppet/Puppetfile +25 -25
- data/examples/kitchen-puppet/README.md +53 -53
- data/examples/kitchen-puppet/manifests/site.pp +33 -33
- data/examples/kitchen-puppet/metadata.json +11 -11
- data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -28
- data/examples/meta-profile/README.md +37 -37
- data/examples/meta-profile/controls/example.rb +13 -13
- data/examples/meta-profile/inspec.yml +13 -13
- data/examples/profile-attribute.yml +2 -2
- data/examples/profile-attribute/README.md +14 -14
- data/examples/profile-attribute/controls/example.rb +11 -11
- data/examples/profile-attribute/inspec.yml +8 -8
- data/examples/profile-aws/controls/iam_password_policy_expiration.rb +8 -8
- data/examples/profile-aws/controls/iam_password_policy_max_age.rb +8 -8
- data/examples/profile-aws/controls/iam_root_user_mfa.rb +8 -8
- data/examples/profile-aws/controls/iam_users_access_key_age.rb +8 -8
- data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +8 -8
- data/examples/profile-aws/inspec.yml +11 -11
- data/examples/profile-azure/controls/azure_resource_group_example.rb +24 -24
- data/examples/profile-azure/controls/azure_vm_example.rb +29 -29
- data/examples/profile-azure/inspec.yml +11 -11
- data/examples/profile-sensitive/README.md +29 -29
- data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -9
- data/examples/profile-sensitive/controls/sensitive.rb +9 -9
- data/examples/profile-sensitive/inspec.yml +8 -8
- data/examples/profile/README.md +48 -48
- data/examples/profile/controls/example.rb +23 -23
- data/examples/profile/controls/gordon.rb +36 -36
- data/examples/profile/controls/meta.rb +34 -34
- data/examples/profile/inspec.yml +10 -10
- data/examples/profile/libraries/gordon_config.rb +53 -53
- data/inspec.gemspec +47 -47
- data/lib/bundles/README.md +3 -3
- data/lib/bundles/inspec-artifact.rb +7 -7
- data/lib/bundles/inspec-artifact/README.md +1 -1
- data/lib/bundles/inspec-artifact/cli.rb +277 -277
- data/lib/bundles/inspec-compliance.rb +16 -16
- data/lib/bundles/inspec-compliance/.kitchen.yml +20 -20
- data/lib/bundles/inspec-compliance/README.md +185 -185
- data/lib/bundles/inspec-compliance/api.rb +316 -316
- data/lib/bundles/inspec-compliance/api/login.rb +152 -152
- data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
- data/lib/bundles/inspec-compliance/cli.rb +254 -254
- data/lib/bundles/inspec-compliance/configuration.rb +103 -103
- data/lib/bundles/inspec-compliance/http.rb +86 -86
- data/lib/bundles/inspec-compliance/support.rb +36 -36
- data/lib/bundles/inspec-compliance/target.rb +98 -98
- data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -93
- data/lib/bundles/inspec-habitat.rb +12 -12
- data/lib/bundles/inspec-habitat/cli.rb +36 -36
- data/lib/bundles/inspec-habitat/log.rb +10 -10
- data/lib/bundles/inspec-habitat/profile.rb +390 -390
- data/lib/bundles/inspec-init.rb +8 -8
- data/lib/bundles/inspec-init/README.md +31 -31
- data/lib/bundles/inspec-init/cli.rb +97 -97
- data/lib/bundles/inspec-init/templates/profile/README.md +3 -3
- data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -19
- data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -8
- data/lib/bundles/inspec-supermarket.rb +13 -13
- data/lib/bundles/inspec-supermarket/README.md +45 -45
- data/lib/bundles/inspec-supermarket/api.rb +84 -84
- data/lib/bundles/inspec-supermarket/cli.rb +73 -73
- data/lib/bundles/inspec-supermarket/target.rb +34 -34
- data/lib/fetchers/git.rb +163 -163
- data/lib/fetchers/local.rb +74 -74
- data/lib/fetchers/mock.rb +35 -35
- data/lib/fetchers/url.rb +204 -204
- data/lib/inspec.rb +24 -24
- data/lib/inspec/archive/tar.rb +29 -29
- data/lib/inspec/archive/zip.rb +19 -19
- data/lib/inspec/backend.rb +92 -92
- data/lib/inspec/base_cli.rb +355 -350
- data/lib/inspec/cached_fetcher.rb +66 -66
- data/lib/inspec/cli.rb +292 -292
- data/lib/inspec/completions/bash.sh.erb +45 -45
- data/lib/inspec/completions/fish.sh.erb +34 -34
- data/lib/inspec/completions/zsh.sh.erb +61 -61
- data/lib/inspec/control_eval_context.rb +179 -179
- data/lib/inspec/dependencies/cache.rb +72 -72
- data/lib/inspec/dependencies/dependency_set.rb +92 -92
- data/lib/inspec/dependencies/lockfile.rb +115 -115
- data/lib/inspec/dependencies/requirement.rb +123 -123
- data/lib/inspec/dependencies/resolver.rb +86 -86
- data/lib/inspec/describe.rb +27 -27
- data/lib/inspec/dsl.rb +66 -66
- data/lib/inspec/dsl_shared.rb +33 -33
- data/lib/inspec/env_printer.rb +157 -157
- data/lib/inspec/errors.rb +13 -13
- data/lib/inspec/exceptions.rb +12 -12
- data/lib/inspec/expect.rb +45 -45
- data/lib/inspec/fetcher.rb +45 -45
- data/lib/inspec/file_provider.rb +275 -275
- data/lib/inspec/formatters.rb +3 -3
- data/lib/inspec/formatters/base.rb +250 -250
- data/lib/inspec/formatters/json_rspec.rb +20 -20
- data/lib/inspec/formatters/show_progress.rb +12 -12
- data/lib/inspec/library_eval_context.rb +58 -58
- data/lib/inspec/log.rb +11 -11
- data/lib/inspec/metadata.rb +247 -247
- data/lib/inspec/method_source.rb +24 -24
- data/lib/inspec/objects.rb +14 -14
- data/lib/inspec/objects/attribute.rb +65 -65
- data/lib/inspec/objects/control.rb +61 -61
- data/lib/inspec/objects/describe.rb +92 -92
- data/lib/inspec/objects/each_loop.rb +36 -36
- data/lib/inspec/objects/list.rb +15 -15
- data/lib/inspec/objects/or_test.rb +40 -40
- data/lib/inspec/objects/ruby_helper.rb +15 -15
- data/lib/inspec/objects/tag.rb +27 -27
- data/lib/inspec/objects/test.rb +87 -87
- data/lib/inspec/objects/value.rb +27 -27
- data/lib/inspec/plugins.rb +60 -60
- data/lib/inspec/plugins/cli.rb +24 -24
- data/lib/inspec/plugins/fetcher.rb +86 -86
- data/lib/inspec/plugins/resource.rb +135 -135
- data/lib/inspec/plugins/secret.rb +15 -15
- data/lib/inspec/plugins/source_reader.rb +40 -40
- data/lib/inspec/polyfill.rb +12 -12
- data/lib/inspec/profile.rb +510 -510
- data/lib/inspec/profile_context.rb +207 -207
- data/lib/inspec/profile_vendor.rb +66 -66
- data/lib/inspec/reporters.rb +54 -50
- data/lib/inspec/reporters/base.rb +24 -24
- data/lib/inspec/reporters/cli.rb +356 -356
- data/lib/inspec/reporters/json.rb +116 -116
- data/lib/inspec/reporters/json_min.rb +48 -48
- data/lib/inspec/reporters/junit.rb +77 -77
- data/lib/inspec/require_loader.rb +33 -33
- data/lib/inspec/resource.rb +186 -186
- data/lib/inspec/rule.rb +266 -266
- data/lib/inspec/runner.rb +345 -345
- data/lib/inspec/runner_mock.rb +41 -41
- data/lib/inspec/runner_rspec.rb +175 -175
- data/lib/inspec/runtime_profile.rb +26 -26
- data/lib/inspec/schema.rb +213 -213
- data/lib/inspec/secrets.rb +19 -19
- data/lib/inspec/secrets/yaml.rb +30 -30
- data/lib/inspec/shell.rb +220 -220
- data/lib/inspec/shell_detector.rb +90 -90
- data/lib/inspec/source_reader.rb +29 -29
- data/lib/inspec/version.rb +8 -8
- data/lib/matchers/matchers.rb +339 -339
- data/lib/resource_support/aws.rb +41 -41
- data/lib/resource_support/aws/aws_backend_base.rb +12 -12
- data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -12
- data/lib/resource_support/aws/aws_plural_resource_mixin.rb +21 -21
- data/lib/resource_support/aws/aws_resource_mixin.rb +66 -66
- data/lib/resource_support/aws/aws_singular_resource_mixin.rb +24 -24
- data/lib/resources/aide_conf.rb +159 -160
- data/lib/resources/apache.rb +48 -48
- data/lib/resources/apache_conf.rb +156 -156
- data/lib/resources/apt.rb +149 -149
- data/lib/resources/audit_policy.rb +63 -63
- data/lib/resources/auditd.rb +231 -231
- data/lib/resources/auditd_conf.rb +55 -55
- data/lib/resources/aws/aws_cloudtrail_trail.rb +77 -77
- data/lib/resources/aws/aws_cloudtrail_trails.rb +47 -47
- data/lib/resources/aws/aws_cloudwatch_alarm.rb +62 -62
- data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +100 -100
- data/lib/resources/aws/aws_config_recorder.rb +98 -98
- data/lib/resources/aws/aws_ec2_instance.rb +157 -157
- data/lib/resources/aws/aws_iam_access_key.rb +106 -106
- data/lib/resources/aws/aws_iam_access_keys.rb +149 -144
- data/lib/resources/aws/aws_iam_group.rb +56 -56
- data/lib/resources/aws/aws_iam_groups.rb +52 -45
- data/lib/resources/aws/aws_iam_password_policy.rb +116 -116
- data/lib/resources/aws/aws_iam_policies.rb +53 -46
- data/lib/resources/aws/aws_iam_policy.rb +125 -119
- data/lib/resources/aws/aws_iam_role.rb +51 -51
- data/lib/resources/aws/aws_iam_root_user.rb +60 -60
- data/lib/resources/aws/aws_iam_user.rb +111 -111
- data/lib/resources/aws/aws_iam_users.rb +108 -96
- data/lib/resources/aws/aws_kms_keys.rb +53 -46
- data/lib/resources/aws/aws_route_table.rb +61 -61
- data/lib/resources/aws/aws_s3_bucket.rb +115 -115
- data/lib/resources/aws/aws_security_group.rb +93 -93
- data/lib/resources/aws/aws_security_groups.rb +68 -68
- data/lib/resources/aws/aws_sns_topic.rb +53 -53
- data/lib/resources/aws/aws_subnet.rb +88 -88
- data/lib/resources/aws/aws_subnets.rb +53 -53
- data/lib/resources/aws/aws_vpc.rb +69 -69
- data/lib/resources/aws/aws_vpcs.rb +45 -45
- data/lib/resources/azure/azure_backend.rb +377 -377
- data/lib/resources/azure/azure_generic_resource.rb +59 -59
- data/lib/resources/azure/azure_resource_group.rb +152 -152
- data/lib/resources/azure/azure_virtual_machine.rb +264 -264
- data/lib/resources/azure/azure_virtual_machine_data_disk.rb +136 -136
- data/lib/resources/bash.rb +35 -35
- data/lib/resources/bond.rb +68 -68
- data/lib/resources/bridge.rb +122 -122
- data/lib/resources/command.rb +73 -69
- data/lib/resources/cpan.rb +58 -58
- data/lib/resources/cran.rb +64 -64
- data/lib/resources/crontab.rb +169 -170
- data/lib/resources/csv.rb +60 -60
- data/lib/resources/dh_params.rb +82 -82
- data/lib/resources/directory.rb +25 -25
- data/lib/resources/docker.rb +236 -236
- data/lib/resources/docker_container.rb +89 -89
- data/lib/resources/docker_image.rb +83 -83
- data/lib/resources/docker_object.rb +57 -57
- data/lib/resources/docker_service.rb +90 -90
- data/lib/resources/elasticsearch.rb +169 -169
- data/lib/resources/etc_fstab.rb +101 -102
- data/lib/resources/etc_group.rb +152 -156
- data/lib/resources/etc_hosts.rb +82 -81
- data/lib/resources/etc_hosts_allow_deny.rb +122 -123
- data/lib/resources/file.rb +298 -298
- data/lib/resources/filesystem.rb +31 -31
- data/lib/resources/firewalld.rb +143 -144
- data/lib/resources/gem.rb +70 -70
- data/lib/resources/groups.rb +215 -215
- data/lib/resources/grub_conf.rb +237 -237
- data/lib/resources/host.rb +306 -300
- data/lib/resources/http.rb +251 -250
- data/lib/resources/iis_app.rb +101 -104
- data/lib/resources/iis_site.rb +148 -148
- data/lib/resources/inetd_conf.rb +62 -62
- data/lib/resources/ini.rb +29 -29
- data/lib/resources/interface.rb +129 -129
- data/lib/resources/iptables.rb +80 -69
- data/lib/resources/json.rb +117 -117
- data/lib/resources/kernel_module.rb +107 -107
- data/lib/resources/kernel_parameter.rb +58 -58
- data/lib/resources/key_rsa.rb +67 -67
- data/lib/resources/limits_conf.rb +55 -55
- data/lib/resources/login_def.rb +66 -66
- data/lib/resources/mount.rb +88 -88
- data/lib/resources/mssql_session.rb +101 -101
- data/lib/resources/mysql.rb +81 -81
- data/lib/resources/mysql_conf.rb +134 -134
- data/lib/resources/mysql_session.rb +71 -71
- data/lib/resources/nginx.rb +96 -96
- data/lib/resources/nginx_conf.rb +227 -227
- data/lib/resources/npm.rb +48 -48
- data/lib/resources/ntp_conf.rb +58 -58
- data/lib/resources/oneget.rb +71 -71
- data/lib/resources/oracledb_session.rb +139 -139
- data/lib/resources/os.rb +36 -36
- data/lib/resources/os_env.rb +76 -76
- data/lib/resources/package.rb +370 -370
- data/lib/resources/packages.rb +111 -111
- data/lib/resources/parse_config.rb +116 -116
- data/lib/resources/passwd.rb +74 -74
- data/lib/resources/pip.rb +89 -89
- data/lib/resources/platform.rb +109 -109
- data/lib/resources/port.rb +771 -771
- data/lib/resources/postgres.rb +130 -130
- data/lib/resources/postgres_conf.rb +121 -121
- data/lib/resources/postgres_hba_conf.rb +99 -100
- data/lib/resources/postgres_ident_conf.rb +76 -78
- data/lib/resources/postgres_session.rb +71 -71
- data/lib/resources/powershell.rb +53 -57
- data/lib/resources/processes.rb +204 -204
- data/lib/resources/rabbitmq_conf.rb +52 -52
- data/lib/resources/registry_key.rb +296 -296
- data/lib/resources/security_policy.rb +180 -180
- data/lib/resources/service.rb +789 -789
- data/lib/resources/shadow.rb +146 -140
- data/lib/resources/ssh_conf.rb +102 -102
- data/lib/resources/ssl.rb +99 -99
- data/lib/resources/sys_info.rb +28 -28
- data/lib/resources/toml.rb +32 -32
- data/lib/resources/users.rb +654 -654
- data/lib/resources/vbscript.rb +68 -69
- data/lib/resources/virtualization.rb +247 -247
- data/lib/resources/windows_feature.rb +84 -84
- data/lib/resources/windows_hotfix.rb +35 -35
- data/lib/resources/windows_task.rb +102 -105
- data/lib/resources/wmi.rb +110 -113
- data/lib/resources/x509_certificate.rb +143 -143
- data/lib/resources/xinetd.rb +111 -111
- data/lib/resources/xml.rb +46 -46
- data/lib/resources/yaml.rb +47 -47
- data/lib/resources/yum.rb +180 -180
- data/lib/resources/zfs_dataset.rb +60 -60
- data/lib/resources/zfs_pool.rb +49 -49
- data/lib/source_readers/flat.rb +39 -39
- data/lib/source_readers/inspec.rb +75 -75
- data/lib/utils/command_wrapper.rb +27 -27
- data/lib/utils/convert.rb +12 -12
- data/lib/utils/database_helpers.rb +77 -77
- data/lib/utils/erlang_parser.rb +192 -192
- data/lib/utils/filter.rb +272 -272
- data/lib/utils/filter_array.rb +27 -27
- data/lib/utils/find_files.rb +44 -44
- data/lib/utils/hash.rb +41 -41
- data/lib/utils/json_log.rb +18 -18
- data/lib/utils/latest_version.rb +22 -22
- data/lib/utils/modulator.rb +12 -12
- data/lib/utils/nginx_parser.rb +85 -85
- data/lib/utils/object_traversal.rb +49 -49
- data/lib/utils/parser.rb +274 -274
- data/lib/utils/plugin_registry.rb +93 -93
- data/lib/utils/simpleconfig.rb +120 -120
- data/lib/utils/spdx.rb +13 -13
- data/lib/utils/spdx.txt +343 -343
- metadata +2 -2
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
require 'utils/erlang_parser'
|
|
4
|
-
|
|
5
|
-
module Inspec::Resources
|
|
6
|
-
class RabbitmqConf < Inspec.resource(1)
|
|
7
|
-
name 'rabbitmq_config'
|
|
8
|
-
supports platform: 'unix'
|
|
9
|
-
desc 'Use the rabbitmq_config InSpec resource to test configuration data '\
|
|
10
|
-
'for the RabbitMQ service located in /etc/rabbitmq/rabbitmq.config on '\
|
|
11
|
-
'Linux and UNIX platforms.'
|
|
12
|
-
example "
|
|
13
|
-
describe rabbitmq_config.params('rabbit', 'ssl_listeners') do
|
|
14
|
-
it { should cmp 5671 }
|
|
15
|
-
end
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
def initialize(conf_path = nil)
|
|
19
|
-
@conf_path = conf_path || '/etc/rabbitmq/rabbitmq.config'
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def params(*opts)
|
|
23
|
-
opts.inject(read_params) do |res, nxt|
|
|
24
|
-
res.respond_to?(:key) ? res[nxt] : nil
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def to_s
|
|
29
|
-
"rabbitmq_config #{@conf_path}"
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
private
|
|
33
|
-
|
|
34
|
-
def read_content
|
|
35
|
-
return @content if defined?(@content)
|
|
36
|
-
file = inspec.file(@conf_path)
|
|
37
|
-
if !file.file?
|
|
38
|
-
return skip_resource "Can't find file \"#{@conf_path}\""
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
@content = file.content
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def read_params
|
|
45
|
-
return @params if defined?(@params)
|
|
46
|
-
return @params = {} if read_content.nil?
|
|
47
|
-
@params = ErlangConfigFile.parse(read_content)
|
|
48
|
-
rescue Parslet::ParseFailed
|
|
49
|
-
raise "Cannot parse RabbitMQ config: \"#{read_content}\""
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'utils/erlang_parser'
|
|
4
|
+
|
|
5
|
+
module Inspec::Resources
|
|
6
|
+
class RabbitmqConf < Inspec.resource(1)
|
|
7
|
+
name 'rabbitmq_config'
|
|
8
|
+
supports platform: 'unix'
|
|
9
|
+
desc 'Use the rabbitmq_config InSpec resource to test configuration data '\
|
|
10
|
+
'for the RabbitMQ service located in /etc/rabbitmq/rabbitmq.config on '\
|
|
11
|
+
'Linux and UNIX platforms.'
|
|
12
|
+
example "
|
|
13
|
+
describe rabbitmq_config.params('rabbit', 'ssl_listeners') do
|
|
14
|
+
it { should cmp 5671 }
|
|
15
|
+
end
|
|
16
|
+
"
|
|
17
|
+
|
|
18
|
+
def initialize(conf_path = nil)
|
|
19
|
+
@conf_path = conf_path || '/etc/rabbitmq/rabbitmq.config'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def params(*opts)
|
|
23
|
+
opts.inject(read_params) do |res, nxt|
|
|
24
|
+
res.respond_to?(:key) ? res[nxt] : nil
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def to_s
|
|
29
|
+
"rabbitmq_config #{@conf_path}"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def read_content
|
|
35
|
+
return @content if defined?(@content)
|
|
36
|
+
file = inspec.file(@conf_path)
|
|
37
|
+
if !file.file?
|
|
38
|
+
return skip_resource "Can't find file \"#{@conf_path}\""
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
@content = file.content
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def read_params
|
|
45
|
+
return @params if defined?(@params)
|
|
46
|
+
return @params = {} if read_content.nil?
|
|
47
|
+
@params = ErlangConfigFile.parse(read_content)
|
|
48
|
+
rescue Parslet::ParseFailed
|
|
49
|
+
raise "Cannot parse RabbitMQ config: \"#{read_content}\""
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -1,296 +1,296 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
# copyright: 2015, Vulcano Security GmbH
|
|
3
|
-
|
|
4
|
-
require 'json'
|
|
5
|
-
|
|
6
|
-
# Three constructor methods are available:
|
|
7
|
-
# 1. resistry_key(path'):
|
|
8
|
-
# describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule') do
|
|
9
|
-
# its('Start') { should eq 2 }
|
|
10
|
-
# end
|
|
11
|
-
#
|
|
12
|
-
# 2. resistry_key('name','path'):
|
|
13
|
-
# describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule') do
|
|
14
|
-
# its('Start') { should eq 2 }
|
|
15
|
-
# end
|
|
16
|
-
#
|
|
17
|
-
# 3. options hash
|
|
18
|
-
# describe registry_key({
|
|
19
|
-
# name: 'Task Scheduler',
|
|
20
|
-
# hive: 'HKEY_LOCAL_MACHINE',
|
|
21
|
-
# key: '\SYSTEM\CurrentControlSet\services\Schedule'
|
|
22
|
-
# }) do
|
|
23
|
-
# its('Start') { should eq 2 }
|
|
24
|
-
# end
|
|
25
|
-
#
|
|
26
|
-
# Get all childs of a registry key:
|
|
27
|
-
# describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet').children do
|
|
28
|
-
# it { should_not eq [] }
|
|
29
|
-
# end
|
|
30
|
-
#
|
|
31
|
-
# Example to use regular expressions for keys
|
|
32
|
-
# describe registry_key({
|
|
33
|
-
# hive: HKEY_USERS
|
|
34
|
-
# }).children(/^S-1-5-21-[0-9]+-[0-9]+-[0-9]+-[0-9]{3,}\\Software\\Policies\\Microsoft\\Windows\\Installer/).each { |key|
|
|
35
|
-
# describe registry_key(key) do
|
|
36
|
-
# its('AlwaysInstallElevated') { should eq 'value' }
|
|
37
|
-
# end
|
|
38
|
-
# }
|
|
39
|
-
#
|
|
40
|
-
# Example to use regular expressions in responses
|
|
41
|
-
# describe registry_key({
|
|
42
|
-
# hive: 'HKEY_LOCAL_MACHINE',
|
|
43
|
-
# key: 'SOFTWARE\Microsoft\Windows NT\CurrentVersion'
|
|
44
|
-
# }) do
|
|
45
|
-
# its('ProductName') { should match /^[a-zA-Z0-9\(\)\s]*2012\s[rR]2[a-zA-Z0-9\(\)\s]*$/ }
|
|
46
|
-
# end
|
|
47
|
-
|
|
48
|
-
module Inspec::Resources
|
|
49
|
-
class RegistryKey < Inspec.resource(1)
|
|
50
|
-
name 'registry_key'
|
|
51
|
-
supports platform: 'windows'
|
|
52
|
-
desc 'Use the registry_key InSpec audit resource to test key values in the Microsoft Windows registry.'
|
|
53
|
-
example "
|
|
54
|
-
describe registry_key('path\to\key') do
|
|
55
|
-
its('name') { should eq 'value' }
|
|
56
|
-
end
|
|
57
|
-
"
|
|
58
|
-
|
|
59
|
-
def initialize(name, reg_key = nil)
|
|
60
|
-
# if we have one parameter, we use it as name
|
|
61
|
-
reg_key ||= name
|
|
62
|
-
@options = {}
|
|
63
|
-
if reg_key && reg_key.is_a?(Hash)
|
|
64
|
-
@options = @options.merge!(reg_key)
|
|
65
|
-
|
|
66
|
-
# generate registry_key if we do not have a regular expression
|
|
67
|
-
@options[:path] = generate_registry_key_path_from_options
|
|
68
|
-
@options[:name] ||= @options[:path]
|
|
69
|
-
else
|
|
70
|
-
@options[:name] = name
|
|
71
|
-
@options[:path] = reg_key
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
return skip_resource 'The `registry_key` resource is not supported on your OS yet.' if !inspec.os.windows?
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def exists?
|
|
78
|
-
!registry_key(@options[:path]).nil?
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def has_value?(value)
|
|
82
|
-
val = registry_key(@options[:path])
|
|
83
|
-
!val.nil? && registry_property_value(val, '(default)') == value ? true : false
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def has_property?(property_name, property_type = nil)
|
|
87
|
-
val = registry_key(@options[:path])
|
|
88
|
-
!val.nil? && registry_property_exists(val, property_name) && (property_type.nil? || registry_property_type(val, property_name) == map2type(property_type)) ? true : false
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# deactivate rubocop, because we need to stay compatible with Serverspe
|
|
92
|
-
# rubocop:disable Style/OptionalArguments
|
|
93
|
-
def has_property_value?(property_name, property_type = nil, value)
|
|
94
|
-
# rubocop:enable Style/OptionalArguments
|
|
95
|
-
val = registry_key(@options[:path])
|
|
96
|
-
|
|
97
|
-
# convert value to binary if required
|
|
98
|
-
value = value.bytes if !property_type.nil? && map2type(property_type) == 3 && !value.is_a?(Array)
|
|
99
|
-
|
|
100
|
-
!val.nil? && registry_property_value(val, property_name) == value && (property_type.nil? || registry_property_type(val, property_name) == map2type(property_type)) ? true : false
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# returns an arrray of child nodes
|
|
104
|
-
def children(filter = nil)
|
|
105
|
-
children_keys(@options[:path], filter)
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# returns nil, if not existant or value
|
|
109
|
-
def method_missing(*keys)
|
|
110
|
-
# allow the use of array syntax in an `its` block so that users
|
|
111
|
-
# can use it to query for keys with . characters in them
|
|
112
|
-
if keys.is_a?(Array)
|
|
113
|
-
keys.shift if keys[0] == :[]
|
|
114
|
-
key = keys.first
|
|
115
|
-
else
|
|
116
|
-
key = keys
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# get data
|
|
120
|
-
val = registry_key(@options[:path])
|
|
121
|
-
registry_property_value(val, key)
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
def to_s
|
|
125
|
-
"Registry Key #{@options[:name]}"
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
private
|
|
129
|
-
|
|
130
|
-
def prep_prop(property)
|
|
131
|
-
property.to_s.downcase
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def registry_property_exists(regkey, property)
|
|
135
|
-
return false if regkey.nil? || property.nil?
|
|
136
|
-
# always ensure the key is lower case
|
|
137
|
-
!regkey[prep_prop(property)].nil?
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
def registry_property_value(regkey, property)
|
|
141
|
-
return nil if !registry_property_exists(regkey, property)
|
|
142
|
-
# always ensure the key is lower case
|
|
143
|
-
regkey[prep_prop(property)]['value']
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def registry_property_type(regkey, property)
|
|
147
|
-
return nil if !registry_property_exists(regkey, property)
|
|
148
|
-
# always ensure the key is lower case
|
|
149
|
-
regkey[prep_prop(property)]['type']
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def registry_key(path)
|
|
153
|
-
return @registry_cache if defined?(@registry_cache)
|
|
154
|
-
# load registry key and all properties
|
|
155
|
-
script = <<-EOH
|
|
156
|
-
Function InSpec-GetRegistryKey($path) {
|
|
157
|
-
$reg = Get-Item ('Registry::' + $path)
|
|
158
|
-
if ($reg -eq $null) {
|
|
159
|
-
Write-Error "InSpec: Failed to find registry key"
|
|
160
|
-
exit 1001
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
$properties = New-Object -Type PSObject
|
|
164
|
-
$reg.Property | ForEach-Object {
|
|
165
|
-
$key = $_
|
|
166
|
-
if ("(default)".Equals($key)) { $key = '' }
|
|
167
|
-
$value = New-Object psobject -Property @{
|
|
168
|
-
"value" = $reg.GetValue($key);
|
|
169
|
-
"type" = $reg.GetValueKind($key);
|
|
170
|
-
}
|
|
171
|
-
$properties | Add-Member NoteProperty $_ $value
|
|
172
|
-
}
|
|
173
|
-
$properties
|
|
174
|
-
}
|
|
175
|
-
$path = '#{path}'
|
|
176
|
-
InSpec-GetRegistryKey($path) | ConvertTo-Json -Compress
|
|
177
|
-
EOH
|
|
178
|
-
|
|
179
|
-
cmd = inspec.powershell(script)
|
|
180
|
-
# cannot rely on exit code for now, successful command returns exit code 1
|
|
181
|
-
# return nil if cmd.exit_status != 0, try to parse json
|
|
182
|
-
begin
|
|
183
|
-
if cmd.exit_status == 1001 && cmd.stderr =~ /InSpec: Failed to find registry key/
|
|
184
|
-
# TODO: provide the stderr output
|
|
185
|
-
@registry_cache = nil
|
|
186
|
-
else
|
|
187
|
-
@registry_cache = JSON.parse(cmd.stdout)
|
|
188
|
-
# convert keys to lower case
|
|
189
|
-
@registry_cache = Hash[@registry_cache.map do |key, value|
|
|
190
|
-
[key.downcase, value]
|
|
191
|
-
end]
|
|
192
|
-
end
|
|
193
|
-
rescue JSON::ParserError => _e
|
|
194
|
-
@registry_cache = nil
|
|
195
|
-
end
|
|
196
|
-
@registry_cache
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
def children_keys(path, filter = '')
|
|
200
|
-
return @children_cache if defined?(@children_cache)
|
|
201
|
-
filter = filter.source if filter.is_a? ::Regexp
|
|
202
|
-
script = <<-EOH
|
|
203
|
-
Function InSpec-FindChildsRegistryKeys($path, $filter) {
|
|
204
|
-
# get information about the child registry keys
|
|
205
|
-
$items = Get-ChildItem -Path ('Registry::' + $path) -rec -ea SilentlyContinue
|
|
206
|
-
# filter entries
|
|
207
|
-
$items | Where-Object {
|
|
208
|
-
$name = $_.Name
|
|
209
|
-
$simple = $name -replace "HKEY_LOCAL_MACHINE\\\\",""
|
|
210
|
-
$simple = $name -replace "HKEY_USERS\\\\",""
|
|
211
|
-
$simple -Match $filter
|
|
212
|
-
} | % { $_.Name }
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
$path = '#{path}'
|
|
216
|
-
$filter = "#{filter}"
|
|
217
|
-
ConvertTo-Json @(InSpec-FindChildsRegistryKeys $path $filter)
|
|
218
|
-
EOH
|
|
219
|
-
cmd = inspec.powershell(script)
|
|
220
|
-
begin
|
|
221
|
-
@children_cache = JSON.parse(cmd.stdout)
|
|
222
|
-
rescue JSON::ParserError => _e
|
|
223
|
-
@children_cache = []
|
|
224
|
-
end
|
|
225
|
-
@children_cache
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
# Registry key value types
|
|
229
|
-
# @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms724884(v=vs.85).aspx
|
|
230
|
-
# REG_NONE 0
|
|
231
|
-
# REG_SZ 1
|
|
232
|
-
# REG_EXPAND_SZ 2
|
|
233
|
-
# REG_BINARY 3
|
|
234
|
-
# REG_DWORD 4
|
|
235
|
-
# REG_DWORD_LITTLE_ENDIAN 4
|
|
236
|
-
# REG_DWORD_BIG_ENDIAN 5
|
|
237
|
-
# REG_LINK 6
|
|
238
|
-
# REG_MULTI_SZ 7
|
|
239
|
-
# REG_RESOURCE_LIST 8
|
|
240
|
-
# REG_FULL_RESOURCE_DESCRIPTOR 9
|
|
241
|
-
# REG_RESOURCE_REQUIREMENTS_LIST 10
|
|
242
|
-
# REG_QWORD 11
|
|
243
|
-
# REG_QWORD_LITTLE_ENDIAN 11
|
|
244
|
-
def map2type(symbol)
|
|
245
|
-
options = {}
|
|
246
|
-
|
|
247
|
-
# chef symbols, we prefer those
|
|
248
|
-
options[:binary] = 3
|
|
249
|
-
options[:string] = 1
|
|
250
|
-
options[:multi_string] = 7
|
|
251
|
-
options[:expand_string] = 2
|
|
252
|
-
options[:dword] = 4
|
|
253
|
-
options[:dword_big_endian] = 5
|
|
254
|
-
options[:qword] = 11
|
|
255
|
-
|
|
256
|
-
# serverspec symbols
|
|
257
|
-
options[:type_string] = 1
|
|
258
|
-
options[:type_binary] = 3
|
|
259
|
-
options[:type_dword] = 4
|
|
260
|
-
options[:type_qword] = 11
|
|
261
|
-
options[:type_multistring] = 7
|
|
262
|
-
options[:type_expandstring] = 2
|
|
263
|
-
|
|
264
|
-
options[symbol]
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
def generate_registry_key_path_from_options
|
|
268
|
-
path = @options[:hive]
|
|
269
|
-
path += format_key_from_options
|
|
270
|
-
|
|
271
|
-
path
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
def format_key_from_options
|
|
275
|
-
key = @options[:key]
|
|
276
|
-
return '' unless key
|
|
277
|
-
|
|
278
|
-
key.start_with?('\\') ? key : "\\#{key}"
|
|
279
|
-
end
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
# for compatability with serverspec
|
|
283
|
-
# this is deprecated syntax and will be removed in future versions
|
|
284
|
-
class WindowsRegistryKey < RegistryKey
|
|
285
|
-
name 'windows_registry_key'
|
|
286
|
-
|
|
287
|
-
def initialize(name)
|
|
288
|
-
deprecated
|
|
289
|
-
super(name)
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
def deprecated
|
|
293
|
-
warn '[DEPRECATION] `windows_registry_key(reg_key)` is deprecated. Please use `registry_key(\'path\to\key\')` instead.'
|
|
294
|
-
end
|
|
295
|
-
end
|
|
296
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# copyright: 2015, Vulcano Security GmbH
|
|
3
|
+
|
|
4
|
+
require 'json'
|
|
5
|
+
|
|
6
|
+
# Three constructor methods are available:
|
|
7
|
+
# 1. resistry_key(path'):
|
|
8
|
+
# describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule') do
|
|
9
|
+
# its('Start') { should eq 2 }
|
|
10
|
+
# end
|
|
11
|
+
#
|
|
12
|
+
# 2. resistry_key('name','path'):
|
|
13
|
+
# describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule') do
|
|
14
|
+
# its('Start') { should eq 2 }
|
|
15
|
+
# end
|
|
16
|
+
#
|
|
17
|
+
# 3. options hash
|
|
18
|
+
# describe registry_key({
|
|
19
|
+
# name: 'Task Scheduler',
|
|
20
|
+
# hive: 'HKEY_LOCAL_MACHINE',
|
|
21
|
+
# key: '\SYSTEM\CurrentControlSet\services\Schedule'
|
|
22
|
+
# }) do
|
|
23
|
+
# its('Start') { should eq 2 }
|
|
24
|
+
# end
|
|
25
|
+
#
|
|
26
|
+
# Get all childs of a registry key:
|
|
27
|
+
# describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet').children do
|
|
28
|
+
# it { should_not eq [] }
|
|
29
|
+
# end
|
|
30
|
+
#
|
|
31
|
+
# Example to use regular expressions for keys
|
|
32
|
+
# describe registry_key({
|
|
33
|
+
# hive: HKEY_USERS
|
|
34
|
+
# }).children(/^S-1-5-21-[0-9]+-[0-9]+-[0-9]+-[0-9]{3,}\\Software\\Policies\\Microsoft\\Windows\\Installer/).each { |key|
|
|
35
|
+
# describe registry_key(key) do
|
|
36
|
+
# its('AlwaysInstallElevated') { should eq 'value' }
|
|
37
|
+
# end
|
|
38
|
+
# }
|
|
39
|
+
#
|
|
40
|
+
# Example to use regular expressions in responses
|
|
41
|
+
# describe registry_key({
|
|
42
|
+
# hive: 'HKEY_LOCAL_MACHINE',
|
|
43
|
+
# key: 'SOFTWARE\Microsoft\Windows NT\CurrentVersion'
|
|
44
|
+
# }) do
|
|
45
|
+
# its('ProductName') { should match /^[a-zA-Z0-9\(\)\s]*2012\s[rR]2[a-zA-Z0-9\(\)\s]*$/ }
|
|
46
|
+
# end
|
|
47
|
+
|
|
48
|
+
module Inspec::Resources
|
|
49
|
+
class RegistryKey < Inspec.resource(1)
|
|
50
|
+
name 'registry_key'
|
|
51
|
+
supports platform: 'windows'
|
|
52
|
+
desc 'Use the registry_key InSpec audit resource to test key values in the Microsoft Windows registry.'
|
|
53
|
+
example "
|
|
54
|
+
describe registry_key('path\to\key') do
|
|
55
|
+
its('name') { should eq 'value' }
|
|
56
|
+
end
|
|
57
|
+
"
|
|
58
|
+
|
|
59
|
+
def initialize(name, reg_key = nil)
|
|
60
|
+
# if we have one parameter, we use it as name
|
|
61
|
+
reg_key ||= name
|
|
62
|
+
@options = {}
|
|
63
|
+
if reg_key && reg_key.is_a?(Hash)
|
|
64
|
+
@options = @options.merge!(reg_key)
|
|
65
|
+
|
|
66
|
+
# generate registry_key if we do not have a regular expression
|
|
67
|
+
@options[:path] = generate_registry_key_path_from_options
|
|
68
|
+
@options[:name] ||= @options[:path]
|
|
69
|
+
else
|
|
70
|
+
@options[:name] = name
|
|
71
|
+
@options[:path] = reg_key
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
return skip_resource 'The `registry_key` resource is not supported on your OS yet.' if !inspec.os.windows?
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def exists?
|
|
78
|
+
!registry_key(@options[:path]).nil?
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def has_value?(value)
|
|
82
|
+
val = registry_key(@options[:path])
|
|
83
|
+
!val.nil? && registry_property_value(val, '(default)') == value ? true : false
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def has_property?(property_name, property_type = nil)
|
|
87
|
+
val = registry_key(@options[:path])
|
|
88
|
+
!val.nil? && registry_property_exists(val, property_name) && (property_type.nil? || registry_property_type(val, property_name) == map2type(property_type)) ? true : false
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# deactivate rubocop, because we need to stay compatible with Serverspe
|
|
92
|
+
# rubocop:disable Style/OptionalArguments
|
|
93
|
+
def has_property_value?(property_name, property_type = nil, value)
|
|
94
|
+
# rubocop:enable Style/OptionalArguments
|
|
95
|
+
val = registry_key(@options[:path])
|
|
96
|
+
|
|
97
|
+
# convert value to binary if required
|
|
98
|
+
value = value.bytes if !property_type.nil? && map2type(property_type) == 3 && !value.is_a?(Array)
|
|
99
|
+
|
|
100
|
+
!val.nil? && registry_property_value(val, property_name) == value && (property_type.nil? || registry_property_type(val, property_name) == map2type(property_type)) ? true : false
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# returns an arrray of child nodes
|
|
104
|
+
def children(filter = nil)
|
|
105
|
+
children_keys(@options[:path], filter)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# returns nil, if not existant or value
|
|
109
|
+
def method_missing(*keys)
|
|
110
|
+
# allow the use of array syntax in an `its` block so that users
|
|
111
|
+
# can use it to query for keys with . characters in them
|
|
112
|
+
if keys.is_a?(Array)
|
|
113
|
+
keys.shift if keys[0] == :[]
|
|
114
|
+
key = keys.first
|
|
115
|
+
else
|
|
116
|
+
key = keys
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# get data
|
|
120
|
+
val = registry_key(@options[:path])
|
|
121
|
+
registry_property_value(val, key)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def to_s
|
|
125
|
+
"Registry Key #{@options[:name]}"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
private
|
|
129
|
+
|
|
130
|
+
def prep_prop(property)
|
|
131
|
+
property.to_s.downcase
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def registry_property_exists(regkey, property)
|
|
135
|
+
return false if regkey.nil? || property.nil?
|
|
136
|
+
# always ensure the key is lower case
|
|
137
|
+
!regkey[prep_prop(property)].nil?
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def registry_property_value(regkey, property)
|
|
141
|
+
return nil if !registry_property_exists(regkey, property)
|
|
142
|
+
# always ensure the key is lower case
|
|
143
|
+
regkey[prep_prop(property)]['value']
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def registry_property_type(regkey, property)
|
|
147
|
+
return nil if !registry_property_exists(regkey, property)
|
|
148
|
+
# always ensure the key is lower case
|
|
149
|
+
regkey[prep_prop(property)]['type']
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def registry_key(path)
|
|
153
|
+
return @registry_cache if defined?(@registry_cache)
|
|
154
|
+
# load registry key and all properties
|
|
155
|
+
script = <<-EOH
|
|
156
|
+
Function InSpec-GetRegistryKey($path) {
|
|
157
|
+
$reg = Get-Item ('Registry::' + $path)
|
|
158
|
+
if ($reg -eq $null) {
|
|
159
|
+
Write-Error "InSpec: Failed to find registry key"
|
|
160
|
+
exit 1001
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
$properties = New-Object -Type PSObject
|
|
164
|
+
$reg.Property | ForEach-Object {
|
|
165
|
+
$key = $_
|
|
166
|
+
if ("(default)".Equals($key)) { $key = '' }
|
|
167
|
+
$value = New-Object psobject -Property @{
|
|
168
|
+
"value" = $reg.GetValue($key);
|
|
169
|
+
"type" = $reg.GetValueKind($key);
|
|
170
|
+
}
|
|
171
|
+
$properties | Add-Member NoteProperty $_ $value
|
|
172
|
+
}
|
|
173
|
+
$properties
|
|
174
|
+
}
|
|
175
|
+
$path = '#{path}'
|
|
176
|
+
InSpec-GetRegistryKey($path) | ConvertTo-Json -Compress
|
|
177
|
+
EOH
|
|
178
|
+
|
|
179
|
+
cmd = inspec.powershell(script)
|
|
180
|
+
# cannot rely on exit code for now, successful command returns exit code 1
|
|
181
|
+
# return nil if cmd.exit_status != 0, try to parse json
|
|
182
|
+
begin
|
|
183
|
+
if cmd.exit_status == 1001 && cmd.stderr =~ /InSpec: Failed to find registry key/
|
|
184
|
+
# TODO: provide the stderr output
|
|
185
|
+
@registry_cache = nil
|
|
186
|
+
else
|
|
187
|
+
@registry_cache = JSON.parse(cmd.stdout)
|
|
188
|
+
# convert keys to lower case
|
|
189
|
+
@registry_cache = Hash[@registry_cache.map do |key, value|
|
|
190
|
+
[key.downcase, value]
|
|
191
|
+
end]
|
|
192
|
+
end
|
|
193
|
+
rescue JSON::ParserError => _e
|
|
194
|
+
@registry_cache = nil
|
|
195
|
+
end
|
|
196
|
+
@registry_cache
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def children_keys(path, filter = '')
|
|
200
|
+
return @children_cache if defined?(@children_cache)
|
|
201
|
+
filter = filter.source if filter.is_a? ::Regexp
|
|
202
|
+
script = <<-EOH
|
|
203
|
+
Function InSpec-FindChildsRegistryKeys($path, $filter) {
|
|
204
|
+
# get information about the child registry keys
|
|
205
|
+
$items = Get-ChildItem -Path ('Registry::' + $path) -rec -ea SilentlyContinue
|
|
206
|
+
# filter entries
|
|
207
|
+
$items | Where-Object {
|
|
208
|
+
$name = $_.Name
|
|
209
|
+
$simple = $name -replace "HKEY_LOCAL_MACHINE\\\\",""
|
|
210
|
+
$simple = $name -replace "HKEY_USERS\\\\",""
|
|
211
|
+
$simple -Match $filter
|
|
212
|
+
} | % { $_.Name }
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
$path = '#{path}'
|
|
216
|
+
$filter = "#{filter}"
|
|
217
|
+
ConvertTo-Json @(InSpec-FindChildsRegistryKeys $path $filter)
|
|
218
|
+
EOH
|
|
219
|
+
cmd = inspec.powershell(script)
|
|
220
|
+
begin
|
|
221
|
+
@children_cache = JSON.parse(cmd.stdout)
|
|
222
|
+
rescue JSON::ParserError => _e
|
|
223
|
+
@children_cache = []
|
|
224
|
+
end
|
|
225
|
+
@children_cache
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# Registry key value types
|
|
229
|
+
# @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms724884(v=vs.85).aspx
|
|
230
|
+
# REG_NONE 0
|
|
231
|
+
# REG_SZ 1
|
|
232
|
+
# REG_EXPAND_SZ 2
|
|
233
|
+
# REG_BINARY 3
|
|
234
|
+
# REG_DWORD 4
|
|
235
|
+
# REG_DWORD_LITTLE_ENDIAN 4
|
|
236
|
+
# REG_DWORD_BIG_ENDIAN 5
|
|
237
|
+
# REG_LINK 6
|
|
238
|
+
# REG_MULTI_SZ 7
|
|
239
|
+
# REG_RESOURCE_LIST 8
|
|
240
|
+
# REG_FULL_RESOURCE_DESCRIPTOR 9
|
|
241
|
+
# REG_RESOURCE_REQUIREMENTS_LIST 10
|
|
242
|
+
# REG_QWORD 11
|
|
243
|
+
# REG_QWORD_LITTLE_ENDIAN 11
|
|
244
|
+
def map2type(symbol)
|
|
245
|
+
options = {}
|
|
246
|
+
|
|
247
|
+
# chef symbols, we prefer those
|
|
248
|
+
options[:binary] = 3
|
|
249
|
+
options[:string] = 1
|
|
250
|
+
options[:multi_string] = 7
|
|
251
|
+
options[:expand_string] = 2
|
|
252
|
+
options[:dword] = 4
|
|
253
|
+
options[:dword_big_endian] = 5
|
|
254
|
+
options[:qword] = 11
|
|
255
|
+
|
|
256
|
+
# serverspec symbols
|
|
257
|
+
options[:type_string] = 1
|
|
258
|
+
options[:type_binary] = 3
|
|
259
|
+
options[:type_dword] = 4
|
|
260
|
+
options[:type_qword] = 11
|
|
261
|
+
options[:type_multistring] = 7
|
|
262
|
+
options[:type_expandstring] = 2
|
|
263
|
+
|
|
264
|
+
options[symbol]
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def generate_registry_key_path_from_options
|
|
268
|
+
path = @options[:hive]
|
|
269
|
+
path += format_key_from_options
|
|
270
|
+
|
|
271
|
+
path
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def format_key_from_options
|
|
275
|
+
key = @options[:key]
|
|
276
|
+
return '' unless key
|
|
277
|
+
|
|
278
|
+
key.start_with?('\\') ? key : "\\#{key}"
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
# for compatability with serverspec
|
|
283
|
+
# this is deprecated syntax and will be removed in future versions
|
|
284
|
+
class WindowsRegistryKey < RegistryKey
|
|
285
|
+
name 'windows_registry_key'
|
|
286
|
+
|
|
287
|
+
def initialize(name)
|
|
288
|
+
deprecated
|
|
289
|
+
super(name)
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def deprecated
|
|
293
|
+
warn '[DEPRECATION] `windows_registry_key(reg_key)` is deprecated. Please use `registry_key(\'path\to\key\')` instead.'
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
end
|