inspec 4.56.19 → 5.12.2

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/inspec.gemspec +4 -1
  3. data/lib/plugins/inspec-artifact/inspec-artifact.gemspec +9 -0
  4. data/lib/plugins/inspec-compliance/inspec-compliance.gemspec +9 -0
  5. data/lib/plugins/inspec-habitat/inspec-habitat.gemspec +9 -0
  6. data/lib/plugins/inspec-init/inspec-init.gemspec +9 -0
  7. data/lib/plugins/inspec-init/templates/profiles/aws/inspec.yml +1 -1
  8. data/lib/plugins/inspec-plugin-manager-cli/inspec-plugin-manager-cli.gemspec +10 -0
  9. data/lib/plugins/inspec-reporter-html2/inspec-reporter-html2.gemspec +9 -0
  10. data/lib/plugins/inspec-reporter-json-min/inspec-reporter-json-min.gemspec +9 -0
  11. data/lib/plugins/inspec-reporter-junit/inspec-reporter-junit.gemspec +9 -0
  12. data/lib/plugins/inspec-streaming-reporter-progress-bar/inspec-streaming-reporter-progress-bar.gemspec +9 -0
  13. metadata +28 -62
  14. data/lib/resource_support/aws/aws_backend_base.rb +0 -12
  15. data/lib/resource_support/aws/aws_backend_factory_mixin.rb +0 -12
  16. data/lib/resource_support/aws/aws_plural_resource_mixin.rb +0 -24
  17. data/lib/resource_support/aws/aws_resource_mixin.rb +0 -69
  18. data/lib/resource_support/aws/aws_singular_resource_mixin.rb +0 -27
  19. data/lib/resource_support/aws.rb +0 -76
  20. data/lib/resources/aws/aws_billing_report.rb +0 -105
  21. data/lib/resources/aws/aws_billing_reports.rb +0 -74
  22. data/lib/resources/aws/aws_cloudtrail_trail.rb +0 -97
  23. data/lib/resources/aws/aws_cloudtrail_trails.rb +0 -51
  24. data/lib/resources/aws/aws_cloudwatch_alarm.rb +0 -67
  25. data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +0 -105
  26. data/lib/resources/aws/aws_config_delivery_channel.rb +0 -74
  27. data/lib/resources/aws/aws_config_recorder.rb +0 -99
  28. data/lib/resources/aws/aws_ebs_volume.rb +0 -127
  29. data/lib/resources/aws/aws_ebs_volumes.rb +0 -69
  30. data/lib/resources/aws/aws_ec2_instance.rb +0 -162
  31. data/lib/resources/aws/aws_ec2_instances.rb +0 -69
  32. data/lib/resources/aws/aws_ecs_cluster.rb +0 -87
  33. data/lib/resources/aws/aws_eks_cluster.rb +0 -105
  34. data/lib/resources/aws/aws_elb.rb +0 -85
  35. data/lib/resources/aws/aws_elbs.rb +0 -84
  36. data/lib/resources/aws/aws_flow_log.rb +0 -106
  37. data/lib/resources/aws/aws_iam_access_key.rb +0 -112
  38. data/lib/resources/aws/aws_iam_access_keys.rb +0 -153
  39. data/lib/resources/aws/aws_iam_group.rb +0 -62
  40. data/lib/resources/aws/aws_iam_groups.rb +0 -56
  41. data/lib/resources/aws/aws_iam_password_policy.rb +0 -121
  42. data/lib/resources/aws/aws_iam_policies.rb +0 -57
  43. data/lib/resources/aws/aws_iam_policy.rb +0 -311
  44. data/lib/resources/aws/aws_iam_role.rb +0 -60
  45. data/lib/resources/aws/aws_iam_root_user.rb +0 -82
  46. data/lib/resources/aws/aws_iam_user.rb +0 -145
  47. data/lib/resources/aws/aws_iam_users.rb +0 -160
  48. data/lib/resources/aws/aws_kms_key.rb +0 -100
  49. data/lib/resources/aws/aws_kms_keys.rb +0 -58
  50. data/lib/resources/aws/aws_rds_instance.rb +0 -74
  51. data/lib/resources/aws/aws_route_table.rb +0 -67
  52. data/lib/resources/aws/aws_route_tables.rb +0 -64
  53. data/lib/resources/aws/aws_s3_bucket.rb +0 -141
  54. data/lib/resources/aws/aws_s3_bucket_object.rb +0 -87
  55. data/lib/resources/aws/aws_s3_buckets.rb +0 -52
  56. data/lib/resources/aws/aws_security_group.rb +0 -314
  57. data/lib/resources/aws/aws_security_groups.rb +0 -71
  58. data/lib/resources/aws/aws_sns_subscription.rb +0 -82
  59. data/lib/resources/aws/aws_sns_topic.rb +0 -57
  60. data/lib/resources/aws/aws_sns_topics.rb +0 -60
  61. data/lib/resources/aws/aws_sqs_queue.rb +0 -66
  62. data/lib/resources/aws/aws_subnet.rb +0 -92
  63. data/lib/resources/aws/aws_subnets.rb +0 -56
  64. data/lib/resources/aws/aws_vpc.rb +0 -77
  65. data/lib/resources/aws/aws_vpcs.rb +0 -55
  66. data/lib/resources/azure/azure_backend.rb +0 -379
  67. data/lib/resources/azure/azure_generic_resource.rb +0 -55
  68. data/lib/resources/azure/azure_resource_group.rb +0 -151
  69. data/lib/resources/azure/azure_virtual_machine.rb +0 -262
  70. data/lib/resources/azure/azure_virtual_machine_data_disk.rb +0 -131
