aws_recon 0.2.1

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 (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rubocop.yml +12 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +7 -0
  7. data/Gemfile +6 -0
  8. data/Gemfile.lock +1000 -0
  9. data/LICENSE.txt +21 -0
  10. data/Rakefile +10 -0
  11. data/aws_recon.gemspec +36 -0
  12. data/bin/aws_recon +5 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +8 -0
  15. data/lib/aws_recon.rb +19 -0
  16. data/lib/aws_recon/aws_recon.rb +115 -0
  17. data/lib/aws_recon/collectors/acm.rb +32 -0
  18. data/lib/aws_recon/collectors/apigateway.rb +50 -0
  19. data/lib/aws_recon/collectors/apigatewayv2.rb +37 -0
  20. data/lib/aws_recon/collectors/athena.rb +28 -0
  21. data/lib/aws_recon/collectors/autoscaling.rb +35 -0
  22. data/lib/aws_recon/collectors/cloudformation.rb +29 -0
  23. data/lib/aws_recon/collectors/cloudfront.rb +28 -0
  24. data/lib/aws_recon/collectors/cloudtrail.rb +33 -0
  25. data/lib/aws_recon/collectors/cloudwatch.rb +33 -0
  26. data/lib/aws_recon/collectors/cloudwatchlogs.rb +36 -0
  27. data/lib/aws_recon/collectors/codebuild.rb +29 -0
  28. data/lib/aws_recon/collectors/codepipeline.rb +27 -0
  29. data/lib/aws_recon/collectors/collectors.rb +2 -0
  30. data/lib/aws_recon/collectors/configservice.rb +80 -0
  31. data/lib/aws_recon/collectors/directconnect.rb +25 -0
  32. data/lib/aws_recon/collectors/directyservice.rb +27 -0
  33. data/lib/aws_recon/collectors/dms.rb +25 -0
  34. data/lib/aws_recon/collectors/dynamodb.rb +26 -0
  35. data/lib/aws_recon/collectors/ec2.rb +257 -0
  36. data/lib/aws_recon/collectors/ecr.rb +39 -0
  37. data/lib/aws_recon/collectors/ecs.rb +40 -0
  38. data/lib/aws_recon/collectors/efs.rb +25 -0
  39. data/lib/aws_recon/collectors/eks.rb +36 -0
  40. data/lib/aws_recon/collectors/elasticloadbalancing.rb +41 -0
  41. data/lib/aws_recon/collectors/elasticloadbalancingv2.rb +63 -0
  42. data/lib/aws_recon/collectors/elasticsearch.rb +27 -0
  43. data/lib/aws_recon/collectors/firehose.rb +29 -0
  44. data/lib/aws_recon/collectors/guardduty.rb +33 -0
  45. data/lib/aws_recon/collectors/iam.rb +136 -0
  46. data/lib/aws_recon/collectors/kafka.rb +27 -0
  47. data/lib/aws_recon/collectors/kinesis.rb +26 -0
  48. data/lib/aws_recon/collectors/kms.rb +71 -0
  49. data/lib/aws_recon/collectors/lambda.rb +42 -0
  50. data/lib/aws_recon/collectors/lightsail.rb +38 -0
  51. data/lib/aws_recon/collectors/organizations.rb +36 -0
  52. data/lib/aws_recon/collectors/rds.rb +81 -0
  53. data/lib/aws_recon/collectors/redshift.rb +40 -0
  54. data/lib/aws_recon/collectors/route53.rb +28 -0
  55. data/lib/aws_recon/collectors/route53domains.rb +25 -0
  56. data/lib/aws_recon/collectors/s3.rb +80 -0
  57. data/lib/aws_recon/collectors/sagemaker.rb +25 -0
  58. data/lib/aws_recon/collectors/servicequotas.rb +44 -0
  59. data/lib/aws_recon/collectors/ses.rb +28 -0
  60. data/lib/aws_recon/collectors/shield.rb +67 -0
  61. data/lib/aws_recon/collectors/sns.rb +38 -0
  62. data/lib/aws_recon/collectors/sqs.rb +28 -0
  63. data/lib/aws_recon/collectors/ssm.rb +41 -0
  64. data/lib/aws_recon/collectors/support.rb +43 -0
  65. data/lib/aws_recon/collectors/transfer.rb +24 -0
  66. data/lib/aws_recon/collectors/wafv2.rb +49 -0
  67. data/lib/aws_recon/collectors/workspaces.rb +24 -0
  68. data/lib/aws_recon/collectors/xray.rb +19 -0
  69. data/lib/aws_recon/lib/formatter.rb +32 -0
  70. data/lib/aws_recon/lib/mapper.rb +69 -0
  71. data/lib/aws_recon/options.rb +141 -0
  72. data/lib/aws_recon/services.yaml +134 -0
  73. data/lib/aws_recon/version.rb +3 -0
  74. data/readme.md +226 -0
  75. data/readme_gem.md +39 -0
  76. metadata +245 -0
@@ -0,0 +1,39 @@
1
+ class ECR < Mapper
2
+ #
3
+ # Returns an array of resources.
4
+ #
5
+ def collect
6
+ resources = []
7
+
8
+ #
9
+ # describe_repositories
10
+ #
11
+ @client.describe_repositories.each_with_index do |response, page|
12
+ log(response.context.operation_name, page)
13
+
14
+ response.repositories.each do |repo|
15
+ struct = OpenStruct.new(repo.to_h)
16
+ struct.type = 'repository'
17
+ struct.arn = repo.repository_arn
18
+ struct.policy = @client
19
+ .get_repository_policy({ repository_name: repo.repository_name }).to_h
20
+
21
+ rescue Aws::ECR::Errors::ServiceError => e
22
+ raise e unless suppressed_errors.include?(e.code)
23
+ ensure
24
+ resources.push(struct.to_h)
25
+ end
26
+ end
27
+
28
+ resources
29
+ end
30
+
31
+ private
32
+
33
+ # not an error
34
+ def suppressed_errors
35
+ %w[
36
+ RepositoryPolicyNotFoundException
37
+ ]
38
+ end
39
+ end
@@ -0,0 +1,40 @@
1
+ class ECS < Mapper
2
+ #
3
+ # Returns an array of resources.
4
+ #
5
+ # TODO: test live
6
+ #
7
+ def collect
8
+ resources = []
9
+
10
+ #
11
+ # describe_clusters
12
+ #
13
+ @client.describe_clusters.each_with_index do |response, page|
14
+ log(response.context.operation_name, page)
15
+
16
+ response.clusters.each do |cluster|
17
+ struct = OpenStruct.new(cluster.to_h)
18
+ struct.type = 'cluster'
19
+ struct.arn = cluster.cluster_arn
20
+ struct.tasks = []
21
+
22
+ # list_tasks
23
+ @client.list_tasks({ cluster: cluster.cluster_arn }).each_with_index do |response, page|
24
+ log(response.context.operation_name, 'list_tasks', page)
25
+
26
+ # describe_tasks
27
+ response.task_arns.each do |task_arn|
28
+ @client.describe_tasks({ cluster: cluster.cluster_arn, tasks: [task_arn] }).tasks.each do |task|
29
+ struct.tasks.push(task)
30
+ end
31
+ end
32
+ end
33
+
34
+ resources.push(struct.to_h)
35
+ end
36
+ end
37
+
38
+ resources
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ class EFS < Mapper
2
+ #
3
+ # Returns an array of resources.
4
+ #
5
+ def collect
6
+ resources = []
7
+
8
+ #
9
+ # describe_file_systems
10
+ #
11
+ @client.describe_file_systems.each_with_index do |response, page|
12
+ log(response.context.operation_name, page)
13
+
14
+ response.file_systems.each do |filesystem|
15
+ struct = OpenStruct.new(filesystem.to_h)
16
+ struct.type = 'filesystem'
17
+ struct.arn = filesystem.file_system_arn
18
+
19
+ resources.push(struct.to_h)
20
+ end
21
+ end
22
+
23
+ resources
24
+ end
25
+ end
@@ -0,0 +1,36 @@
1
+ class EKS < Mapper
2
+ #
3
+ # Returns an array of resources.
4
+ #
5
+ def collect
6
+ resources = []
7
+
8
+ #
9
+ # list_clusters
10
+ #
11
+ @client.list_clusters.each_with_index do |response, page|
12
+ log(response.context.operation_name, page)
13
+
14
+ # describe_cluster
15
+ response.clusters.each do |cluster|
16
+ struct = OpenStruct.new(@client.describe_cluster({ name: cluster }).cluster.to_h)
17
+ struct.type = 'cluster'
18
+ struct.nodegroups = []
19
+
20
+ # list_nodegroups
21
+ @client.list_nodegroups({ cluster_name: cluster }).each_with_index do |response, page|
22
+ log(response.context.operation_name, 'list_nodegroups', page)
23
+
24
+ # describe_nodegroup
25
+ response.nodegroups.each do |nodegroup|
26
+ struct.nodegroups.push(@client.describe_nodegroup({ cluster_name: cluster, nodegroup_name: nodegroup }).nodegroup.to_h)
27
+ end
28
+ end
29
+
30
+ resources.push(struct.to_h)
31
+ end
32
+ end
33
+
34
+ resources
35
+ end
36
+ end
@@ -0,0 +1,41 @@
1
+ class ElasticLoadBalancing < Mapper
2
+ #
3
+ # Returns an array of resources.
4
+ #
5
+ def collect
6
+ resources = []
7
+
8
+ #
9
+ # describe_load_balancers
10
+ #
11
+ @client.describe_load_balancers.each_with_index do |response, page|
12
+ log(response.context.operation_name, page)
13
+
14
+ response.load_balancer_descriptions.each do |elb|
15
+ struct = OpenStruct.new(elb.to_h)
16
+ struct.type = 'load_balancer'
17
+ struct.arn = elb.dns_name
18
+
19
+ # describe_load_balancer_policies
20
+ struct.policies = @client
21
+ .describe_load_balancer_policies({ load_balancer_name: elb.load_balancer_name })
22
+ .policy_descriptions.map(&:to_h)
23
+
24
+ # describe_load_balancer_attributes
25
+ struct.attributes = @client
26
+ .describe_load_balancer_attributes({ load_balancer_name: elb.load_balancer_name })
27
+ .load_balancer_attributes.to_h
28
+
29
+ # describe_tags
30
+ struct.tags = @client
31
+ .describe_tags({ load_balancer_names: [elb.load_balancer_name] })
32
+ .tag_descriptions.map(&:tags)
33
+ .flatten.map(&:to_h)
34
+
35
+ resources.push(struct.to_h)
36
+ end
37
+ end
38
+
39
+ resources
40
+ end
41
+ end
@@ -0,0 +1,63 @@
1
+ class ElasticLoadBalancingV2 < Mapper
2
+ #
3
+ # Returns an array of resources.
4
+ #
5
+ def collect
6
+ resources = []
7
+
8
+ #
9
+ # describe_load_balancers
10
+ #
11
+ @client.describe_load_balancers.each_with_index do |response, page|
12
+ log(response.context.operation_name, page)
13
+
14
+ response.load_balancers.each do |elb|
15
+ struct = OpenStruct.new(elb.to_h)
16
+ struct.type = 'load_balancer'
17
+ struct.arn = elb.load_balancer_arn
18
+ struct.listeners = []
19
+ struct.target_groups = []
20
+
21
+ # describe_load_balancer_attributes
22
+ struct.attributes = @client
23
+ .describe_load_balancer_attributes({ load_balancer_arn: elb.load_balancer_arn })
24
+ .attributes.map(&:to_h)
25
+
26
+ # describe_tags
27
+ struct.tags = @client
28
+ .describe_tags({ resource_arns: [elb.load_balancer_arn] })
29
+ .tag_descriptions.map(&:tags)
30
+ .flatten.map(&:to_h)
31
+
32
+ # describe_listeners
33
+ @client.describe_listeners({ load_balancer_arn: elb.load_balancer_arn }).each_with_index do |response, _page|
34
+ log(response.context.operation_name, page)
35
+
36
+ response.listeners.each do |listener|
37
+ struct.listeners.push(listener.to_h)
38
+ end
39
+ end
40
+
41
+ # describe_target_groups
42
+ @client.describe_target_groups({ load_balancer_arn: elb.load_balancer_arn }).each_with_index do |response, page|
43
+ log(response.context.operation_name, page)
44
+
45
+ response.target_groups.each do |target_group|
46
+ tg = OpenStruct.new(target_group.to_h)
47
+
48
+ # describe_target_health
49
+ tg.health_descriptions = @client
50
+ .describe_target_health({ target_group_arn: target_group.target_group_arn })
51
+ .target_health_descriptions.map(&:to_h)
52
+
53
+ struct.target_groups.push(tg.to_h)
54
+ end
55
+ end
56
+
57
+ resources.push(struct.to_h)
58
+ end
59
+ end
60
+
61
+ resources
62
+ end
63
+ end
@@ -0,0 +1,27 @@
1
+ class ElasticsearchService < Mapper
2
+ #
3
+ # Returns an array of resources.
4
+ #
5
+ def collect
6
+ resources = []
7
+
8
+ #
9
+ # list_domain_names
10
+ #
11
+ @client.list_domain_names.each_with_index do |response, page|
12
+ log(response.context.operation_name, page)
13
+
14
+ response.domain_names.each do |domain|
15
+ log(response.context.operation_name, 'describe_elasticsearch_domain', page)
16
+
17
+ # describe_elasticsearch_domains
18
+ struct = OpenStruct.new(@client.describe_elasticsearch_domain({ domain_name: domain.domain_name }).domain_status.to_h)
19
+ struct.type = 'domain'
20
+
21
+ resources.push(struct.to_h)
22
+ end
23
+ end
24
+
25
+ resources
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ class Firehose < Mapper
2
+ #
3
+ # Returns an array of resources.
4
+ #
5
+ # TODO: test live
6
+ # TODO: confirm paging behavior
7
+ #
8
+ def collect
9
+ resources = []
10
+
11
+ #
12
+ # list_delivery_streams
13
+ #
14
+ @client.list_delivery_streams.each_with_index do |response, page|
15
+ log(response.context.operation_name, page)
16
+
17
+ # describe_delivery_stream
18
+ response.delivery_stream_names.each do |stream|
19
+ struct = OpenStruct.new(@client.describe_delivery_stream({ delivery_stream_name: stream }).delivery_stream_description.to_h)
20
+ struct.type = 'stream'
21
+ struct.arn = struct.delivery_stream_arn
22
+
23
+ resources.push(struct.to_h)
24
+ end
25
+ end
26
+
27
+ resources
28
+ end
29
+ end
@@ -0,0 +1,33 @@
1
+ class GuardDuty < Mapper
2
+ #
3
+ # Returns an array of resources.
4
+ #
5
+ # TODO: test live
6
+ #
7
+ def collect
8
+ resources = []
9
+
10
+ #
11
+ # list_detectors
12
+ #
13
+ @client.list_detectors.each_with_index do |response, page|
14
+ log(response.context.operation_name, page)
15
+
16
+ response.detector_ids.each do |detector|
17
+ log(response.context.operation_name, 'get_detector', detector)
18
+
19
+ # get_detector
20
+ struct = OpenStruct.new(@client.get_detector({ detector_id: detector }).to_h)
21
+ struct.type = 'detector'
22
+ struct.arn = "arn:aws:guardduty:#{@region}:detector/#{detector}"
23
+
24
+ # get_master_account
25
+ struct.master_account = @client.get_master_account({ detector_id: detector }).to_h
26
+
27
+ resources.push(struct.to_h)
28
+ end
29
+ end
30
+
31
+ resources
32
+ end
33
+ end
@@ -0,0 +1,136 @@
1
+ class IAM < Mapper
2
+ #
3
+ # Returns an array of resources.
4
+ #
5
+ def collect
6
+ resources = []
7
+
8
+ #
9
+ # get_account_authorization_details
10
+ # list_mfa_devices
11
+ # list_ssh_public_keys
12
+ #
13
+ @client.get_account_authorization_details.each_with_index do |response, page|
14
+ log(response.context.operation_name, page)
15
+
16
+ # users
17
+ response.user_detail_list.each do |user|
18
+ struct = OpenStruct.new(user.to_h)
19
+ struct.type = 'user'
20
+ struct.mfa_devices = @client.list_mfa_devices({ user_name: user.user_name }).mfa_devices.map(&:to_h)
21
+ struct.ssh_keys = @client.list_ssh_public_keys({ user_name: user.user_name }).ssh_public_keys.map(&:to_h)
22
+
23
+ resources.push(struct.to_h)
24
+ end
25
+
26
+ # groups
27
+ response.group_detail_list.each do |group|
28
+ struct = OpenStruct.new(group.to_h)
29
+ struct.type = 'group'
30
+
31
+ resources.push(struct.to_h)
32
+ end
33
+
34
+ # roles
35
+ response.role_detail_list.each do |role|
36
+ struct = OpenStruct.new(role.to_h)
37
+ struct.type = 'role'
38
+
39
+ resources.push(struct.to_h)
40
+ end
41
+
42
+ # polices
43
+ response.policies.each do |policy|
44
+ struct = OpenStruct.new(policy.to_h)
45
+ struct.type = 'policy'
46
+
47
+ resources.push(struct.to_h)
48
+ end
49
+ end
50
+
51
+ #
52
+ # get_account_password_policy
53
+ #
54
+ @client.get_account_password_policy.each do |response|
55
+ log(response.context.operation_name)
56
+
57
+ struct = OpenStruct.new(response.password_policy.to_h)
58
+ struct.type = 'password_policy'
59
+
60
+ resources.push(struct.to_h)
61
+ end
62
+
63
+ #
64
+ # get_account_summary
65
+ #
66
+ @client.get_account_summary.each do |response|
67
+ log(response.context.operation_name)
68
+
69
+ struct = OpenStruct.new(response.summary_map)
70
+ struct.type = 'account_summary'
71
+
72
+ resources.push(struct.to_h)
73
+ end
74
+
75
+ #
76
+ # list_server_certificates
77
+ #
78
+ @client.list_server_certificates.each_with_index do |response, page|
79
+ log(response.context.operation_name, page)
80
+
81
+ response.server_certificate_metadata_list.each do |cert|
82
+ struct = OpenStruct.new(cert)
83
+ struct.type = 'server_certificate'
84
+ struct.arn = cert.arn
85
+
86
+ resources.push(struct.to_h)
87
+ end
88
+ end
89
+
90
+ #
91
+ # list_virtual_mfa_devices
92
+ #
93
+ @client.list_virtual_mfa_devices.each_with_index do |response, page|
94
+ log(response.context.operation_name, page)
95
+
96
+ response.virtual_mfa_devices.each do |mfa_device|
97
+ struct = OpenStruct.new(mfa_device.to_h)
98
+ struct.type = 'virtual_mfa_device'
99
+ struct.arn = mfa_device.serial_number
100
+
101
+ resources.push(struct.to_h)
102
+ end
103
+ end
104
+
105
+ #
106
+ # get_credential_report
107
+ #
108
+ begin
109
+ @client.get_credential_report.each do |response|
110
+ log(response.context.operation_name)
111
+
112
+ struct = OpenStruct.new
113
+ struct.type = 'credential_report'
114
+ struct.content = CSV.parse(response.content, headers: :first_row).map(&:to_h)
115
+ struct.report_format = response.report_format
116
+ struct.generated_time = response.generated_time
117
+
118
+ resources.push(struct.to_h)
119
+ end
120
+ rescue Aws::IAM::Errors::ServiceError => e
121
+ log_error(e.code)
122
+ raise e unless suppressed_errors.include?(e.code)
123
+ end
124
+
125
+ resources
126
+ end
127
+
128
+ private
129
+
130
+ # not an error
131
+ def suppressed_errors
132
+ %w[
133
+ ReportNotPresent
134
+ ]
135
+ end
136
+ end