inspec 4.7.3 → 4.7.18

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.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/inspec.gemspec +1 -1
  3. data/lib/bundles/inspec-supermarket/api.rb +2 -1
  4. data/lib/bundles/inspec-supermarket/cli.rb +6 -6
  5. data/lib/bundles/inspec-supermarket/target.rb +1 -0
  6. data/lib/fetchers/git.rb +3 -1
  7. data/lib/fetchers/mock.rb +1 -0
  8. data/lib/fetchers/url.rb +6 -3
  9. data/lib/inspec/backend.rb +1 -0
  10. data/lib/inspec/base_cli.rb +4 -1
  11. data/lib/inspec/cli.rb +5 -4
  12. data/lib/inspec/config.rb +9 -1
  13. data/lib/inspec/control_eval_context.rb +1 -0
  14. data/lib/inspec/dependencies/cache.rb +1 -0
  15. data/lib/inspec/dependencies/dependency_set.rb +2 -0
  16. data/lib/inspec/dependencies/lockfile.rb +1 -0
  17. data/lib/inspec/dependencies/requirement.rb +8 -7
  18. data/lib/inspec/dependencies/resolver.rb +3 -3
  19. data/lib/inspec/describe.rb +1 -0
  20. data/lib/inspec/dsl.rb +1 -1
  21. data/lib/inspec/dsl_shared.rb +1 -1
  22. data/lib/inspec/env_printer.rb +4 -4
  23. data/lib/inspec/fetcher.rb +4 -2
  24. data/lib/inspec/file_provider.rb +18 -8
  25. data/lib/inspec/formatters/base.rb +5 -0
  26. data/lib/inspec/impact.rb +2 -0
  27. data/lib/inspec/input_registry.rb +14 -13
  28. data/lib/inspec/metadata.rb +6 -2
  29. data/lib/inspec/method_source.rb +1 -1
  30. data/lib/inspec/objects/control.rb +4 -1
  31. data/lib/inspec/objects/describe.rb +3 -1
  32. data/lib/inspec/objects/input.rb +6 -5
  33. data/lib/inspec/objects/list.rb +2 -0
  34. data/lib/inspec/objects/test.rb +3 -2
  35. data/lib/inspec/plugin/v1/plugin_types/resource.rb +7 -0
  36. data/lib/inspec/plugin/v1/plugins.rb +4 -3
  37. data/lib/inspec/plugin/v1/registry.rb +3 -2
  38. data/lib/inspec/plugin/v2.rb +1 -0
  39. data/lib/inspec/plugin/v2/activator.rb +2 -0
  40. data/lib/inspec/plugin/v2/config_file.rb +4 -1
  41. data/lib/inspec/plugin/v2/filter.rb +1 -0
  42. data/lib/inspec/plugin/v2/installer.rb +9 -7
  43. data/lib/inspec/plugin/v2/loader.rb +2 -0
  44. data/lib/inspec/plugin/v2/plugin_base.rb +1 -0
  45. data/lib/inspec/plugin/v2/plugin_types/cli.rb +2 -2
  46. data/lib/inspec/plugin/v2/registry.rb +3 -1
  47. data/lib/inspec/profile.rb +13 -6
  48. data/lib/inspec/profile_context.rb +4 -2
  49. data/lib/inspec/reporters/cli.rb +14 -10
  50. data/lib/inspec/reporters/json.rb +1 -0
  51. data/lib/inspec/reporters/json_automate.rb +3 -0
  52. data/lib/inspec/reporters/json_min.rb +2 -0
  53. data/lib/inspec/resource.rb +2 -0
  54. data/lib/inspec/resources/aide_conf.rb +4 -3
  55. data/lib/inspec/resources/apache_conf.rb +1 -1
  56. data/lib/inspec/resources/apt.rb +2 -0
  57. data/lib/inspec/resources/auditd.rb +19 -18
  58. data/lib/inspec/resources/bridge.rb +5 -2
  59. data/lib/inspec/resources/chocolatey_package.rb +2 -0
  60. data/lib/inspec/resources/command.rb +1 -1
  61. data/lib/inspec/resources/crontab.rb +9 -8
  62. data/lib/inspec/resources/csv.rb +1 -1
  63. data/lib/inspec/resources/dh_params.rb +6 -0
  64. data/lib/inspec/resources/docker.rb +37 -34
  65. data/lib/inspec/resources/docker_container.rb +1 -0
  66. data/lib/inspec/resources/docker_image.rb +1 -0
  67. data/lib/inspec/resources/docker_plugin.rb +1 -0
  68. data/lib/inspec/resources/docker_service.rb +1 -0
  69. data/lib/inspec/resources/elasticsearch.rb +24 -24
  70. data/lib/inspec/resources/etc_fstab.rb +8 -7
  71. data/lib/inspec/resources/etc_group.rb +4 -0
  72. data/lib/inspec/resources/etc_hosts.rb +4 -4
  73. data/lib/inspec/resources/etc_hosts_allow_deny.rb +5 -3
  74. data/lib/inspec/resources/file.rb +4 -1
  75. data/lib/inspec/resources/filesystem.rb +5 -3
  76. data/lib/inspec/resources/firewalld.rb +7 -4
  77. data/lib/inspec/resources/groups.rb +6 -4
  78. data/lib/inspec/resources/grub_conf.rb +3 -0
  79. data/lib/inspec/resources/host.rb +5 -3
  80. data/lib/inspec/resources/http.rb +6 -4
  81. data/lib/inspec/resources/iis_app.rb +1 -0
  82. data/lib/inspec/resources/iis_app_pool.rb +1 -1
  83. data/lib/inspec/resources/iis_site.rb +4 -3
  84. data/lib/inspec/resources/interface.rb +10 -7
  85. data/lib/inspec/resources/json.rb +1 -1
  86. data/lib/inspec/resources/kernel_module.rb +1 -1
  87. data/lib/inspec/resources/kernel_parameter.rb +2 -1
  88. data/lib/inspec/resources/key_rsa.rb +5 -0
  89. data/lib/inspec/resources/mount.rb +3 -1
  90. data/lib/inspec/resources/mysql_conf.rb +3 -1
  91. data/lib/inspec/resources/mysql_session.rb +2 -0
  92. data/lib/inspec/resources/nginx.rb +1 -0
  93. data/lib/inspec/resources/nginx_conf.rb +10 -6
  94. data/lib/inspec/resources/ntp_conf.rb +1 -0
  95. data/lib/inspec/resources/oneget.rb +1 -1
  96. data/lib/inspec/resources/oracledb_session.rb +4 -2
  97. data/lib/inspec/resources/os_env.rb +1 -0
  98. data/lib/inspec/resources/package.rb +10 -6
  99. data/lib/inspec/resources/packages.rb +7 -5
  100. data/lib/inspec/resources/passwd.rb +7 -7
  101. data/lib/inspec/resources/pip.rb +2 -0
  102. data/lib/inspec/resources/port.rb +22 -8
  103. data/lib/inspec/resources/postgres.rb +2 -1
  104. data/lib/inspec/resources/postgres_conf.rb +2 -0
  105. data/lib/inspec/resources/postgres_hba_conf.rb +6 -6
  106. data/lib/inspec/resources/postgres_ident_conf.rb +3 -3
  107. data/lib/inspec/resources/processes.rb +16 -15
  108. data/lib/inspec/resources/rabbitmq_config.rb +2 -0
  109. data/lib/inspec/resources/registry_key.rb +8 -3
  110. data/lib/inspec/resources/security_identifier.rb +3 -1
  111. data/lib/inspec/resources/security_policy.rb +2 -1
  112. data/lib/inspec/resources/service.rb +13 -1
  113. data/lib/inspec/resources/shadow.rb +1 -0
  114. data/lib/inspec/resources/ssh_config.rb +2 -0
  115. data/lib/inspec/resources/ssl.rb +12 -11
  116. data/lib/inspec/resources/users.rb +29 -19
  117. data/lib/inspec/resources/virtualization.rb +10 -0
  118. data/lib/inspec/resources/windows_feature.rb +1 -1
  119. data/lib/inspec/resources/windows_hotfix.rb +2 -0
  120. data/lib/inspec/resources/windows_task.rb +4 -0
  121. data/lib/inspec/resources/wmi.rb +2 -1
  122. data/lib/inspec/resources/x509_certificate.rb +8 -0
  123. data/lib/inspec/resources/xinetd_conf.rb +10 -9
  124. data/lib/inspec/resources/yum.rb +15 -11
  125. data/lib/inspec/resources/zfs_dataset.rb +4 -2
  126. data/lib/inspec/resources/zfs_pool.rb +2 -1
  127. data/lib/inspec/rule.rb +11 -1
  128. data/lib/inspec/runner.rb +9 -6
  129. data/lib/inspec/runner_rspec.rb +10 -8
  130. data/lib/inspec/schema.rb +1 -0
  131. data/lib/inspec/secrets.rb +1 -0
  132. data/lib/inspec/secrets/yaml.rb +1 -0
  133. data/lib/inspec/shell.rb +20 -19
  134. data/lib/inspec/shell_detector.rb +1 -1
  135. data/lib/inspec/source_reader.rb +2 -0
  136. data/lib/inspec/ui.rb +1 -0
  137. data/lib/inspec/utils/deprecation/config_file.rb +8 -4
  138. data/lib/inspec/utils/erlang_parser.rb +2 -0
  139. data/lib/inspec/utils/file_reader.rb +1 -1
  140. data/lib/inspec/utils/filter.rb +16 -3
  141. data/lib/inspec/utils/find_files.rb +2 -2
  142. data/lib/inspec/utils/object_traversal.rb +1 -0
  143. data/lib/inspec/utils/parser.rb +2 -0
  144. data/lib/inspec/utils/simpleconfig.rb +4 -1
  145. data/lib/inspec/utils/telemetry/global_methods.rb +1 -0
  146. data/lib/inspec/version.rb +1 -1
  147. data/lib/matchers/matchers.rb +4 -1
  148. data/lib/plugins/inspec-artifact/lib/inspec-artifact/base.rb +12 -11
  149. data/lib/plugins/inspec-artifact/test/functional/inspec_artifact_test.rb +3 -3
  150. data/lib/plugins/inspec-compliance/lib/inspec-compliance/api.rb +15 -11
  151. data/lib/plugins/inspec-compliance/lib/inspec-compliance/api/login.rb +4 -2
  152. data/lib/plugins/inspec-compliance/lib/inspec-compliance/cli.rb +13 -12
  153. data/lib/plugins/inspec-compliance/lib/inspec-compliance/http.rb +3 -0
  154. data/lib/plugins/inspec-compliance/test/unit/api_test.rb +28 -28
  155. data/lib/plugins/inspec-compliance/test/unit/target_test.rb +1 -1
  156. data/lib/plugins/inspec-habitat/lib/inspec-habitat/profile.rb +1 -1
  157. data/lib/plugins/inspec-habitat/test/unit/profile_test.rb +7 -6
  158. data/lib/plugins/inspec-init/lib/inspec-init/cli_profile.rb +2 -2
  159. data/lib/plugins/inspec-init/lib/inspec-init/renderer.rb +1 -0
  160. data/lib/plugins/inspec-init/test/functional/inspec_init_plugin_test.rb +12 -10
  161. data/lib/plugins/inspec-plugin-manager-cli/lib/inspec-plugin-manager-cli/cli_command.rb +6 -5
  162. data/lib/plugins/inspec-plugin-manager-cli/test/functional/inspec-plugin_test.rb +1 -0
  163. data/lib/plugins/shared/core_plugin_test_helper.rb +1 -0
  164. data/lib/resource_support/aws/aws_resource_mixin.rb +3 -2
  165. data/lib/resources/aws/aws_billing_report.rb +1 -1
  166. data/lib/resources/aws/aws_billing_reports.rb +8 -7
  167. data/lib/resources/aws/aws_cloudtrail_trail.rb +1 -1
  168. data/lib/resources/aws/aws_cloudtrail_trails.rb +1 -0
  169. data/lib/resources/aws/aws_cloudwatch_alarm.rb +4 -3
  170. data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +2 -1
  171. data/lib/resources/aws/aws_config_delivery_channel.rb +1 -1
  172. data/lib/resources/aws/aws_config_recorder.rb +2 -0
  173. data/lib/resources/aws/aws_ebs_volume.rb +1 -0
  174. data/lib/resources/aws/aws_ebs_volumes.rb +2 -0
  175. data/lib/resources/aws/aws_ec2_instance.rb +2 -0
  176. data/lib/resources/aws/aws_ec2_instances.rb +2 -0
  177. data/lib/resources/aws/aws_ecs_cluster.rb +2 -2
  178. data/lib/resources/aws/aws_eks_cluster.rb +3 -3
  179. data/lib/resources/aws/aws_elb.rb +2 -2
  180. data/lib/resources/aws/aws_elbs.rb +14 -12
  181. data/lib/resources/aws/aws_flow_log.rb +2 -2
  182. data/lib/resources/aws/aws_iam_access_key.rb +3 -1
  183. data/lib/resources/aws/aws_iam_access_keys.rb +18 -16
  184. data/lib/resources/aws/aws_iam_groups.rb +1 -0
  185. data/lib/resources/aws/aws_iam_password_policy.rb +9 -7
  186. data/lib/resources/aws/aws_iam_policies.rb +2 -1
  187. data/lib/resources/aws/aws_iam_policy.rb +10 -1
  188. data/lib/resources/aws/aws_iam_role.rb +1 -0
  189. data/lib/resources/aws/aws_iam_user.rb +5 -2
  190. data/lib/resources/aws/aws_iam_users.rb +12 -11
  191. data/lib/resources/aws/aws_kms_key.rb +2 -2
  192. data/lib/resources/aws/aws_kms_keys.rb +3 -1
  193. data/lib/resources/aws/aws_route_table.rb +2 -2
  194. data/lib/resources/aws/aws_route_tables.rb +2 -1
  195. data/lib/resources/aws/aws_s3_bucket.rb +5 -3
  196. data/lib/resources/aws/aws_s3_bucket_object.rb +3 -1
  197. data/lib/resources/aws/aws_s3_buckets.rb +1 -0
  198. data/lib/resources/aws/aws_security_group.rb +20 -9
  199. data/lib/resources/aws/aws_security_groups.rb +1 -0
  200. data/lib/resources/aws/aws_sns_subscription.rb +1 -1
  201. data/lib/resources/aws/aws_sns_topics.rb +2 -0
  202. data/lib/resources/aws/aws_subnet.rb +2 -2
  203. data/lib/resources/aws/aws_subnets.rb +4 -3
  204. data/lib/resources/aws/aws_vpc.rb +1 -1
  205. data/lib/resources/aws/aws_vpcs.rb +3 -2
  206. data/lib/resources/azure/azure_generic_resource.rb +4 -4
  207. data/lib/resources/azure/azure_resource_group.rb +1 -0
  208. data/lib/resources/azure/azure_virtual_machine_data_disk.rb +13 -12
  209. data/lib/source_readers/flat.rb +1 -0
  210. data/lib/source_readers/inspec.rb +1 -0
  211. metadata +2 -2
