s3-secure 0.3.0 → 0.5.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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/LICENSE.txt +201 -22
  4. data/README.md +134 -16
  5. data/lib/s3_secure.rb +3 -2
  6. data/lib/s3_secure/abstract_base.rb +2 -1
  7. data/lib/s3_secure/access_logs.rb +32 -0
  8. data/lib/s3_secure/access_logs/base.rb +4 -0
  9. data/lib/s3_secure/access_logs/disable.rb +37 -0
  10. data/lib/s3_secure/access_logs/enable.rb +41 -0
  11. data/lib/s3_secure/access_logs/list.rb +25 -0
  12. data/lib/s3_secure/access_logs/show.rb +89 -0
  13. data/lib/s3_secure/aws_services.rb +1 -30
  14. data/lib/s3_secure/aws_services/s3.rb +54 -0
  15. data/lib/s3_secure/cli.rb +27 -1
  16. data/lib/s3_secure/command.rb +7 -0
  17. data/lib/s3_secure/encryption.rb +4 -0
  18. data/lib/s3_secure/encryption/disable.rb +5 -9
  19. data/lib/s3_secure/encryption/enable.rb +5 -11
  20. data/lib/s3_secure/encryption/list.rb +12 -16
  21. data/lib/s3_secure/encryption/show.rb +14 -9
  22. data/lib/s3_secure/help/batch.md +14 -0
  23. data/lib/s3_secure/help/encryption/disable.md +5 -0
  24. data/lib/s3_secure/help/encryption/enable.md +6 -0
  25. data/lib/s3_secure/help/encryption/list.md +5 -0
  26. data/lib/s3_secure/help/lifecycle/add.md +13 -0
  27. data/lib/s3_secure/help/lifecycle/list.md +22 -0
  28. data/lib/s3_secure/help/lifecycle/remove.md +5 -0
  29. data/lib/s3_secure/help/lifecycle/show.md +13 -0
  30. data/lib/s3_secure/help/policy/enforce_ssl.md +34 -0
  31. data/lib/s3_secure/help/policy/list.md +5 -0
  32. data/lib/s3_secure/help/policy/unforce_ssl.md +61 -0
  33. data/lib/s3_secure/help/summary.md +22 -0
  34. data/lib/s3_secure/lifecycle.rb +33 -0
  35. data/lib/s3_secure/lifecycle/add.rb +33 -0
  36. data/lib/s3_secure/lifecycle/base.rb +5 -0
  37. data/lib/s3_secure/lifecycle/builder.rb +47 -0
  38. data/lib/s3_secure/lifecycle/list.rb +24 -0
  39. data/lib/s3_secure/lifecycle/remove.rb +28 -0
  40. data/lib/s3_secure/lifecycle/show.rb +40 -0
  41. data/lib/s3_secure/policy.rb +4 -0
  42. data/lib/s3_secure/policy/enforce.rb +6 -10
  43. data/lib/s3_secure/policy/list.rb +13 -17
  44. data/lib/s3_secure/policy/show.rb +11 -10
  45. data/lib/s3_secure/policy/unforce.rb +7 -10
  46. data/lib/s3_secure/remediate_all.rb +12 -0
  47. data/lib/s3_secure/say.rb +7 -0
  48. data/lib/s3_secure/summary.rb +13 -0
  49. data/lib/s3_secure/summary/item.rb +16 -0
  50. data/lib/s3_secure/summary/items.rb +65 -0
  51. data/lib/s3_secure/table.rb +18 -0
  52. data/lib/s3_secure/version.rb +1 -1
  53. data/lib/s3_secure/versioning.rb +31 -0
  54. data/lib/s3_secure/versioning/base.rb +4 -0
  55. data/lib/s3_secure/versioning/disable.rb +19 -0
  56. data/lib/s3_secure/versioning/enable.rb +19 -0
  57. data/lib/s3_secure/versioning/list.rb +24 -0
  58. data/lib/s3_secure/versioning/show.rb +27 -0
  59. data/s3-secure.gemspec +5 -2
  60. data/spec/lib/lifecycle/builder_spec.rb +85 -0
  61. metadata +72 -5
  62. data/lib/s3_secure/help/hello.md +0 -5
