s3-secure 0.4.2 → 0.5.0

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/LICENSE.txt +201 -22
  4. data/README.md +41 -17
  5. data/lib/s3_secure.rb +3 -2
  6. data/lib/s3_secure/access_logs.rb +30 -0
  7. data/lib/s3_secure/access_logs/base.rb +4 -0
  8. data/lib/s3_secure/access_logs/disable.rb +37 -0
  9. data/lib/s3_secure/access_logs/enable.rb +41 -0
  10. data/lib/s3_secure/access_logs/list.rb +25 -0
  11. data/lib/s3_secure/access_logs/show.rb +89 -0
  12. data/lib/s3_secure/aws_services.rb +1 -33
  13. data/lib/s3_secure/aws_services/s3.rb +54 -0
  14. data/lib/s3_secure/cli.rb +19 -1
  15. data/lib/s3_secure/command.rb +7 -0
  16. data/lib/s3_secure/encryption.rb +2 -0
  17. data/lib/s3_secure/encryption/disable.rb +4 -8
  18. data/lib/s3_secure/encryption/enable.rb +4 -8
  19. data/lib/s3_secure/encryption/list.rb +12 -16
  20. data/lib/s3_secure/encryption/show.rb +11 -6
  21. data/lib/s3_secure/help/batch.md +14 -0
  22. data/lib/s3_secure/help/encryption/list.md +5 -0
  23. data/lib/s3_secure/help/lifecycle/add.md +13 -0
  24. data/lib/s3_secure/help/lifecycle/list.md +22 -0
  25. data/lib/s3_secure/help/lifecycle/remove.md +5 -0
  26. data/lib/s3_secure/help/lifecycle/show.md +13 -0
  27. data/lib/s3_secure/help/policy/list.md +5 -0
  28. data/lib/s3_secure/lifecycle.rb +31 -0
  29. data/lib/s3_secure/lifecycle/add.rb +33 -0
  30. data/lib/s3_secure/lifecycle/base.rb +5 -0
  31. data/lib/s3_secure/lifecycle/builder.rb +47 -0
  32. data/lib/s3_secure/lifecycle/list.rb +24 -0
  33. data/lib/s3_secure/lifecycle/remove.rb +28 -0
  34. data/lib/s3_secure/lifecycle/show.rb +40 -0
  35. data/lib/s3_secure/policy.rb +2 -0
  36. data/lib/s3_secure/policy/enforce.rb +3 -6
  37. data/lib/s3_secure/policy/list.rb +13 -17
  38. data/lib/s3_secure/policy/show.rb +8 -6
  39. data/lib/s3_secure/policy/unforce.rb +4 -7
  40. data/lib/s3_secure/remediate_all.rb +11 -0
  41. data/lib/s3_secure/summary/items.rb +0 -2
  42. data/lib/s3_secure/version.rb +1 -1
  43. data/lib/s3_secure/versioning.rb +29 -0
  44. data/lib/s3_secure/versioning/base.rb +4 -0
  45. data/lib/s3_secure/versioning/disable.rb +19 -0
  46. data/lib/s3_secure/versioning/enable.rb +19 -0
  47. data/lib/s3_secure/versioning/list.rb +24 -0
  48. data/lib/s3_secure/versioning/show.rb +27 -0
  49. data/s3-secure.gemspec +4 -2
  50. data/spec/lib/lifecycle/builder_spec.rb +85 -0
  51. metadata +48 -4
@@ -0,0 +1,19 @@
1
+ class S3Secure::Versioning
2
+ class Disable < Base
3
+ def run
4
+ show = Show.new(@options)
5
+ if show.enabled?
6
+ s3.put_bucket_versioning(
7
+ bucket: @bucket,
8
+ versioning_configuration: {
9
+ # mfa_delete: "Disabled",
10
+ status: "Suspended",
11
+ },
12
+ )
13
+ puts "Versioning Suspended on bucket #{@bucket}"
14
+ else
15
+ puts "Bucket #{@bucket} is already has versioning already Suspended or not Enabled."
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ class S3Secure::Versioning
2
+ class Enable < Base
3
+ def run
4
+ show = Show.new(@options)
5
+ if show.enabled?
6
+ puts "Bucket #{@bucket} is has versioning already enabled."
7
+ else
8
+ s3.put_bucket_versioning(
9
+ bucket: @bucket,
10
+ versioning_configuration: {
11
+ # mfa_delete: "Disabled",
12
+ status: "Enabled",
13
+ },
14
+ )
15
+ puts "Versioning enabled on bucket #{@bucket}"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -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
+ puts "This S3 bucket has versioning enabled"
6
+ else
7
+ puts "This S3 bucket does not have versioning enabled"
8
+ end
9
+ details = get_versioning(@bucket).to_h
10
+ unless details.empty?
11
+ puts "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,6 +21,7 @@ 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"
25
27
  spec.add_dependency "text-table"