@@ -23,12 +23,13 @@ class AwsCloudwatchAlarm < Inspec.resource(1)
23
23
  def validate_params(raw_params)
24
24
  recognized_params = check_resource_param_names(
25
25
  raw_params: raw_params,
26
- allowed_params: [:metric_name, :metric_namespace]
26
+ allowed_params: %i{metric_name metric_namespace}
27
27
  )
28
28
  validated_params = {}
29
29
  # Currently you must specify exactly metric_name and metric_namespace
30
- [:metric_name, :metric_namespace].each do |param|
30
+ %i{metric_name metric_namespace}.each do |param|
31
31
  raise ArgumentError, "Missing resource param #{param}" unless recognized_params.key?(param)
32
+
32
33
  validated_params[param] = recognized_params.delete(param)
33
34
  end
34
35
 
@@ -45,7 +46,7 @@ class AwsCloudwatchAlarm < Inspec.resource(1)
45
46
  elsif aws_alarms.metric_alarms.count > 1
46
47
  alarms = aws_alarms.metric_alarms.map(&:alarm_name)
47
48
  raise "More than one Cloudwatch Alarm was matched. Try using " \
48
- "more specific resource parameters. Alarms matched: #{alarms.join(', ')}"
49
+ "more specific resource parameters. Alarms matched: #{alarms.join(", ")}"
49
50
  else
