s3-secure 0.5.1 → 0.6.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +3 -2
- data/lib/s3_secure/access_logs/base.rb +2 -2
- data/lib/s3_secure/access_logs/disable.rb +1 -1
- data/lib/s3_secure/access_logs/enable.rb +1 -1
- data/lib/s3_secure/access_logs/list.rb +1 -1
- data/lib/s3_secure/access_logs/show.rb +1 -1
- data/lib/s3_secure/aws_services/s3.rb +7 -0
- data/lib/s3_secure/aws_services.rb +6 -0
- data/lib/s3_secure/{access_logs.rb → cli/access_logs.rb} +6 -6
- data/lib/s3_secure/{abstract_base.rb → cli/base.rb} +2 -2
- data/lib/s3_secure/{batch.rb → cli/batch.rb} +1 -1
- data/lib/s3_secure/{encryption.rb → cli/encryption.rb} +6 -6
- data/lib/s3_secure/cli/help.rb +11 -0
- data/lib/s3_secure/{lifecycle.rb → cli/lifecycle.rb} +6 -6
- data/lib/s3_secure/{policy.rb → cli/policy.rb} +6 -6
- data/lib/s3_secure/cli/public_access.rb +32 -0
- data/lib/s3_secure/{remediate_all.rb → cli/remediate_all.rb} +2 -2
- data/lib/s3_secure/{say.rb → cli/say.rb} +1 -1
- data/lib/s3_secure/{summary.rb → cli/summary.rb} +3 -3
- data/lib/s3_secure/{versioning.rb → cli/versioning.rb} +6 -6
- data/lib/s3_secure/cli.rb +5 -1
- data/lib/s3_secure/encryption/base.rb +2 -2
- data/lib/s3_secure/encryption/disable.rb +1 -1
- data/lib/s3_secure/encryption/enable.rb +1 -1
- data/lib/s3_secure/encryption/list.rb +1 -1
- data/lib/s3_secure/encryption/show.rb +2 -1
- data/lib/s3_secure/lifecycle/add.rb +1 -1
- data/lib/s3_secure/lifecycle/base.rb +2 -2
- data/lib/s3_secure/lifecycle/builder.rb +1 -1
- data/lib/s3_secure/lifecycle/list.rb +1 -1
- data/lib/s3_secure/lifecycle/remove.rb +1 -1
- data/lib/s3_secure/lifecycle/show.rb +1 -1
- data/lib/s3_secure/policy/base.rb +2 -2
- data/lib/s3_secure/policy/checker.rb +1 -1
- data/lib/s3_secure/policy/document/base.rb +1 -1
- data/lib/s3_secure/policy/document/force_ssl_only_access.rb +1 -1
- data/lib/s3_secure/policy/document/force_ssl_only_access_remove.rb +1 -1
- data/lib/s3_secure/policy/document.rb +1 -1
- data/lib/s3_secure/policy/enforce.rb +1 -1
- data/lib/s3_secure/policy/list.rb +1 -1
- data/lib/s3_secure/policy/show.rb +1 -1
- data/lib/s3_secure/policy/unforce.rb +1 -1
- data/lib/s3_secure/public_access/base.rb +10 -0
- data/lib/s3_secure/public_access/block.rb +18 -0
- data/lib/s3_secure/public_access/list.rb +24 -0
- data/lib/s3_secure/public_access/show.rb +27 -0
- data/lib/s3_secure/public_access/unblock.rb +12 -0
- data/lib/s3_secure/summary/item.rb +1 -1
- data/lib/s3_secure/summary/items.rb +6 -7
- data/lib/s3_secure/version.rb +1 -1
- data/lib/s3_secure/versioning/base.rb +2 -2
- data/lib/s3_secure/versioning/disable.rb +1 -1
- data/lib/s3_secure/versioning/enable.rb +1 -1
- data/lib/s3_secure/versioning/list.rb +1 -1
- data/lib/s3_secure/versioning/show.rb +1 -1
- data/lib/s3_secure.rb +1 -0
- data/s3-secure.gemspec +2 -1
- metadata +35 -15
- data/lib/s3_secure/help.rb +0 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 739695e06691bf9716545d0874b7a92bca5c739d78ebd7caee2458a45dbf767e
|
|
4
|
+
data.tar.gz: 2b9d47ad43044cd0b70e4063639d08c7963e8c144057ddc4b56556e07f7d7ee1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a68b9daf5ec3b047776a5e3e70ecf7aa680bb5fb685d911ff82d04c0baffd73b13e2d5acc3c899a241c10a2da7825de8b35a8fbe89116c95f515be1ee4b70017
|
|
7
|
+
data.tar.gz: 48346b04e0e720b004aec4b73ecb8da5c191b0f0018eceb9041a0b32fdd71f5a840a005be4df5daed95752af125770ceebc48e06b39b2131adb3c29af0463861
|
data/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
|
5
5
|
|
|
6
|
+
## [0.6.0] - 2021-12-30
|
|
7
|
+
- [#4](https://github.com/tongueroo/s3-secure/pull/4) refactor move directly related cli classes to subfolder
|
|
8
|
+
- [#5](https://github.com/tongueroo/s3-secure/pull/5) add public access block support
|
|
9
|
+
- fix activesupport require
|
|
10
|
+
|
|
6
11
|
## [0.5.1]
|
|
7
12
|
- #3 add quiet option
|
|
8
13
|
|
data/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# s3-secure tool
|
|
2
2
|
|
|
3
|
-
[](http://badge.fury.io/rb/s3-secure)
|
|
3
|
+
[](http://badge.fury.io/rb/s3-secure)
|
|
4
|
+
|
|
4
5
|
[](https://www.boltops.com)
|
|
5
6
|
|
|
6
7
|
The s3-secure tool can be used to harden your s3 bucket security posture. The tool is useful if you have a lot of buckets to update. It supports:
|
|
@@ -171,4 +172,4 @@ buckets.txt:
|
|
|
171
172
|
|
|
172
173
|
Install with:
|
|
173
174
|
|
|
174
|
-
gem install s3-secure
|
|
175
|
+
gem install s3-secure
|
|
@@ -8,6 +8,13 @@ module S3Secure::AwsServices
|
|
|
8
8
|
@@s3_clients[@bucket] ||= new_s3_regional_client
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
+
def s3_regional_client(bucket)
|
|
12
|
+
temp = @bucket
|
|
13
|
+
@bucket = bucket
|
|
14
|
+
@@s3_clients[bucket] ||= new_s3_regional_client
|
|
15
|
+
@bucket = temp
|
|
16
|
+
end
|
|
17
|
+
|
|
11
18
|
def new_s3_regional_client
|
|
12
19
|
options = {}
|
|
13
20
|
options[:endpoint] = "https://s3.#{region}.amazonaws.com"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
class AccessLogs < Command
|
|
1
|
+
class S3Secure::CLI
|
|
2
|
+
class AccessLogs < S3Secure::Command
|
|
3
3
|
class_option :quiet, type: :boolean
|
|
4
4
|
|
|
5
5
|
desc "list", "List bucket access_logs setting"
|
|
@@ -7,26 +7,26 @@ module S3Secure
|
|
|
7
7
|
option :format, desc: "Format options: #{CliFormat.formats.join(', ')}"
|
|
8
8
|
option :access_logs, type: :boolean, desc: "Filter for access_logs: all, true, false"
|
|
9
9
|
def list
|
|
10
|
-
List.new(options).run
|
|
10
|
+
S3Secure::AccessLogs::List.new(options).run
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
desc "show BUCKET", "show bucket access_logs"
|
|
14
14
|
long_desc Help.text("access_logs/show")
|
|
15
15
|
def show(bucket)
|
|
16
|
-
Show.new(options.merge(bucket: bucket)).run
|
|
16
|
+
S3Secure::AccessLogs::Show.new(options.merge(bucket: bucket)).run
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
desc "enable BUCKET", "enable bucket access_logs"
|
|
20
20
|
long_desc Help.text("access_logs/enable")
|
|
21
21
|
option :target_bucket, desc: "Target s3 bucket"
|
|
22
22
|
def enable(bucket)
|
|
23
|
-
Enable.new(options.merge(bucket: bucket)).run
|
|
23
|
+
S3Secure::AccessLogs::Enable.new(options.merge(bucket: bucket)).run
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
desc "disable BUCKET", "disable bucket access_logs"
|
|
27
27
|
long_desc Help.text("access_logs/disable")
|
|
28
28
|
def disable(bucket)
|
|
29
|
-
Disable.new(options.merge(bucket: bucket)).run
|
|
29
|
+
S3Secure::AccessLogs::Disable.new(options.merge(bucket: bucket)).run
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
class Encryption < Command
|
|
1
|
+
class S3Secure::CLI
|
|
2
|
+
class Encryption < S3Secure::Command
|
|
3
3
|
class_option :quiet, type: :boolean
|
|
4
4
|
|
|
5
5
|
desc "list", "List bucket encryptions"
|
|
@@ -7,26 +7,26 @@ module S3Secure
|
|
|
7
7
|
option :format, desc: "Format options: #{CliFormat.formats.join(', ')}"
|
|
8
8
|
option :encryption, type: :boolean, desc: "Filter for encryption: all, true, false"
|
|
9
9
|
def list
|
|
10
|
-
List.new(options).run
|
|
10
|
+
S3Secure::Encryption::List.new(options).run
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
desc "show BUCKET", "show bucket encryption"
|
|
14
14
|
long_desc Help.text("encryption/show")
|
|
15
15
|
def show(bucket)
|
|
16
|
-
Show.new(options.merge(bucket: bucket)).run
|
|
16
|
+
S3Secure::Encryption::Show.new(options.merge(bucket: bucket)).run
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
desc "enable BUCKET", "enable bucket encryption"
|
|
20
20
|
long_desc Help.text("encryption/enable")
|
|
21
21
|
option :kms_key, desc: "KMS Key Id. If this is set will use sse_algorithm=aws:kms Otherwise will use sse_algorithm=AES256"
|
|
22
22
|
def enable(bucket)
|
|
23
|
-
Enable.new(options.merge(bucket: bucket)).run
|
|
23
|
+
S3Secure::Encryption::Enable.new(options.merge(bucket: bucket)).run
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
desc "disable BUCKET", "disable bucket encryption"
|
|
27
27
|
long_desc Help.text("encryption/disable")
|
|
28
28
|
def disable(bucket)
|
|
29
|
-
Disable.new(options.merge(bucket: bucket)).run
|
|
29
|
+
S3Secure::Encryption::Disable.new(options.merge(bucket: bucket)).run
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
class Lifecycle < Command
|
|
1
|
+
class S3Secure::CLI
|
|
2
|
+
class Lifecycle < S3Secure::Command
|
|
3
3
|
class_option :quiet, type: :boolean
|
|
4
4
|
|
|
5
5
|
desc "list", "List bucket lifecycles"
|
|
@@ -7,13 +7,13 @@ module S3Secure
|
|
|
7
7
|
option :format, desc: "Format options: #{CliFormat.formats.join(', ')}"
|
|
8
8
|
option :lifecycle, desc: "Filter for lifecycle: all, true, false"
|
|
9
9
|
def list
|
|
10
|
-
List.new(options).run
|
|
10
|
+
S3Secure::Lifecycle::List.new(options).run
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
desc "show BUCKET", "show bucket lifecycle"
|
|
14
14
|
long_desc Help.text("lifecycle/show")
|
|
15
15
|
def show(bucket)
|
|
16
|
-
Show.new(options.merge(bucket: bucket)).run
|
|
16
|
+
S3Secure::Lifecycle::Show.new(options.merge(bucket: bucket)).run
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
desc "add BUCKET", "add bucket lifecycle"
|
|
@@ -21,13 +21,13 @@ module S3Secure
|
|
|
21
21
|
option :additive, type: :boolean, desc: "Force adding another lifecycle rule even if one exists. Note, may fail, need a different prefix filter"
|
|
22
22
|
option :prefix, desc: "Filter prefix. Used with additive mode."
|
|
23
23
|
def add(bucket)
|
|
24
|
-
Add.new(options.merge(bucket: bucket)).run
|
|
24
|
+
S3Secure::Lifecycle::Add.new(options.merge(bucket: bucket)).run
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
desc "remove BUCKET", "remove bucket lifecycle"
|
|
28
28
|
long_desc Help.text("lifecycle/remove")
|
|
29
29
|
def remove(bucket)
|
|
30
|
-
Remove.new(options.merge(bucket: bucket)).run
|
|
30
|
+
S3Secure::Lifecycle::Remove.new(options.merge(bucket: bucket)).run
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
class Policy < Command
|
|
1
|
+
class S3Secure::CLI
|
|
2
|
+
class Policy < S3Secure::Command
|
|
3
3
|
class_option :quiet, type: :boolean
|
|
4
4
|
|
|
5
5
|
desc "list", "List bucket policies"
|
|
@@ -7,25 +7,25 @@ module S3Secure
|
|
|
7
7
|
option :format, desc: "Format options: #{CliFormat.formats.join(', ')}"
|
|
8
8
|
option :policy, type: :boolean, desc: "Filter for policy: all, true, false"
|
|
9
9
|
def list
|
|
10
|
-
List.new(options).run
|
|
10
|
+
S3Secure::Policy::List.new(options).run
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
desc "show BUCKET", "show bucket policy"
|
|
14
14
|
long_desc Help.text("policy/show")
|
|
15
15
|
def show(bucket)
|
|
16
|
-
Show.new(options.merge(bucket: bucket)).run
|
|
16
|
+
S3Secure::Policy::Show.new(options.merge(bucket: bucket)).run
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
desc "enforce_ssl BUCKET", "Add enforce ssl bucket policy"
|
|
20
20
|
long_desc Help.text("policy/enforce_ssl")
|
|
21
21
|
def enforce_ssl(bucket)
|
|
22
|
-
Enforce.new(options.merge(bucket: bucket, sid: "ForceSSLOnlyAccess")).run
|
|
22
|
+
S3Secure::Policy::Enforce.new(options.merge(bucket: bucket, sid: "ForceSSLOnlyAccess")).run
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
desc "unforce_ssl BUCKET", "Remove enforce ssl bucket policy"
|
|
26
26
|
long_desc Help.text("policy/unforce_ssl")
|
|
27
27
|
def unforce_ssl(bucket)
|
|
28
|
-
Unforce.new(options.merge(bucket: bucket, sid: "ForceSSLOnlyAccess")).run
|
|
28
|
+
S3Secure::Policy::Unforce.new(options.merge(bucket: bucket, sid: "ForceSSLOnlyAccess")).run
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
class S3Secure::CLI
|
|
2
|
+
class PublicAccess < S3Secure::Command
|
|
3
|
+
class_option :quiet, type: :boolean
|
|
4
|
+
|
|
5
|
+
desc "list", "List bucket public access policy"
|
|
6
|
+
long_desc Help.text("public_access/list")
|
|
7
|
+
option :format, desc: "Format options: #{CliFormat.formats.join(', ')}"
|
|
8
|
+
option :blocked, desc: "Filter for public_access: all, true, false"
|
|
9
|
+
def list
|
|
10
|
+
S3Secure::PublicAccess::List.new(options).run
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
desc "show BUCKET", "show bucket public_access"
|
|
14
|
+
long_desc Help.text("public_access/show")
|
|
15
|
+
def show(bucket)
|
|
16
|
+
S3Secure::PublicAccess::Show.new(options.merge(bucket: bucket)).run
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
desc "block BUCKET", "block bucket public_access"
|
|
20
|
+
long_desc Help.text("public_access/block")
|
|
21
|
+
option :prefix, desc: "Filter prefix. Used with mode."
|
|
22
|
+
def block(bucket)
|
|
23
|
+
S3Secure::PublicAccess::Block.new(options.merge(bucket: bucket)).run
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
desc "unblock BUCKET", "unblock bucket public_access"
|
|
27
|
+
long_desc Help.text("public_access/unblock")
|
|
28
|
+
def unblock(bucket)
|
|
29
|
+
S3Secure::PublicAccess::Unblock.new(options.merge(bucket: bucket)).run
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
class Summary <
|
|
1
|
+
class S3Secure::CLI
|
|
2
|
+
class Summary < Base
|
|
3
3
|
def run
|
|
4
4
|
$stderr.puts("Determining bucket security-related settings. Can take a while for lots of buckets...")
|
|
5
5
|
data = [%w[Bucket SSL? Encrypted?]]
|
|
6
|
-
items = Items.new(@options, buckets)
|
|
6
|
+
items = S3Secure::Summary::Items.new(@options, buckets)
|
|
7
7
|
items.filtered_items.each do |i|
|
|
8
8
|
data << [i.bucket, i.ssl, i.encrypted]
|
|
9
9
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
class Versioning < Command
|
|
1
|
+
class S3Secure::CLI
|
|
2
|
+
class Versioning < S3Secure::Command
|
|
3
3
|
class_option :quiet, type: :boolean
|
|
4
4
|
|
|
5
5
|
desc "list", "List bucket versionings"
|
|
@@ -7,25 +7,25 @@ module S3Secure
|
|
|
7
7
|
option :format, desc: "Format options: #{CliFormat.formats.join(', ')}"
|
|
8
8
|
option :versioning, desc: "Filter for versioning: all, true, false"
|
|
9
9
|
def list
|
|
10
|
-
List.new(options).run
|
|
10
|
+
S3Secure::Versioning::List.new(options).run
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
desc "show BUCKET", "show bucket versioning"
|
|
14
14
|
long_desc Help.text("versioning/show")
|
|
15
15
|
def show(bucket)
|
|
16
|
-
Show.new(options.merge(bucket: bucket)).run
|
|
16
|
+
S3Secure::Versioning::Show.new(options.merge(bucket: bucket)).run
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
desc "enable BUCKET", "enable bucket versioning"
|
|
20
20
|
long_desc Help.text("versioning/enable")
|
|
21
21
|
def enable(bucket)
|
|
22
|
-
Enable.new(options.merge(bucket: bucket)).run
|
|
22
|
+
S3Secure::Versioning::Enable.new(options.merge(bucket: bucket)).run
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
desc "disable BUCKET", "disable bucket versioning"
|
|
26
26
|
long_desc Help.text("versioning/disable")
|
|
27
27
|
def disable(bucket)
|
|
28
|
-
Disable.new(options.merge(bucket: bucket)).run
|
|
28
|
+
S3Secure::Versioning::Disable.new(options.merge(bucket: bucket)).run
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
end
|
data/lib/s3_secure/cli.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module S3Secure
|
|
2
|
-
class CLI < Command
|
|
2
|
+
class CLI < S3Secure::Command
|
|
3
3
|
class_option :quiet, type: :boolean
|
|
4
4
|
class_option :noop, type: :boolean
|
|
5
5
|
|
|
@@ -23,6 +23,10 @@ module S3Secure
|
|
|
23
23
|
long_desc Help.text(:lifecycle)
|
|
24
24
|
subcommand "lifecycle", Lifecycle
|
|
25
25
|
|
|
26
|
+
desc "public_access SUBCOMMAND", "public_access subcommands"
|
|
27
|
+
long_desc Help.text(:public_access)
|
|
28
|
+
subcommand "public_access", PublicAccess
|
|
29
|
+
|
|
26
30
|
desc "remediate_all BUCKET", "Remediate all. For more fine-grain control use each of the commands directly."
|
|
27
31
|
long_desc Help.text("remediate_all")
|
|
28
32
|
def remediate_all(bucket)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
module S3Secure::Encryption
|
|
2
2
|
class Show < Base
|
|
3
3
|
def run
|
|
4
4
|
if rules
|
|
@@ -7,6 +7,7 @@ class S3Secure::Encryption
|
|
|
7
7
|
else
|
|
8
8
|
say "Bucket #{@bucket} is not configured with encryption at the bucket level"
|
|
9
9
|
end
|
|
10
|
+
rules
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def enabled?
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module S3Secure::PublicAccess
|
|
2
|
+
class Block < Base
|
|
3
|
+
def run
|
|
4
|
+
resp = s3.put_public_access_block(
|
|
5
|
+
bucket: @bucket,
|
|
6
|
+
public_access_block_configuration: {
|
|
7
|
+
block_public_acls: true,
|
|
8
|
+
ignore_public_acls: true,
|
|
9
|
+
block_public_policy: true,
|
|
10
|
+
restrict_public_buckets: true,
|
|
11
|
+
},
|
|
12
|
+
)
|
|
13
|
+
$stderr.puts("Public access blocked for bucket: #{@bucket}")
|
|
14
|
+
resp
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module S3Secure::PublicAccess
|
|
2
|
+
class List < Base
|
|
3
|
+
def run
|
|
4
|
+
presenter = CliFormat::Presenter.new(@options)
|
|
5
|
+
presenter.header = ["Bucket", "Block Public Access?"]
|
|
6
|
+
|
|
7
|
+
buckets.each do |bucket|
|
|
8
|
+
$stderr.puts "Getting bucket public access configuration for bucket #{bucket.color(:green)}"
|
|
9
|
+
|
|
10
|
+
blocked = Show.new(bucket: bucket).blocked?
|
|
11
|
+
row = [bucket, blocked]
|
|
12
|
+
if @options[:blocked].nil?
|
|
13
|
+
presenter.rows << row # always show policy
|
|
14
|
+
elsif @options[:blocked]
|
|
15
|
+
presenter.rows << row if blocked # only show if bucket is blocked
|
|
16
|
+
else
|
|
17
|
+
presenter.rows << row unless blocked # only show if bucket is unblocked
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
presenter.show
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module S3Secure::PublicAccess
|
|
2
|
+
class Show < Base
|
|
3
|
+
def run
|
|
4
|
+
resp = s3.get_public_access_block(
|
|
5
|
+
bucket: @bucket,
|
|
6
|
+
)
|
|
7
|
+
$stderr.puts(resp.to_h)
|
|
8
|
+
resp
|
|
9
|
+
rescue Aws::S3::Errors::NoSuchPublicAccessBlockConfiguration
|
|
10
|
+
$stderr.puts "No public access block configuration found for bucket: #{@bucket}"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def blocked?
|
|
14
|
+
resp = s3.get_public_access_block(
|
|
15
|
+
bucket: @bucket,
|
|
16
|
+
)
|
|
17
|
+
resp.to_h[:public_access_block_configuration] == {
|
|
18
|
+
block_public_acls: true,
|
|
19
|
+
block_public_policy: true,
|
|
20
|
+
ignore_public_acls: true,
|
|
21
|
+
restrict_public_buckets: true,
|
|
22
|
+
}
|
|
23
|
+
rescue Aws::S3::Errors::NoSuchPublicAccessBlockConfiguration
|
|
24
|
+
false
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
class Items < S3Secure::
|
|
1
|
+
module S3Secure::Summary
|
|
2
|
+
class Items < S3Secure::CLI::Base
|
|
3
3
|
extend Memoist
|
|
4
4
|
|
|
5
5
|
# override initialize
|
|
@@ -44,9 +44,9 @@ class S3Secure::Summary
|
|
|
44
44
|
|
|
45
45
|
private
|
|
46
46
|
def ssl?(bucket)
|
|
47
|
-
|
|
47
|
+
show = S3Secure::Policy::Show.new(@options.merge(bucket: bucket))
|
|
48
48
|
|
|
49
|
-
bucket_policy =
|
|
49
|
+
bucket_policy = show.run
|
|
50
50
|
document = S3Secure::Policy::Document.new(bucket, bucket_policy)
|
|
51
51
|
document.has?("ForceSSLOnlyAccess")
|
|
52
52
|
end
|
|
@@ -54,10 +54,9 @@ class S3Secure::Summary
|
|
|
54
54
|
|
|
55
55
|
def encrypted?(bucket)
|
|
56
56
|
s3 = s3_regional_client(bucket)
|
|
57
|
-
|
|
58
|
-
list.set_s3(s3)
|
|
57
|
+
show = S3Secure::Encryption::Show.new(@options.merge(bucket: bucket))
|
|
59
58
|
|
|
60
|
-
rules =
|
|
59
|
+
rules = show.run
|
|
61
60
|
!!rules
|
|
62
61
|
end
|
|
63
62
|
memoize :encrypted?
|
data/lib/s3_secure/version.rb
CHANGED
data/lib/s3_secure.rb
CHANGED
data/s3-secure.gemspec
CHANGED
|
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
|
9
9
|
spec.authors = ["Tung Nguyen"]
|
|
10
10
|
spec.email = ["tongueroo@gmail.com"]
|
|
11
11
|
spec.summary = "S3 Bucket security hardening tool"
|
|
12
|
-
spec.homepage = "https://github.com/
|
|
12
|
+
spec.homepage = "https://github.com/boltops-tools/s3-secure"
|
|
13
13
|
spec.license = "Apache2.0"
|
|
14
14
|
|
|
15
15
|
git_installed = system("type git > /dev/null 2>&1")
|
|
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
|
|
|
24
24
|
spec.add_dependency "cli-format"
|
|
25
25
|
spec.add_dependency "memoist"
|
|
26
26
|
spec.add_dependency "rainbow"
|
|
27
|
+
spec.add_dependency "rexml"
|
|
27
28
|
spec.add_dependency "text-table"
|
|
28
29
|
spec.add_dependency "thor"
|
|
29
30
|
spec.add_dependency "zeitwerk"
|
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
|
+
version: 0.6.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:
|
|
11
|
+
date: 2021-12-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -80,6 +80,20 @@ dependencies:
|
|
|
80
80
|
- - ">="
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
82
|
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: rexml
|
|
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'
|
|
83
97
|
- !ruby/object:Gem::Dependency
|
|
84
98
|
name: text-table
|
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -211,8 +225,6 @@ files:
|
|
|
211
225
|
- exe/s3-secure
|
|
212
226
|
- lib/s3-secure.rb
|
|
213
227
|
- lib/s3_secure.rb
|
|
214
|
-
- lib/s3_secure/abstract_base.rb
|
|
215
|
-
- lib/s3_secure/access_logs.rb
|
|
216
228
|
- lib/s3_secure/access_logs/base.rb
|
|
217
229
|
- lib/s3_secure/access_logs/disable.rb
|
|
218
230
|
- lib/s3_secure/access_logs/enable.rb
|
|
@@ -221,19 +233,28 @@ files:
|
|
|
221
233
|
- lib/s3_secure/autoloader.rb
|
|
222
234
|
- lib/s3_secure/aws_services.rb
|
|
223
235
|
- lib/s3_secure/aws_services/s3.rb
|
|
224
|
-
- lib/s3_secure/batch.rb
|
|
225
236
|
- lib/s3_secure/cli.rb
|
|
237
|
+
- lib/s3_secure/cli/access_logs.rb
|
|
238
|
+
- lib/s3_secure/cli/base.rb
|
|
239
|
+
- lib/s3_secure/cli/batch.rb
|
|
240
|
+
- lib/s3_secure/cli/encryption.rb
|
|
241
|
+
- lib/s3_secure/cli/help.rb
|
|
242
|
+
- lib/s3_secure/cli/lifecycle.rb
|
|
243
|
+
- lib/s3_secure/cli/policy.rb
|
|
244
|
+
- lib/s3_secure/cli/public_access.rb
|
|
245
|
+
- lib/s3_secure/cli/remediate_all.rb
|
|
246
|
+
- lib/s3_secure/cli/say.rb
|
|
247
|
+
- lib/s3_secure/cli/summary.rb
|
|
248
|
+
- lib/s3_secure/cli/versioning.rb
|
|
226
249
|
- lib/s3_secure/command.rb
|
|
227
250
|
- lib/s3_secure/completer.rb
|
|
228
251
|
- lib/s3_secure/completer/script.rb
|
|
229
252
|
- lib/s3_secure/completer/script.sh
|
|
230
|
-
- lib/s3_secure/encryption.rb
|
|
231
253
|
- lib/s3_secure/encryption/base.rb
|
|
232
254
|
- lib/s3_secure/encryption/disable.rb
|
|
233
255
|
- lib/s3_secure/encryption/enable.rb
|
|
234
256
|
- lib/s3_secure/encryption/list.rb
|
|
235
257
|
- lib/s3_secure/encryption/show.rb
|
|
236
|
-
- lib/s3_secure/help.rb
|
|
237
258
|
- lib/s3_secure/help/batch.md
|
|
238
259
|
- lib/s3_secure/help/completion.md
|
|
239
260
|
- lib/s3_secure/help/completion_script.md
|
|
@@ -248,14 +269,12 @@ files:
|
|
|
248
269
|
- lib/s3_secure/help/policy/list.md
|
|
249
270
|
- lib/s3_secure/help/policy/unforce_ssl.md
|
|
250
271
|
- lib/s3_secure/help/summary.md
|
|
251
|
-
- lib/s3_secure/lifecycle.rb
|
|
252
272
|
- lib/s3_secure/lifecycle/add.rb
|
|
253
273
|
- lib/s3_secure/lifecycle/base.rb
|
|
254
274
|
- lib/s3_secure/lifecycle/builder.rb
|
|
255
275
|
- lib/s3_secure/lifecycle/list.rb
|
|
256
276
|
- lib/s3_secure/lifecycle/remove.rb
|
|
257
277
|
- lib/s3_secure/lifecycle/show.rb
|
|
258
|
-
- lib/s3_secure/policy.rb
|
|
259
278
|
- lib/s3_secure/policy/base.rb
|
|
260
279
|
- lib/s3_secure/policy/checker.rb
|
|
261
280
|
- lib/s3_secure/policy/document.rb
|
|
@@ -266,14 +285,15 @@ files:
|
|
|
266
285
|
- lib/s3_secure/policy/list.rb
|
|
267
286
|
- lib/s3_secure/policy/show.rb
|
|
268
287
|
- lib/s3_secure/policy/unforce.rb
|
|
269
|
-
- lib/s3_secure/
|
|
270
|
-
- lib/s3_secure/
|
|
271
|
-
- lib/s3_secure/
|
|
288
|
+
- lib/s3_secure/public_access/base.rb
|
|
289
|
+
- lib/s3_secure/public_access/block.rb
|
|
290
|
+
- lib/s3_secure/public_access/list.rb
|
|
291
|
+
- lib/s3_secure/public_access/show.rb
|
|
292
|
+
- lib/s3_secure/public_access/unblock.rb
|
|
272
293
|
- lib/s3_secure/summary/item.rb
|
|
273
294
|
- lib/s3_secure/summary/items.rb
|
|
274
295
|
- lib/s3_secure/table.rb
|
|
275
296
|
- lib/s3_secure/version.rb
|
|
276
|
-
- lib/s3_secure/versioning.rb
|
|
277
297
|
- lib/s3_secure/versioning/base.rb
|
|
278
298
|
- lib/s3_secure/versioning/disable.rb
|
|
279
299
|
- lib/s3_secure/versioning/enable.rb
|
|
@@ -286,7 +306,7 @@ files:
|
|
|
286
306
|
- spec/lib/policy/document/force_ssl_remove_spec.rb
|
|
287
307
|
- spec/lib/policy/document_spec.rb
|
|
288
308
|
- spec/spec_helper.rb
|
|
289
|
-
homepage: https://github.com/
|
|
309
|
+
homepage: https://github.com/boltops-tools/s3-secure
|
|
290
310
|
licenses:
|
|
291
311
|
- Apache2.0
|
|
292
312
|
metadata: {}
|
|
@@ -305,7 +325,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
305
325
|
- !ruby/object:Gem::Version
|
|
306
326
|
version: '0'
|
|
307
327
|
requirements: []
|
|
308
|
-
rubygems_version: 3.
|
|
328
|
+
rubygems_version: 3.2.32
|
|
309
329
|
signing_key:
|
|
310
330
|
specification_version: 4
|
|
311
331
|
summary: S3 Bucket security hardening tool
|