@@ -0,0 +1,24 @@
1
+ class S3Secure::Versioning
2
+ class List < Base
3
+ def run
4
+ presenter = CliFormat::Presenter.new(@options)
5
+ presenter.header = ["Bucket", "Has Versioning?"]
6
+
7
+ buckets.each do |bucket|
8
+ $stderr.puts "Getting versioning for bucket #{bucket.color(:green)}"
9
+
10
+ show = Show.new(bucket: bucket)
11
+ row = [bucket, show.enabled?]
12
+ if @options[:versioning].nil?
13
+ presenter.rows << row # always show policy
14
+ elsif @options[:versioning]
15
+ presenter.rows << row if show.enabled? # only show if bucket has some encryption rules
16
+ else
17
+ presenter.rows << row unless show.enabled? # only show if bucket doesnt have any encryption rules
18
+ end
19
+ end
20
+
21
+ presenter.show
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ class S3Secure::Versioning
2
+ class Show < Base
3
+ def run
4
+ if enabled?
5
+ say "This S3 bucket has versioning enabled"
6
+ else
7
+ say "This S3 bucket does not have versioning enabled"
8
+ end
9
+ details = get_versioning(@bucket).to_h
10
+ unless details.empty?
11
+ say "Bucket versioning details: "
12
+ pp details
13
+ end
14
+ end
15
+
16
+ def enabled?
17
+ versioning = get_versioning(@bucket)
18
+ versioning.status == "Enabled" # Can be Enabled, Suspended, or nil
19
+ end
20
+
21
+ def get_versioning(bucket)
22
+ s3.get_bucket_versioning(bucket: bucket) # resp
23
+ rescue Aws::S3::Errors::ServerSideEncryptionConfigurationNotFoundError
24
+ end
25
+ memoize :get_versioning
26
+ end
27
+ end
@@ -10,9 +10,10 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["tongueroo@gmail.com"]
11
11
  spec.summary = "S3 Bucket security hardening tool"
12
12
  spec.homepage = "https://github.com/tongueroo/s3-secure"
13
- spec.license = "MIT"
13
+ spec.license = "Apache2.0"
14
14
 
15
- spec.files = `git ls-files`.split($/)
15
+ git_installed = system("type git > /dev/null 2>&1")
16
+ spec.files = git_installed ? `git ls-files`.split($/) : Dir.glob("**/*")
16
17
  spec.bindir = "exe"
17
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
@@ -20,8 +21,10 @@ Gem::Specification.new do |spec|
20
21
 
21
22
  spec.add_dependency "activesupport"
22
23
  spec.add_dependency "aws-sdk-s3"
24
+ spec.add_dependency "cli-format"
23
25
  spec.add_dependency "memoist"
24
26
  spec.add_dependency "rainbow"
27
+ spec.add_dependency "text-table"
25
28
  spec.add_dependency "thor"
26
29
  spec.add_dependency "zeitwerk"
27
30
 
