inspec 2.1.81 → 2.1.83
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 +5 -5
- data/.rubocop.yml +101 -101
- data/CHANGELOG.md +3183 -3177
- data/Gemfile +56 -56
- data/LICENSE +14 -14
- data/MAINTAINERS.md +33 -33
- data/MAINTAINERS.toml +52 -52
- data/README.md +453 -453
- data/Rakefile +349 -349
- data/bin/inspec +12 -12
- data/docs/.gitignore +2 -2
- data/docs/README.md +41 -40
- data/docs/dev/control-eval.md +61 -61
- data/docs/dsl_inspec.md +258 -258
- data/docs/dsl_resource.md +100 -100
- data/docs/glossary.md +99 -99
- data/docs/habitat.md +191 -191
- data/docs/inspec_and_friends.md +114 -114
- data/docs/matchers.md +169 -169
- data/docs/migration.md +293 -293
- data/docs/platforms.md +118 -118
- data/docs/plugin_kitchen_inspec.md +50 -50
- data/docs/profiles.md +378 -378
- 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 +155 -155
- data/docs/resources/aws_cloudtrail_trails.md.erb +86 -86
- data/docs/resources/aws_cloudwatch_alarm.md.erb +91 -91
- data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +154 -154
- data/docs/resources/aws_config_delivery_channel.md.erb +101 -101
- data/docs/resources/aws_config_recorder.md.erb +86 -86
- data/docs/resources/aws_ec2_instance.md.erb +112 -112
- data/docs/resources/aws_ec2_instances.md.erb +79 -79
- data/docs/resources/aws_iam_access_key.md.erb +129 -129
- data/docs/resources/aws_iam_access_keys.md.erb +204 -204
- data/docs/resources/aws_iam_group.md.erb +64 -64
- data/docs/resources/aws_iam_groups.md.erb +49 -49
- data/docs/resources/aws_iam_password_policy.md.erb +82 -82
- data/docs/resources/aws_iam_policies.md.erb +87 -87
- data/docs/resources/aws_iam_policy.md.erb +245 -245
- data/docs/resources/aws_iam_role.md.erb +69 -69
- data/docs/resources/aws_iam_root_user.md.erb +76 -76
- data/docs/resources/aws_iam_user.md.erb +120 -120
- data/docs/resources/aws_iam_users.md.erb +279 -279
- data/docs/resources/aws_kms_key.md.erb +177 -177
- data/docs/resources/aws_kms_keys.md.erb +89 -89
- data/docs/resources/aws_rds_instance.md.erb +66 -66
- data/docs/resources/aws_route_table.md.erb +53 -53
- data/docs/resources/aws_route_tables.md.erb +55 -55
- data/docs/resources/aws_s3_bucket.md.erb +146 -146
- data/docs/resources/aws_s3_bucket_object.md.erb +89 -89
- data/docs/resources/aws_s3_buckets.md.erb +59 -59
- data/docs/resources/aws_security_group.md.erb +296 -296
- data/docs/resources/aws_security_groups.md.erb +97 -97
- data/docs/resources/aws_sns_subscription.md.erb +130 -130
- data/docs/resources/aws_sns_topic.md.erb +69 -69
- data/docs/resources/aws_sns_topics.md.erb +58 -58
- data/docs/resources/aws_subnet.md.erb +140 -140
- data/docs/resources/aws_subnets.md.erb +132 -132
- data/docs/resources/aws_vpc.md.erb +125 -125
- data/docs/resources/aws_vpcs.md.erb +125 -125
- data/docs/resources/azure_generic_resource.md.erb +171 -171
- 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/chocolatey_package.md.erb +58 -58
- 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 +103 -103
- 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 -526
- 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 +197 -197
- 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_defs.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 +138 -138
- 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 +91 -91
- 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 -146
- data/docs/resources/ssh_config.md.erb +73 -73
- 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 +217 -217
- 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 +23 -23
- 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 +59 -59
- data/inspec.gemspec +49 -49
- 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 +193 -193
- data/lib/bundles/inspec-compliance/api.rb +360 -360
- data/lib/bundles/inspec-compliance/api/login.rb +193 -193
- data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
- data/lib/bundles/inspec-compliance/cli.rb +260 -260
- data/lib/bundles/inspec-compliance/configuration.rb +103 -103
- data/lib/bundles/inspec-compliance/http.rb +125 -125
- data/lib/bundles/inspec-compliance/support.rb +36 -36
- data/lib/bundles/inspec-compliance/target.rb +112 -112
- 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 +391 -391
- 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 +247 -247
- 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 +93 -93
- data/lib/inspec/base_cli.rb +368 -368
- 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 +14 -14
- 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 +259 -259
- 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 +75 -75
- 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 +513 -513
- data/lib/inspec/profile_context.rb +208 -208
- data/lib/inspec/profile_vendor.rb +66 -66
- data/lib/inspec/reporters.rb +60 -60
- data/lib/inspec/reporters/automate.rb +76 -76
- data/lib/inspec/reporters/base.rb +25 -25
- data/lib/inspec/reporters/cli.rb +356 -356
- data/lib/inspec/reporters/json.rb +117 -117
- data/lib/inspec/reporters/json_min.rb +48 -48
- data/lib/inspec/reporters/junit.rb +78 -78
- data/lib/inspec/require_loader.rb +33 -33
- data/lib/inspec/resource.rb +190 -190
- data/lib/inspec/rule.rb +280 -280
- 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 +50 -50
- 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 +151 -151
- data/lib/resources/apache.rb +48 -48
- data/lib/resources/apache_conf.rb +149 -149
- 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 +46 -46
- data/lib/resources/aws/aws_cloudtrail_trail.rb +93 -93
- 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_delivery_channel.rb +70 -70
- data/lib/resources/aws/aws_config_recorder.rb +93 -93
- data/lib/resources/aws/aws_ec2_instance.rb +157 -157
- data/lib/resources/aws/aws_ec2_instances.rb +64 -64
- data/lib/resources/aws/aws_iam_access_key.rb +106 -106
- data/lib/resources/aws/aws_iam_access_keys.rb +149 -149
- data/lib/resources/aws/aws_iam_group.rb +58 -58
- data/lib/resources/aws/aws_iam_groups.rb +52 -52
- data/lib/resources/aws/aws_iam_password_policy.rb +116 -116
- data/lib/resources/aws/aws_iam_policies.rb +53 -53
- data/lib/resources/aws/aws_iam_policy.rb +291 -291
- data/lib/resources/aws/aws_iam_role.rb +55 -55
- data/lib/resources/aws/aws_iam_root_user.rb +78 -78
- data/lib/resources/aws/aws_iam_user.rb +142 -142
- data/lib/resources/aws/aws_iam_users.rb +146 -146
- data/lib/resources/aws/aws_kms_key.rb +96 -96
- data/lib/resources/aws/aws_kms_keys.rb +53 -53
- data/lib/resources/aws/aws_rds_instance.rb +71 -71
- data/lib/resources/aws/aws_route_table.rb +63 -63
- data/lib/resources/aws/aws_route_tables.rb +60 -60
- data/lib/resources/aws/aws_s3_bucket.rb +137 -137
- data/lib/resources/aws/aws_s3_bucket_object.rb +82 -82
- data/lib/resources/aws/aws_s3_buckets.rb +51 -51
- data/lib/resources/aws/aws_security_group.rb +249 -249
- data/lib/resources/aws/aws_security_groups.rb +68 -68
- data/lib/resources/aws/aws_sns_subscription.rb +78 -78
- data/lib/resources/aws/aws_sns_topic.rb +53 -53
- data/lib/resources/aws/aws_sns_topics.rb +56 -56
- 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 +73 -73
- data/lib/resources/aws/aws_vpcs.rb +52 -52
- 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 +134 -134
- data/lib/resources/bash.rb +35 -35
- data/lib/resources/bond.rb +69 -69
- data/lib/resources/bridge.rb +122 -122
- data/lib/resources/chocolatey_package.rb +78 -78
- data/lib/resources/command.rb +73 -73
- data/lib/resources/cpan.rb +58 -58
- data/lib/resources/cran.rb +64 -64
- data/lib/resources/crontab.rb +169 -169
- data/lib/resources/csv.rb +56 -56
- data/lib/resources/dh_params.rb +77 -77
- 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 +94 -94
- data/lib/resources/etc_group.rb +154 -154
- data/lib/resources/etc_hosts.rb +66 -66
- data/lib/resources/etc_hosts_allow_deny.rb +112 -112
- data/lib/resources/file.rb +298 -298
- data/lib/resources/filesystem.rb +31 -31
- data/lib/resources/firewalld.rb +143 -143
- data/lib/resources/gem.rb +70 -70
- data/lib/resources/groups.rb +215 -215
- data/lib/resources/grub_conf.rb +227 -227
- data/lib/resources/host.rb +306 -306
- data/lib/resources/http.rb +253 -253
- data/lib/resources/iis_app.rb +101 -101
- data/lib/resources/iis_site.rb +148 -148
- data/lib/resources/inetd_conf.rb +54 -54
- data/lib/resources/ini.rb +29 -29
- data/lib/resources/interface.rb +129 -129
- data/lib/resources/iptables.rb +80 -80
- data/lib/resources/json.rb +111 -111
- data/lib/resources/kernel_module.rb +107 -107
- data/lib/resources/kernel_parameter.rb +58 -58
- data/lib/resources/key_rsa.rb +63 -63
- data/lib/resources/limits_conf.rb +46 -46
- data/lib/resources/login_def.rb +57 -57
- data/lib/resources/mount.rb +88 -88
- data/lib/resources/mssql_session.rb +101 -101
- data/lib/resources/mysql.rb +82 -82
- data/lib/resources/mysql_conf.rb +127 -127
- data/lib/resources/mysql_session.rb +85 -85
- data/lib/resources/nginx.rb +96 -96
- data/lib/resources/nginx_conf.rb +226 -226
- data/lib/resources/npm.rb +48 -48
- data/lib/resources/ntp_conf.rb +51 -51
- 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 +86 -86
- data/lib/resources/package.rb +370 -370
- data/lib/resources/packages.rb +111 -111
- data/lib/resources/parse_config.rb +112 -112
- data/lib/resources/passwd.rb +76 -76
- data/lib/resources/pip.rb +130 -130
- data/lib/resources/platform.rb +109 -109
- data/lib/resources/port.rb +771 -771
- data/lib/resources/postgres.rb +131 -131
- data/lib/resources/postgres_conf.rb +114 -114
- data/lib/resources/postgres_hba_conf.rb +90 -90
- data/lib/resources/postgres_ident_conf.rb +79 -79
- data/lib/resources/postgres_session.rb +71 -71
- data/lib/resources/powershell.rb +67 -67
- data/lib/resources/processes.rb +204 -204
- data/lib/resources/rabbitmq_conf.rb +51 -51
- data/lib/resources/registry_key.rb +297 -297
- data/lib/resources/security_policy.rb +180 -180
- data/lib/resources/service.rb +794 -794
- data/lib/resources/shadow.rb +159 -159
- data/lib/resources/ssh_conf.rb +97 -97
- 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 -68
- 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 -102
- data/lib/resources/wmi.rb +110 -110
- data/lib/resources/x509_certificate.rb +137 -137
- data/lib/resources/xinetd.rb +106 -106
- data/lib/resources/xml.rb +46 -46
- data/lib/resources/yaml.rb +43 -43
- 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/enumerable_delegation.rb +9 -9
- data/lib/utils/erlang_parser.rb +192 -192
- data/lib/utils/file_reader.rb +25 -25
- data/lib/utils/filter.rb +273 -273
- data/lib/utils/filter_array.rb +27 -27
- data/lib/utils/find_files.rb +47 -47
- 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 +105 -105
- data/lib/utils/object_traversal.rb +49 -49
- data/lib/utils/parser.rb +274 -274
- data/lib/utils/pkey_reader.rb +15 -15
- 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 +3 -3
|
@@ -1,249 +1,249 @@
|
|
|
1
|
-
require 'set'
|
|
2
|
-
require 'ipaddr'
|
|
3
|
-
|
|
4
|
-
class AwsSecurityGroup < Inspec.resource(1)
|
|
5
|
-
name 'aws_security_group'
|
|
6
|
-
desc 'Verifies settings for an individual AWS Security Group.'
|
|
7
|
-
example "
|
|
8
|
-
describe aws_security_group('sg-12345678') do
|
|
9
|
-
it { should exist }
|
|
10
|
-
end
|
|
11
|
-
"
|
|
12
|
-
supports platform: 'aws'
|
|
13
|
-
|
|
14
|
-
include AwsSingularResourceMixin
|
|
15
|
-
attr_reader :description, :group_id, :group_name, :vpc_id, :inbound_rules, :outbound_rules
|
|
16
|
-
|
|
17
|
-
def to_s
|
|
18
|
-
"EC2 Security Group #{@group_id}"
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def allow_in?(criteria = {})
|
|
22
|
-
allow(inbound_rules, criteria.dup)
|
|
23
|
-
end
|
|
24
|
-
RSpec::Matchers.alias_matcher :allow_in, :be_allow_in
|
|
25
|
-
|
|
26
|
-
def allow_out?(criteria = {})
|
|
27
|
-
allow(outbound_rules, criteria.dup)
|
|
28
|
-
end
|
|
29
|
-
RSpec::Matchers.alias_matcher :allow_out, :be_allow_out
|
|
30
|
-
|
|
31
|
-
def allow_in_only?(criteria = {})
|
|
32
|
-
allow_only(inbound_rules, criteria.dup)
|
|
33
|
-
end
|
|
34
|
-
RSpec::Matchers.alias_matcher :allow_in_only, :be_allow_in_only
|
|
35
|
-
|
|
36
|
-
def allow_out_only?(criteria = {})
|
|
37
|
-
allow_only(outbound_rules, criteria.dup)
|
|
38
|
-
end
|
|
39
|
-
RSpec::Matchers.alias_matcher :allow_out_only, :be_allow_out_only
|
|
40
|
-
|
|
41
|
-
private
|
|
42
|
-
|
|
43
|
-
def allow_only(rules, criteria)
|
|
44
|
-
# allow_{in_out}_only require either a single-rule group, or you
|
|
45
|
-
# to select a rule using position.
|
|
46
|
-
return false unless rules.count == 1 || criteria.key?(:position)
|
|
47
|
-
criteria[:exact] = true
|
|
48
|
-
allow(rules, criteria)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def allow(rules, criteria)
|
|
52
|
-
criteria = allow__check_criteria(criteria)
|
|
53
|
-
rules = allow__focus_on_position(rules, criteria)
|
|
54
|
-
|
|
55
|
-
rules.any? do |rule|
|
|
56
|
-
matched = true
|
|
57
|
-
matched &&= allow__match_port(rule, criteria)
|
|
58
|
-
matched &&= allow__match_protocol(rule, criteria)
|
|
59
|
-
matched &&= allow__match_ipv4_range(rule, criteria)
|
|
60
|
-
matched
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def allow__check_criteria(raw_criteria)
|
|
65
|
-
allowed_criteria = [
|
|
66
|
-
:from_port,
|
|
67
|
-
:ipv4_range,
|
|
68
|
-
:port,
|
|
69
|
-
:position,
|
|
70
|
-
:protocol,
|
|
71
|
-
:to_port,
|
|
72
|
-
:exact, # Internal
|
|
73
|
-
]
|
|
74
|
-
recognized_criteria = {}
|
|
75
|
-
allowed_criteria.each do |expected_criterion|
|
|
76
|
-
if raw_criteria.key?(expected_criterion)
|
|
77
|
-
recognized_criteria[expected_criterion] = raw_criteria.delete(expected_criterion)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Any leftovers are unwelcome
|
|
82
|
-
unless raw_criteria.empty?
|
|
83
|
-
raise ArgumentError, "Unrecognized security group rule 'allow' criteria '#{raw_criteria.keys.join(',')}'. Expected criteria: #{allowed_criteria.join(', ')}"
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
recognized_criteria
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def allow__focus_on_position(rules, criteria)
|
|
90
|
-
return rules unless criteria.key?(:position)
|
|
91
|
-
|
|
92
|
-
idx = criteria.delete(:position)
|
|
93
|
-
|
|
94
|
-
# Normalize to a zero-based numeric index
|
|
95
|
-
case # rubocop: disable Style/EmptyCaseCondition
|
|
96
|
-
when idx.is_a?(Symbol) && idx == :first
|
|
97
|
-
idx = 0
|
|
98
|
-
when idx.is_a?(Symbol) && idx == :last
|
|
99
|
-
idx = rules.count - 1
|
|
100
|
-
when idx.is_a?(String)
|
|
101
|
-
idx = idx.to_i - 1 # We document this as 1-based, so adjust to be zero-based.
|
|
102
|
-
when idx.is_a?(Numeric)
|
|
103
|
-
idx -= 1 # We document this as 1-based, so adjust to be zero-based.
|
|
104
|
-
else
|
|
105
|
-
raise ArgumentError, "aws_security_group 'allow' 'position' criteria must be an integer or the symbols :first or :last"
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
unless idx < rules.count
|
|
109
|
-
raise ArgumentError, "aws_security_group 'allow' 'position' criteria #{idx+1} is out of range - there are only #{rules.count} rules for security group #{group_id}."
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
[rules[idx]]
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def allow__match_port(rule, criteria) # rubocop: disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize
|
|
116
|
-
if criteria[:exact] || criteria[:from_port] || criteria[:to_port]
|
|
117
|
-
# Exact match mode
|
|
118
|
-
# :port is shorthand for a single-valued port range.
|
|
119
|
-
criteria[:to_port] = criteria[:from_port] = criteria[:port] if criteria[:port]
|
|
120
|
-
to = criteria[:to_port]
|
|
121
|
-
from = criteria[:from_port]
|
|
122
|
-
# It's a match if neither criteria was specified
|
|
123
|
-
return true if to.nil? && from.nil?
|
|
124
|
-
# Normalize to integers
|
|
125
|
-
to = to.to_i unless to.nil?
|
|
126
|
-
from = from.to_i unless from.nil?
|
|
127
|
-
# It's a match if either was specified and the other was not
|
|
128
|
-
return true if rule[:to_port] == to && from.nil?
|
|
129
|
-
return true if rule[:from_port] == from && to.nil?
|
|
130
|
-
# Finally, both must match.
|
|
131
|
-
rule[:to_port] == to && rule[:from_port] == from
|
|
132
|
-
elsif !criteria[:port]
|
|
133
|
-
# port not specified, match anything
|
|
134
|
-
true
|
|
135
|
-
else
|
|
136
|
-
# Range membership mode
|
|
137
|
-
rule_from = rule[:from_port] || 0
|
|
138
|
-
rule_to = rule[:to_port] || 65535
|
|
139
|
-
(rule_from..rule_to).cover?(criteria[:port].to_i)
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def allow__match_protocol(rule, criteria)
|
|
144
|
-
return true unless criteria.key?(:protocol)
|
|
145
|
-
prot = criteria[:protocol]
|
|
146
|
-
# We provide a "fluency alias" for -1 (any).
|
|
147
|
-
prot = '-1' if prot == 'any'
|
|
148
|
-
|
|
149
|
-
rule[:ip_protocol] == prot
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def allow__match_ipv4_range(rule, criteria)
|
|
153
|
-
return true unless criteria.key?(:ipv4_range)
|
|
154
|
-
query = criteria[:ipv4_range]
|
|
155
|
-
query = [query] unless query.is_a?(Array)
|
|
156
|
-
ranges = rule[:ip_ranges].map { |rng| rng[:cidr_ip] }
|
|
157
|
-
if criteria[:exact]
|
|
158
|
-
Set.new(query) == Set.new(ranges)
|
|
159
|
-
else
|
|
160
|
-
# CIDR subset mode
|
|
161
|
-
# "Each of the provided IP ranges must be a member of one of the rule's listed IP ranges"
|
|
162
|
-
query.all? do |candidate|
|
|
163
|
-
candidate = IPAddr.new(candidate)
|
|
164
|
-
ranges.any? do |range|
|
|
165
|
-
range = IPAddr.new(range)
|
|
166
|
-
range.include?(candidate)
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
def validate_params(raw_params)
|
|
173
|
-
recognized_params = check_resource_param_names(
|
|
174
|
-
raw_params: raw_params,
|
|
175
|
-
allowed_params: [:id, :group_id, :group_name, :vpc_id],
|
|
176
|
-
allowed_scalar_name: :group_id,
|
|
177
|
-
allowed_scalar_type: String,
|
|
178
|
-
)
|
|
179
|
-
|
|
180
|
-
# id is an alias for group_id
|
|
181
|
-
recognized_params[:group_id] = recognized_params.delete(:id) if recognized_params.key?(:id)
|
|
182
|
-
|
|
183
|
-
if recognized_params.key?(:group_id) && recognized_params[:group_id] !~ /^sg\-[0-9a-f]{8}/
|
|
184
|
-
raise ArgumentError, 'aws_security_group security group ID must be in the format "sg-" followed by 8 hexadecimal characters.'
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
if recognized_params.key?(:vpc_id) && recognized_params[:vpc_id] !~ /^vpc\-[0-9a-f]{8}/
|
|
188
|
-
raise ArgumentError, 'aws_security_group VPC ID must be in the format "vpc-" followed by 8 hexadecimal characters.'
|
|
189
|
-
end
|
|
190
|
-
|
|
191
|
-
validated_params = recognized_params
|
|
192
|
-
|
|
193
|
-
if validated_params.empty?
|
|
194
|
-
raise ArgumentError, 'You must provide parameters to aws_security_group, such as group_name, group_id, or vpc_id.g_group.'
|
|
195
|
-
end
|
|
196
|
-
validated_params
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
def fetch_from_api # rubocop: disable Metrics/AbcSize
|
|
200
|
-
backend = BackendFactory.create(inspec_runner)
|
|
201
|
-
|
|
202
|
-
# Transform into filter format expected by AWS
|
|
203
|
-
filters = []
|
|
204
|
-
[
|
|
205
|
-
:description,
|
|
206
|
-
:group_id,
|
|
207
|
-
:group_name,
|
|
208
|
-
:vpc_id,
|
|
209
|
-
].each do |criterion_name|
|
|
210
|
-
instance_var = "@#{criterion_name}".to_sym
|
|
211
|
-
next unless instance_variable_defined?(instance_var)
|
|
212
|
-
val = instance_variable_get(instance_var)
|
|
213
|
-
next if val.nil?
|
|
214
|
-
filters.push(
|
|
215
|
-
{
|
|
216
|
-
name: criterion_name.to_s.tr('_', '-'),
|
|
217
|
-
values: [val],
|
|
218
|
-
},
|
|
219
|
-
)
|
|
220
|
-
end
|
|
221
|
-
dsg_response = backend.describe_security_groups(filters: filters)
|
|
222
|
-
|
|
223
|
-
if dsg_response.security_groups.empty?
|
|
224
|
-
@exists = false
|
|
225
|
-
@inbound_rules = []
|
|
226
|
-
@outbound_rules = []
|
|
227
|
-
return
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
@exists = true
|
|
231
|
-
@description = dsg_response.security_groups[0].description
|
|
232
|
-
@group_id = dsg_response.security_groups[0].group_id
|
|
233
|
-
@group_name = dsg_response.security_groups[0].group_name
|
|
234
|
-
@vpc_id = dsg_response.security_groups[0].vpc_id
|
|
235
|
-
@inbound_rules = dsg_response.security_groups[0].ip_permissions.map(&:to_h)
|
|
236
|
-
@outbound_rules = dsg_response.security_groups[0].ip_permissions_egress.map(&:to_h)
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
class Backend
|
|
240
|
-
class AwsClientApi < AwsBackendBase
|
|
241
|
-
BackendFactory.set_default_backend self
|
|
242
|
-
self.aws_client_class = Aws::EC2::Client
|
|
243
|
-
|
|
244
|
-
def describe_security_groups(query)
|
|
245
|
-
aws_service_client.describe_security_groups(query)
|
|
246
|
-
end
|
|
247
|
-
end
|
|
248
|
-
end
|
|
249
|
-
end
|
|
1
|
+
require 'set'
|
|
2
|
+
require 'ipaddr'
|
|
3
|
+
|
|
4
|
+
class AwsSecurityGroup < Inspec.resource(1)
|
|
5
|
+
name 'aws_security_group'
|
|
6
|
+
desc 'Verifies settings for an individual AWS Security Group.'
|
|
7
|
+
example "
|
|
8
|
+
describe aws_security_group('sg-12345678') do
|
|
9
|
+
it { should exist }
|
|
10
|
+
end
|
|
11
|
+
"
|
|
12
|
+
supports platform: 'aws'
|
|
13
|
+
|
|
14
|
+
include AwsSingularResourceMixin
|
|
15
|
+
attr_reader :description, :group_id, :group_name, :vpc_id, :inbound_rules, :outbound_rules
|
|
16
|
+
|
|
17
|
+
def to_s
|
|
18
|
+
"EC2 Security Group #{@group_id}"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def allow_in?(criteria = {})
|
|
22
|
+
allow(inbound_rules, criteria.dup)
|
|
23
|
+
end
|
|
24
|
+
RSpec::Matchers.alias_matcher :allow_in, :be_allow_in
|
|
25
|
+
|
|
26
|
+
def allow_out?(criteria = {})
|
|
27
|
+
allow(outbound_rules, criteria.dup)
|
|
28
|
+
end
|
|
29
|
+
RSpec::Matchers.alias_matcher :allow_out, :be_allow_out
|
|
30
|
+
|
|
31
|
+
def allow_in_only?(criteria = {})
|
|
32
|
+
allow_only(inbound_rules, criteria.dup)
|
|
33
|
+
end
|
|
34
|
+
RSpec::Matchers.alias_matcher :allow_in_only, :be_allow_in_only
|
|
35
|
+
|
|
36
|
+
def allow_out_only?(criteria = {})
|
|
37
|
+
allow_only(outbound_rules, criteria.dup)
|
|
38
|
+
end
|
|
39
|
+
RSpec::Matchers.alias_matcher :allow_out_only, :be_allow_out_only
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def allow_only(rules, criteria)
|
|
44
|
+
# allow_{in_out}_only require either a single-rule group, or you
|
|
45
|
+
# to select a rule using position.
|
|
46
|
+
return false unless rules.count == 1 || criteria.key?(:position)
|
|
47
|
+
criteria[:exact] = true
|
|
48
|
+
allow(rules, criteria)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def allow(rules, criteria)
|
|
52
|
+
criteria = allow__check_criteria(criteria)
|
|
53
|
+
rules = allow__focus_on_position(rules, criteria)
|
|
54
|
+
|
|
55
|
+
rules.any? do |rule|
|
|
56
|
+
matched = true
|
|
57
|
+
matched &&= allow__match_port(rule, criteria)
|
|
58
|
+
matched &&= allow__match_protocol(rule, criteria)
|
|
59
|
+
matched &&= allow__match_ipv4_range(rule, criteria)
|
|
60
|
+
matched
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def allow__check_criteria(raw_criteria)
|
|
65
|
+
allowed_criteria = [
|
|
66
|
+
:from_port,
|
|
67
|
+
:ipv4_range,
|
|
68
|
+
:port,
|
|
69
|
+
:position,
|
|
70
|
+
:protocol,
|
|
71
|
+
:to_port,
|
|
72
|
+
:exact, # Internal
|
|
73
|
+
]
|
|
74
|
+
recognized_criteria = {}
|
|
75
|
+
allowed_criteria.each do |expected_criterion|
|
|
76
|
+
if raw_criteria.key?(expected_criterion)
|
|
77
|
+
recognized_criteria[expected_criterion] = raw_criteria.delete(expected_criterion)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Any leftovers are unwelcome
|
|
82
|
+
unless raw_criteria.empty?
|
|
83
|
+
raise ArgumentError, "Unrecognized security group rule 'allow' criteria '#{raw_criteria.keys.join(',')}'. Expected criteria: #{allowed_criteria.join(', ')}"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
recognized_criteria
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def allow__focus_on_position(rules, criteria)
|
|
90
|
+
return rules unless criteria.key?(:position)
|
|
91
|
+
|
|
92
|
+
idx = criteria.delete(:position)
|
|
93
|
+
|
|
94
|
+
# Normalize to a zero-based numeric index
|
|
95
|
+
case # rubocop: disable Style/EmptyCaseCondition
|
|
96
|
+
when idx.is_a?(Symbol) && idx == :first
|
|
97
|
+
idx = 0
|
|
98
|
+
when idx.is_a?(Symbol) && idx == :last
|
|
99
|
+
idx = rules.count - 1
|
|
100
|
+
when idx.is_a?(String)
|
|
101
|
+
idx = idx.to_i - 1 # We document this as 1-based, so adjust to be zero-based.
|
|
102
|
+
when idx.is_a?(Numeric)
|
|
103
|
+
idx -= 1 # We document this as 1-based, so adjust to be zero-based.
|
|
104
|
+
else
|
|
105
|
+
raise ArgumentError, "aws_security_group 'allow' 'position' criteria must be an integer or the symbols :first or :last"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
unless idx < rules.count
|
|
109
|
+
raise ArgumentError, "aws_security_group 'allow' 'position' criteria #{idx+1} is out of range - there are only #{rules.count} rules for security group #{group_id}."
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
[rules[idx]]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def allow__match_port(rule, criteria) # rubocop: disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize
|
|
116
|
+
if criteria[:exact] || criteria[:from_port] || criteria[:to_port]
|
|
117
|
+
# Exact match mode
|
|
118
|
+
# :port is shorthand for a single-valued port range.
|
|
119
|
+
criteria[:to_port] = criteria[:from_port] = criteria[:port] if criteria[:port]
|
|
120
|
+
to = criteria[:to_port]
|
|
121
|
+
from = criteria[:from_port]
|
|
122
|
+
# It's a match if neither criteria was specified
|
|
123
|
+
return true if to.nil? && from.nil?
|
|
124
|
+
# Normalize to integers
|
|
125
|
+
to = to.to_i unless to.nil?
|
|
126
|
+
from = from.to_i unless from.nil?
|
|
127
|
+
# It's a match if either was specified and the other was not
|
|
128
|
+
return true if rule[:to_port] == to && from.nil?
|
|
129
|
+
return true if rule[:from_port] == from && to.nil?
|
|
130
|
+
# Finally, both must match.
|
|
131
|
+
rule[:to_port] == to && rule[:from_port] == from
|
|
132
|
+
elsif !criteria[:port]
|
|
133
|
+
# port not specified, match anything
|
|
134
|
+
true
|
|
135
|
+
else
|
|
136
|
+
# Range membership mode
|
|
137
|
+
rule_from = rule[:from_port] || 0
|
|
138
|
+
rule_to = rule[:to_port] || 65535
|
|
139
|
+
(rule_from..rule_to).cover?(criteria[:port].to_i)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def allow__match_protocol(rule, criteria)
|
|
144
|
+
return true unless criteria.key?(:protocol)
|
|
145
|
+
prot = criteria[:protocol]
|
|
146
|
+
# We provide a "fluency alias" for -1 (any).
|
|
147
|
+
prot = '-1' if prot == 'any'
|
|
148
|
+
|
|
149
|
+
rule[:ip_protocol] == prot
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def allow__match_ipv4_range(rule, criteria)
|
|
153
|
+
return true unless criteria.key?(:ipv4_range)
|
|
154
|
+
query = criteria[:ipv4_range]
|
|
155
|
+
query = [query] unless query.is_a?(Array)
|
|
156
|
+
ranges = rule[:ip_ranges].map { |rng| rng[:cidr_ip] }
|
|
157
|
+
if criteria[:exact]
|
|
158
|
+
Set.new(query) == Set.new(ranges)
|
|
159
|
+
else
|
|
160
|
+
# CIDR subset mode
|
|
161
|
+
# "Each of the provided IP ranges must be a member of one of the rule's listed IP ranges"
|
|
162
|
+
query.all? do |candidate|
|
|
163
|
+
candidate = IPAddr.new(candidate)
|
|
164
|
+
ranges.any? do |range|
|
|
165
|
+
range = IPAddr.new(range)
|
|
166
|
+
range.include?(candidate)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def validate_params(raw_params)
|
|
173
|
+
recognized_params = check_resource_param_names(
|
|
174
|
+
raw_params: raw_params,
|
|
175
|
+
allowed_params: [:id, :group_id, :group_name, :vpc_id],
|
|
176
|
+
allowed_scalar_name: :group_id,
|
|
177
|
+
allowed_scalar_type: String,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
# id is an alias for group_id
|
|
181
|
+
recognized_params[:group_id] = recognized_params.delete(:id) if recognized_params.key?(:id)
|
|
182
|
+
|
|
183
|
+
if recognized_params.key?(:group_id) && recognized_params[:group_id] !~ /^sg\-[0-9a-f]{8}/
|
|
184
|
+
raise ArgumentError, 'aws_security_group security group ID must be in the format "sg-" followed by 8 hexadecimal characters.'
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
if recognized_params.key?(:vpc_id) && recognized_params[:vpc_id] !~ /^vpc\-[0-9a-f]{8}/
|
|
188
|
+
raise ArgumentError, 'aws_security_group VPC ID must be in the format "vpc-" followed by 8 hexadecimal characters.'
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
validated_params = recognized_params
|
|
192
|
+
|
|
193
|
+
if validated_params.empty?
|
|
194
|
+
raise ArgumentError, 'You must provide parameters to aws_security_group, such as group_name, group_id, or vpc_id.g_group.'
|
|
195
|
+
end
|
|
196
|
+
validated_params
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def fetch_from_api # rubocop: disable Metrics/AbcSize
|
|
200
|
+
backend = BackendFactory.create(inspec_runner)
|
|
201
|
+
|
|
202
|
+
# Transform into filter format expected by AWS
|
|
203
|
+
filters = []
|
|
204
|
+
[
|
|
205
|
+
:description,
|
|
206
|
+
:group_id,
|
|
207
|
+
:group_name,
|
|
208
|
+
:vpc_id,
|
|
209
|
+
].each do |criterion_name|
|
|
210
|
+
instance_var = "@#{criterion_name}".to_sym
|
|
211
|
+
next unless instance_variable_defined?(instance_var)
|
|
212
|
+
val = instance_variable_get(instance_var)
|
|
213
|
+
next if val.nil?
|
|
214
|
+
filters.push(
|
|
215
|
+
{
|
|
216
|
+
name: criterion_name.to_s.tr('_', '-'),
|
|
217
|
+
values: [val],
|
|
218
|
+
},
|
|
219
|
+
)
|
|
220
|
+
end
|
|
221
|
+
dsg_response = backend.describe_security_groups(filters: filters)
|
|
222
|
+
|
|
223
|
+
if dsg_response.security_groups.empty?
|
|
224
|
+
@exists = false
|
|
225
|
+
@inbound_rules = []
|
|
226
|
+
@outbound_rules = []
|
|
227
|
+
return
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
@exists = true
|
|
231
|
+
@description = dsg_response.security_groups[0].description
|
|
232
|
+
@group_id = dsg_response.security_groups[0].group_id
|
|
233
|
+
@group_name = dsg_response.security_groups[0].group_name
|
|
234
|
+
@vpc_id = dsg_response.security_groups[0].vpc_id
|
|
235
|
+
@inbound_rules = dsg_response.security_groups[0].ip_permissions.map(&:to_h)
|
|
236
|
+
@outbound_rules = dsg_response.security_groups[0].ip_permissions_egress.map(&:to_h)
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
class Backend
|
|
240
|
+
class AwsClientApi < AwsBackendBase
|
|
241
|
+
BackendFactory.set_default_backend self
|
|
242
|
+
self.aws_client_class = Aws::EC2::Client
|
|
243
|
+
|
|
244
|
+
def describe_security_groups(query)
|
|
245
|
+
aws_service_client.describe_security_groups(query)
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|