inspec 2.0.32 → 2.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +101 -101
- data/CHANGELOG.md +2991 -2970
- data/Gemfile +55 -55
- data/LICENSE +14 -14
- data/MAINTAINERS.md +33 -33
- data/MAINTAINERS.toml +52 -52
- data/README.md +446 -437
- data/Rakefile +322 -322
- data/bin/inspec +12 -12
- data/docs/.gitignore +2 -2
- data/docs/README.md +40 -40
- data/docs/dsl_inspec.md +258 -258
- data/docs/dsl_resource.md +93 -93
- data/docs/glossary.md +99 -99
- data/docs/habitat.md +191 -191
- data/docs/inspec_and_friends.md +107 -107
- data/docs/matchers.md +169 -168
- data/docs/migration.md +293 -293
- data/docs/platforms.md +118 -118
- data/docs/plugin_kitchen_inspec.md +49 -49
- data/docs/profiles.md +370 -370
- data/docs/reporters.md +105 -105
- data/docs/resources/aide_conf.md.erb +75 -75
- data/docs/resources/apache.md.erb +67 -67
- data/docs/resources/apache_conf.md.erb +68 -68
- data/docs/resources/apt.md.erb +71 -71
- data/docs/resources/audit_policy.md.erb +47 -47
- data/docs/resources/auditd.md.erb +79 -79
- data/docs/resources/auditd_conf.md.erb +68 -68
- data/docs/resources/aws_cloudtrail_trail.md.erb +140 -140
- data/docs/resources/aws_cloudtrail_trails.md.erb +81 -81
- data/docs/resources/aws_cloudwatch_alarm.md.erb +86 -86
- data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +151 -151
- data/docs/resources/aws_config_recorder.md.erb +71 -71
- data/docs/resources/aws_ec2_instance.md.erb +106 -106
- data/docs/resources/aws_iam_access_key.md.erb +123 -123
- data/docs/resources/aws_iam_access_keys.md.erb +198 -198
- data/docs/resources/aws_iam_group.md.erb +46 -46
- data/docs/resources/aws_iam_groups.md.erb +43 -43
- data/docs/resources/aws_iam_password_policy.md.erb +76 -76
- data/docs/resources/aws_iam_policies.md.erb +82 -82
- data/docs/resources/aws_iam_policy.md.erb +144 -144
- data/docs/resources/aws_iam_role.md.erb +63 -63
- data/docs/resources/aws_iam_root_user.md.erb +58 -58
- data/docs/resources/aws_iam_user.md.erb +64 -64
- data/docs/resources/aws_iam_users.md.erb +89 -89
- data/docs/resources/aws_kms_keys.md.erb +84 -84
- data/docs/resources/aws_route_table.md.erb +47 -47
- data/docs/resources/aws_s3_bucket.md.erb +134 -134
- data/docs/resources/aws_security_group.md.erb +151 -151
- data/docs/resources/aws_security_groups.md.erb +91 -91
- data/docs/resources/aws_sns_topic.md.erb +63 -63
- data/docs/resources/aws_subnet.md.erb +133 -133
- data/docs/resources/aws_subnets.md.erb +126 -126
- data/docs/resources/aws_vpc.md.erb +120 -120
- data/docs/resources/aws_vpcs.md.erb +48 -48
- data/docs/resources/azure_generic_resource.md.erb +170 -170
- data/docs/resources/azure_resource_group.md.erb +284 -284
- data/docs/resources/azure_virtual_machine.md.erb +347 -347
- data/docs/resources/azure_virtual_machine_data_disk.md.erb +224 -224
- data/docs/resources/bash.md.erb +75 -75
- data/docs/resources/bond.md.erb +90 -90
- data/docs/resources/bridge.md.erb +57 -57
- data/docs/resources/bsd_service.md.erb +67 -67
- data/docs/resources/command.md.erb +138 -138
- data/docs/resources/cpan.md.erb +79 -79
- data/docs/resources/cran.md.erb +64 -64
- data/docs/resources/crontab.md.erb +89 -89
- data/docs/resources/csv.md.erb +54 -54
- data/docs/resources/dh_params.md.erb +205 -205
- data/docs/resources/directory.md.erb +30 -30
- data/docs/resources/docker.md.erb +219 -219
- data/docs/resources/docker_container.md.erb +104 -104
- data/docs/resources/docker_image.md.erb +94 -94
- data/docs/resources/docker_service.md.erb +114 -114
- data/docs/resources/elasticsearch.md.erb +242 -242
- data/docs/resources/etc_fstab.md.erb +125 -125
- data/docs/resources/etc_group.md.erb +75 -75
- data/docs/resources/etc_hosts.md.erb +78 -78
- data/docs/resources/etc_hosts_allow.md.erb +74 -74
- data/docs/resources/etc_hosts_deny.md.erb +74 -74
- data/docs/resources/file.md.erb +526 -515
- data/docs/resources/filesystem.md.erb +41 -41
- data/docs/resources/firewalld.md.erb +107 -107
- data/docs/resources/gem.md.erb +79 -79
- data/docs/resources/group.md.erb +61 -61
- data/docs/resources/grub_conf.md.erb +101 -101
- data/docs/resources/host.md.erb +86 -86
- data/docs/resources/http.md.erb +196 -196
- data/docs/resources/iis_app.md.erb +122 -122
- data/docs/resources/iis_site.md.erb +135 -135
- data/docs/resources/inetd_conf.md.erb +94 -94
- data/docs/resources/ini.md.erb +76 -76
- data/docs/resources/interface.md.erb +58 -58
- data/docs/resources/iptables.md.erb +64 -64
- data/docs/resources/json.md.erb +63 -63
- data/docs/resources/kernel_module.md.erb +120 -120
- data/docs/resources/kernel_parameter.md.erb +53 -53
- data/docs/resources/key_rsa.md.erb +85 -85
- data/docs/resources/launchd_service.md.erb +57 -57
- data/docs/resources/limits_conf.md.erb +75 -75
- data/docs/resources/login_def.md.erb +71 -71
- data/docs/resources/mount.md.erb +69 -69
- data/docs/resources/mssql_session.md.erb +60 -60
- data/docs/resources/mysql_conf.md.erb +99 -99
- data/docs/resources/mysql_session.md.erb +74 -74
- data/docs/resources/nginx.md.erb +79 -79
- data/docs/resources/nginx_conf.md.erb +128 -128
- data/docs/resources/npm.md.erb +60 -60
- data/docs/resources/ntp_conf.md.erb +60 -60
- data/docs/resources/oneget.md.erb +53 -53
- data/docs/resources/oracledb_session.md.erb +52 -52
- data/docs/resources/os.md.erb +141 -141
- data/docs/resources/os_env.md.erb +78 -78
- data/docs/resources/package.md.erb +120 -120
- data/docs/resources/packages.md.erb +67 -67
- data/docs/resources/parse_config.md.erb +103 -103
- data/docs/resources/parse_config_file.md.erb +138 -138
- data/docs/resources/passwd.md.erb +141 -141
- data/docs/resources/pip.md.erb +67 -67
- data/docs/resources/port.md.erb +137 -137
- data/docs/resources/postgres_conf.md.erb +79 -79
- data/docs/resources/postgres_hba_conf.md.erb +93 -93
- data/docs/resources/postgres_ident_conf.md.erb +76 -76
- data/docs/resources/postgres_session.md.erb +69 -69
- data/docs/resources/powershell.md.erb +102 -102
- data/docs/resources/processes.md.erb +109 -109
- data/docs/resources/rabbitmq_config.md.erb +41 -41
- data/docs/resources/registry_key.md.erb +158 -158
- data/docs/resources/runit_service.md.erb +57 -57
- data/docs/resources/security_policy.md.erb +47 -47
- data/docs/resources/service.md.erb +121 -121
- data/docs/resources/shadow.md.erb +146 -144
- data/docs/resources/ssh_config.md.erb +80 -80
- data/docs/resources/sshd_config.md.erb +83 -83
- data/docs/resources/ssl.md.erb +119 -119
- data/docs/resources/sys_info.md.erb +42 -42
- data/docs/resources/systemd_service.md.erb +57 -57
- data/docs/resources/sysv_service.md.erb +57 -57
- data/docs/resources/upstart_service.md.erb +57 -57
- data/docs/resources/user.md.erb +140 -140
- data/docs/resources/users.md.erb +127 -127
- data/docs/resources/vbscript.md.erb +55 -55
- data/docs/resources/virtualization.md.erb +57 -57
- data/docs/resources/windows_feature.md.erb +47 -47
- data/docs/resources/windows_hotfix.md.erb +53 -53
- data/docs/resources/windows_task.md.erb +95 -95
- data/docs/resources/wmi.md.erb +81 -81
- data/docs/resources/x509_certificate.md.erb +151 -151
- data/docs/resources/xinetd_conf.md.erb +156 -156
- data/docs/resources/xml.md.erb +85 -85
- data/docs/resources/yaml.md.erb +69 -69
- data/docs/resources/yum.md.erb +98 -98
- data/docs/resources/zfs_dataset.md.erb +53 -53
- data/docs/resources/zfs_pool.md.erb +47 -47
- data/docs/ruby_usage.md +203 -203
- data/docs/shared/matcher_be.md.erb +1 -1
- data/docs/shared/matcher_cmp.md.erb +43 -43
- data/docs/shared/matcher_eq.md.erb +3 -3
- data/docs/shared/matcher_include.md.erb +1 -1
- data/docs/shared/matcher_match.md.erb +1 -1
- data/docs/shell.md +215 -215
- data/examples/README.md +8 -8
- data/examples/inheritance/README.md +65 -65
- data/examples/inheritance/controls/example.rb +14 -14
- data/examples/inheritance/inspec.yml +15 -15
- data/examples/kitchen-ansible/.kitchen.yml +25 -25
- data/examples/kitchen-ansible/Gemfile +19 -19
- data/examples/kitchen-ansible/README.md +53 -53
- data/examples/kitchen-ansible/files/nginx.repo +6 -6
- data/examples/kitchen-ansible/tasks/main.yml +16 -16
- data/examples/kitchen-ansible/test/integration/default/default.yml +5 -5
- data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -28
- data/examples/kitchen-chef/.kitchen.yml +20 -20
- data/examples/kitchen-chef/Berksfile +3 -3
- data/examples/kitchen-chef/Gemfile +19 -19
- data/examples/kitchen-chef/README.md +27 -27
- data/examples/kitchen-chef/metadata.rb +7 -7
- data/examples/kitchen-chef/recipes/default.rb +6 -6
- data/examples/kitchen-chef/recipes/nginx.rb +30 -30
- data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -28
- data/examples/kitchen-puppet/.kitchen.yml +22 -22
- data/examples/kitchen-puppet/Gemfile +20 -20
- data/examples/kitchen-puppet/Puppetfile +25 -25
- data/examples/kitchen-puppet/README.md +53 -53
- data/examples/kitchen-puppet/manifests/site.pp +33 -33
- data/examples/kitchen-puppet/metadata.json +11 -11
- data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -28
- data/examples/meta-profile/README.md +37 -37
- data/examples/meta-profile/controls/example.rb +13 -13
- data/examples/meta-profile/inspec.yml +13 -13
- data/examples/profile-attribute.yml +2 -2
- data/examples/profile-attribute/README.md +14 -14
- data/examples/profile-attribute/controls/example.rb +11 -11
- data/examples/profile-attribute/inspec.yml +8 -8
- data/examples/profile-aws/controls/iam_password_policy_expiration.rb +8 -8
- data/examples/profile-aws/controls/iam_password_policy_max_age.rb +8 -8
- data/examples/profile-aws/controls/iam_root_user_mfa.rb +8 -8
- data/examples/profile-aws/controls/iam_users_access_key_age.rb +8 -8
- data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +8 -8
- data/examples/profile-aws/inspec.yml +11 -11
- data/examples/profile-azure/controls/azure_resource_group_example.rb +24 -24
- data/examples/profile-azure/controls/azure_vm_example.rb +29 -29
- data/examples/profile-azure/inspec.yml +11 -11
- data/examples/profile-sensitive/README.md +29 -29
- data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -9
- data/examples/profile-sensitive/controls/sensitive.rb +9 -9
- data/examples/profile-sensitive/inspec.yml +8 -8
- data/examples/profile/README.md +48 -48
- data/examples/profile/controls/example.rb +23 -23
- data/examples/profile/controls/gordon.rb +36 -36
- data/examples/profile/controls/meta.rb +34 -34
- data/examples/profile/inspec.yml +10 -10
- data/examples/profile/libraries/gordon_config.rb +53 -53
- data/inspec.gemspec +47 -47
- data/lib/bundles/README.md +3 -3
- data/lib/bundles/inspec-artifact.rb +7 -7
- data/lib/bundles/inspec-artifact/README.md +1 -1
- data/lib/bundles/inspec-artifact/cli.rb +277 -277
- data/lib/bundles/inspec-compliance.rb +16 -16
- data/lib/bundles/inspec-compliance/.kitchen.yml +20 -20
- data/lib/bundles/inspec-compliance/README.md +185 -185
- data/lib/bundles/inspec-compliance/api.rb +316 -316
- data/lib/bundles/inspec-compliance/api/login.rb +152 -152
- data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
- data/lib/bundles/inspec-compliance/cli.rb +254 -254
- data/lib/bundles/inspec-compliance/configuration.rb +103 -103
- data/lib/bundles/inspec-compliance/http.rb +86 -86
- data/lib/bundles/inspec-compliance/support.rb +36 -36
- data/lib/bundles/inspec-compliance/target.rb +98 -98
- data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -93
- data/lib/bundles/inspec-habitat.rb +12 -12
- data/lib/bundles/inspec-habitat/cli.rb +36 -36
- data/lib/bundles/inspec-habitat/log.rb +10 -10
- data/lib/bundles/inspec-habitat/profile.rb +390 -390
- data/lib/bundles/inspec-init.rb +8 -8
- data/lib/bundles/inspec-init/README.md +31 -31
- data/lib/bundles/inspec-init/cli.rb +97 -97
- data/lib/bundles/inspec-init/templates/profile/README.md +3 -3
- data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -19
- data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -8
- data/lib/bundles/inspec-supermarket.rb +13 -13
- data/lib/bundles/inspec-supermarket/README.md +45 -45
- data/lib/bundles/inspec-supermarket/api.rb +84 -84
- data/lib/bundles/inspec-supermarket/cli.rb +73 -73
- data/lib/bundles/inspec-supermarket/target.rb +34 -34
- data/lib/fetchers/git.rb +163 -163
- data/lib/fetchers/local.rb +74 -74
- data/lib/fetchers/mock.rb +35 -35
- data/lib/fetchers/url.rb +204 -204
- data/lib/inspec.rb +24 -24
- data/lib/inspec/archive/tar.rb +29 -29
- data/lib/inspec/archive/zip.rb +19 -19
- data/lib/inspec/backend.rb +92 -92
- data/lib/inspec/base_cli.rb +355 -350
- data/lib/inspec/cached_fetcher.rb +66 -66
- data/lib/inspec/cli.rb +292 -292
- data/lib/inspec/completions/bash.sh.erb +45 -45
- data/lib/inspec/completions/fish.sh.erb +34 -34
- data/lib/inspec/completions/zsh.sh.erb +61 -61
- data/lib/inspec/control_eval_context.rb +179 -179
- data/lib/inspec/dependencies/cache.rb +72 -72
- data/lib/inspec/dependencies/dependency_set.rb +92 -92
- data/lib/inspec/dependencies/lockfile.rb +115 -115
- data/lib/inspec/dependencies/requirement.rb +123 -123
- data/lib/inspec/dependencies/resolver.rb +86 -86
- data/lib/inspec/describe.rb +27 -27
- data/lib/inspec/dsl.rb +66 -66
- data/lib/inspec/dsl_shared.rb +33 -33
- data/lib/inspec/env_printer.rb +157 -157
- data/lib/inspec/errors.rb +13 -13
- data/lib/inspec/exceptions.rb +12 -12
- data/lib/inspec/expect.rb +45 -45
- data/lib/inspec/fetcher.rb +45 -45
- data/lib/inspec/file_provider.rb +275 -275
- data/lib/inspec/formatters.rb +3 -3
- data/lib/inspec/formatters/base.rb +250 -250
- data/lib/inspec/formatters/json_rspec.rb +20 -20
- data/lib/inspec/formatters/show_progress.rb +12 -12
- data/lib/inspec/library_eval_context.rb +58 -58
- data/lib/inspec/log.rb +11 -11
- data/lib/inspec/metadata.rb +247 -247
- data/lib/inspec/method_source.rb +24 -24
- data/lib/inspec/objects.rb +14 -14
- data/lib/inspec/objects/attribute.rb +65 -65
- data/lib/inspec/objects/control.rb +61 -61
- data/lib/inspec/objects/describe.rb +92 -92
- data/lib/inspec/objects/each_loop.rb +36 -36
- data/lib/inspec/objects/list.rb +15 -15
- data/lib/inspec/objects/or_test.rb +40 -40
- data/lib/inspec/objects/ruby_helper.rb +15 -15
- data/lib/inspec/objects/tag.rb +27 -27
- data/lib/inspec/objects/test.rb +87 -87
- data/lib/inspec/objects/value.rb +27 -27
- data/lib/inspec/plugins.rb +60 -60
- data/lib/inspec/plugins/cli.rb +24 -24
- data/lib/inspec/plugins/fetcher.rb +86 -86
- data/lib/inspec/plugins/resource.rb +135 -135
- data/lib/inspec/plugins/secret.rb +15 -15
- data/lib/inspec/plugins/source_reader.rb +40 -40
- data/lib/inspec/polyfill.rb +12 -12
- data/lib/inspec/profile.rb +510 -510
- data/lib/inspec/profile_context.rb +207 -207
- data/lib/inspec/profile_vendor.rb +66 -66
- data/lib/inspec/reporters.rb +54 -50
- data/lib/inspec/reporters/base.rb +24 -24
- data/lib/inspec/reporters/cli.rb +356 -356
- data/lib/inspec/reporters/json.rb +116 -116
- data/lib/inspec/reporters/json_min.rb +48 -48
- data/lib/inspec/reporters/junit.rb +77 -77
- data/lib/inspec/require_loader.rb +33 -33
- data/lib/inspec/resource.rb +186 -186
- data/lib/inspec/rule.rb +266 -266
- data/lib/inspec/runner.rb +345 -345
- data/lib/inspec/runner_mock.rb +41 -41
- data/lib/inspec/runner_rspec.rb +175 -175
- data/lib/inspec/runtime_profile.rb +26 -26
- data/lib/inspec/schema.rb +213 -213
- data/lib/inspec/secrets.rb +19 -19
- data/lib/inspec/secrets/yaml.rb +30 -30
- data/lib/inspec/shell.rb +220 -220
- data/lib/inspec/shell_detector.rb +90 -90
- data/lib/inspec/source_reader.rb +29 -29
- data/lib/inspec/version.rb +8 -8
- data/lib/matchers/matchers.rb +339 -339
- data/lib/resource_support/aws.rb +41 -41
- data/lib/resource_support/aws/aws_backend_base.rb +12 -12
- data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -12
- data/lib/resource_support/aws/aws_plural_resource_mixin.rb +21 -21
- data/lib/resource_support/aws/aws_resource_mixin.rb +66 -66
- data/lib/resource_support/aws/aws_singular_resource_mixin.rb +24 -24
- data/lib/resources/aide_conf.rb +159 -160
- data/lib/resources/apache.rb +48 -48
- data/lib/resources/apache_conf.rb +156 -156
- data/lib/resources/apt.rb +149 -149
- data/lib/resources/audit_policy.rb +63 -63
- data/lib/resources/auditd.rb +231 -231
- data/lib/resources/auditd_conf.rb +55 -55
- data/lib/resources/aws/aws_cloudtrail_trail.rb +77 -77
- data/lib/resources/aws/aws_cloudtrail_trails.rb +47 -47
- data/lib/resources/aws/aws_cloudwatch_alarm.rb +62 -62
- data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +100 -100
- data/lib/resources/aws/aws_config_recorder.rb +98 -98
- data/lib/resources/aws/aws_ec2_instance.rb +157 -157
- data/lib/resources/aws/aws_iam_access_key.rb +106 -106
- data/lib/resources/aws/aws_iam_access_keys.rb +149 -144
- data/lib/resources/aws/aws_iam_group.rb +56 -56
- data/lib/resources/aws/aws_iam_groups.rb +52 -45
- data/lib/resources/aws/aws_iam_password_policy.rb +116 -116
- data/lib/resources/aws/aws_iam_policies.rb +53 -46
- data/lib/resources/aws/aws_iam_policy.rb +125 -119
- data/lib/resources/aws/aws_iam_role.rb +51 -51
- data/lib/resources/aws/aws_iam_root_user.rb +60 -60
- data/lib/resources/aws/aws_iam_user.rb +111 -111
- data/lib/resources/aws/aws_iam_users.rb +108 -96
- data/lib/resources/aws/aws_kms_keys.rb +53 -46
- data/lib/resources/aws/aws_route_table.rb +61 -61
- data/lib/resources/aws/aws_s3_bucket.rb +115 -115
- data/lib/resources/aws/aws_security_group.rb +93 -93
- data/lib/resources/aws/aws_security_groups.rb +68 -68
- data/lib/resources/aws/aws_sns_topic.rb +53 -53
- data/lib/resources/aws/aws_subnet.rb +88 -88
- data/lib/resources/aws/aws_subnets.rb +53 -53
- data/lib/resources/aws/aws_vpc.rb +69 -69
- data/lib/resources/aws/aws_vpcs.rb +45 -45
- data/lib/resources/azure/azure_backend.rb +377 -377
- data/lib/resources/azure/azure_generic_resource.rb +59 -59
- data/lib/resources/azure/azure_resource_group.rb +152 -152
- data/lib/resources/azure/azure_virtual_machine.rb +264 -264
- data/lib/resources/azure/azure_virtual_machine_data_disk.rb +136 -136
- data/lib/resources/bash.rb +35 -35
- data/lib/resources/bond.rb +68 -68
- data/lib/resources/bridge.rb +122 -122
- data/lib/resources/command.rb +73 -69
- data/lib/resources/cpan.rb +58 -58
- data/lib/resources/cran.rb +64 -64
- data/lib/resources/crontab.rb +169 -170
- data/lib/resources/csv.rb +60 -60
- data/lib/resources/dh_params.rb +82 -82
- data/lib/resources/directory.rb +25 -25
- data/lib/resources/docker.rb +236 -236
- data/lib/resources/docker_container.rb +89 -89
- data/lib/resources/docker_image.rb +83 -83
- data/lib/resources/docker_object.rb +57 -57
- data/lib/resources/docker_service.rb +90 -90
- data/lib/resources/elasticsearch.rb +169 -169
- data/lib/resources/etc_fstab.rb +101 -102
- data/lib/resources/etc_group.rb +152 -156
- data/lib/resources/etc_hosts.rb +82 -81
- data/lib/resources/etc_hosts_allow_deny.rb +122 -123
- data/lib/resources/file.rb +298 -298
- data/lib/resources/filesystem.rb +31 -31
- data/lib/resources/firewalld.rb +143 -144
- data/lib/resources/gem.rb +70 -70
- data/lib/resources/groups.rb +215 -215
- data/lib/resources/grub_conf.rb +237 -237
- data/lib/resources/host.rb +306 -300
- data/lib/resources/http.rb +251 -250
- data/lib/resources/iis_app.rb +101 -104
- data/lib/resources/iis_site.rb +148 -148
- data/lib/resources/inetd_conf.rb +62 -62
- data/lib/resources/ini.rb +29 -29
- data/lib/resources/interface.rb +129 -129
- data/lib/resources/iptables.rb +80 -69
- data/lib/resources/json.rb +117 -117
- data/lib/resources/kernel_module.rb +107 -107
- data/lib/resources/kernel_parameter.rb +58 -58
- data/lib/resources/key_rsa.rb +67 -67
- data/lib/resources/limits_conf.rb +55 -55
- data/lib/resources/login_def.rb +66 -66
- data/lib/resources/mount.rb +88 -88
- data/lib/resources/mssql_session.rb +101 -101
- data/lib/resources/mysql.rb +81 -81
- data/lib/resources/mysql_conf.rb +134 -134
- data/lib/resources/mysql_session.rb +71 -71
- data/lib/resources/nginx.rb +96 -96
- data/lib/resources/nginx_conf.rb +227 -227
- data/lib/resources/npm.rb +48 -48
- data/lib/resources/ntp_conf.rb +58 -58
- data/lib/resources/oneget.rb +71 -71
- data/lib/resources/oracledb_session.rb +139 -139
- data/lib/resources/os.rb +36 -36
- data/lib/resources/os_env.rb +76 -76
- data/lib/resources/package.rb +370 -370
- data/lib/resources/packages.rb +111 -111
- data/lib/resources/parse_config.rb +116 -116
- data/lib/resources/passwd.rb +74 -74
- data/lib/resources/pip.rb +89 -89
- data/lib/resources/platform.rb +109 -109
- data/lib/resources/port.rb +771 -771
- data/lib/resources/postgres.rb +130 -130
- data/lib/resources/postgres_conf.rb +121 -121
- data/lib/resources/postgres_hba_conf.rb +99 -100
- data/lib/resources/postgres_ident_conf.rb +76 -78
- data/lib/resources/postgres_session.rb +71 -71
- data/lib/resources/powershell.rb +53 -57
- data/lib/resources/processes.rb +204 -204
- data/lib/resources/rabbitmq_conf.rb +52 -52
- data/lib/resources/registry_key.rb +296 -296
- data/lib/resources/security_policy.rb +180 -180
- data/lib/resources/service.rb +789 -789
- data/lib/resources/shadow.rb +146 -140
- data/lib/resources/ssh_conf.rb +102 -102
- data/lib/resources/ssl.rb +99 -99
- data/lib/resources/sys_info.rb +28 -28
- data/lib/resources/toml.rb +32 -32
- data/lib/resources/users.rb +654 -654
- data/lib/resources/vbscript.rb +68 -69
- data/lib/resources/virtualization.rb +247 -247
- data/lib/resources/windows_feature.rb +84 -84
- data/lib/resources/windows_hotfix.rb +35 -35
- data/lib/resources/windows_task.rb +102 -105
- data/lib/resources/wmi.rb +110 -113
- data/lib/resources/x509_certificate.rb +143 -143
- data/lib/resources/xinetd.rb +111 -111
- data/lib/resources/xml.rb +46 -46
- data/lib/resources/yaml.rb +47 -47
- data/lib/resources/yum.rb +180 -180
- data/lib/resources/zfs_dataset.rb +60 -60
- data/lib/resources/zfs_pool.rb +49 -49
- data/lib/source_readers/flat.rb +39 -39
- data/lib/source_readers/inspec.rb +75 -75
- data/lib/utils/command_wrapper.rb +27 -27
- data/lib/utils/convert.rb +12 -12
- data/lib/utils/database_helpers.rb +77 -77
- data/lib/utils/erlang_parser.rb +192 -192
- data/lib/utils/filter.rb +272 -272
- data/lib/utils/filter_array.rb +27 -27
- data/lib/utils/find_files.rb +44 -44
- data/lib/utils/hash.rb +41 -41
- data/lib/utils/json_log.rb +18 -18
- data/lib/utils/latest_version.rb +22 -22
- data/lib/utils/modulator.rb +12 -12
- data/lib/utils/nginx_parser.rb +85 -85
- data/lib/utils/object_traversal.rb +49 -49
- data/lib/utils/parser.rb +274 -274
- data/lib/utils/plugin_registry.rb +93 -93
- data/lib/utils/simpleconfig.rb +120 -120
- data/lib/utils/spdx.rb +13 -13
- data/lib/utils/spdx.txt +343 -343
- metadata +2 -2
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
class AwsIamAccessKey < Inspec.resource(1)
|
|
2
|
-
name 'aws_iam_access_key'
|
|
3
|
-
desc 'Verifies settings for an individual IAM access key'
|
|
4
|
-
example "
|
|
5
|
-
describe aws_iam_access_key(username: 'username', id: 'access-key id') do
|
|
6
|
-
it { should exist }
|
|
7
|
-
it { should_not be_active }
|
|
8
|
-
its('create_date') { should be > Time.now - 365 * 86400 }
|
|
9
|
-
its('last_used_date') { should be > Time.now - 90 * 86400 }
|
|
10
|
-
end
|
|
11
|
-
"
|
|
12
|
-
supports platform: 'aws'
|
|
13
|
-
|
|
14
|
-
include AwsSingularResourceMixin
|
|
15
|
-
attr_reader :access_key_id, :create_date, :status, :username
|
|
16
|
-
alias id access_key_id
|
|
17
|
-
|
|
18
|
-
def validate_params(raw_params)
|
|
19
|
-
recognized_params = check_resource_param_names(
|
|
20
|
-
raw_params: raw_params,
|
|
21
|
-
allowed_params: [:username, :id, :access_key_id],
|
|
22
|
-
allowed_scalar_name: :access_key_id,
|
|
23
|
-
allowed_scalar_type: String,
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
# id and access_key_id are aliases; standardize on access_key_id
|
|
27
|
-
recognized_params[:access_key_id] = recognized_params.delete(:id) if recognized_params.key?(:id)
|
|
28
|
-
|
|
29
|
-
# Validate format of access_key_id
|
|
30
|
-
if recognized_params[:access_key_id] and
|
|
31
|
-
recognized_params[:access_key_id] !~ /^AKIA[0-9A-Z]{16}$/
|
|
32
|
-
raise ArgumentError, 'Incorrect format for Access Key ID - expected AKIA followed ' \
|
|
33
|
-
'by 16 letters or numbers'
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# One of username and access_key_id is required
|
|
37
|
-
if recognized_params[:username].nil? && recognized_params[:access_key_id].nil?
|
|
38
|
-
raise ArgumentError, 'You must provide at lease one of access_key_id or username to aws_iam_access_key'
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
recognized_params
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def active?
|
|
45
|
-
return nil unless exists?
|
|
46
|
-
status == 'Active'
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def to_s
|
|
50
|
-
"IAM Access-Key #{access_key_id}"
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def last_used_date
|
|
54
|
-
return nil unless exists?
|
|
55
|
-
return @last_used_date if defined? @last_used_date
|
|
56
|
-
backend = BackendFactory.create(inspec_runner)
|
|
57
|
-
catch_aws_errors do
|
|
58
|
-
@last_used_date = backend.get_access_key_last_used({ access_key_id: access_key_id }).access_key_last_used.last_used_date
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def fetch_from_api
|
|
63
|
-
backend = BackendFactory.create(inspec_runner)
|
|
64
|
-
query = {}
|
|
65
|
-
query[:user_name] = username if username
|
|
66
|
-
|
|
67
|
-
response = backend.list_access_keys(query)
|
|
68
|
-
|
|
69
|
-
access_keys = response.access_key_metadata.select do |key|
|
|
70
|
-
if access_key_id
|
|
71
|
-
key.access_key_id == access_key_id
|
|
72
|
-
else
|
|
73
|
-
true
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
if access_keys.empty?
|
|
78
|
-
@exists = false
|
|
79
|
-
return
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
if access_keys.count > 1
|
|
83
|
-
raise 'More than one access key matched for aws_iam_access_key. Use more specific paramaters, such as access_key_id.'
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
@exists = true
|
|
87
|
-
@access_key_id = access_keys[0].access_key_id
|
|
88
|
-
@username = access_keys[0].user_name
|
|
89
|
-
@create_date = access_keys[0].create_date
|
|
90
|
-
@status = access_keys[0].status
|
|
91
|
-
# Last used date is lazily loaded, separate API call
|
|
92
|
-
rescue Aws::IAM::Errors::NoSuchEntity
|
|
93
|
-
@exists = false
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
class Backend
|
|
97
|
-
class AwsClientApi < AwsBackendBase
|
|
98
|
-
BackendFactory.set_default_backend(self)
|
|
99
|
-
self.aws_client_class = Aws::IAM::Client
|
|
100
|
-
|
|
101
|
-
def list_access_keys(query)
|
|
102
|
-
aws_service_client.list_access_keys(query)
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
end
|
|
1
|
+
class AwsIamAccessKey < Inspec.resource(1)
|
|
2
|
+
name 'aws_iam_access_key'
|
|
3
|
+
desc 'Verifies settings for an individual IAM access key'
|
|
4
|
+
example "
|
|
5
|
+
describe aws_iam_access_key(username: 'username', id: 'access-key id') do
|
|
6
|
+
it { should exist }
|
|
7
|
+
it { should_not be_active }
|
|
8
|
+
its('create_date') { should be > Time.now - 365 * 86400 }
|
|
9
|
+
its('last_used_date') { should be > Time.now - 90 * 86400 }
|
|
10
|
+
end
|
|
11
|
+
"
|
|
12
|
+
supports platform: 'aws'
|
|
13
|
+
|
|
14
|
+
include AwsSingularResourceMixin
|
|
15
|
+
attr_reader :access_key_id, :create_date, :status, :username
|
|
16
|
+
alias id access_key_id
|
|
17
|
+
|
|
18
|
+
def validate_params(raw_params)
|
|
19
|
+
recognized_params = check_resource_param_names(
|
|
20
|
+
raw_params: raw_params,
|
|
21
|
+
allowed_params: [:username, :id, :access_key_id],
|
|
22
|
+
allowed_scalar_name: :access_key_id,
|
|
23
|
+
allowed_scalar_type: String,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
# id and access_key_id are aliases; standardize on access_key_id
|
|
27
|
+
recognized_params[:access_key_id] = recognized_params.delete(:id) if recognized_params.key?(:id)
|
|
28
|
+
|
|
29
|
+
# Validate format of access_key_id
|
|
30
|
+
if recognized_params[:access_key_id] and
|
|
31
|
+
recognized_params[:access_key_id] !~ /^AKIA[0-9A-Z]{16}$/
|
|
32
|
+
raise ArgumentError, 'Incorrect format for Access Key ID - expected AKIA followed ' \
|
|
33
|
+
'by 16 letters or numbers'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# One of username and access_key_id is required
|
|
37
|
+
if recognized_params[:username].nil? && recognized_params[:access_key_id].nil?
|
|
38
|
+
raise ArgumentError, 'You must provide at lease one of access_key_id or username to aws_iam_access_key'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
recognized_params
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def active?
|
|
45
|
+
return nil unless exists?
|
|
46
|
+
status == 'Active'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def to_s
|
|
50
|
+
"IAM Access-Key #{access_key_id}"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def last_used_date
|
|
54
|
+
return nil unless exists?
|
|
55
|
+
return @last_used_date if defined? @last_used_date
|
|
56
|
+
backend = BackendFactory.create(inspec_runner)
|
|
57
|
+
catch_aws_errors do
|
|
58
|
+
@last_used_date = backend.get_access_key_last_used({ access_key_id: access_key_id }).access_key_last_used.last_used_date
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def fetch_from_api
|
|
63
|
+
backend = BackendFactory.create(inspec_runner)
|
|
64
|
+
query = {}
|
|
65
|
+
query[:user_name] = username if username
|
|
66
|
+
|
|
67
|
+
response = backend.list_access_keys(query)
|
|
68
|
+
|
|
69
|
+
access_keys = response.access_key_metadata.select do |key|
|
|
70
|
+
if access_key_id
|
|
71
|
+
key.access_key_id == access_key_id
|
|
72
|
+
else
|
|
73
|
+
true
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
if access_keys.empty?
|
|
78
|
+
@exists = false
|
|
79
|
+
return
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
if access_keys.count > 1
|
|
83
|
+
raise 'More than one access key matched for aws_iam_access_key. Use more specific paramaters, such as access_key_id.'
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
@exists = true
|
|
87
|
+
@access_key_id = access_keys[0].access_key_id
|
|
88
|
+
@username = access_keys[0].user_name
|
|
89
|
+
@create_date = access_keys[0].create_date
|
|
90
|
+
@status = access_keys[0].status
|
|
91
|
+
# Last used date is lazily loaded, separate API call
|
|
92
|
+
rescue Aws::IAM::Errors::NoSuchEntity
|
|
93
|
+
@exists = false
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
class Backend
|
|
97
|
+
class AwsClientApi < AwsBackendBase
|
|
98
|
+
BackendFactory.set_default_backend(self)
|
|
99
|
+
self.aws_client_class = Aws::IAM::Client
|
|
100
|
+
|
|
101
|
+
def list_access_keys(query)
|
|
102
|
+
aws_service_client.list_access_keys(query)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -1,144 +1,149 @@
|
|
|
1
|
-
class AwsIamAccessKeys < Inspec.resource(1)
|
|
2
|
-
name 'aws_iam_access_keys'
|
|
3
|
-
desc 'Verifies settings for AWS IAM Access Keys in bulk'
|
|
4
|
-
example '
|
|
5
|
-
describe aws_iam_access_keys do
|
|
6
|
-
it { should_not exist }
|
|
7
|
-
end
|
|
8
|
-
'
|
|
9
|
-
supports platform: 'aws'
|
|
10
|
-
|
|
11
|
-
include AwsPluralResourceMixin
|
|
12
|
-
|
|
13
|
-
def validate_params(raw_params)
|
|
14
|
-
recognized_params = check_resource_param_names(
|
|
15
|
-
raw_params: raw_params,
|
|
16
|
-
allowed_params: [:username, :id, :access_key_id, :created_date],
|
|
17
|
-
allowed_scalar_name: :access_key_id,
|
|
18
|
-
allowed_scalar_type: String,
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
# id and access_key_id are aliases; standardize on access_key_id
|
|
22
|
-
recognized_params[:access_key_id] = recognized_params.delete(:id) if recognized_params.key?(:id)
|
|
23
|
-
if recognized_params[:access_key_id] and
|
|
24
|
-
recognized_params[:access_key_id] !~ /^AKIA[0-9A-Z]{16}$/
|
|
25
|
-
raise 'Incorrect format for Access Key ID - expected AKIA followed ' \
|
|
26
|
-
'by 16 letters or numbers'
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
recognized_params
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def fetch_from_api
|
|
33
|
-
# TODO: this interface should be normalized to match the AWS API
|
|
34
|
-
criteria = {}
|
|
35
|
-
criteria[:username] = @username if defined? @username
|
|
36
|
-
@table = BackendFactory.create(inspec_runner).fetch(criteria)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# Underlying FilterTable implementation.
|
|
40
|
-
filter = FilterTable.create
|
|
41
|
-
filter.add_accessor(:where)
|
|
42
|
-
.add_accessor(:entries)
|
|
43
|
-
.add(:exists?) { |x| !x.entries.empty? }
|
|
44
|
-
.add(:access_key_ids, field: :access_key_id)
|
|
45
|
-
.add(:created_date, field: :create_date)
|
|
46
|
-
.add(:created_days_ago, field: :created_days_ago)
|
|
47
|
-
.add(:created_with_user, field: :created_with_user)
|
|
48
|
-
.add(:created_hours_ago, field: :created_hours_ago)
|
|
49
|
-
.add(:usernames, field: :username)
|
|
50
|
-
.add(:active, field: :active)
|
|
51
|
-
.add(:inactive, field: :inactive)
|
|
52
|
-
.add(:last_used_date, field: :last_used_date)
|
|
53
|
-
.add(:last_used_hours_ago, field: :last_used_hours_ago)
|
|
54
|
-
.add(:last_used_days_ago, field: :last_used_days_ago)
|
|
55
|
-
.add(:ever_used, field: :ever_used)
|
|
56
|
-
.add(:never_used, field: :never_used)
|
|
57
|
-
.add(:user_created_date, field: :user_created_date)
|
|
58
|
-
filter.connect(self, :table)
|
|
59
|
-
|
|
60
|
-
def to_s
|
|
61
|
-
'IAM Access Keys'
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# Internal support class. This is used to fetch
|
|
65
|
-
# the users and access keys. We have an abstract
|
|
66
|
-
# class with a concrete AWS implementation provided here;
|
|
67
|
-
# a few mock implementations are also provided in the unit tests.
|
|
68
|
-
class Backend
|
|
69
|
-
# Implementation of AccessKeyProvider which operates by looping over
|
|
70
|
-
# all users, then fetching their access keys.
|
|
71
|
-
# TODO: An alternate, more scalable implementation could be made
|
|
72
|
-
# using the Credential Report.
|
|
73
|
-
class AwsUserIterator < AwsBackendBase
|
|
74
|
-
BackendFactory.set_default_backend(self)
|
|
75
|
-
self.aws_client_class = Aws::IAM::Client
|
|
76
|
-
|
|
77
|
-
def fetch(criteria)
|
|
78
|
-
iam_client = aws_service_client
|
|
79
|
-
|
|
80
|
-
user_details = {}
|
|
81
|
-
if criteria.key?(:username)
|
|
82
|
-
begin
|
|
83
|
-
user_details[criteria[:username]] = iam_client.get_user(user_name: criteria[:username]).user
|
|
84
|
-
rescue Aws::IAM::Errors::NoSuchEntity # rubocop:disable Lint/HandleExceptions
|
|
85
|
-
# Swallow - a miss on search results should return an empty table
|
|
86
|
-
end
|
|
87
|
-
else
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
key_info[:
|
|
128
|
-
key_info[:
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
key_info[:
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
1
|
+
class AwsIamAccessKeys < Inspec.resource(1)
|
|
2
|
+
name 'aws_iam_access_keys'
|
|
3
|
+
desc 'Verifies settings for AWS IAM Access Keys in bulk'
|
|
4
|
+
example '
|
|
5
|
+
describe aws_iam_access_keys do
|
|
6
|
+
it { should_not exist }
|
|
7
|
+
end
|
|
8
|
+
'
|
|
9
|
+
supports platform: 'aws'
|
|
10
|
+
|
|
11
|
+
include AwsPluralResourceMixin
|
|
12
|
+
|
|
13
|
+
def validate_params(raw_params)
|
|
14
|
+
recognized_params = check_resource_param_names(
|
|
15
|
+
raw_params: raw_params,
|
|
16
|
+
allowed_params: [:username, :id, :access_key_id, :created_date],
|
|
17
|
+
allowed_scalar_name: :access_key_id,
|
|
18
|
+
allowed_scalar_type: String,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# id and access_key_id are aliases; standardize on access_key_id
|
|
22
|
+
recognized_params[:access_key_id] = recognized_params.delete(:id) if recognized_params.key?(:id)
|
|
23
|
+
if recognized_params[:access_key_id] and
|
|
24
|
+
recognized_params[:access_key_id] !~ /^AKIA[0-9A-Z]{16}$/
|
|
25
|
+
raise 'Incorrect format for Access Key ID - expected AKIA followed ' \
|
|
26
|
+
'by 16 letters or numbers'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
recognized_params
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def fetch_from_api
|
|
33
|
+
# TODO: this interface should be normalized to match the AWS API
|
|
34
|
+
criteria = {}
|
|
35
|
+
criteria[:username] = @username if defined? @username
|
|
36
|
+
@table = BackendFactory.create(inspec_runner).fetch(criteria)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Underlying FilterTable implementation.
|
|
40
|
+
filter = FilterTable.create
|
|
41
|
+
filter.add_accessor(:where)
|
|
42
|
+
.add_accessor(:entries)
|
|
43
|
+
.add(:exists?) { |x| !x.entries.empty? }
|
|
44
|
+
.add(:access_key_ids, field: :access_key_id)
|
|
45
|
+
.add(:created_date, field: :create_date)
|
|
46
|
+
.add(:created_days_ago, field: :created_days_ago)
|
|
47
|
+
.add(:created_with_user, field: :created_with_user)
|
|
48
|
+
.add(:created_hours_ago, field: :created_hours_ago)
|
|
49
|
+
.add(:usernames, field: :username)
|
|
50
|
+
.add(:active, field: :active)
|
|
51
|
+
.add(:inactive, field: :inactive)
|
|
52
|
+
.add(:last_used_date, field: :last_used_date)
|
|
53
|
+
.add(:last_used_hours_ago, field: :last_used_hours_ago)
|
|
54
|
+
.add(:last_used_days_ago, field: :last_used_days_ago)
|
|
55
|
+
.add(:ever_used, field: :ever_used)
|
|
56
|
+
.add(:never_used, field: :never_used)
|
|
57
|
+
.add(:user_created_date, field: :user_created_date)
|
|
58
|
+
filter.connect(self, :table)
|
|
59
|
+
|
|
60
|
+
def to_s
|
|
61
|
+
'IAM Access Keys'
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Internal support class. This is used to fetch
|
|
65
|
+
# the users and access keys. We have an abstract
|
|
66
|
+
# class with a concrete AWS implementation provided here;
|
|
67
|
+
# a few mock implementations are also provided in the unit tests.
|
|
68
|
+
class Backend
|
|
69
|
+
# Implementation of AccessKeyProvider which operates by looping over
|
|
70
|
+
# all users, then fetching their access keys.
|
|
71
|
+
# TODO: An alternate, more scalable implementation could be made
|
|
72
|
+
# using the Credential Report.
|
|
73
|
+
class AwsUserIterator < AwsBackendBase
|
|
74
|
+
BackendFactory.set_default_backend(self)
|
|
75
|
+
self.aws_client_class = Aws::IAM::Client
|
|
76
|
+
|
|
77
|
+
def fetch(criteria)
|
|
78
|
+
iam_client = aws_service_client
|
|
79
|
+
|
|
80
|
+
user_details = {}
|
|
81
|
+
if criteria.key?(:username)
|
|
82
|
+
begin
|
|
83
|
+
user_details[criteria[:username]] = iam_client.get_user(user_name: criteria[:username]).user
|
|
84
|
+
rescue Aws::IAM::Errors::NoSuchEntity # rubocop:disable Lint/HandleExceptions
|
|
85
|
+
# Swallow - a miss on search results should return an empty table
|
|
86
|
+
end
|
|
87
|
+
else
|
|
88
|
+
pagination_opts = {}
|
|
89
|
+
loop do
|
|
90
|
+
api_result = iam_client.list_users(pagination_opts)
|
|
91
|
+
api_result.users.each do |info|
|
|
92
|
+
user_details[info.user_name] = info
|
|
93
|
+
end
|
|
94
|
+
break unless api_result.is_truncated
|
|
95
|
+
pagination_opts[:marker] = api_result.marker
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
access_key_data = []
|
|
100
|
+
user_details.each_key do |username|
|
|
101
|
+
begin
|
|
102
|
+
user_keys = iam_client.list_access_keys(user_name: username)
|
|
103
|
+
.access_key_metadata
|
|
104
|
+
user_keys = user_keys.map do |metadata|
|
|
105
|
+
{
|
|
106
|
+
access_key_id: metadata.access_key_id,
|
|
107
|
+
username: username,
|
|
108
|
+
status: metadata.status,
|
|
109
|
+
create_date: metadata.create_date, # DateTime.parse(metadata.create_date),
|
|
110
|
+
}
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Copy in from user data
|
|
114
|
+
# Synthetics
|
|
115
|
+
user_keys.each do |key_info|
|
|
116
|
+
add_synthetic_fields(key_info, user_details[username])
|
|
117
|
+
end
|
|
118
|
+
access_key_data.concat(user_keys)
|
|
119
|
+
rescue Aws::IAM::Errors::NoSuchEntity # rubocop:disable Lint/HandleExceptions
|
|
120
|
+
# Swallow - a miss on search results should return an empty table
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
access_key_data
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def add_synthetic_fields(key_info, user_details) # rubocop:disable Metrics/AbcSize
|
|
127
|
+
key_info[:id] = key_info[:access_key_id]
|
|
128
|
+
key_info[:active] = key_info[:status] == 'Active'
|
|
129
|
+
key_info[:inactive] = key_info[:status] != 'Active'
|
|
130
|
+
key_info[:created_hours_ago] = ((Time.now - key_info[:create_date]) / (60*60)).to_i
|
|
131
|
+
key_info[:created_days_ago] = (key_info[:created_hours_ago] / 24).to_i
|
|
132
|
+
key_info[:user_created_date] = user_details[:create_date]
|
|
133
|
+
key_info[:created_with_user] = (key_info[:create_date] - key_info[:user_created_date]).abs < 1.0/24.0
|
|
134
|
+
|
|
135
|
+
# Last used is a separate API call
|
|
136
|
+
iam_client = aws_service_client
|
|
137
|
+
last_used =
|
|
138
|
+
iam_client.get_access_key_last_used(access_key_id: key_info[:access_key_id])
|
|
139
|
+
.access_key_last_used.last_used_date
|
|
140
|
+
key_info[:ever_used] = !last_used.nil?
|
|
141
|
+
key_info[:never_used] = last_used.nil?
|
|
142
|
+
key_info[:last_used_time] = last_used
|
|
143
|
+
return unless last_used
|
|
144
|
+
key_info[:last_used_hours_ago] = ((Time.now - last_used) / (60*60)).to_i
|
|
145
|
+
key_info[:last_used_days_ago] = (key_info[:last_used_hours_ago]/24).to_i
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|