@@ -0,0 +1,85 @@
1
+ describe S3Secure::Lifecycle::Builder do
2
+ subject { S3Secure::Lifecycle::Builder.new(rules) }
3
+
4
+ describe "already has s3-secure-automated-cleanup rule" do
5
+ let(:rules) {
6
+ [{:expiration=>{:expired_object_delete_marker=>true},
7
+ :id=>"s3-secure-automated-cleanup",
8
+ :status=>"Enabled",
9
+ :noncurrent_version_expiration=>{:noncurrent_days=>365},
10
+ :abort_incomplete_multipart_upload=>{:days_after_initiation=>30}}]
11
+ }
12
+
13
+ it "has?" do
14
+ result = subject.has?("s3-secure-automated-cleanup")
15
+ expect(result).to be true
16
+ end
17
+
18
+ it "rules_with_addition" do
19
+ rules = subject.rules_with_addition
20
+ expect(rules.size).to eq 1 # no dups
21
+ result = has_lifecycle?(rules)
22
+ expect(result).to be true
23
+ end
24
+
25
+ it "rules_with_removal" do
26
+ rules = subject.rules_with_removal
27
+ result = has_lifecycle?(rules)
28
+ expect(result).to be false
29
+ end
30
+ end
31
+
32
+ describe "doesnt have s3-secure-automated-cleanup rule" do
33
+ let(:rules) {
34
+ [{:rules=>
35
+ [{:expiration=>{:expired_object_delete_marker=>true},
36
+ :id=>"someother-policy",
37
+ :status=>"Enabled",
38
+ :noncurrent_version_expiration=>{:noncurrent_days=>365},
39
+ :abort_incomplete_multipart_upload=>{:days_after_initiation=>30}}]}]
40
+ }
41
+
42
+ it "has?" do
43
+ result = subject.has?("s3-secure-automated-cleanup")
44
+ expect(result).to be false
45
+ end
46
+
47
+ it "rules_with_addition" do
48
+ rules = subject.rules_with_addition
49
+ expect(rules.size).to eq 2 # no dups
50
+ result = has_lifecycle?(rules)
51
+ expect(result).to be true
52
+ end
53
+
54
+ it "rules_with_removal" do
55
+ rules = subject.rules_with_removal
56
+ result = has_lifecycle?(rules)
57
+ expect(result).to be false
58
+ end
59
+ end
60
+
61
+ describe "empty policy" do
62
+ let(:rules) { nil }
63
+
64
+ it "has?" do
65
+ result = subject.has?("s3-secure-automated-cleanup")
66
+ expect(result).to be false
67
+ end
68
+
69
+ it "rules_with_addition" do
70
+ rules = subject.rules_with_addition
71
+ result = has_lifecycle?(rules)
72
+ expect(result).to be true
73
+ end
74
+
75
+ it "rules_with_removal" do
76
+ rules = subject.rules_with_removal
77
+ result = has_lifecycle?(rules)
78
+ expect(result).to be false
79
+ end
80
+ end
81
+
82
+ def has_lifecycle?(rules)
83
+ !!rules.detect { |rule| rule[:id] == S3Secure::Lifecycle::Builder::RULE_ID }
84
+ end
85
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: s3-secure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-23 00:00:00.000000000 Z
11
+ date: 2020-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: cli-format
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: memoist
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,20 @@ dependencies:
66
80
  - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: text-table
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: thor
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -184,8 +212,15 @@ files:
184
212
  - lib/s3-secure.rb
185
213
  - lib/s3_secure.rb
186
214
  - lib/s3_secure/abstract_base.rb
215
+ - lib/s3_secure/access_logs.rb
216
+ - lib/s3_secure/access_logs/base.rb
217
+ - lib/s3_secure/access_logs/disable.rb
218
+ - lib/s3_secure/access_logs/enable.rb
219
+ - lib/s3_secure/access_logs/list.rb
220
+ - lib/s3_secure/access_logs/show.rb
187
221
  - lib/s3_secure/autoloader.rb
188
222
  - lib/s3_secure/aws_services.rb
223
+ - lib/s3_secure/aws_services/s3.rb
189
224
  - lib/s3_secure/batch.rb
190
225
  - lib/s3_secure/cli.rb
191
226
  - lib/s3_secure/command.rb
@@ -199,9 +234,27 @@ files:
199
234
  - lib/s3_secure/encryption/list.rb
200
235
  - lib/s3_secure/encryption/show.rb
201
236
  - lib/s3_secure/help.rb
237
+ - lib/s3_secure/help/batch.md
202
238
  - lib/s3_secure/help/completion.md
