inspec 4.22.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +63 -0
  3. data/inspec.gemspec +36 -0
  4. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/Gemfile +11 -0
  5. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/inspec-plugin-template.gemspec +43 -0
  6. data/lib/plugins/inspec-init/templates/profiles/aws/README.md +192 -0
  7. data/lib/plugins/inspec-init/templates/profiles/aws/attributes.yml +2 -0
  8. data/lib/plugins/inspec-init/templates/profiles/aws/controls/example.rb +39 -0
  9. data/lib/plugins/inspec-init/templates/profiles/aws/inspec.yml +22 -0
  10. data/lib/plugins/inspec-init/templates/profiles/azure/README.md +56 -0
  11. data/lib/plugins/inspec-init/templates/profiles/azure/controls/example.rb +14 -0
  12. data/lib/plugins/inspec-init/templates/profiles/azure/inspec.yml +14 -0
  13. data/lib/plugins/inspec-init/templates/profiles/gcp/README.md +66 -0
  14. data/lib/plugins/inspec-init/templates/profiles/gcp/attributes.yml +2 -0
  15. data/lib/plugins/inspec-init/templates/profiles/gcp/controls/example.rb +27 -0
  16. data/lib/plugins/inspec-init/templates/profiles/gcp/inspec.yml +19 -0
  17. data/lib/resource_support/aws.rb +76 -0
  18. data/lib/resource_support/aws/aws_backend_base.rb +12 -0
  19. data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -0
  20. data/lib/resource_support/aws/aws_plural_resource_mixin.rb +24 -0
  21. data/lib/resource_support/aws/aws_resource_mixin.rb +69 -0
  22. data/lib/resource_support/aws/aws_singular_resource_mixin.rb +27 -0
  23. data/lib/resources/aws/aws_billing_report.rb +107 -0
  24. data/lib/resources/aws/aws_billing_reports.rb +74 -0
  25. data/lib/resources/aws/aws_cloudtrail_trail.rb +97 -0
  26. data/lib/resources/aws/aws_cloudtrail_trails.rb +51 -0
  27. data/lib/resources/aws/aws_cloudwatch_alarm.rb +67 -0
  28. data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +105 -0
  29. data/lib/resources/aws/aws_config_delivery_channel.rb +74 -0
  30. data/lib/resources/aws/aws_config_recorder.rb +99 -0
  31. data/lib/resources/aws/aws_ebs_volume.rb +127 -0
  32. data/lib/resources/aws/aws_ebs_volumes.rb +69 -0
  33. data/lib/resources/aws/aws_ec2_instance.rb +162 -0
  34. data/lib/resources/aws/aws_ec2_instances.rb +69 -0
  35. data/lib/resources/aws/aws_ecs_cluster.rb +88 -0
  36. data/lib/resources/aws/aws_eks_cluster.rb +105 -0
  37. data/lib/resources/aws/aws_elb.rb +85 -0
  38. data/lib/resources/aws/aws_elbs.rb +84 -0
  39. data/lib/resources/aws/aws_flow_log.rb +106 -0
  40. data/lib/resources/aws/aws_iam_access_key.rb +112 -0
  41. data/lib/resources/aws/aws_iam_access_keys.rb +153 -0
  42. data/lib/resources/aws/aws_iam_group.rb +62 -0
  43. data/lib/resources/aws/aws_iam_groups.rb +56 -0
  44. data/lib/resources/aws/aws_iam_password_policy.rb +121 -0
  45. data/lib/resources/aws/aws_iam_policies.rb +57 -0
  46. data/lib/resources/aws/aws_iam_policy.rb +311 -0
  47. data/lib/resources/aws/aws_iam_role.rb +60 -0
  48. data/lib/resources/aws/aws_iam_root_user.rb +82 -0
  49. data/lib/resources/aws/aws_iam_user.rb +145 -0
  50. data/lib/resources/aws/aws_iam_users.rb +160 -0
  51. data/lib/resources/aws/aws_kms_key.rb +100 -0
  52. data/lib/resources/aws/aws_kms_keys.rb +58 -0
  53. data/lib/resources/aws/aws_rds_instance.rb +74 -0
  54. data/lib/resources/aws/aws_route_table.rb +67 -0
  55. data/lib/resources/aws/aws_route_tables.rb +64 -0
  56. data/lib/resources/aws/aws_s3_bucket.rb +142 -0
  57. data/lib/resources/aws/aws_s3_bucket_object.rb +87 -0
  58. data/lib/resources/aws/aws_s3_buckets.rb +52 -0
  59. data/lib/resources/aws/aws_security_group.rb +314 -0
  60. data/lib/resources/aws/aws_security_groups.rb +71 -0
  61. data/lib/resources/aws/aws_sns_subscription.rb +82 -0
  62. data/lib/resources/aws/aws_sns_topic.rb +57 -0
  63. data/lib/resources/aws/aws_sns_topics.rb +60 -0
  64. data/lib/resources/aws/aws_sqs_queue.rb +66 -0
  65. data/lib/resources/aws/aws_subnet.rb +92 -0
  66. data/lib/resources/aws/aws_subnets.rb +56 -0
  67. data/lib/resources/aws/aws_vpc.rb +77 -0
  68. data/lib/resources/aws/aws_vpcs.rb +55 -0
  69. data/lib/resources/azure/azure_backend.rb +379 -0
  70. data/lib/resources/azure/azure_generic_resource.rb +55 -0
  71. data/lib/resources/azure/azure_resource_group.rb +151 -0
  72. data/lib/resources/azure/azure_virtual_machine.rb +262 -0
  73. data/lib/resources/azure/azure_virtual_machine_data_disk.rb +131 -0
  74. metadata +202 -0
