inspec 2.1.0 → 2.1.10
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 +3024 -3004
- data/Gemfile +55 -55
- data/LICENSE +14 -14
- data/MAINTAINERS.md +33 -33
- data/MAINTAINERS.toml +52 -52
- data/README.md +447 -446
- 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 +100 -93
- 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 +376 -376
- 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_s3_bucket_object.md.erb +83 -0
- 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_subscription.md.erb +125 -0
- data/docs/resources/aws_sns_topic.md.erb +63 -63
- data/docs/resources/aws_sns_topics.md.erb +52 -0
- data/docs/resources/aws_subnet.md.erb +134 -134
- 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 +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/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 +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 → 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 -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 -146
- data/docs/resources/ssh_config.md.erb +73 -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 +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 +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 +93 -93
- data/lib/inspec/base_cli.rb +357 -355
- 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 -54
- 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 +44 -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 +151 -159
- data/lib/resources/apache.rb +48 -48
- data/lib/resources/apache_conf.rb +149 -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 +46 -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 -149
- data/lib/resources/aws/aws_iam_group.rb +56 -56
- 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 +125 -125
- 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 -108
- data/lib/resources/aws/aws_kms_keys.rb +53 -53
- 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_s3_bucket_object.rb +82 -0
- 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_subscription.rb +78 -0
- data/lib/resources/aws/aws_sns_topic.rb +53 -53
- data/lib/resources/aws/aws_sns_topics.rb +56 -0
- 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 +69 -68
- data/lib/resources/bridge.rb +122 -122
- 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 -60
- data/lib/resources/dh_params.rb +77 -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 +94 -101
- data/lib/resources/etc_group.rb +152 -152
- data/lib/resources/etc_hosts.rb +66 -82
- data/lib/resources/etc_hosts_allow_deny.rb +112 -122
- 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 -237
- data/lib/resources/host.rb +306 -306
- data/lib/resources/http.rb +251 -251
- data/lib/resources/iis_app.rb +101 -101
- data/lib/resources/iis_site.rb +148 -148
- data/lib/resources/inetd_conf.rb +54 -62
- 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 +107 -117
- data/lib/resources/kernel_module.rb +107 -107
- data/lib/resources/kernel_parameter.rb +58 -58
- data/lib/resources/key_rsa.rb +61 -67
- data/lib/resources/limits_conf.rb +46 -55
- data/lib/resources/login_def.rb +57 -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 +127 -134
- data/lib/resources/mysql_session.rb +85 -85
- data/lib/resources/nginx.rb +96 -96
- data/lib/resources/nginx_conf.rb +226 -227
- data/lib/resources/npm.rb +48 -48
- data/lib/resources/ntp_conf.rb +51 -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 +112 -116
- data/lib/resources/passwd.rb +76 -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 +114 -121
- data/lib/resources/postgres_hba_conf.rb +90 -99
- data/lib/resources/postgres_ident_conf.rb +79 -76
- data/lib/resources/postgres_session.rb +71 -71
- data/lib/resources/powershell.rb +53 -53
- data/lib/resources/processes.rb +204 -204
- data/lib/resources/rabbitmq_conf.rb +51 -52
- data/lib/resources/registry_key.rb +296 -296
- data/lib/resources/security_policy.rb +180 -180
- data/lib/resources/service.rb +790 -789
- data/lib/resources/shadow.rb +149 -146
- data/lib/resources/ssh_conf.rb +97 -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 -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 -143
- data/lib/resources/xinetd.rb +106 -111
- data/lib/resources/xml.rb +46 -46
- data/lib/resources/yaml.rb +43 -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/file_reader.rb +25 -0
- 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 +12 -5
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
class AwsIamRootUser < Inspec.resource(1)
|
|
2
|
-
name 'aws_iam_root_user'
|
|
3
|
-
desc 'Verifies settings for AWS root account'
|
|
4
|
-
example "
|
|
5
|
-
describe aws_iam_root_user do
|
|
6
|
-
it { should have_access_key }
|
|
7
|
-
end
|
|
8
|
-
"
|
|
9
|
-
supports platform: 'aws'
|
|
10
|
-
|
|
11
|
-
# TODO: rewrite to avoid direct injection, match other resources, use AwsSingularResourceMixin
|
|
12
|
-
def initialize(conn = nil)
|
|
13
|
-
@client = conn ? conn.iam_client : inspec_runner.backend.aws_client(Aws::IAM::Client)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# TODO: DRY up, see https://github.com/chef/inspec/issues/2633
|
|
17
|
-
# Copied from resource_support/aws/aws_resource_mixin.rb
|
|
18
|
-
def catch_aws_errors
|
|
19
|
-
yield
|
|
20
|
-
rescue Aws::Errors::MissingCredentialsError
|
|
21
|
-
# The AWS error here is unhelpful:
|
|
22
|
-
# "unable to sign request without credentials set"
|
|
23
|
-
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."
|
|
24
|
-
fail_resource('No AWS credentials available')
|
|
25
|
-
rescue Aws::Errors::ServiceError => e
|
|
26
|
-
fail_resource e.message
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# TODO: DRY up, see https://github.com/chef/inspec/issues/2633
|
|
30
|
-
# Copied from resource_support/aws/aws_singular_resource_mixin.rb
|
|
31
|
-
def inspec_runner
|
|
32
|
-
# When running under inspec-cli, we have an 'inspec' method that
|
|
33
|
-
# returns the runner. When running under unit tests, we don't
|
|
34
|
-
# have that, but we still have to call this to pass something
|
|
35
|
-
# (nil is OK) to the backend.
|
|
36
|
-
# TODO: remove with https://github.com/chef/inspec-aws/issues/216
|
|
37
|
-
# TODO: remove after rewrite to include AwsSingularResource
|
|
38
|
-
inspec if respond_to?(:inspec)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def has_access_key?
|
|
42
|
-
summary_account['AccountAccessKeysPresent'] == 1
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def has_mfa_enabled?
|
|
46
|
-
summary_account['AccountMFAEnabled'] == 1
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def to_s
|
|
50
|
-
'AWS Root-User'
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
private
|
|
54
|
-
|
|
55
|
-
def summary_account
|
|
56
|
-
catch_aws_errors do
|
|
57
|
-
@summary_account ||= @client.get_account_summary.summary_map
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
1
|
+
class AwsIamRootUser < Inspec.resource(1)
|
|
2
|
+
name 'aws_iam_root_user'
|
|
3
|
+
desc 'Verifies settings for AWS root account'
|
|
4
|
+
example "
|
|
5
|
+
describe aws_iam_root_user do
|
|
6
|
+
it { should have_access_key }
|
|
7
|
+
end
|
|
8
|
+
"
|
|
9
|
+
supports platform: 'aws'
|
|
10
|
+
|
|
11
|
+
# TODO: rewrite to avoid direct injection, match other resources, use AwsSingularResourceMixin
|
|
12
|
+
def initialize(conn = nil)
|
|
13
|
+
@client = conn ? conn.iam_client : inspec_runner.backend.aws_client(Aws::IAM::Client)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# TODO: DRY up, see https://github.com/chef/inspec/issues/2633
|
|
17
|
+
# Copied from resource_support/aws/aws_resource_mixin.rb
|
|
18
|
+
def catch_aws_errors
|
|
19
|
+
yield
|
|
20
|
+
rescue Aws::Errors::MissingCredentialsError
|
|
21
|
+
# The AWS error here is unhelpful:
|
|
22
|
+
# "unable to sign request without credentials set"
|
|
23
|
+
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."
|
|
24
|
+
fail_resource('No AWS credentials available')
|
|
25
|
+
rescue Aws::Errors::ServiceError => e
|
|
26
|
+
fail_resource e.message
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# TODO: DRY up, see https://github.com/chef/inspec/issues/2633
|
|
30
|
+
# Copied from resource_support/aws/aws_singular_resource_mixin.rb
|
|
31
|
+
def inspec_runner
|
|
32
|
+
# When running under inspec-cli, we have an 'inspec' method that
|
|
33
|
+
# returns the runner. When running under unit tests, we don't
|
|
34
|
+
# have that, but we still have to call this to pass something
|
|
35
|
+
# (nil is OK) to the backend.
|
|
36
|
+
# TODO: remove with https://github.com/chef/inspec-aws/issues/216
|
|
37
|
+
# TODO: remove after rewrite to include AwsSingularResource
|
|
38
|
+
inspec if respond_to?(:inspec)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def has_access_key?
|
|
42
|
+
summary_account['AccountAccessKeysPresent'] == 1
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def has_mfa_enabled?
|
|
46
|
+
summary_account['AccountMFAEnabled'] == 1
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def to_s
|
|
50
|
+
'AWS Root-User'
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
private
|
|
54
|
+
|
|
55
|
+
def summary_account
|
|
56
|
+
catch_aws_errors do
|
|
57
|
+
@summary_account ||= @client.get_account_summary.summary_map
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
# author: Alex Bedley
|
|
2
|
-
# author: Steffanie Freeman
|
|
3
|
-
# author: Simon Varlow
|
|
4
|
-
# author: Chris Redekop
|
|
5
|
-
class AwsIamUser < Inspec.resource(1)
|
|
6
|
-
name 'aws_iam_user'
|
|
7
|
-
desc 'Verifies settings for AWS IAM user'
|
|
8
|
-
example "
|
|
9
|
-
describe aws_iam_user(username: 'test_user') do
|
|
10
|
-
it { should have_mfa_enabled }
|
|
11
|
-
it { should_not have_console_password }
|
|
12
|
-
end
|
|
13
|
-
"
|
|
14
|
-
supports platform: 'aws'
|
|
15
|
-
|
|
16
|
-
include AwsSingularResourceMixin
|
|
17
|
-
attr_reader :access_keys, :has_console_password, :has_mfa_enabled, :username
|
|
18
|
-
alias has_mfa_enabled? has_mfa_enabled
|
|
19
|
-
alias has_console_password? has_console_password
|
|
20
|
-
|
|
21
|
-
def name
|
|
22
|
-
warn "[DEPRECATION] - Property ':name' is deprecated on the aws_iam_user resource. Use ':username' instead."
|
|
23
|
-
username
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def to_s
|
|
27
|
-
"IAM User #{username}"
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
def validate_params(raw_params)
|
|
33
|
-
validated_params = check_resource_param_names(
|
|
34
|
-
raw_params: raw_params,
|
|
35
|
-
allowed_params: [:username, :aws_user_struct, :name, :user],
|
|
36
|
-
allowed_scalar_name: :username,
|
|
37
|
-
allowed_scalar_type: String,
|
|
38
|
-
)
|
|
39
|
-
# If someone passed :name, rename it to :username
|
|
40
|
-
if validated_params.key?(:name)
|
|
41
|
-
warn "[DEPRECATION] - Resource parameter ':name' is deprecated on the aws_iam_user resource. Use ':username' instead."
|
|
42
|
-
validated_params[:username] = validated_params.delete(:name)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# If someone passed :user, rename it to :aws_user_struct
|
|
46
|
-
if validated_params.key?(:user)
|
|
47
|
-
warn "[DEPRECATION] - Resource parameter ':user' is deprecated on the aws_iam_user resource. Use ':aws_user_struct' instead."
|
|
48
|
-
validated_params[:aws_user_struct] = validated_params.delete(:user)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
if validated_params.empty?
|
|
52
|
-
raise ArgumentError, 'You must provide a username to aws_iam_user.'
|
|
53
|
-
end
|
|
54
|
-
validated_params
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def fetch_from_api
|
|
58
|
-
backend = BackendFactory.create(inspec_runner)
|
|
59
|
-
@aws_user_struct ||= nil # silence unitialized warning
|
|
60
|
-
unless @aws_user_struct
|
|
61
|
-
begin
|
|
62
|
-
@aws_user_struct = backend.get_user(user_name: username)
|
|
63
|
-
rescue Aws::IAM::Errors::NoSuchEntity
|
|
64
|
-
@exists = false
|
|
65
|
-
return
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
# TODO: extract properties from aws_user_struct?
|
|
69
|
-
|
|
70
|
-
@exists = true
|
|
71
|
-
|
|
72
|
-
begin
|
|
73
|
-
_login_profile = backend.get_login_profile(user_name: username)
|
|
74
|
-
@has_console_password = true
|
|
75
|
-
# Password age also available here
|
|
76
|
-
rescue Aws::IAM::Errors::NoSuchEntity
|
|
77
|
-
@has_console_password = false
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
mfa_info = backend.list_mfa_devices(user_name: username)
|
|
81
|
-
@has_mfa_enabled = !mfa_info.mfa_devices.empty?
|
|
82
|
-
|
|
83
|
-
# TODO: consider returning Inspec AwsIamAccessKey objects
|
|
84
|
-
@access_keys = backend.list_access_keys(user_name: username).access_key_metadata
|
|
85
|
-
# If the above call fails, we get nil here; but we promise access_keys will be an array.
|
|
86
|
-
@access_keys ||= []
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
class Backend
|
|
90
|
-
class AwsClientApi < AwsBackendBase
|
|
91
|
-
BackendFactory.set_default_backend(self)
|
|
92
|
-
self.aws_client_class = Aws::IAM::Client
|
|
93
|
-
|
|
94
|
-
def get_user(criteria)
|
|
95
|
-
aws_service_client.get_user(criteria)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def get_login_profile(criteria)
|
|
99
|
-
aws_service_client.get_login_profile(criteria)
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def list_mfa_devices(criteria)
|
|
103
|
-
aws_service_client.list_mfa_devices(criteria)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def list_access_keys(criteria)
|
|
107
|
-
aws_service_client.list_access_keys(criteria)
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
end
|
|
1
|
+
# author: Alex Bedley
|
|
2
|
+
# author: Steffanie Freeman
|
|
3
|
+
# author: Simon Varlow
|
|
4
|
+
# author: Chris Redekop
|
|
5
|
+
class AwsIamUser < Inspec.resource(1)
|
|
6
|
+
name 'aws_iam_user'
|
|
7
|
+
desc 'Verifies settings for AWS IAM user'
|
|
8
|
+
example "
|
|
9
|
+
describe aws_iam_user(username: 'test_user') do
|
|
10
|
+
it { should have_mfa_enabled }
|
|
11
|
+
it { should_not have_console_password }
|
|
12
|
+
end
|
|
13
|
+
"
|
|
14
|
+
supports platform: 'aws'
|
|
15
|
+
|
|
16
|
+
include AwsSingularResourceMixin
|
|
17
|
+
attr_reader :access_keys, :has_console_password, :has_mfa_enabled, :username
|
|
18
|
+
alias has_mfa_enabled? has_mfa_enabled
|
|
19
|
+
alias has_console_password? has_console_password
|
|
20
|
+
|
|
21
|
+
def name
|
|
22
|
+
warn "[DEPRECATION] - Property ':name' is deprecated on the aws_iam_user resource. Use ':username' instead."
|
|
23
|
+
username
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def to_s
|
|
27
|
+
"IAM User #{username}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def validate_params(raw_params)
|
|
33
|
+
validated_params = check_resource_param_names(
|
|
34
|
+
raw_params: raw_params,
|
|
35
|
+
allowed_params: [:username, :aws_user_struct, :name, :user],
|
|
36
|
+
allowed_scalar_name: :username,
|
|
37
|
+
allowed_scalar_type: String,
|
|
38
|
+
)
|
|
39
|
+
# If someone passed :name, rename it to :username
|
|
40
|
+
if validated_params.key?(:name)
|
|
41
|
+
warn "[DEPRECATION] - Resource parameter ':name' is deprecated on the aws_iam_user resource. Use ':username' instead."
|
|
42
|
+
validated_params[:username] = validated_params.delete(:name)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# If someone passed :user, rename it to :aws_user_struct
|
|
46
|
+
if validated_params.key?(:user)
|
|
47
|
+
warn "[DEPRECATION] - Resource parameter ':user' is deprecated on the aws_iam_user resource. Use ':aws_user_struct' instead."
|
|
48
|
+
validated_params[:aws_user_struct] = validated_params.delete(:user)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
if validated_params.empty?
|
|
52
|
+
raise ArgumentError, 'You must provide a username to aws_iam_user.'
|
|
53
|
+
end
|
|
54
|
+
validated_params
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def fetch_from_api
|
|
58
|
+
backend = BackendFactory.create(inspec_runner)
|
|
59
|
+
@aws_user_struct ||= nil # silence unitialized warning
|
|
60
|
+
unless @aws_user_struct
|
|
61
|
+
begin
|
|
62
|
+
@aws_user_struct = backend.get_user(user_name: username)
|
|
63
|
+
rescue Aws::IAM::Errors::NoSuchEntity
|
|
64
|
+
@exists = false
|
|
65
|
+
return
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
# TODO: extract properties from aws_user_struct?
|
|
69
|
+
|
|
70
|
+
@exists = true
|
|
71
|
+
|
|
72
|
+
begin
|
|
73
|
+
_login_profile = backend.get_login_profile(user_name: username)
|
|
74
|
+
@has_console_password = true
|
|
75
|
+
# Password age also available here
|
|
76
|
+
rescue Aws::IAM::Errors::NoSuchEntity
|
|
77
|
+
@has_console_password = false
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
mfa_info = backend.list_mfa_devices(user_name: username)
|
|
81
|
+
@has_mfa_enabled = !mfa_info.mfa_devices.empty?
|
|
82
|
+
|
|
83
|
+
# TODO: consider returning Inspec AwsIamAccessKey objects
|
|
84
|
+
@access_keys = backend.list_access_keys(user_name: username).access_key_metadata
|
|
85
|
+
# If the above call fails, we get nil here; but we promise access_keys will be an array.
|
|
86
|
+
@access_keys ||= []
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
class Backend
|
|
90
|
+
class AwsClientApi < AwsBackendBase
|
|
91
|
+
BackendFactory.set_default_backend(self)
|
|
92
|
+
self.aws_client_class = Aws::IAM::Client
|
|
93
|
+
|
|
94
|
+
def get_user(criteria)
|
|
95
|
+
aws_service_client.get_user(criteria)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def get_login_profile(criteria)
|
|
99
|
+
aws_service_client.get_login_profile(criteria)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def list_mfa_devices(criteria)
|
|
103
|
+
aws_service_client.list_mfa_devices(criteria)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def list_access_keys(criteria)
|
|
107
|
+
aws_service_client.list_access_keys(criteria)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
# author: Alex Bedley
|
|
2
|
-
# author: Steffanie Freeman
|
|
3
|
-
# author: Simon Varlow
|
|
4
|
-
# author: Chris Redekop
|
|
5
|
-
class AwsIamUsers < Inspec.resource(1)
|
|
6
|
-
name 'aws_iam_users'
|
|
7
|
-
desc 'Verifies settings for AWS IAM users'
|
|
8
|
-
example '
|
|
9
|
-
describe aws_iam_users.where(has_mfa_enabled?: false) do
|
|
10
|
-
it { should_not exist }
|
|
11
|
-
end
|
|
12
|
-
describe aws_iam_users.where(has_console_password?: true) do
|
|
13
|
-
it { should exist }
|
|
14
|
-
end
|
|
15
|
-
'
|
|
16
|
-
supports platform: 'aws'
|
|
17
|
-
|
|
18
|
-
include AwsPluralResourceMixin
|
|
19
|
-
|
|
20
|
-
filter = FilterTable.create
|
|
21
|
-
filter.add_accessor(:where)
|
|
22
|
-
.add_accessor(:entries)
|
|
23
|
-
.add(:exists?) { |x| !x.entries.empty? }
|
|
24
|
-
.add(:has_mfa_enabled?, field: :has_mfa_enabled)
|
|
25
|
-
.add(:has_console_password?, field: :has_console_password)
|
|
26
|
-
.add(:password_ever_used?, field: :password_ever_used?)
|
|
27
|
-
.add(:password_never_used?, field: :password_never_used?)
|
|
28
|
-
.add(:password_last_used_days_ago, field: :password_last_used_days_ago)
|
|
29
|
-
.add(:username, field: :user_name)
|
|
30
|
-
filter.connect(self, :table)
|
|
31
|
-
|
|
32
|
-
def validate_params(raw_params)
|
|
33
|
-
# No params yet
|
|
34
|
-
unless raw_params.empty?
|
|
35
|
-
raise ArgumentError, 'aws_iam_users does not accept resource parameters'
|
|
36
|
-
end
|
|
37
|
-
raw_params
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def fetch_from_api_paginated(backend)
|
|
41
|
-
table = []
|
|
42
|
-
page_marker = nil
|
|
43
|
-
loop do
|
|
44
|
-
api_result = backend.list_users(marker: page_marker)
|
|
45
|
-
table += api_result.users.map(&:to_h)
|
|
46
|
-
page_marker = api_result.marker
|
|
47
|
-
break unless api_result.is_truncated
|
|
48
|
-
end
|
|
49
|
-
table
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def fetch_from_api
|
|
53
|
-
backend = BackendFactory.create(inspec_runner)
|
|
54
|
-
@table = fetch_from_api_paginated(backend)
|
|
55
|
-
|
|
56
|
-
# TODO: lazy columns - https://github.com/chef/inspec-aws/issues/100
|
|
57
|
-
@table.each do |user|
|
|
58
|
-
begin
|
|
59
|
-
_login_profile = backend.get_login_profile(user_name: user[:user_name])
|
|
60
|
-
user[:has_console_password] = true
|
|
61
|
-
rescue Aws::IAM::Errors::NoSuchEntity
|
|
62
|
-
user[:has_console_password] = false
|
|
63
|
-
end
|
|
64
|
-
user[:has_console_password?] = user[:has_console_password]
|
|
65
|
-
|
|
66
|
-
begin
|
|
67
|
-
aws_mfa_devices = backend.list_mfa_devices(user_name: user[:user_name])
|
|
68
|
-
user[:has_mfa_enabled] = !aws_mfa_devices.mfa_devices.empty?
|
|
69
|
-
rescue Aws::IAM::Errors::NoSuchEntity
|
|
70
|
-
user[:has_mfa_enabled] = false
|
|
71
|
-
end
|
|
72
|
-
user[:has_mfa_enabled?] = user[:has_mfa_enabled]
|
|
73
|
-
password_last_used = user[:password_last_used]
|
|
74
|
-
user[:password_ever_used?] = !password_last_used.nil?
|
|
75
|
-
user[:password_never_used?] = password_last_used.nil?
|
|
76
|
-
next unless user[:password_ever_used?]
|
|
77
|
-
user[:password_last_used_days_ago] = ((Time.now - password_last_used) / (24*60*60)).to_i
|
|
78
|
-
end
|
|
79
|
-
@table
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def to_s
|
|
83
|
-
'IAM Users'
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
#===========================================================================#
|
|
87
|
-
# Backend Implementation
|
|
88
|
-
#===========================================================================#
|
|
89
|
-
class Backend
|
|
90
|
-
class AwsClientApi < AwsBackendBase
|
|
91
|
-
BackendFactory.set_default_backend(self)
|
|
92
|
-
self.aws_client_class = Aws::IAM::Client
|
|
93
|
-
|
|
94
|
-
# TODO: delegate this out
|
|
95
|
-
def list_users(query = {})
|
|
96
|
-
aws_service_client.list_users(query)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def get_login_profile(query)
|
|
100
|
-
aws_service_client.get_login_profile(query)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def list_mfa_devices(query)
|
|
104
|
-
aws_service_client.list_mfa_devices(query)
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
|
1
|
+
# author: Alex Bedley
|
|
2
|
+
# author: Steffanie Freeman
|
|
3
|
+
# author: Simon Varlow
|
|
4
|
+
# author: Chris Redekop
|
|
5
|
+
class AwsIamUsers < Inspec.resource(1)
|
|
6
|
+
name 'aws_iam_users'
|
|
7
|
+
desc 'Verifies settings for AWS IAM users'
|
|
8
|
+
example '
|
|
9
|
+
describe aws_iam_users.where(has_mfa_enabled?: false) do
|
|
10
|
+
it { should_not exist }
|
|
11
|
+
end
|
|
12
|
+
describe aws_iam_users.where(has_console_password?: true) do
|
|
13
|
+
it { should exist }
|
|
14
|
+
end
|
|
15
|
+
'
|
|
16
|
+
supports platform: 'aws'
|
|
17
|
+
|
|
18
|
+
include AwsPluralResourceMixin
|
|
19
|
+
|
|
20
|
+
filter = FilterTable.create
|
|
21
|
+
filter.add_accessor(:where)
|
|
22
|
+
.add_accessor(:entries)
|
|
23
|
+
.add(:exists?) { |x| !x.entries.empty? }
|
|
24
|
+
.add(:has_mfa_enabled?, field: :has_mfa_enabled)
|
|
25
|
+
.add(:has_console_password?, field: :has_console_password)
|
|
26
|
+
.add(:password_ever_used?, field: :password_ever_used?)
|
|
27
|
+
.add(:password_never_used?, field: :password_never_used?)
|
|
28
|
+
.add(:password_last_used_days_ago, field: :password_last_used_days_ago)
|
|
29
|
+
.add(:username, field: :user_name)
|
|
30
|
+
filter.connect(self, :table)
|
|
31
|
+
|
|
32
|
+
def validate_params(raw_params)
|
|
33
|
+
# No params yet
|
|
34
|
+
unless raw_params.empty?
|
|
35
|
+
raise ArgumentError, 'aws_iam_users does not accept resource parameters'
|
|
36
|
+
end
|
|
37
|
+
raw_params
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def fetch_from_api_paginated(backend)
|
|
41
|
+
table = []
|
|
42
|
+
page_marker = nil
|
|
43
|
+
loop do
|
|
44
|
+
api_result = backend.list_users(marker: page_marker)
|
|
45
|
+
table += api_result.users.map(&:to_h)
|
|
46
|
+
page_marker = api_result.marker
|
|
47
|
+
break unless api_result.is_truncated
|
|
48
|
+
end
|
|
49
|
+
table
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def fetch_from_api
|
|
53
|
+
backend = BackendFactory.create(inspec_runner)
|
|
54
|
+
@table = fetch_from_api_paginated(backend)
|
|
55
|
+
|
|
56
|
+
# TODO: lazy columns - https://github.com/chef/inspec-aws/issues/100
|
|
57
|
+
@table.each do |user|
|
|
58
|
+
begin
|
|
59
|
+
_login_profile = backend.get_login_profile(user_name: user[:user_name])
|
|
60
|
+
user[:has_console_password] = true
|
|
61
|
+
rescue Aws::IAM::Errors::NoSuchEntity
|
|
62
|
+
user[:has_console_password] = false
|
|
63
|
+
end
|
|
64
|
+
user[:has_console_password?] = user[:has_console_password]
|
|
65
|
+
|
|
66
|
+
begin
|
|
67
|
+
aws_mfa_devices = backend.list_mfa_devices(user_name: user[:user_name])
|
|
68
|
+
user[:has_mfa_enabled] = !aws_mfa_devices.mfa_devices.empty?
|
|
69
|
+
rescue Aws::IAM::Errors::NoSuchEntity
|
|
70
|
+
user[:has_mfa_enabled] = false
|
|
71
|
+
end
|
|
72
|
+
user[:has_mfa_enabled?] = user[:has_mfa_enabled]
|
|
73
|
+
password_last_used = user[:password_last_used]
|
|
74
|
+
user[:password_ever_used?] = !password_last_used.nil?
|
|
75
|
+
user[:password_never_used?] = password_last_used.nil?
|
|
76
|
+
next unless user[:password_ever_used?]
|
|
77
|
+
user[:password_last_used_days_ago] = ((Time.now - password_last_used) / (24*60*60)).to_i
|
|
78
|
+
end
|
|
79
|
+
@table
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def to_s
|
|
83
|
+
'IAM Users'
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
#===========================================================================#
|
|
87
|
+
# Backend Implementation
|
|
88
|
+
#===========================================================================#
|
|
89
|
+
class Backend
|
|
90
|
+
class AwsClientApi < AwsBackendBase
|
|
91
|
+
BackendFactory.set_default_backend(self)
|
|
92
|
+
self.aws_client_class = Aws::IAM::Client
|
|
93
|
+
|
|
94
|
+
# TODO: delegate this out
|
|
95
|
+
def list_users(query = {})
|
|
96
|
+
aws_service_client.list_users(query)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def get_login_profile(query)
|
|
100
|
+
aws_service_client.get_login_profile(query)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def list_mfa_devices(query)
|
|
104
|
+
aws_service_client.list_mfa_devices(query)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|