203
239
  - lib/s3_secure/help/completion_script.md
204
- - lib/s3_secure/help/hello.md
240
+ - lib/s3_secure/help/encryption/disable.md
241
+ - lib/s3_secure/help/encryption/enable.md
242
+ - lib/s3_secure/help/encryption/list.md
243
+ - lib/s3_secure/help/lifecycle/add.md
244
+ - lib/s3_secure/help/lifecycle/list.md
245
+ - lib/s3_secure/help/lifecycle/remove.md
246
+ - lib/s3_secure/help/lifecycle/show.md
247
+ - lib/s3_secure/help/policy/enforce_ssl.md
248
+ - lib/s3_secure/help/policy/list.md
249
+ - lib/s3_secure/help/policy/unforce_ssl.md
250
+ - lib/s3_secure/help/summary.md
251
+ - lib/s3_secure/lifecycle.rb
252
+ - lib/s3_secure/lifecycle/add.rb
253
+ - lib/s3_secure/lifecycle/base.rb
254
+ - lib/s3_secure/lifecycle/builder.rb
255
+ - lib/s3_secure/lifecycle/list.rb
256
+ - lib/s3_secure/lifecycle/remove.rb
257
+ - lib/s3_secure/lifecycle/show.rb
205
258
  - lib/s3_secure/policy.rb
206
259
  - lib/s3_secure/policy/base.rb
207
260
  - lib/s3_secure/policy/checker.rb
@@ -213,16 +266,29 @@ files:
213
266
  - lib/s3_secure/policy/list.rb
214
267
  - lib/s3_secure/policy/show.rb
215
268
  - lib/s3_secure/policy/unforce.rb
269
+ - lib/s3_secure/remediate_all.rb
270
+ - lib/s3_secure/say.rb
271
+ - lib/s3_secure/summary.rb
272
+ - lib/s3_secure/summary/item.rb
273
+ - lib/s3_secure/summary/items.rb
274
+ - lib/s3_secure/table.rb
216
275
  - lib/s3_secure/version.rb
276
+ - lib/s3_secure/versioning.rb
277
+ - lib/s3_secure/versioning/base.rb
278
+ - lib/s3_secure/versioning/disable.rb
279
+ - lib/s3_secure/versioning/enable.rb
280
+ - lib/s3_secure/versioning/list.rb
281
+ - lib/s3_secure/versioning/show.rb
217
282
  - s3-secure.gemspec
218
283
  - spec/lib/cli_spec.rb
284
+ - spec/lib/lifecycle/builder_spec.rb
219
285
  - spec/lib/policy/checker_spec.rb
220
286
  - spec/lib/policy/document/force_ssl_remove_spec.rb
221
287
  - spec/lib/policy/document_spec.rb
222
288
  - spec/spec_helper.rb
223
289
  homepage: https://github.com/tongueroo/s3-secure
224
290
  licenses:
225
- - MIT
291
+ - Apache2.0
226
292
  metadata: {}
227
293
  post_install_message:
228
294
  rdoc_options: []
@@ -239,12 +305,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
239
305
  - !ruby/object:Gem::Version
240
306
  version: '0'
241
307
  requirements: []
242
- rubygems_version: 3.0.6
308
+ rubygems_version: 3.1.2
243
309
  signing_key:
244
310
  specification_version: 4
245
311
  summary: S3 Bucket security hardening tool
246
312
  test_files:
247
313
  - spec/lib/cli_spec.rb
314
+ - spec/lib/lifecycle/builder_spec.rb
248
315
  - spec/lib/policy/checker_spec.rb
249
316
  - spec/lib/policy/document/force_ssl_remove_spec.rb
250
317
  - spec/lib/policy/document_spec.rb
@@ -1,5 +0,0 @@
1
- ## Examples
2
-
3
- s3-secure hello
4
- s3-secure hello NAME
5
- s3-secure hello NAME --from me