50
51
  @alarm_actions = aws_alarms.metric_alarms.first.alarm_actions
51
52
  @alarm_name = aws_alarms.metric_alarms.first.alarm_name
@@ -33,11 +33,12 @@ class AwsCloudwatchLogMetricFilter < Inspec.resource(1)
33
33
  def validate_params(raw_params)
34
34
  validated_params = check_resource_param_names(
35
35
  raw_params: raw_params,
36
- allowed_params: [:filter_name, :log_group_name, :pattern]
36
+ allowed_params: %i{filter_name log_group_name pattern}
37
37
  )
38
38
  if validated_params.empty?
39
39
  raise ArgumentError, "You must provide either filter_name, log_group, or pattern to aws_cloudwatch_log_metric_filter."
40
40
  end
41
+
41
42
  validated_params
42
43
  end
43
44
 
@@ -16,7 +16,7 @@ class AwsConfigDeliveryChannel < Inspec.resource(1)
16
16
 
17
17
  include AwsSingularResourceMixin
18
18
  attr_reader :channel_name, :s3_bucket_name, :s3_key_prefix, :sns_topic_arn,
19
- :delivery_frequency_in_hours
19
+ :delivery_frequency_in_hours
20
20
 
21
21
  def to_s
22
22
  "Config_Delivery_Channel: #{@channel_name}"