@@ -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.4.2
4
+ version: 0.5.0
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-26 00:00:00.000000000 Z
11
+ date: 2020-05-31 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
@@ -198,8 +212,15 @@ files:
198
212
  - lib/s3-secure.rb
199
213
  - lib/s3_secure.rb
200
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
201
221
  - lib/s3_secure/autoloader.rb
202
222
  - lib/s3_secure/aws_services.rb
223
+ - lib/s3_secure/aws_services/s3.rb
203
224
  - lib/s3_secure/batch.rb
204
225
  - lib/s3_secure/cli.rb
205
226
  - lib/s3_secure/command.rb
@@ -213,13 +234,27 @@ files:
213
234
  - lib/s3_secure/encryption/list.rb
214
235
  - lib/s3_secure/encryption/show.rb
215
236
  - lib/s3_secure/help.rb
237
+ - lib/s3_secure/help/batch.md
216
238
  - lib/s3_secure/help/completion.md
217
239
  - lib/s3_secure/help/completion_script.md
218
240
  - lib/s3_secure/help/encryption/disable.md
219
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
220
247
  - lib/s3_secure/help/policy/enforce_ssl.md
248
+ - lib/s3_secure/help/policy/list.md
221
249
  - lib/s3_secure/help/policy/unforce_ssl.md
222
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
223
258
  - lib/s3_secure/policy.rb
224
259
  - lib/s3_secure/policy/base.rb
225
260
  - lib/s3_secure/policy/checker.rb
@@ -231,20 +266,28 @@ files:
231
266
  - lib/s3_secure/policy/list.rb
232
267
  - lib/s3_secure/policy/show.rb
233
268
  - lib/s3_secure/policy/unforce.rb
269
+ - lib/s3_secure/remediate_all.rb
234
270
  - lib/s3_secure/summary.rb
235
271
  - lib/s3_secure/summary/item.rb
236
272
  - lib/s3_secure/summary/items.rb
237
273
  - lib/s3_secure/table.rb
238
274
  - lib/s3_secure/version.rb
275
+ - lib/s3_secure/versioning.rb
276
+ - lib/s3_secure/versioning/base.rb
277
+ - lib/s3_secure/versioning/disable.rb
278
+ - lib/s3_secure/versioning/enable.rb
279
+ - lib/s3_secure/versioning/list.rb
280
+ - lib/s3_secure/versioning/show.rb
239
281
  - s3-secure.gemspec
240
282
  - spec/lib/cli_spec.rb
283
+ - spec/lib/lifecycle/builder_spec.rb
241
284
  - spec/lib/policy/checker_spec.rb
242
285
  - spec/lib/policy/document/force_ssl_remove_spec.rb
243
286
  - spec/lib/policy/document_spec.rb
244
287
  - spec/spec_helper.rb
245
288
  homepage: https://github.com/tongueroo/s3-secure
246
289
  licenses:
247
- - MIT
290
+ - Apache2.0
248
291
  metadata: {}
249
292
  post_install_message:
250
293
  rdoc_options: []
@@ -261,12 +304,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
304
  - !ruby/object:Gem::Version
262
305
  version: '0'
263
306
  requirements: []
264
- rubygems_version: 3.0.6
307
+ rubygems_version: 3.1.2
265
308
  signing_key:
266
309
  specification_version: 4
267
310
  summary: S3 Bucket security hardening tool
268
311
  test_files:
269
312
  - spec/lib/cli_spec.rb
313
+ - spec/lib/lifecycle/builder_spec.rb
270
314
  - spec/lib/policy/checker_spec.rb
271
315
  - spec/lib/policy/document/force_ssl_remove_spec.rb
272
316
  - spec/lib/policy/document_spec.rb