@@ -0,0 +1,69 @@
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 AwsEc2Instances < Inspec.resource(1)
6
+ name "aws_ec2_instances"
7
+ desc "Verifies settings for AWS EC2 Instances in bulk"
8
+ example <<~EXAMPLE
9
+ describe aws_ec2_instances do
10
+ it { should exist }
11
+ end
12
+ EXAMPLE
13
+ supports platform: "aws"
14
+
15
+ include AwsPluralResourceMixin
16
+ def validate_params(resource_params)
17
+ unless resource_params.empty?
18
+ raise ArgumentError, "aws_ec2_instances does not accept resource parameters."
19
+ end
20
+
21
+ resource_params
22
+ end
23
+
24
+ # Underlying FilterTable implementation.
25
+ filter = FilterTable.create
26
+ filter.register_custom_matcher(:exists?) { |x| !x.entries.empty? }
27
+ filter.register_column(:instance_ids, field: :instance_id)
28
+ filter.install_filter_methods_on_resource(self, :table)
29
+
30
+ def to_s
31
+ "EC2 Instances"
32
+ end
33
+
34
+ def fetch_from_api
35
+ backend = BackendFactory.create(inspec_runner)
36
+ @table = []
37
+ pagination_opts = {}
38
+ loop do
39
+ api_result = backend.describe_instances(pagination_opts)
40
+ @table += unpack_describe_instances_response(api_result.reservations)
41
+ break unless api_result.next_token
42
+
43
+ pagination_opts = { next_token: api_result.next_token }
44
+ end
45
+ end
46
+
47
+ def unpack_describe_instances_response(reservations)
48
+ instance_rows = []
49
+ reservations.each do |res|
50
+ instance_rows += res.instances.map do |instance_struct|
51
+ {
52
+ instance_id: instance_struct.instance_id,
53
+ }
54
+ end
55
+ end
56
+ instance_rows
57
+ end
58
+
59
+ class Backend
60
+ class AwsClientApi < AwsBackendBase
61
+ BackendFactory.set_default_backend(self)
62
+ self.aws_client_class = Aws::EC2::Client
63
+
64
+ def describe_instances(query)
65
+ aws_service_client.describe_instances(query)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,88 @@
1
+ require "resource_support/aws/aws_singular_resource_mixin"
2
+ require "resource_support/aws/aws_backend_base"
3
+ require "aws-sdk-ecs"
4
+
5
+ class AwsEcsCluster < Inspec.resource(1)
6
+ name "aws_ecs_cluster"
7
+ desc "Verifies settings for an ECS cluster"
8
+
9
+ example <<~EXAMPLE
10
+ describe aws_ecs_cluster('default') do
11
+ it { should exist }
12
+ end
13
+ EXAMPLE
14
+ supports platform: "aws"
15
+
16
+ include AwsSingularResourceMixin
17
+ attr_reader :cluster_arn, :cluster_name, :status,
18
+ :registered_container_instances_count, :running_tasks_count,
19
+ :pending_tasks_count, :active_services_count, :statistics
20
+
21
+ def to_s
22
+ "AWS ECS cluster #{cluster_name}"
23
+ end
24
+
25
+ private
26
+
27
+ def validate_params(raw_params)
28
+ validated_params = check_resource_param_names(
29
+ raw_params: raw_params,
30
+ allowed_params: [:cluster_name],
31
+ allowed_scalar_name: :cluster_name,
32
+ allowed_scalar_type: String
33
+ )
34
+
35
+ validated_params
36
+ end
37
+
38
+ def fetch_from_api
39
+ backend = BackendFactory.create(inspec_runner)
40
+ begin
41
+ # Use default cluster if no cluster name is specified
42
+ params = cluster_name.nil? ? {} : { clusters: [cluster_name] }
43
+ clusters = backend.describe_clusters(params).clusters
44
+
45
+ # Cluster name is unique, we either get back one cluster, or none
46
+ if clusters.length == 1
47
+ @exists = true
48
+ unpack_describe_clusters_response(clusters.first)
49
+ else
50
+ @exists = false
51
+ populate_as_missing
52
+ end
53
+ end
54
+ end
55
+
56
+ def unpack_describe_clusters_response(cluster_struct)
57
+ @cluster_arn = cluster_struct.cluster_arn
58
+ @cluster_name = cluster_struct.cluster_name
59
+ @status = cluster_struct.status
60
+ @registered_container_instances_count = cluster_struct.registered_container_instances_count
61
+ @running_tasks_count = cluster_struct.running_tasks_count
62
+ @pending_tasks_count = cluster_struct.pending_tasks_count
63
+ @active_services_count = cluster_struct.active_services_count
64
+ @statistics = cluster_struct.statistics
65
+ end
66
+
67
+ def populate_as_missing
68
+ @cluster_arn = ""
69
+ @cluster_name = ""
70
+ @status = ""
71
+ @registered_container_instances_count = 0
72
+ @running_tasks_count = 0
73
+ @pending_tasks_count = 0
74
+ @active_services_count = 0
75
+ @statistics = []
76
+ end
77
+
78
+ class Backend
79
+ class AwsClientApi < AwsBackendBase
80
+ BackendFactory.set_default_backend(self)
81
+ self.aws_client_class = Aws::ECS::Client
82
+
83
+ def describe_clusters(query = {})
84
+ aws_service_client.describe_clusters(query)
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,105 @@
1
+ require "resource_support/aws/aws_singular_resource_mixin"
2
+ require "resource_support/aws/aws_backend_base"
3
+ require "aws-sdk-eks"
4
+
5
+ class AwsEksCluster < Inspec.resource(1)
6
+ name "aws_eks_cluster"
7
+ desc "Verifies settings for an EKS cluster"
8
+
9
+ example <<~EXAMPLE
10
+ describe aws_eks_cluster('default') do
11
+ it { should exist }
12
+ end
13
+ EXAMPLE
14
+ supports platform: "aws"
15
+
16
+ include AwsSingularResourceMixin
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
21
+ # Use aliases for matchers
22
+ alias active? active
23
+ alias failed? failed
24
+ alias creating? creating
25
+ alias deleting? deleting
26
+
27
+ def to_s
28
+ "AWS EKS cluster #{cluster_name}"
29
+ end
30
+
31
+ private
32
+
33
+ def validate_params(raw_params)
34
+ validated_params = check_resource_param_names(
35
+ raw_params: raw_params,
36
+ allowed_params: [:cluster_name],
37
+ allowed_scalar_name: :cluster_name,
38
+ allowed_scalar_type: String
39
+ )
40
+
41
+ if validated_params.empty?
42
+ raise ArgumentError, "You must provide a cluster_name to aws_eks_cluster."
43
+ end
44
+
45
+ validated_params
46
+ end
47
+
48
+ def fetch_from_api # rubocop:disable Metrics/AbcSize
49
+ backend = BackendFactory.create(inspec_runner)
50
+ begin
51
+ params = { name: cluster_name }
52
+ resp = backend.describe_cluster(params)
53
+ rescue Aws::EKS::Errors::ResourceNotFoundException
54
+ @exists = false
55
+ populate_as_missing
56
+ return
57
+ end
58
+ @exists = true
59
+ cluster = resp.to_h[:cluster]
60
+ @version = cluster[:version]
61
+ @name = cluster[:name]
62
+ @arn = cluster[:arn]
63
+ @certificate_authority = cluster[:certificate_authority][:data]
64
+ @created_at = cluster[:created_at]
65
+ @endpoint = cluster[:endpoint]
66
+ @security_group_ids = cluster[:resources_vpc_config][:security_group_ids]
67
+ @subnet_ids = cluster[:resources_vpc_config][:subnet_ids]
68
+ @subnets_count = cluster[:resources_vpc_config][:subnet_ids].length
69
+ @security_groups_count = cluster[:resources_vpc_config][:security_group_ids].length
70
+ @vpc_id = cluster[:resources_vpc_config][:vpc_id]
71
+ @role_arn = cluster[:role_arn]
72
+ @status = cluster[:status]
73
+ @active = cluster[:status] == "ACTIVE"
74
+ @failed = cluster[:status] == "FAILED"
75
+ @creating = cluster[:status] == "CREATING"
76
+ @deleting = cluster[:status] == "DELETING"
77
+ end
78
+
79
+ def populate_as_missing
80
+ @version = nil
81
+ @name = cluster_name # name is an alias for cluster_name, and it is retained on a miss
82
+ @arn = nil
83
+ @certificate_authority = nil
84
+ @created_at = nil
85
+ @endpoint = nil
86
+ @security_group_ids = []
87
+ @subnet_ids = []
88
+ @subnets_count = nil
89
+ @security_groups_count = nil
90
+ @vpc_id = nil
91
+ @role_arn = nil
92
+ @status = nil
93
+ end
94
+
95
+ class Backend
96
+ class AwsClientApi < AwsBackendBase
97
+ BackendFactory.set_default_backend(self)
98
+ self.aws_client_class = Aws::EKS::Client
99
+
100
+ def describe_cluster(query = {})
101
+ aws_service_client.describe_cluster(query)
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,85 @@
1
+ require "resource_support/aws/aws_singular_resource_mixin"
2
+ require "resource_support/aws/aws_backend_base"
3
+ require "aws-sdk-elasticloadbalancing"
4
+
5
+ class AwsElb < Inspec.resource(1)
6
+ name "aws_elb"
7
+ desc "Verifies settings for AWS Elastic Load Balancer"
8
+ example <<~EXAMPLE
9
+ describe aws_elb('myelb') do
10
+ it { should exist }
11
+ end
12
+ EXAMPLE
13
+ supports platform: "aws"
14
+
15
+ include AwsSingularResourceMixin
16
+ attr_reader :availability_zones, :dns_name, :elb_name, :external_ports,
17
+ :instance_ids, :internal_ports, :security_group_ids,
18
+ :subnet_ids, :vpc_id
19
+
20
+ def to_s
21
+ "AWS ELB #{elb_name}"
22
+ end
23
+
24
+ private
25
+
26
+ def validate_params(raw_params)
27
+ validated_params = check_resource_param_names(
28
+ raw_params: raw_params,
29
+ allowed_params: [:elb_name],
30
+ allowed_scalar_name: :elb_name,
31
+ allowed_scalar_type: String
32
+ )
33
+
34
+ if validated_params.empty?
35
+ raise ArgumentError, "You must provide a elb_name to aws_elb."
36
+ end
37
+
38
+ validated_params
39
+ end
40
+
41
+ def fetch_from_api
42
+ backend = BackendFactory.create(inspec_runner)
43
+ begin
44
+ lbs = backend.describe_load_balancers(load_balancer_names: [elb_name]).load_balancer_descriptions
45
+ @exists = true
46
+ # Load balancer names are uniq; we will either have 0 or 1 result
47
+ unpack_describe_elbs_response(lbs.first)
48
+ rescue Aws::ElasticLoadBalancing::Errors::LoadBalancerNotFound
49
+ @exists = false
50
+ populate_as_missing
51
+ end
52
+ end
53
+
54
+ def unpack_describe_elbs_response(lb_struct)
55
+ @availability_zones = lb_struct.availability_zones
56
+ @dns_name = lb_struct.dns_name
57
+ @external_ports = lb_struct.listener_descriptions.map { |ld| ld.listener.load_balancer_port }
58
+ @instance_ids = lb_struct.instances.map(&:instance_id)
59
+ @internal_ports = lb_struct.listener_descriptions.map { |ld| ld.listener.instance_port }
60
+ @elb_name = lb_struct.load_balancer_name
61
+ @security_group_ids = lb_struct.security_groups
62
+ @subnet_ids = lb_struct.subnets
63
+ @vpc_id = lb_struct.vpc_id
64
+ end
65
+
66
+ def populate_as_missing
67
+ @availability_zones = []
68
+ @external_ports = []
69
+ @instance_ids = []
70
+ @internal_ports = []
71
+ @security_group_ids = []
72
+ @subnet_ids = []
73
+ end
74
+
75
+ class Backend
76
+ class AwsClientApi < AwsBackendBase
77
+ BackendFactory.set_default_backend(self)
78
+ self.aws_client_class = Aws::ElasticLoadBalancing::Client
79
+
80
+ def describe_load_balancers(query = {})
81
+ aws_service_client.describe_load_balancers(query)
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,84 @@
1
+ require "resource_support/aws/aws_plural_resource_mixin"
2
+ require "resource_support/aws/aws_backend_base"
3
+ require "aws-sdk-elasticloadbalancing"
4
+
5
+ class AwsElbs < Inspec.resource(1)
6
+ name "aws_elbs"
7
+ desc "Verifies settings for AWS ELBs (classic Elastic Load Balancers) in bulk"
8
+ example <<~EXAMPLE
9
+ describe aws_elbs do
10
+ it { should exist }
11
+ end
12
+ EXAMPLE
13
+ supports platform: "aws"
14
+
15
+ include AwsPluralResourceMixin
16
+ def validate_params(resource_params)
17
+ unless resource_params.empty?
18
+ raise ArgumentError, "aws_elbs does not accept resource parameters."
19
+ end
20
+
21
+ resource_params
22
+ end
23
+
24
+ # Underlying FilterTable implementation.
25
+ filter = FilterTable.create
26
+ filter.add_accessor(:entries)
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)
39
+ filter.connect(self, :table)
40
+
41
+ def to_s
42
+ "AWS ELBs"
43
+ end
44
+
45
+ def fetch_from_api
46
+ backend = BackendFactory.create(inspec_runner)
47
+ @table = []
48
+ pagination_opts = {}
49
+ loop do
50
+ api_result = backend.describe_load_balancers(pagination_opts)
51
+ @table += unpack_describe_elbs_response(api_result.load_balancer_descriptions)
52
+ break unless api_result.next_marker
53
+
54
+ pagination_opts = { marker: api_result.next_marker }
55
+ end
56
+ end
57
+
58
+ def unpack_describe_elbs_response(load_balancers)
59
+ load_balancers.map do |lb_struct|
60
+ {
61
+ availability_zones: lb_struct.availability_zones,
62
+ dns_name: lb_struct.dns_name,
63
+ external_ports: lb_struct.listener_descriptions.map { |ld| ld.listener.load_balancer_port },
64
+ instance_ids: lb_struct.instances.map(&:instance_id),
65
+ internal_ports: lb_struct.listener_descriptions.map { |ld| ld.listener.instance_port },
66
+ elb_name: lb_struct.load_balancer_name,
67
+ security_group_ids: lb_struct.security_groups,
68
+ subnet_ids: lb_struct.subnets,
69
+ vpc_id: lb_struct.vpc_id,
70
+ }
71
+ end
72
+ end
73
+
74
+ class Backend
75
+ class AwsClientApi < AwsBackendBase
76
+ BackendFactory.set_default_backend(self)
77
+ self.aws_client_class = Aws::ElasticLoadBalancing::Client
78
+
79
+ def describe_load_balancers(query = {})
80
+ aws_service_client.describe_load_balancers(query)
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,106 @@
1
+ require "resource_support/aws/aws_singular_resource_mixin"
2
+ require "resource_support/aws/aws_backend_base"
3
+ require "aws-sdk-ec2"
4
+
5
+ class AwsFlowLog < Inspec.resource(1)
6
+ name "aws_flow_log"
7
+ supports platform: "aws"
8
+ desc "This resource is used to test the attributes of a Flow Log."
9
+ example <<~EXAMPLE
10
+ describe aws_flow_log('fl-9c718cf5') do
11
+ it { should exist }
12
+ end
13
+ EXAMPLE
14
+
15
+ include AwsSingularResourceMixin
16
+
17
+ def to_s
18
+ "AWS Flow Log #{id}"
19
+ end
20
+
21
+ def resource_type
22
+ case @resource_id
23
+ when /^eni/
24
+ @resource_type = "eni"
25
+ when /^subnet/
26
+ @resource_type = "subnet"
27
+ when /^vpc/
28
+ @resource_type = "vpc"
29
+ end
30
+ end
31
+
32
+ def attached_to_eni?
33
+ resource_type.eql?("eni") ? true : false
34
+ end
35
+
36
+ def attached_to_subnet?
37
+ resource_type.eql?("subnet") ? true : false
38
+ end
39
+
40
+ def attached_to_vpc?
41
+ resource_type.eql?("vpc") ? true : false
42
+ end
43
+
44
+ attr_reader :log_group_name, :resource_id, :flow_log_id
45
+
46
+ private
47
+
48
+ def validate_params(raw_params)
49
+ validated_params = check_resource_param_names(
50
+ raw_params: raw_params,
51
+ allowed_params: %i{flow_log_id subnet_id vpc_id},
52
+ allowed_scalar_name: :flow_log_id,
53
+ allowed_scalar_type: String
54
+ )
55
+
56
+ if validated_params.empty?
57
+ raise ArgumentError,
58
+ "aws_flow_log requires a parameter: flow_log_id, subnet_id, or vpc_id"
59
+ end
60
+
61
+ validated_params
62
+ end
63
+
64
+ def fetch_from_api
65
+ backend = BackendFactory.create(inspec_runner)
66
+
67
+ resp = backend.describe_flow_logs(filter_args)
68
+ flow_log = resp.to_h[:flow_logs].first
69
+ @exists = !flow_log.nil?
70
+ unless flow_log.nil?
71
+ @log_group_name = flow_log[:log_group_name]
72
+ @resource_id = flow_log[:resource_id]
73
+ @flow_log_id = flow_log[:flow_log_id]
74
+ end
75
+ end
76
+
77
+ def filter_args
78
+ if @flow_log_id
79
+ { filter: [{ name: "flow-log-id", values: [@flow_log_id] }] }
80
+ elsif @subnet_id || @vpc_id
81
+ filter = @subnet_id || @vpc_id
82
+ { filter: [{ name: "resource-id", values: [filter] }] }
83
+ end
84
+ end
85
+
86
+ def id
87
+ return @flow_log_id if @flow_log_id
88
+ return @subnet_id if @subnet_id
89
+ return @vpc_id if @vpc_id
90
+ end
91
+
92
+ def backend
93
+ BackendFactory.create(inspec_runner)
94
+ end
95
+
96
+ class Backend
97
+ class AwsClientApi < AwsBackendBase
98
+ AwsFlowLog::BackendFactory.set_default_backend(self)
99
+ self.aws_client_class = Aws::EC2::Client
100
+
101
+ def describe_flow_logs(query)
102
+ aws_service_client.describe_flow_logs(query)
103
+ end
104
+ end
105
+ end
106
+ end