@@ -32,6 +32,7 @@ class AwsConfigurationRecorder < Inspec.resource(1)
32
32
 
33
33
  def status
34
34
  return {} unless @exists
35
+
35
36
  backend = BackendFactory.create(inspec_runner)
36
37
  catch_aws_errors do
37
38
  response = backend.describe_configuration_recorder_status(configuration_recorder_names: [@recorder_name])
@@ -41,6 +42,7 @@ class AwsConfigurationRecorder < Inspec.resource(1)
41
42
 
42
43
  def recording?
43
44
  return unless @exists
45
+
44
46
  status[:recording]
45
47
  end
46
48
 
@@ -54,6 +54,7 @@ class AwsEbsVolume < Inspec.resource(1)
54
54
 
55
55
  def id
56
56
  return @volume_id if defined?(@volume_id)
57
+
57
58
  catch_aws_errors do
58
59
  if @opts.is_a?(Hash)
59
60
  first = @ec2_resource.volumes(
@@ -17,6 +17,7 @@ class AwsEbsVolumes < Inspec.resource(1)
17
17
  unless resource_params.empty?
18
18
  raise ArgumentError, "aws_ebs_volumes does not accept resource parameters."
19
19
  end
20
+
20
21
  resource_params
21
22
  end
22
23
 
@@ -38,6 +39,7 @@ class AwsEbsVolumes < Inspec.resource(1)
38
39
  api_result = backend.describe_volumes(pagination_opts)
39
40
  @table += unpack_describe_volumes_response(api_result.volumes)
40
41
  break unless api_result.next_token
42
+
41
43
  pagination_opts = { next_token: api_result.next_token }
42
44
  end
43
45
  end
@@ -55,6 +55,7 @@ class AwsEc2Instance < Inspec.resource(1)
55
55
 
56
56
  def id
57
57
  return @instance_id if defined?(@instance_id)
58
+
58
59
  catch_aws_errors do
59
60
  if @opts.is_a?(Hash)
60
61
  first = @ec2_resource.instances(
@@ -76,6 +77,7 @@ class AwsEc2Instance < Inspec.resource(1)
76
77
 
77
78
  def exists?
78
79
  return false if instance.nil?
80
+
79
81
  instance.exists?
80
82
  end
81
83
 
@@ -17,6 +17,7 @@ class AwsEc2Instances < Inspec.resource(1)
17
17
  unless resource_params.empty?
18
18
  raise ArgumentError, "aws_ec2_instances does not accept resource parameters."
19
19
  end
20
+
20
21
  resource_params
21
22
  end
22
23
 
@@ -38,6 +39,7 @@ class AwsEc2Instances < Inspec.resource(1)
38
39
  api_result = backend.describe_instances(pagination_opts)
39
40
  @table += unpack_describe_instances_response(api_result.reservations)
40
41
  break unless api_result.next_token
42
+
41
43
  pagination_opts = { next_token: api_result.next_token }
42
44
  end
43
45
  end
@@ -15,8 +15,8 @@ class AwsEcsCluster < Inspec.resource(1)
15
15
 
16
16
  include AwsSingularResourceMixin
17
17
  attr_reader :cluster_arn, :cluster_name, :status,
18
- :registered_container_instances_count, :running_tasks_count,
19
- :pending_tasks_count, :active_services_count, :statistics
18
+ :registered_container_instances_count, :running_tasks_count,
19
+ :pending_tasks_count, :active_services_count, :statistics
20
20
 
21
21
  def to_s
22
22
  "AWS ECS cluster #{cluster_name}"
@@ -15,9 +15,9 @@ class AwsEksCluster < Inspec.resource(1)
15
15
 
16
16
  include AwsSingularResourceMixin
17
17
  attr_reader :version, :arn, :cluster_name, :certificate_authority, :name,
18
- :status, :endpoint, :subnets_count, :subnet_ids, :security_group_ids,
19
- :created_at, :role_arn, :vpc_id, :security_groups_count, :creating,
20
- :active, :failed, :deleting
18
+ :status, :endpoint, :subnets_count, :subnet_ids, :security_group_ids,
19
+ :created_at, :role_arn, :vpc_id, :security_groups_count, :creating,
20
+ :active, :failed, :deleting
21
21
  # Use aliases for matchers
22
22
  alias active? active
23
23
  alias failed? failed
@@ -14,8 +14,8 @@ class AwsElb < Inspec.resource(1)
14
14
 
15
15
  include AwsSingularResourceMixin
16
16
  attr_reader :availability_zones, :dns_name, :elb_name, :external_ports,
17
- :instance_ids, :internal_ports, :security_group_ids,
18
- :subnet_ids, :vpc_id
17
+ :instance_ids, :internal_ports, :security_group_ids,
18
+ :subnet_ids, :vpc_id
19
19
 
20
20
  def to_s
21
21
  "AWS ELB #{elb_name}"
@@ -17,24 +17,25 @@ class AwsElbs < Inspec.resource(1)
17
17
  unless resource_params.empty?
18
18
  raise ArgumentError, "aws_elbs does not accept resource parameters."
19
19
  end
20
+
20
21
  resource_params
21
22
  end
22
23
 
23
24
  # Underlying FilterTable implementation.
24
25
  filter = FilterTable.create
25
26
  filter.add_accessor(:entries)
26
- .add_accessor(:where)
27
- .add(:exists?) { |table| !table.params.empty? }
28
- .add(:count) { |table| table.params.count }
29
- .add(:availability_zones, field: :availability_zones, style: :simple)
30
- .add(:dns_names, field: :dns_name)
31
- .add(:external_ports, field: :external_ports, style: :simple)
32
- .add(:instance_ids, field: :instance_ids, style: :simple)
33
- .add(:internal_ports, field: :internal_ports, style: :simple)
34
- .add(:elb_names, field: :elb_name)
35
- .add(:security_group_ids, field: :security_group_ids, style: :simple)
36
- .add(:subnet_ids, field: :subnet_ids, style: :simple)
37
- .add(:vpc_ids, field: :vpc_id, style: :simple)
27
+ .add_accessor(:where)
28
+ .add(:exists?) { |table| !table.params.empty? }
29
+ .add(:count) { |table| table.params.count }
30
+ .add(:availability_zones, field: :availability_zones, style: :simple)
31
+ .add(:dns_names, field: :dns_name)
32
+ .add(:external_ports, field: :external_ports, style: :simple)
33
+ .add(:instance_ids, field: :instance_ids, style: :simple)
34
+ .add(:internal_ports, field: :internal_ports, style: :simple)
35
+ .add(:elb_names, field: :elb_name)
36
+ .add(:security_group_ids, field: :security_group_ids, style: :simple)
37
+ .add(:subnet_ids, field: :subnet_ids, style: :simple)
38
+ .add(:vpc_ids, field: :vpc_id, style: :simple)
38
39
  filter.connect(self, :table)
39
40
 
40
41
  def to_s
@@ -49,6 +50,7 @@ class AwsElbs < Inspec.resource(1)
49
50
  api_result = backend.describe_load_balancers(pagination_opts)
50
51
  @table += unpack_describe_elbs_response(api_result.load_balancer_descriptions)
51
52
  break unless api_result.next_marker
53
+
52
54
  pagination_opts = { marker: api_result.next_marker }
53
55
  end
54
56
  end
@@ -48,14 +48,14 @@ class AwsFlowLog < Inspec.resource(1)
48
48
  def validate_params(raw_params)
49
49
  validated_params = check_resource_param_names(
50
50
  raw_params: raw_params,
51
- allowed_params: [:flow_log_id, :subnet_id, :vpc_id],
51
+ allowed_params: %i{flow_log_id subnet_id vpc_id},
52
52
  allowed_scalar_name: :flow_log_id,
53
53
  allowed_scalar_type: String
54
54
  )
55
55
 
56
56
  if validated_params.empty?
57
57
  raise ArgumentError,
58
- "aws_flow_log requires a parameter: flow_log_id, subnet_id, or vpc_id"
58
+ "aws_flow_log requires a parameter: flow_log_id, subnet_id, or vpc_id"
59
59
  end
60
60
 
61
61
  validated_params
@@ -22,7 +22,7 @@ class AwsIamAccessKey < Inspec.resource(1)
22
22
  def validate_params(raw_params)
23
23
  recognized_params = check_resource_param_names(
24
24
  raw_params: raw_params,
25
- allowed_params: [:username, :id, :access_key_id],
25
+ allowed_params: %i{username id access_key_id},
26
26
  allowed_scalar_name: :access_key_id,
27
27
  allowed_scalar_type: String
28
28
  )
@@ -47,6 +47,7 @@ class AwsIamAccessKey < Inspec.resource(1)
47
47
 
48
48
  def active?
49
49
  return nil unless exists?
50
+
50
51
  status == "Active"
51
52
  end
52
53
 
@@ -57,6 +58,7 @@ class AwsIamAccessKey < Inspec.resource(1)
57
58
  def last_used_date
58
59
  return nil unless exists?
59
60
  return @last_used_date if defined? @last_used_date
61
+
60
62
  backend = BackendFactory.create(inspec_runner)
61
63
  catch_aws_errors do
62
64
  @last_used_date = backend.get_access_key_last_used({ access_key_id: access_key_id }).access_key_last_used.last_used_date
@@ -17,7 +17,7 @@ class AwsIamAccessKeys < Inspec.resource(1)
17
17
  def validate_params(raw_params)
18
18
  recognized_params = check_resource_param_names(
19
19
  raw_params: raw_params,
20
- allowed_params: [:username, :id, :access_key_id, :created_date],
20
+ allowed_params: %i{username id access_key_id created_date},
21
21
  allowed_scalar_name: :access_key_id,
22
22
  allowed_scalar_type: String
23
23
  )
@@ -44,19 +44,19 @@ class AwsIamAccessKeys < Inspec.resource(1)
44
44
  filter = FilterTable.create
45
45
  filter.register_custom_matcher(:exists?) { |x| !x.entries.empty? }
46
46
  filter.register_column(:access_key_ids, field: :access_key_id)
47
- .register_column(:created_date, field: :create_date)
48
- .register_column(:created_days_ago, field: :created_days_ago)
49
- .register_column(:created_with_user, field: :created_with_user)
50
- .register_column(:created_hours_ago, field: :created_hours_ago)
51
- .register_column(:usernames, field: :username)
52
- .register_column(:active, field: :active)
53
- .register_column(:inactive, field: :inactive)
54
- .register_column(:last_used_date, field: :last_used_date)
55
- .register_column(:last_used_hours_ago, field: :last_used_hours_ago)
56
- .register_column(:last_used_days_ago, field: :last_used_days_ago)
57
- .register_column(:ever_used, field: :ever_used)
58
- .register_column(:never_used, field: :never_used)
59
- .register_column(:user_created_date, field: :user_created_date)
47
+ .register_column(:created_date, field: :create_date)
48
+ .register_column(:created_days_ago, field: :created_days_ago)
49
+ .register_column(:created_with_user, field: :created_with_user)
50
+ .register_column(:created_hours_ago, field: :created_hours_ago)
51
+ .register_column(:usernames, field: :username)
52
+ .register_column(:active, field: :active)
53
+ .register_column(:inactive, field: :inactive)
54
+ .register_column(:last_used_date, field: :last_used_date)
55
+ .register_column(:last_used_hours_ago, field: :last_used_hours_ago)
56
+ .register_column(:last_used_days_ago, field: :last_used_days_ago)
57
+ .register_column(:ever_used, field: :ever_used)
58
+ .register_column(:never_used, field: :never_used)
59
+ .register_column(:user_created_date, field: :user_created_date)
60
60
  filter.install_filter_methods_on_resource(self, :table)
61
61
 
62
62
  def to_s
@@ -94,6 +94,7 @@ class AwsIamAccessKeys < Inspec.resource(1)
94
94
  user_details[info.user_name] = info
95
95
  end
96
96
  break unless api_result.is_truncated
97
+
97
98
  pagination_opts[:marker] = api_result.marker
98
99
  end
99
100
  end
@@ -102,7 +103,7 @@ class AwsIamAccessKeys < Inspec.resource(1)
102
103
  user_details.each_key do |username|
103
104
  begin
104
105
  user_keys = iam_client.list_access_keys(user_name: username)
105
- .access_key_metadata
106
+ .access_key_metadata
106
107
  user_keys = user_keys.map do |metadata|
107
108
  {
108
109
  access_key_id: metadata.access_key_id,
@@ -138,11 +139,12 @@ class AwsIamAccessKeys < Inspec.resource(1)
138
139
  iam_client = aws_service_client
139
140
  last_used =
140
141
  iam_client.get_access_key_last_used(access_key_id: key_info[:access_key_id])
141
- .access_key_last_used.last_used_date
142
+ .access_key_last_used.last_used_date
142
143
  key_info[:ever_used] = !last_used.nil?
143
144
  key_info[:never_used] = last_used.nil?
144
145
  key_info[:last_used_time] = last_used
145
146
  return unless last_used
147
+
146
148
  key_info[:last_used_hours_ago] = ((Time.now - last_used) / (60 * 60)).to_i
147
149
  key_info[:last_used_days_ago] = (key_info[:last_used_hours_ago] / 24).to_i
148
150
  end
@@ -18,6 +18,7 @@ class AwsIamGroups < Inspec.resource(1)
18
18
  unless resource_params.empty?
19
19
  raise ArgumentError, "aws_iam_groups does not accept resource parameters."
20
20
  end
21
+
21
22
  resource_params
22
23
  end
23
24
 
@@ -77,23 +77,25 @@ class AwsIamPasswordPolicy < Inspec.resource(1)
77
77
 
78
78
  def max_password_age_in_days
79
79
  raise "this policy does not expire passwords" unless expire_passwords?
80
+
80
81
  @policy.max_password_age
81
82
  end
82
83
 
83
84
  def number_of_passwords_to_remember
84
85
  raise "this policy does not prevent password reuse" \
85
86
  unless prevent_password_reuse?
87
+
86
88
  @policy.password_reuse_prevention
87
89
  end
88
90
 
89
91
  #-------------------------- Matchers ----------------------------#
90
- [
91
- :require_lowercase_characters,
92
- :require_uppercase_characters,
93
- :require_symbols,
94
- :require_numbers,
95
- :expire_passwords,
96
- ].each do |matcher_stem|
92
+ %i{
93
+ require_lowercase_characters
94
+ require_uppercase_characters
95
+ require_symbols
96
+ require_numbers
97
+ expire_passwords
98
+ }.each do |matcher_stem|
97
99
  # Create our predicates (for example, 'require_symbols?')
98
100
  stem_with_question_mark = (matcher_stem.to_s + "?").to_sym
99
101
  define_method stem_with_question_mark do
@@ -17,6 +17,7 @@ class AwsIamPolicies < Inspec.resource(1)
17
17
  unless resource_params.empty?
18
18
  raise ArgumentError, "aws_iam_policies does not accept resource parameters."
19
19
  end
20
+
20
21
  resource_params
21
22
  end
22
23
 
@@ -24,7 +25,7 @@ class AwsIamPolicies < Inspec.resource(1)
24
25
  filter = FilterTable.create
25
26
  filter.register_custom_matcher(:exists?) { |x| !x.entries.empty? }
26
27
  filter.register_column(:policy_names, field: :policy_name)
27
- .register_column(:arns, field: :arn)
28
+ .register_column(:arns, field: :arn)
28
29
  filter.install_filter_methods_on_resource(self, :table)
29
30
 
30
31
  def to_s
@@ -46,18 +46,21 @@ class AwsIamPolicy < Inspec.resource(1)
46
46
 
47
47
  def attached_users
48
48
  return @attached_users if defined? @attached_users
49
+
49
50
  fetch_attached_entities
50
51
  @attached_users
51
52
  end
52
53
 
53
54
  def attached_groups
54
55
  return @attached_groups if defined? @attached_groups
56
+
55
57
  fetch_attached_entities
56
58
  @attached_groups
57
59
  end
58
60
 
59
61
  def attached_roles
60
62
  return @attached_roles if defined? @attached_roles
63
+
61
64
  fetch_attached_entities
62
65
  @attached_roles
63
66
  end
@@ -88,6 +91,7 @@ class AwsIamPolicy < Inspec.resource(1)
88
91
 
89
92
  def statement_count
90
93
  return nil unless exists?
94
+
91
95
  # Typically it is an array of statements
92
96
  if policy["Statement"].is_a? Array
93
97
  policy["Statement"].count
@@ -100,6 +104,7 @@ class AwsIamPolicy < Inspec.resource(1)
100
104
 
101
105
  def has_statement?(provided_criteria = {})
102
106
  return nil unless exists?
107
+
103
108
  raw_criteria = provided_criteria.dup # provided_criteria is used for output formatting - can't delete from it.
104
109
  criteria = has_statement__validate_criteria(raw_criteria)
105
110
  @normalized_statements ||= has_statement__normalize_statements
@@ -146,7 +151,7 @@ class AwsIamPolicy < Inspec.resource(1)
146
151
 
147
152
  # If anything is left, it's spurious
148
153
  unless raw_criteria.empty?
149
- raise ArgumentError, "Unrecognized criteria #{raw_criteria.keys.join(', ')} to have_statement. Recognized criteria: #{EXPECTED_CRITERIA.join(', ')}"
154
+ raise ArgumentError, "Unrecognized criteria #{raw_criteria.keys.join(", ")} to have_statement. Recognized criteria: #{EXPECTED_CRITERIA.join(", ")}"
150
155
  end
151
156
 
152
157
  # Effect has only 2 permitted values
@@ -184,6 +189,7 @@ class AwsIamPolicy < Inspec.resource(1)
184
189
 
185
190
  def has_statement__focus_on_sid(statements, criteria)
186
191
  return statements unless criteria.key?(:sid)
192
+
187
193
  sid_seek = criteria[:sid]
188
194
  statements.select do |statement|
189
195
  if sid_seek.is_a? Regexp
@@ -200,6 +206,7 @@ class AwsIamPolicy < Inspec.resource(1)
200
206
 
201
207
  def has_statement__array_criterion(crit_name, statement, criteria)
202
208
  return true unless criteria.key?(crit_name)
209
+
203
210
  check = criteria[crit_name]
204
211
  # This is an array due to normalize_statements
205
212
  # If it is nil, the statement does not have an entry for that dimension;
@@ -252,12 +259,14 @@ class AwsIamPolicy < Inspec.resource(1)
252
259
  end
253
260
  break if policy # Found it!
254
261
  break unless api_result.is_truncated # Not found and no more results
262
+
255
263
  pagination_opts[:marker] = api_result.marker
256
264
  end
257
265
 
258
266
  @exists = !policy.nil?
259
267
 
260
268
  return unless @exists
269
+
261
270
  @arn = policy[:arn]
262
271
  @default_version_id = policy[:default_version_id]
263
272
  @attachment_count = policy[:attachment_count]