@@ -1,87 +0,0 @@
1
- require "resource_support/aws/aws_singular_resource_mixin"
2
- require "resource_support/aws/aws_backend_base"
3
- require "aws-sdk-s3"
4
-
5
- class AwsS3BucketObject < Inspec.resource(1)
6
- name "aws_s3_bucket_object"
7
- desc "Verifies settings for a s3 bucket object"
8
- example <<~EXAMPLE
9
- describe aws_s3_bucket_object(bucket_name: 'bucket_name', key: 'file_name') do
10
- it { should exist }
11
- it { should_not be_public }
12
- end
13
- EXAMPLE
14
- supports platform: "aws"
15
-
16
- include AwsSingularResourceMixin
17
- attr_reader :bucket_name, :key
18
-
19
- def to_s
20
- # keep the format that aws uses.
21
- "s3://#{@bucket_name}/#{@key}"
22
- end
23
-
24
- def object_acl
25
- return @object_acl if defined? @object_acl
26
-
27
- catch_aws_errors do
28
- @object_acl = BackendFactory.create(inspec_runner).get_object_acl(bucket: bucket_name, key: key).grants
29
- end
30
- @object_acl
31
- end
32
-
33
- # RSpec will alias this to be_public
34
- def public?
35
- # first line just for formatting
36
- false || \
37
- object_acl.any? { |g| g.grantee.type == "Group" && g.grantee.uri =~ /AllUsers/ } || \
38
- object_acl.any? { |g| g.grantee.type == "Group" && g.grantee.uri =~ /AuthenticatedUsers/ }
39
- end
40
-
41
- private
42
-
43
- def validate_params(raw_params)
44
- validated_params = check_resource_param_names(
45
- raw_params: raw_params,
46
- allowed_params: %i{bucket_name key id}
47
- )
48
- if validated_params.empty? || !validated_params.key?(:bucket_name) || !validated_params.key?(:key)
49
- raise ArgumentError, "You must provide a bucket_name and key to aws_s3_bucket_object."
50
- end
51
-
52
- validated_params
53
- end
54
-
55
- def fetch_from_api
56
- backend = BackendFactory.create(inspec_runner)
57
- catch_aws_errors do
58
-
59
- # Just use get_object to detect if the bucket exists
60
- backend.get_object(bucket: bucket_name, key: key)
61
- rescue Aws::S3::Errors::NoSuchBucket
62
- @exists = false
63
- return
64
- rescue Aws::S3::Errors::NoSuchKey
65
- @exists = false
66
- return
67
-
68
- end
69
- @exists = true
70
- end
71
-
72
- class Backend
73
- class AwsClientApi < AwsBackendBase
74
- BackendFactory.set_default_backend(self)
75
- self.aws_client_class = Aws::S3::Client
76
-
77
- # Used to detect if object exists
78
- def get_object(query)
79
- aws_service_client.get_object(query)
80
- end
81
-
82
- def get_object_acl(query)
83
- aws_service_client.get_object_acl(query)
84
- end
85
- end
86
- end
87
- end
@@ -1,52 +0,0 @@
1
- require "resource_support/aws/aws_plural_resource_mixin"
2
- require "resource_support/aws/aws_backend_base"
3
- require "aws-sdk-s3"
4
-
5
- class AwsS3Buckets < Inspec.resource(1)
6
- name "aws_s3_buckets"
7
- desc "Verifies settings for AWS S3 Buckets in bulk"
8
- example <<~EXAMPLE
9
- describe aws_s3_bucket do
10
- its('bucket_names') { should eq ['my_bucket'] }
11
- end
12
- EXAMPLE
13
- supports platform: "aws"
14
-
15
- include AwsPluralResourceMixin
16
-
17
- # Underlying FilterTable implementation.
18
- filter = FilterTable.create
19
- filter.register_custom_matcher(:exists?) { |x| !x.entries.empty? }
20
- filter.register_column(:bucket_names, field: :name)
21
- filter.install_filter_methods_on_resource(self, :table)
22
-
23
- def to_s
24
- "S3 Buckets"
25
- end
26
-
27
- def validate_params(resource_params)
28
- unless resource_params.empty?
29
- raise ArgumentError, "aws_s3_buckets does not accept resource parameters."
30
- end
31
-
32
- resource_params
33
- end
34
-
35
- private
36
-
37
- def fetch_from_api
38
- backend = BackendFactory.create(inspec_runner)
39
- @table = backend.list_buckets.buckets.map(&:to_h)
40
- end
41
-
42
- class Backend
43
- class AwsClientApi < AwsBackendBase
44
- BackendFactory.set_default_backend self
45
- self.aws_client_class = Aws::S3::Client
46
-
47
- def list_buckets
48
- aws_service_client.list_buckets
49
- end
50
- end
51
- end
52
- end
@@ -1,314 +0,0 @@
1
- require "set" unless defined?(Set)
2
- require "ipaddr" unless defined?(IPAddr)
3
-
4
- require "resource_support/aws/aws_singular_resource_mixin"
5
- require "resource_support/aws/aws_backend_base"
6
- require "aws-sdk-ec2"
7
-
8
- class AwsSecurityGroup < Inspec.resource(1)
9
- name "aws_security_group"
10
- desc "Verifies settings for an individual AWS Security Group."
11
- example <<~EXAMPLE
12
- describe aws_security_group('sg-12345678') do
13
- it { should exist }
14
- end
15
- EXAMPLE
16
- supports platform: "aws"
17
-
18
- include AwsSingularResourceMixin
19
- attr_reader :description, :group_id, :group_name, :vpc_id, :inbound_rules, :outbound_rules, :inbound_rules_count, :outbound_rules_count
20
-
21
- def to_s
22
- "EC2 Security Group #{@group_id}"
23
- end
24
-
25
- def allow_in?(criteria = {})
26
- allow(inbound_rules, criteria.dup)
27
- end
28
- RSpec::Matchers.alias_matcher :allow_in, :be_allow_in
29
-
30
- def allow_out?(criteria = {})
31
- allow(outbound_rules, criteria.dup)
32
- end
33
- RSpec::Matchers.alias_matcher :allow_out, :be_allow_out
34
-
35
- def allow_in_only?(criteria = {})
36
- allow_only(inbound_rules, criteria.dup)
37
- end
38
- RSpec::Matchers.alias_matcher :allow_in_only, :be_allow_in_only
39
-
40
- def allow_out_only?(criteria = {})
41
- allow_only(outbound_rules, criteria.dup)
42
- end
43
- RSpec::Matchers.alias_matcher :allow_out_only, :be_allow_out_only
44
-
45
- private
46
-
47
- def allow_only(rules, criteria)
48
- rules = allow__focus_on_position(rules, criteria)
49
- # allow_{in_out}_only require either a single-rule group, or you
50
- # to select a rule using position.
51
- return false unless rules.count == 1 || criteria.key?(:position)
52
-
53
- if criteria.key?(:security_group)
54
- if criteria.key?(:position)
55
- pos = criteria[:position] - 1
56
- else
57
- pos = 0
58
- end
59
- return false unless rules[pos].key?(:user_id_group_pairs) && rules[pos][:user_id_group_pairs].count == 1
60
- end
61
- criteria[:exact] = true
62
- allow(rules, criteria)
63
- end
64
-
65
- def allow(rules, criteria)
66
- criteria = allow__check_criteria(criteria)
67
- rules = allow__focus_on_position(rules, criteria)
68
-
69
- rules.any? do |rule|
70
- matched = true
71
- matched &&= allow__match_port(rule, criteria)
72
- matched &&= allow__match_protocol(rule, criteria)
73
- matched &&= allow__match_ipv4_range(rule, criteria)
74
- matched &&= allow__match_ipv6_range(rule, criteria)
75
- matched &&= allow__match_security_group(rule, criteria)
76
- matched
77
- end
78
- end
79
-
80
- def allow__check_criteria(raw_criteria)
81
- allowed_criteria = [
82
- :from_port,
83
- :ipv4_range,
84
- :ipv6_range,
85
- :security_group,
86
- :port,
87
- :position,
88
- :protocol,
89
- :to_port,
90
- :exact, # Internal
91
- ]
92
- recognized_criteria = {}
93
- allowed_criteria.each do |expected_criterion|
94
- if raw_criteria.key?(expected_criterion)
95
- recognized_criteria[expected_criterion] = raw_criteria.delete(expected_criterion)
96
- end
97
- end
98
-
99
- # Any leftovers are unwelcome
100
- unless raw_criteria.empty?
101
- raise ArgumentError, "Unrecognized security group rule 'allow' criteria '#{raw_criteria.keys.join(",")}'. Expected criteria: #{allowed_criteria.join(", ")}"
102
- end
103
-
104
- recognized_criteria
105
- end
106
-
107
- def allow__focus_on_position(rules, criteria)
108
- return rules unless criteria.key?(:position)
109
-
110
- idx = criteria.delete(:position)
111
-
112
- # Normalize to a zero-based numeric index
113
- case # rubocop: disable Style/EmptyCaseCondition
114
- when idx.is_a?(Symbol) && idx == :first
115
- idx = 0
116
- when idx.is_a?(Symbol) && idx == :last
117
- idx = rules.count - 1
118
- when idx.is_a?(String)
119
- idx = idx.to_i - 1 # We document this as 1-based, so adjust to be zero-based.
120
- when idx.is_a?(Numeric)
121
- idx -= 1 # We document this as 1-based, so adjust to be zero-based.
122
- else
123
- raise ArgumentError, "aws_security_group 'allow' 'position' criteria must be an integer or the symbols :first or :last"
124
- end
125
-
126
- unless idx < rules.count
127
- raise ArgumentError, "aws_security_group 'allow' 'position' criteria #{idx + 1} is out of range - there are only #{rules.count} rules for security group #{group_id}."
128
- end
129
-
130
- [rules[idx]]
131
- end
132
-
133
- def allow__match_port(rule, criteria) # rubocop: disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize
134
- if criteria[:exact] || criteria[:from_port] || criteria[:to_port]
135
- # Exact match mode
136
- # :port is shorthand for a single-valued port range.
137
- criteria[:to_port] = criteria[:from_port] = criteria[:port] if criteria[:port]
138
- to = criteria[:to_port]
139
- from = criteria[:from_port]
140
- # It's a match if neither criteria was specified
141
- return true if to.nil? && from.nil?
142
-
143
- # Normalize to integers
144
- to = to.to_i unless to.nil?
145
- from = from.to_i unless from.nil?
146
- # It's a match if either was specified and the other was not
147
- return true if rule[:to_port] == to && from.nil?
148
- return true if rule[:from_port] == from && to.nil?
149
-
150
- # Finally, both must match.
151
- rule[:to_port] == to && rule[:from_port] == from
152
- elsif !criteria[:port]
153
- # port not specified, match anything
154
- true
155
- else
156
- # Range membership mode
157
- rule_from = rule[:from_port] || 0
158
- rule_to = rule[:to_port] || 65535
159
- (rule_from..rule_to).cover?(criteria[:port].to_i)
160
- end
161
- end
162
-
163
- def allow__match_protocol(rule, criteria)
164
- return true unless criteria.key?(:protocol)
165
-
166
- prot = criteria[:protocol]
167
- # We provide a "fluency alias" for -1 (any).
168
- prot = "-1" if prot == "any"
169
-
170
- rule[:ip_protocol] == prot
171
- end
172
-
173
- def match_ipv4_or_6_range(rule, criteria)
174
- if criteria.key?(:ipv4_range)
175
- query = criteria[:ipv4_range]
176
- query = [query] unless query.is_a?(Array)
177
- ranges = rule[:ip_ranges].map { |rng| rng[:cidr_ip] }
178
- else # IPv6
179
- query = criteria[:ipv6_range]
180
- query = [query] unless query.is_a?(Array)
181
- ranges = rule[:ipv_6_ranges].map { |rng| rng[:cidr_ipv_6] }
182
- end
183
-
184
- if criteria[:exact]
185
- Set.new(query) == Set.new(ranges)
186
- else
187
- # CIDR subset mode
188
- # "Each of the provided IP ranges must be a member of one of the rule's listed IP ranges"
189
- query.all? do |candidate|
190
- candidate = IPAddr.new(candidate)
191
- ranges.any? do |range|
192
- range = IPAddr.new(range)
193
- range.include?(candidate)
194
- end
195
- end
196
- end
197
- end
198
-
199
- def allow__match_ipv4_range(rule, criteria)
200
- return true unless criteria.key?(:ipv4_range)
201
-
202
- match_ipv4_or_6_range(rule, criteria)
203
- end
204
-
205
- def allow__match_ipv6_range(rule, criteria)
206
- return true unless criteria.key?(:ipv6_range)
207
-
208
- match_ipv4_or_6_range(rule, criteria)
209
- end
210
-
211
- def allow__match_security_group(rule, criteria)
212
- return true unless criteria.key?(:security_group)
213
-
214
- query = criteria[:security_group]
215
- return false unless rule[:user_id_group_pairs]
216
-
217
- rule[:user_id_group_pairs].any? { |group| query == group[:group_id] }
218
- end
219
-
220
- def validate_params(raw_params)
221
- recognized_params = check_resource_param_names(
222
- raw_params: raw_params,
223
- allowed_params: %i{id group_id group_name vpc_id},
224
- allowed_scalar_name: :group_id,
225
- allowed_scalar_type: String
226
- )
227
-
228
- # id is an alias for group_id
229
- recognized_params[:group_id] = recognized_params.delete(:id) if recognized_params.key?(:id)
230
-
231
- if recognized_params.key?(:group_id) && recognized_params[:group_id] !~ /^sg\-[0-9a-f]{8}/
232
- raise ArgumentError, 'aws_security_group security group ID must be in the format "sg-" followed by 8 hexadecimal characters.'
233
- end
234
-
235
- if recognized_params.key?(:vpc_id) && recognized_params[:vpc_id] !~ /^vpc\-[0-9a-f]{8}/
236
- raise ArgumentError, 'aws_security_group VPC ID must be in the format "vpc-" followed by 8 hexadecimal characters.'
237
- end
238
-
239
- validated_params = recognized_params
240
-
241
- if validated_params.empty?
242
- raise ArgumentError, "You must provide parameters to aws_security_group, such as group_name, group_id, or vpc_id.g_group."
243
- end
244
-
245
- validated_params
246
- end
247
-
248
- def count_sg_rules(ip_permissions)
249
- rule_count = 0
250
- ip_permissions.each do |ip_permission|
251
- %i{ip_ranges ipv_6_ranges user_id_group_pairs}.each do |key|
252
- if ip_permission.key? key
253
- rule_count += ip_permission[key].length
254
- end
255
- end
256
- end
257
- rule_count
258
- end
259
-
260
- def fetch_from_api # rubocop: disable Metrics/AbcSize
261
- backend = BackendFactory.create(inspec_runner)
262
-
263
- # Transform into filter format expected by AWS
264
- filters = []
265
- %i{
266
- description
267
- group_id
268
- group_name
269
- vpc_id
270
- }.each do |criterion_name|
271
- instance_var = "@#{criterion_name}".to_sym
272
- next unless instance_variable_defined?(instance_var)
273
-
274
- val = instance_variable_get(instance_var)
275
- next if val.nil?
276
-
277
- filters.push(
278
- {
279
- name: criterion_name.to_s.tr("_", "-"),
280
- values: [val],
281
- }
282
- )
283
- end
284
- dsg_response = backend.describe_security_groups(filters: filters)
285
-
286
- if dsg_response.security_groups.empty?
287
- @exists = false
288
- @inbound_rules = []
289
- @outbound_rules = []
290
- return
291
- end
292
-
293
- @exists = true
294
- @description = dsg_response.security_groups[0].description
295
- @group_id = dsg_response.security_groups[0].group_id
296
- @group_name = dsg_response.security_groups[0].group_name
297
- @vpc_id = dsg_response.security_groups[0].vpc_id
298
- @inbound_rules = dsg_response.security_groups[0].ip_permissions.map(&:to_h)
299
- @inbound_rules_count = count_sg_rules(dsg_response.security_groups[0].ip_permissions.map(&:to_h))
300
- @outbound_rules = dsg_response.security_groups[0].ip_permissions_egress.map(&:to_h)
301
- @outbound_rules_count = count_sg_rules(dsg_response.security_groups[0].ip_permissions_egress.map(&:to_h))
302
- end
303
-
304
- class Backend
305
- class AwsClientApi < AwsBackendBase
306
- BackendFactory.set_default_backend self
307
- self.aws_client_class = Aws::EC2::Client
308
-
309
- def describe_security_groups(query)
310
- aws_service_client.describe_security_groups(query)
311
- end
312
- end
313
- end
314
- end
@@ -1,71 +0,0 @@
1
- require "resource_support/aws/aws_plural_resource_mixin"
2
- require "resource_support/aws/aws_backend_base"
3
- require "aws-sdk-ec2"
4
-
5
- class AwsSecurityGroups < Inspec.resource(1)
6
- name "aws_security_groups"
7
- desc "Verifies settings for AWS Security Groups in bulk"
8
- example <<~EXAMPLE
9
- # Verify that you have security groups defined
10
- describe aws_security_groups do
11
- it { should exist }
12
- end
13
-
14
- # Verify you have more than the default security group
15
- describe aws_security_groups do
16
- its('entries.count') { should be > 1 }
17
- end
18
- EXAMPLE
19
- supports platform: "aws"
20
-
21
- include AwsPluralResourceMixin
22
-
23
- # Underlying FilterTable implementation.
24
- filter = FilterTable.create
25
- filter.register_custom_matcher(:exists?) { |x| !x.entries.empty? }
26
- filter.register_column(:group_ids, field: :group_id)
27
- filter.install_filter_methods_on_resource(self, :table)
28
-
29
- def to_s
30
- "EC2 Security Groups"
31
- end
32
-
33
- private
34
-
35
- def validate_params(raw_criteria)
36
- unless raw_criteria.is_a? Hash
37
- raise "Unrecognized criteria for fetching Security Groups. " \
38
- "Use 'criteria: value' format."
39
- end
40
-
41
- # No criteria yet
42
- unless raw_criteria.empty?
43
- raise ArgumentError, "aws_ec2_security_groups does not currently accept resource parameters."
44
- end
45
-
46
- raw_criteria
47
- end
48
-
49
- def fetch_from_api
50
- @table = []
51
- backend = BackendFactory.create(inspec_runner)
52
- backend.describe_security_groups({}).security_groups.each do |sg_info|
53
- @table.push({
54
- group_id: sg_info.group_id,
55
- group_name: sg_info.group_name,
56
- vpc_id: sg_info.vpc_id,
57
- })
58
- end
59
- end
60
-
61
- class Backend
62
- class AwsClientApi < AwsBackendBase
63
- BackendFactory.set_default_backend self
64
- self.aws_client_class = Aws::EC2::Client
65
-
66
- def describe_security_groups(query)
67
- aws_service_client.describe_security_groups(query)
68
- end
69
- end
70
- end
71
- end
@@ -1,82 +0,0 @@
1
- require "resource_support/aws/aws_singular_resource_mixin"
2
- require "resource_support/aws/aws_backend_base"
3
- require "aws-sdk-sns"
4
-
5
- class AwsSnsSubscription < Inspec.resource(1)
6
- name "aws_sns_subscription"
7
- desc "Verifies settings for an SNS Subscription"
8
- example <<~EXAMPLE
9
- describe aws_sns_subscription('arn:aws:sns:us-east-1::test-topic-01:b214aff5-a2c7-438f-a753-8494493f2ff6') do
10
- it { should_not have_raw_message_delivery }
11
- it { should be_confirmation_authenticated }
12
- its('owner') { should cmp '12345678' }
13
- its('topic_arn') { should cmp 'arn:aws:sns:us-east-1::test-topic-01' }
14
- its('endpoint') { should cmp 'arn:aws:sqs:us-east-1::test-queue-01' }
15
- its('protocol') { should cmp 'sqs' }
16
- end
17
- EXAMPLE
18
-
19
- supports platform: "aws"
20
-
21
- include AwsSingularResourceMixin
22
- attr_reader :arn, :owner, :raw_message_delivery, :topic_arn, :endpoint, :protocol,
23
- :confirmation_was_authenticated, :aws_response
24
-
25
- alias confirmation_authenticated? confirmation_was_authenticated
26
- alias raw_message_delivery? raw_message_delivery
27
-
28
- def has_raw_message_delivery?
29
- raw_message_delivery
30
- end
31
-
32
- def to_s
33
- "SNS Subscription #{@arn}"
34
- end
35
-
36
- private
37
-
38
- def validate_params(raw_params)
39
- validated_params = check_resource_param_names(
40
- raw_params: raw_params,
41
- allowed_params: [:subscription_arn],
42
- allowed_scalar_name: :subscription_arn,
43
- allowed_scalar_type: String
44
- )
45
-
46
- if validated_params.empty?
47
- raise ArgumentError, "You must provide a subscription_arn to aws_sns_subscription."
48
- end
49
-
50
- validated_params
51
- end
52
-
53
- def fetch_from_api
54
- backend = BackendFactory.create(inspec_runner)
55
- catch_aws_errors do
56
-
57
- aws_response = backend.get_subscription_attributes(subscription_arn: @subscription_arn).attributes
58
- @exists = true
59
- @owner = aws_response["Owner"]
60
- @raw_message_delivery = aws_response["RawMessageDelivery"].eql?("true")
61
- @topic_arn = aws_response["TopicArn"]
62
- @endpoint = aws_response["Endpoint"]
63
- @protocol = aws_response["Protocol"]
64
- @confirmation_was_authenticated = aws_response["ConfirmationWasAuthenticated"].eql?("true")
65
- rescue Aws::SNS::Errors::NotFound
66
- @exists = false
67
- return
68
-
69
- end
70
- end
71
-
72
- class Backend
73
- class AwsClientApi < AwsBackendBase
74
- BackendFactory.set_default_backend self
75
- self.aws_client_class = Aws::SNS::Client
76
-
77
- def get_subscription_attributes(criteria)
78
- aws_service_client.get_subscription_attributes(criteria)
79
- end
80
- end
81
- end
82
- end
@@ -1,57 +0,0 @@
1
- require "resource_support/aws/aws_singular_resource_mixin"
2
- require "resource_support/aws/aws_backend_base"
3
- require "aws-sdk-sns"
4
-
5
- class AwsSnsTopic < Inspec.resource(1)
6
- name "aws_sns_topic"
7
- desc "Verifies settings for an SNS Topic"
8
- example <<~EXAMPLE
9
- describe aws_sns_topic('arn:aws:sns:us-east-1:123456789012:some-topic') do
10
- it { should exist }
11
- its('confirmed_subscription_count') { should_not be_zero }
12
- end
13
- EXAMPLE
14
- supports platform: "aws"
15
-
16
- include AwsSingularResourceMixin
17
- attr_reader :arn, :confirmed_subscription_count
18
-
19
- private
20
-
21
- def validate_params(raw_params)
22
- validated_params = check_resource_param_names(
23
- raw_params: raw_params,
24
- allowed_params: [:arn],
25
- allowed_scalar_name: :arn,
26
- allowed_scalar_type: String
27
- )
28
- # Validate the ARN
29
- unless validated_params[:arn] =~ /^arn:aws:sns:[\w\-]+:\d{12}:[\S]+$/
30
- raise ArgumentError, "Malformed ARN for SNS topics. Expected an ARN of the form " \
31
- "'arn:aws:sns:REGION:ACCOUNT-ID:TOPIC-NAME'"
32
- end
33
- validated_params
34
- end
35
-
36
- def fetch_from_api
37
- aws_response = BackendFactory.create(inspec_runner).get_topic_attributes(topic_arn: @arn).attributes
38
- @exists = true
39
-
40
- # The response has a plain hash with CamelCase plain string keys and string values
41
- @confirmed_subscription_count = aws_response["SubscriptionsConfirmed"].to_i
42
- rescue Aws::SNS::Errors::NotFound
43
- @exists = false
44
- end
45
-
46
- # Uses the SDK API to really talk to AWS
47
- class Backend
48
- class AwsClientApi < AwsBackendBase
49
- BackendFactory.set_default_backend(self)
50
- self.aws_client_class = Aws::SNS::Client
51
-
52
- def get_topic_attributes(criteria)
53
- aws_service_client.get_topic_attributes(criteria)
54
- end
55
- end
56
- end
57
- end