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
data/lib/resource_support/aws.rb
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
# Main AWS loader file. The intent is for this to be
|
|
2
|
-
# loaded only if AWS resources are needed.
|
|
3
|
-
|
|
4
|
-
require 'aws-sdk' # TODO: split once ADK v3 is in use
|
|
5
|
-
|
|
6
|
-
require 'resource_support/aws/aws_backend_factory_mixin'
|
|
7
|
-
require 'resource_support/aws/aws_resource_mixin'
|
|
8
|
-
require 'resource_support/aws/aws_singular_resource_mixin'
|
|
9
|
-
require 'resource_support/aws/aws_plural_resource_mixin'
|
|
10
|
-
require 'resource_support/aws/aws_backend_base'
|
|
11
|
-
|
|
12
|
-
# Load all AWS resources
|
|
13
|
-
# TODO: loop over and load entire directory
|
|
14
|
-
# for f in ls lib/resources/aws/*; do t=$(echo $f | cut -c 5- | cut -f1 -d. ); echo "require '${t}'"; done
|
|
15
|
-
require 'resources/aws/aws_cloudtrail_trail'
|
|
16
|
-
require 'resources/aws/aws_cloudtrail_trails'
|
|
17
|
-
require 'resources/aws/aws_cloudwatch_alarm'
|
|
18
|
-
require 'resources/aws/aws_cloudwatch_log_metric_filter'
|
|
19
|
-
require 'resources/aws/aws_config_recorder'
|
|
20
|
-
require 'resources/aws/aws_ec2_instance'
|
|
21
|
-
require 'resources/aws/aws_iam_access_key'
|
|
22
|
-
require 'resources/aws/aws_iam_access_keys'
|
|
23
|
-
require 'resources/aws/aws_iam_group'
|
|
24
|
-
require 'resources/aws/aws_iam_groups'
|
|
25
|
-
require 'resources/aws/aws_iam_password_policy'
|
|
26
|
-
require 'resources/aws/aws_iam_policies'
|
|
27
|
-
require 'resources/aws/aws_iam_policy'
|
|
28
|
-
require 'resources/aws/aws_iam_role'
|
|
29
|
-
require 'resources/aws/aws_iam_root_user'
|
|
30
|
-
require 'resources/aws/aws_iam_user'
|
|
31
|
-
require 'resources/aws/aws_iam_users'
|
|
32
|
-
require 'resources/aws/aws_kms_keys'
|
|
33
|
-
require 'resources/aws/aws_route_table'
|
|
34
|
-
require 'resources/aws/aws_s3_bucket'
|
|
35
|
-
require 'resources/aws/aws_security_group'
|
|
36
|
-
require 'resources/aws/aws_security_groups'
|
|
37
|
-
require 'resources/aws/aws_sns_topic'
|
|
38
|
-
require 'resources/aws/aws_subnet'
|
|
39
|
-
require 'resources/aws/aws_subnets'
|
|
40
|
-
require 'resources/aws/aws_vpc'
|
|
41
|
-
require 'resources/aws/aws_vpcs'
|
|
1
|
+
# Main AWS loader file. The intent is for this to be
|
|
2
|
+
# loaded only if AWS resources are needed.
|
|
3
|
+
|
|
4
|
+
require 'aws-sdk' # TODO: split once ADK v3 is in use
|
|
5
|
+
|
|
6
|
+
require 'resource_support/aws/aws_backend_factory_mixin'
|
|
7
|
+
require 'resource_support/aws/aws_resource_mixin'
|
|
8
|
+
require 'resource_support/aws/aws_singular_resource_mixin'
|
|
9
|
+
require 'resource_support/aws/aws_plural_resource_mixin'
|
|
10
|
+
require 'resource_support/aws/aws_backend_base'
|
|
11
|
+
|
|
12
|
+
# Load all AWS resources
|
|
13
|
+
# TODO: loop over and load entire directory
|
|
14
|
+
# for f in ls lib/resources/aws/*; do t=$(echo $f | cut -c 5- | cut -f1 -d. ); echo "require '${t}'"; done
|
|
15
|
+
require 'resources/aws/aws_cloudtrail_trail'
|
|
16
|
+
require 'resources/aws/aws_cloudtrail_trails'
|
|
17
|
+
require 'resources/aws/aws_cloudwatch_alarm'
|
|
18
|
+
require 'resources/aws/aws_cloudwatch_log_metric_filter'
|
|
19
|
+
require 'resources/aws/aws_config_recorder'
|
|
20
|
+
require 'resources/aws/aws_ec2_instance'
|
|
21
|
+
require 'resources/aws/aws_iam_access_key'
|
|
22
|
+
require 'resources/aws/aws_iam_access_keys'
|
|
23
|
+
require 'resources/aws/aws_iam_group'
|
|
24
|
+
require 'resources/aws/aws_iam_groups'
|
|
25
|
+
require 'resources/aws/aws_iam_password_policy'
|
|
26
|
+
require 'resources/aws/aws_iam_policies'
|
|
27
|
+
require 'resources/aws/aws_iam_policy'
|
|
28
|
+
require 'resources/aws/aws_iam_role'
|
|
29
|
+
require 'resources/aws/aws_iam_root_user'
|
|
30
|
+
require 'resources/aws/aws_iam_user'
|
|
31
|
+
require 'resources/aws/aws_iam_users'
|
|
32
|
+
require 'resources/aws/aws_kms_keys'
|
|
33
|
+
require 'resources/aws/aws_route_table'
|
|
34
|
+
require 'resources/aws/aws_s3_bucket'
|
|
35
|
+
require 'resources/aws/aws_security_group'
|
|
36
|
+
require 'resources/aws/aws_security_groups'
|
|
37
|
+
require 'resources/aws/aws_sns_topic'
|
|
38
|
+
require 'resources/aws/aws_subnet'
|
|
39
|
+
require 'resources/aws/aws_subnets'
|
|
40
|
+
require 'resources/aws/aws_vpc'
|
|
41
|
+
require 'resources/aws/aws_vpcs'
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
class AwsBackendBase
|
|
2
|
-
attr_reader :aws_transport
|
|
3
|
-
class << self; attr_accessor :aws_client_class end
|
|
4
|
-
|
|
5
|
-
def initialize(inspec = nil)
|
|
6
|
-
@aws_transport = inspec ? inspec.backend : nil
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def aws_service_client
|
|
10
|
-
aws_transport.aws_client(self.class.aws_client_class)
|
|
11
|
-
end
|
|
12
|
-
end
|
|
1
|
+
class AwsBackendBase
|
|
2
|
+
attr_reader :aws_transport
|
|
3
|
+
class << self; attr_accessor :aws_client_class end
|
|
4
|
+
|
|
5
|
+
def initialize(inspec = nil)
|
|
6
|
+
@aws_transport = inspec ? inspec.backend : nil
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def aws_service_client
|
|
10
|
+
aws_transport.aws_client(self.class.aws_client_class)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# Intended to be pulled in via extend, not include
|
|
2
|
-
module AwsBackendFactoryMixin
|
|
3
|
-
def create(inspec)
|
|
4
|
-
@selected_backend.new(inspec)
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
def select(klass)
|
|
8
|
-
@selected_backend = klass
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
alias set_default_backend select
|
|
12
|
-
end
|
|
1
|
+
# Intended to be pulled in via extend, not include
|
|
2
|
+
module AwsBackendFactoryMixin
|
|
3
|
+
def create(inspec)
|
|
4
|
+
@selected_backend.new(inspec)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def select(klass)
|
|
8
|
+
@selected_backend = klass
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
alias set_default_backend select
|
|
12
|
+
end
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
module AwsPluralResourceMixin
|
|
2
|
-
include AwsResourceMixin
|
|
3
|
-
attr_reader :table
|
|
4
|
-
|
|
5
|
-
# This sets up a class, AwsSomeResource::BackendFactory, that
|
|
6
|
-
# provides a mechanism to create and use backends without
|
|
7
|
-
# having to know which is selected. This is mainly used for
|
|
8
|
-
# unit testing.
|
|
9
|
-
# TODO: DRY up. This code exists in both the Singular and Plural mixins.
|
|
10
|
-
# We'd like to put it in AwsResourceMixin, but included only sees the
|
|
11
|
-
# directly-including class - we can't see second-order includers.
|
|
12
|
-
def self.included(base)
|
|
13
|
-
# Create a new class, whose body is simply to extend the
|
|
14
|
-
# backend factory mixin
|
|
15
|
-
resource_backend_factory_class = Class.new(Object) do
|
|
16
|
-
extend AwsBackendFactoryMixin
|
|
17
|
-
end
|
|
18
|
-
# Name that class
|
|
19
|
-
base.const_set('BackendFactory', resource_backend_factory_class)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
1
|
+
module AwsPluralResourceMixin
|
|
2
|
+
include AwsResourceMixin
|
|
3
|
+
attr_reader :table
|
|
4
|
+
|
|
5
|
+
# This sets up a class, AwsSomeResource::BackendFactory, that
|
|
6
|
+
# provides a mechanism to create and use backends without
|
|
7
|
+
# having to know which is selected. This is mainly used for
|
|
8
|
+
# unit testing.
|
|
9
|
+
# TODO: DRY up. This code exists in both the Singular and Plural mixins.
|
|
10
|
+
# We'd like to put it in AwsResourceMixin, but included only sees the
|
|
11
|
+
# directly-including class - we can't see second-order includers.
|
|
12
|
+
def self.included(base)
|
|
13
|
+
# Create a new class, whose body is simply to extend the
|
|
14
|
+
# backend factory mixin
|
|
15
|
+
resource_backend_factory_class = Class.new(Object) do
|
|
16
|
+
extend AwsBackendFactoryMixin
|
|
17
|
+
end
|
|
18
|
+
# Name that class
|
|
19
|
+
base.const_set('BackendFactory', resource_backend_factory_class)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
module AwsResourceMixin
|
|
2
|
-
def initialize(resource_params = {})
|
|
3
|
-
validate_params(resource_params).each do |param, value|
|
|
4
|
-
instance_variable_set(:"@#{param}", value)
|
|
5
|
-
end
|
|
6
|
-
catch_aws_errors do
|
|
7
|
-
fetch_from_api
|
|
8
|
-
end
|
|
9
|
-
rescue ArgumentError => e
|
|
10
|
-
# continue with ArgumentError if testing
|
|
11
|
-
raise unless respond_to?(:inspec)
|
|
12
|
-
raise Inspec::Exceptions::ResourceFailed, e.message
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Default implementation of validate params accepts everything.
|
|
16
|
-
def validate_params(resource_params)
|
|
17
|
-
resource_params
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def check_resource_param_names(raw_params: {}, allowed_params: [], allowed_scalar_name: nil, allowed_scalar_type: nil)
|
|
21
|
-
# Some resources allow passing in a single ID value. Check and convert to hash if so.
|
|
22
|
-
if allowed_scalar_name && !raw_params.is_a?(Hash)
|
|
23
|
-
value_seen = raw_params
|
|
24
|
-
if value_seen.is_a?(allowed_scalar_type)
|
|
25
|
-
raw_params = { allowed_scalar_name => value_seen }
|
|
26
|
-
else
|
|
27
|
-
raise ArgumentError, 'If you pass a single value to the resource, it must ' \
|
|
28
|
-
"be a #{allowed_scalar_type}, not an #{value_seen.class}."
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Remove all expected params from the raw param hash
|
|
33
|
-
recognized_params = {}
|
|
34
|
-
allowed_params.each do |expected_param|
|
|
35
|
-
recognized_params[expected_param] = raw_params.delete(expected_param) if raw_params.key?(expected_param)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Any leftovers are unwelcome
|
|
39
|
-
unless raw_params.empty?
|
|
40
|
-
raise ArgumentError, "Unrecognized resource param '#{raw_params.keys.first}'. Expected parameters: #{allowed_params.join(', ')}"
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
recognized_params
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def inspec_runner
|
|
47
|
-
# When running under inspec-cli, we have an 'inspec' method that
|
|
48
|
-
# returns the runner. When running under unit tests, we don't
|
|
49
|
-
# have that, but we still have to call this to pass something
|
|
50
|
-
# (nil is OK) to the backend.
|
|
51
|
-
# TODO: remove with https://github.com/chef/inspec-aws/issues/216
|
|
52
|
-
inspec if respond_to?(:inspec)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# Intercept AWS exceptions
|
|
56
|
-
def catch_aws_errors
|
|
57
|
-
yield
|
|
58
|
-
rescue Aws::Errors::MissingCredentialsError
|
|
59
|
-
# The AWS error here is unhelpful:
|
|
60
|
-
# "unable to sign request without credentials set"
|
|
61
|
-
Inspec::Log.error "It appears that you have not set your AWS credentials. You may set them using environment variables, or using the 'aws://region/aws_credentials_profile' target. See https://www.inspec.io/docs/reference/platforms for details."
|
|
62
|
-
fail_resource('No AWS credentials available')
|
|
63
|
-
rescue Aws::Errors::ServiceError => e
|
|
64
|
-
fail_resource e.message
|
|
65
|
-
end
|
|
66
|
-
end
|
|
1
|
+
module AwsResourceMixin
|
|
2
|
+
def initialize(resource_params = {})
|
|
3
|
+
validate_params(resource_params).each do |param, value|
|
|
4
|
+
instance_variable_set(:"@#{param}", value)
|
|
5
|
+
end
|
|
6
|
+
catch_aws_errors do
|
|
7
|
+
fetch_from_api
|
|
8
|
+
end
|
|
9
|
+
rescue ArgumentError => e
|
|
10
|
+
# continue with ArgumentError if testing
|
|
11
|
+
raise unless respond_to?(:inspec)
|
|
12
|
+
raise Inspec::Exceptions::ResourceFailed, e.message
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Default implementation of validate params accepts everything.
|
|
16
|
+
def validate_params(resource_params)
|
|
17
|
+
resource_params
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def check_resource_param_names(raw_params: {}, allowed_params: [], allowed_scalar_name: nil, allowed_scalar_type: nil)
|
|
21
|
+
# Some resources allow passing in a single ID value. Check and convert to hash if so.
|
|
22
|
+
if allowed_scalar_name && !raw_params.is_a?(Hash)
|
|
23
|
+
value_seen = raw_params
|
|
24
|
+
if value_seen.is_a?(allowed_scalar_type)
|
|
25
|
+
raw_params = { allowed_scalar_name => value_seen }
|
|
26
|
+
else
|
|
27
|
+
raise ArgumentError, 'If you pass a single value to the resource, it must ' \
|
|
28
|
+
"be a #{allowed_scalar_type}, not an #{value_seen.class}."
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Remove all expected params from the raw param hash
|
|
33
|
+
recognized_params = {}
|
|
34
|
+
allowed_params.each do |expected_param|
|
|
35
|
+
recognized_params[expected_param] = raw_params.delete(expected_param) if raw_params.key?(expected_param)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Any leftovers are unwelcome
|
|
39
|
+
unless raw_params.empty?
|
|
40
|
+
raise ArgumentError, "Unrecognized resource param '#{raw_params.keys.first}'. Expected parameters: #{allowed_params.join(', ')}"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
recognized_params
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def inspec_runner
|
|
47
|
+
# When running under inspec-cli, we have an 'inspec' method that
|
|
48
|
+
# returns the runner. When running under unit tests, we don't
|
|
49
|
+
# have that, but we still have to call this to pass something
|
|
50
|
+
# (nil is OK) to the backend.
|
|
51
|
+
# TODO: remove with https://github.com/chef/inspec-aws/issues/216
|
|
52
|
+
inspec if respond_to?(:inspec)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Intercept AWS exceptions
|
|
56
|
+
def catch_aws_errors
|
|
57
|
+
yield
|
|
58
|
+
rescue Aws::Errors::MissingCredentialsError
|
|
59
|
+
# The AWS error here is unhelpful:
|
|
60
|
+
# "unable to sign request without credentials set"
|
|
61
|
+
Inspec::Log.error "It appears that you have not set your AWS credentials. You may set them using environment variables, or using the 'aws://region/aws_credentials_profile' target. See https://www.inspec.io/docs/reference/platforms for details."
|
|
62
|
+
fail_resource('No AWS credentials available')
|
|
63
|
+
rescue Aws::Errors::ServiceError => e
|
|
64
|
+
fail_resource e.message
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
module AwsSingularResourceMixin
|
|
2
|
-
include AwsResourceMixin
|
|
3
|
-
|
|
4
|
-
def exists?
|
|
5
|
-
@exists
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
# This sets up a class, AwsSomeResource::BackendFactory, that
|
|
9
|
-
# provides a mechanism to create and use backends without
|
|
10
|
-
# having to know which is selected. This is mainly used for
|
|
11
|
-
# unit testing.
|
|
12
|
-
# TODO: DRY up. This code exists in both the Singular and Plural mixins.
|
|
13
|
-
# We'd like to put it in AwsResourceMixin, but included only sees the
|
|
14
|
-
# directly-including class - we can't see second-order includers.
|
|
15
|
-
def self.included(base)
|
|
16
|
-
# Create a new class, whose body is simply to extend the
|
|
17
|
-
# backend factory mixin
|
|
18
|
-
resource_backend_factory_class = Class.new(Object) do
|
|
19
|
-
extend AwsBackendFactoryMixin
|
|
20
|
-
end
|
|
21
|
-
# Name that class
|
|
22
|
-
base.const_set('BackendFactory', resource_backend_factory_class)
|
|
23
|
-
end
|
|
24
|
-
end
|
|
1
|
+
module AwsSingularResourceMixin
|
|
2
|
+
include AwsResourceMixin
|
|
3
|
+
|
|
4
|
+
def exists?
|
|
5
|
+
@exists
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# This sets up a class, AwsSomeResource::BackendFactory, that
|
|
9
|
+
# provides a mechanism to create and use backends without
|
|
10
|
+
# having to know which is selected. This is mainly used for
|
|
11
|
+
# unit testing.
|
|
12
|
+
# TODO: DRY up. This code exists in both the Singular and Plural mixins.
|
|
13
|
+
# We'd like to put it in AwsResourceMixin, but included only sees the
|
|
14
|
+
# directly-including class - we can't see second-order includers.
|
|
15
|
+
def self.included(base)
|
|
16
|
+
# Create a new class, whose body is simply to extend the
|
|
17
|
+
# backend factory mixin
|
|
18
|
+
resource_backend_factory_class = Class.new(Object) do
|
|
19
|
+
extend AwsBackendFactoryMixin
|
|
20
|
+
end
|
|
21
|
+
# Name that class
|
|
22
|
+
base.const_set('BackendFactory', resource_backend_factory_class)
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/resources/aide_conf.rb
CHANGED
|
@@ -1,160 +1,159 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
require 'utils/filter'
|
|
4
|
-
require 'utils/parser'
|
|
5
|
-
module Inspec::Resources
|
|
6
|
-
class AideConf < Inspec.resource(1)
|
|
7
|
-
name 'aide_conf'
|
|
8
|
-
supports platform: 'unix'
|
|
9
|
-
desc 'Use the aide_conf InSpec audit resource to test the rules established for
|
|
10
|
-
the file integrity tool AIDE. Controlled by the aide.conf file typically at /etc/aide.conf.'
|
|
11
|
-
example "
|
|
12
|
-
describe aide_conf do
|
|
13
|
-
its('selection_lines') { should include '/sbin' }
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
describe aide_conf.where { selection_line == '/bin' } do
|
|
17
|
-
its('rules.flatten') { should include 'r' }
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
describe aide_conf.all_have_rule('sha512') do
|
|
21
|
-
it { should eq true }
|
|
22
|
-
end
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
attr_reader :params
|
|
26
|
-
|
|
27
|
-
include CommentParser
|
|
28
|
-
|
|
29
|
-
def initialize(aide_conf_path = nil)
|
|
30
|
-
|
|
31
|
-
@
|
|
32
|
-
@
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
lines
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
filter
|
|
46
|
-
|
|
47
|
-
.
|
|
48
|
-
.add(:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
file
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
raw_conf
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
@
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
content_line
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
param
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
line.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
selection_line
|
|
126
|
-
|
|
127
|
-
rule_list
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
'
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'utils/filter'
|
|
4
|
+
require 'utils/parser'
|
|
5
|
+
module Inspec::Resources
|
|
6
|
+
class AideConf < Inspec.resource(1)
|
|
7
|
+
name 'aide_conf'
|
|
8
|
+
supports platform: 'unix'
|
|
9
|
+
desc 'Use the aide_conf InSpec audit resource to test the rules established for
|
|
10
|
+
the file integrity tool AIDE. Controlled by the aide.conf file typically at /etc/aide.conf.'
|
|
11
|
+
example "
|
|
12
|
+
describe aide_conf do
|
|
13
|
+
its('selection_lines') { should include '/sbin' }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe aide_conf.where { selection_line == '/bin' } do
|
|
17
|
+
its('rules.flatten') { should include 'r' }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe aide_conf.all_have_rule('sha512') do
|
|
21
|
+
it { should eq true }
|
|
22
|
+
end
|
|
23
|
+
"
|
|
24
|
+
|
|
25
|
+
attr_reader :params
|
|
26
|
+
|
|
27
|
+
include CommentParser
|
|
28
|
+
|
|
29
|
+
def initialize(aide_conf_path = nil)
|
|
30
|
+
@conf_path = aide_conf_path || '/etc/aide.conf'
|
|
31
|
+
@content = nil
|
|
32
|
+
@rules = nil
|
|
33
|
+
read_content
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def all_have_rule(rule)
|
|
37
|
+
# Case when file didn't exist or perms didn't allow an open
|
|
38
|
+
return false if @content.nil?
|
|
39
|
+
|
|
40
|
+
lines = @params.reject { |line| line['rules'].include? rule }
|
|
41
|
+
lines.empty?
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
filter = FilterTable.create
|
|
45
|
+
filter.add_accessor(:where)
|
|
46
|
+
.add_accessor(:entries)
|
|
47
|
+
.add(:selection_lines, field: 'selection_line')
|
|
48
|
+
.add(:rules, field: 'rules')
|
|
49
|
+
|
|
50
|
+
filter.connect(self, :params)
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def read_content
|
|
55
|
+
return @content unless @content.nil?
|
|
56
|
+
@rules = {}
|
|
57
|
+
|
|
58
|
+
file = inspec.file(@conf_path)
|
|
59
|
+
if !file.file?
|
|
60
|
+
return skip_resource "Can't find file \"#{@conf_path}\""
|
|
61
|
+
end
|
|
62
|
+
raw_conf = file.content
|
|
63
|
+
if raw_conf.nil?
|
|
64
|
+
return skip_resource "File can't be opened or is empty \"#{@conf_path}\""
|
|
65
|
+
end
|
|
66
|
+
if raw_conf.empty? && !file.empty?
|
|
67
|
+
return skip_resource "Can't read file \"#{@conf_path}\""
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# If there is a file and it contains content, continue
|
|
71
|
+
@content = filter_comments(inspec.file(@conf_path).content.lines)
|
|
72
|
+
@params = parse_conf(@content)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def filter_comments(data)
|
|
76
|
+
content = []
|
|
77
|
+
data.each do |line|
|
|
78
|
+
content_line, = parse_comment_line(line, comment_char: '#', standalone_comments: false)
|
|
79
|
+
content.push(content_line)
|
|
80
|
+
end
|
|
81
|
+
content
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def parse_conf(content)
|
|
85
|
+
params = []
|
|
86
|
+
content.each do |line|
|
|
87
|
+
param = parse_line(line)
|
|
88
|
+
if !param['selection_line'].nil?
|
|
89
|
+
params.push(param)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
params
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def parse_line(line)
|
|
96
|
+
line_and_rules = {}
|
|
97
|
+
# Case when line is a rule line
|
|
98
|
+
if line.include?(' = ')
|
|
99
|
+
parse_rule_line(line)
|
|
100
|
+
# Case when line is a selection line
|
|
101
|
+
elsif line.start_with?('/', '!', '=')
|
|
102
|
+
line_and_rules = parse_selection_line(line)
|
|
103
|
+
end
|
|
104
|
+
line_and_rules
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def parse_rule_line(line)
|
|
108
|
+
line.gsub!(/\s+/, '')
|
|
109
|
+
rule_line_arr = line.split('=')
|
|
110
|
+
rules_list = rule_line_arr.last.split('+')
|
|
111
|
+
rule_name = rule_line_arr.first
|
|
112
|
+
rules_list.each_index do |i|
|
|
113
|
+
# Cases where rule respresents one or more other rules
|
|
114
|
+
if @rules.key?(rules_list[i])
|
|
115
|
+
rules_list[i] = @rules[rules_list[i]]
|
|
116
|
+
end
|
|
117
|
+
rules_list[i] = handle_multi_rule(rules_list, i)
|
|
118
|
+
end
|
|
119
|
+
@rules[rule_name] = rules_list.flatten
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def parse_selection_line(line)
|
|
123
|
+
selec_line_arr = line.split(' ')
|
|
124
|
+
selection_line = selec_line_arr.first
|
|
125
|
+
selection_line.chop! if selection_line.end_with?('/')
|
|
126
|
+
rule_list = selec_line_arr.last.split('+')
|
|
127
|
+
rule_list.each_index do |i|
|
|
128
|
+
hash_list = @rules[rule_list[i]]
|
|
129
|
+
# Cases where rule respresents one or more other rules
|
|
130
|
+
if !hash_list.nil?
|
|
131
|
+
rule_list[i] = hash_list
|
|
132
|
+
end
|
|
133
|
+
rule_list[i] = handle_multi_rule(rule_list, i)
|
|
134
|
+
end
|
|
135
|
+
rule_list.flatten!
|
|
136
|
+
{
|
|
137
|
+
'selection_line' => selection_line,
|
|
138
|
+
'rules' => rule_list,
|
|
139
|
+
}
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def handle_multi_rule(rule_list, i)
|
|
143
|
+
# Rules that represent multiple rules (R,L,>)
|
|
144
|
+
r_rules = %w{p i l n u g s m c md5}
|
|
145
|
+
l_rules = %w{p i l n u g}
|
|
146
|
+
grow_log_rules = %w{p l u g i n S}
|
|
147
|
+
|
|
148
|
+
case rule_list[i]
|
|
149
|
+
when 'R'
|
|
150
|
+
return r_rules
|
|
151
|
+
when 'L'
|
|
152
|
+
return l_rules
|
|
153
|
+
when '>'
|
|
154
|
+
return grow_log_rules
|
|
155
|
+
end
|
|
156
|
+
rule_list[i]
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|