cfn-nag 0.4.54 → 0.4.55

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9f1ec99e81c1cb40eb73ada73058cefaa7ca8f5971e9758185151d6d5024cf96
4
- data.tar.gz: 429177c30d6994c2729fbf8a7b33f160ceb00c63e1e5037ef19e75cdcbd618a6
3
+ metadata.gz: 2682c698c9f4b4cc462275cb36c2789f62305084d85175f5f3a2be1d1bc28095
4
+ data.tar.gz: f0718d888c66edb0d5efa8da809e0379be6c3b9f079299bee93bd73fc396b5d5
5
5
  SHA512:
6
- metadata.gz: 0fd6d418f467e7d2a96de56ee13aba8ff3c2151f5a740a3e78184cf53fcac18d1c54f24f6d521d7897230e66f86d2b6161d9c0b670a805692e6664f7c080b330
7
- data.tar.gz: 329f13656def76e5490e65bfaa16f75012fee1201de587c727b5b274b2f90a6f4417cc8535d71f6845e291c6fbf0b28ce40c3fe3b43e9955b7c3dfbe68ae23e4
6
+ metadata.gz: 0042f93b7b41c7f3203b532d7bb4342adf8f5c61e0a0aecc962ecb7b2f2bda87cffaed100a6be8464399a9bd3355029f80178319653dfd7e05339e97d3eb149d
7
+ data.tar.gz: 1ea773c620e0d22ff2e1225022304879b13615c72aabbfbd813630d15b64a3f8c3e31f889fae37dc315fdf2b3990289b843033552c34c7d1dd46bce06834ede8
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cfn-nag/violation'
4
+ require_relative 'base'
5
+
6
+ class KinesisStreamStreamEncryptionRule < BaseRule
7
+ def rule_text
8
+ 'Kinesis Stream should specify StreamEncryption. EncryptionType should be KMS and specify KMS Key Id.'
9
+ end
10
+
11
+ def rule_type
12
+ Violation::WARNING
13
+ end
14
+
15
+ def rule_id
16
+ 'W49'
17
+ end
18
+
19
+ def audit_impl(cfn_model)
20
+ violating_kinesis_streams = cfn_model.resources_by_type('AWS::Kinesis::Stream').select do |kinesis_stream|
21
+ violating_kinesis_streams?(kinesis_stream)
22
+ end
23
+
24
+ violating_kinesis_streams.map(&:logical_resource_id)
25
+ end
26
+
27
+ private
28
+
29
+ def violating_kinesis_streams?(kinesis_stream)
30
+ if kinesis_stream.streamEncryption.nil?
31
+ true
32
+ elsif kinesis_stream.streamEncryption['EncryptionType'].nil?
33
+ true
34
+ elsif kinesis_stream.streamEncryption['KeyId'].nil?
35
+ true
36
+ else
37
+ kinesis_stream.streamEncryption['EncryptionType'] == 'NONE'
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cfn-nag/violation'
4
+ require_relative 'sub_property_with_list_password_base_rule'
5
+
6
+ class OpsWorksStackRdsDbInstancesDbPasswordRule < SubPropertyWithListPasswordBaseRule
7
+ def rule_text
8
+ 'OpsWorks Stack RDS DbInstance DbPassword must not be a plaintext ' \
9
+ 'string or a Ref to a NoEcho Parameter with a Default value.' \
10
+ end
11
+
12
+ def rule_type
13
+ Violation::FAILING_VIOLATION
14
+ end
15
+
16
+ def rule_id
17
+ 'F54'
18
+ end
19
+
20
+ def resource_type
21
+ 'AWS::OpsWorks::Stack'
22
+ end
23
+
24
+ def password_property
25
+ :rdsDbInstances
26
+ end
27
+
28
+ def sub_property_name
29
+ 'DbPassword'
30
+ end
31
+ end
@@ -20,7 +20,7 @@ class PasswordBaseRule < BaseRule
20
20
  resources = cfn_model.resources_by_type(resource_type)
21
21
 
22
22
  violating_resources = resources.select do |resource|
23
- if verify_parameter_exists(resource, password_property, sub_property_name)
23
+ if property_does_not_exist(resource, password_property, sub_property_name)
24
24
  false
25
25
  else
26
26
  verify_insecure_string_and_parameter(
@@ -31,32 +31,34 @@ class PasswordBaseRule < BaseRule
31
31
 
32
32
  violating_resources.map(&:logical_resource_id)
33
33
  end
34
- end
35
34
 
36
- private
35
+ private
37
36
 
38
- def verify_parameter_exists(resource, password_property, sub_property_name)
39
- if sub_property_name.nil?
40
- resource.send(password_property).nil?
41
- else
42
- resource.send(password_property)[sub_property_name].nil?
37
+ def property_does_not_exist(resource, password_property, sub_property_name)
38
+ if resource.send(password_property).nil?
39
+ true
40
+ elsif sub_property_name.nil?
41
+ false
42
+ else
43
+ resource.send(password_property)[sub_property_name].nil?
44
+ end
43
45
  end
44
- end
45
46
 
46
- def verify_insecure_string_and_parameter(
47
- cfn_model, resource, password_property, sub_property_name
48
- )
49
- if sub_property_name.nil?
50
- insecure_parameter?(cfn_model, resource.send(password_property)) ||
51
- insecure_string_or_dynamic_reference?(
52
- cfn_model, resource.send(password_property)
53
- )
54
- else
55
- insecure_parameter?(
56
- cfn_model, resource.send(password_property)[sub_property_name]
57
- ) ||
58
- insecure_string_or_dynamic_reference?(
47
+ def verify_insecure_string_and_parameter(
48
+ cfn_model, resource, password_property, sub_property_name
49
+ )
50
+ if sub_property_name.nil?
51
+ insecure_parameter?(cfn_model, resource.send(password_property)) ||
52
+ insecure_string_or_dynamic_reference?(
53
+ cfn_model, resource.send(password_property)
54
+ )
55
+ else
56
+ insecure_parameter?(
59
57
  cfn_model, resource.send(password_property)[sub_property_name]
60
- )
58
+ ) ||
59
+ insecure_string_or_dynamic_reference?(
60
+ cfn_model, resource.send(password_property)[sub_property_name]
61
+ )
62
+ end
61
63
  end
62
64
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cfn-nag/violation'
4
+ require 'cfn-nag/util/enforce_reference_parameter'
5
+ require 'cfn-nag/util/enforce_string_or_dynamic_reference'
6
+ require_relative 'base'
7
+
8
+ class SubPropertyWithListPasswordBaseRule < BaseRule
9
+ def resource_type
10
+ raise 'must implement in subclass'
11
+ end
12
+
13
+ def password_property
14
+ raise 'must implement in subclass'
15
+ end
16
+
17
+ def sub_property_name; end
18
+
19
+ def audit_impl(cfn_model)
20
+ resources = cfn_model.resources_by_type(resource_type)
21
+
22
+ violating_resources = resources.select do |resource|
23
+ verify_insecure_string_and_parameter_with_list(
24
+ cfn_model, resource, password_property, sub_property_name
25
+ )
26
+ end
27
+
28
+ violating_resources.map(&:logical_resource_id)
29
+ end
30
+
31
+ private
32
+
33
+ def verify_insecure_string_and_parameter_with_list(
34
+ cfn_model, resource, password_property, sub_property_name
35
+ )
36
+ sub_property_checks_result = ''
37
+
38
+ resource.send(password_property).select do |sub_property|
39
+ sub_property_checks_result = insecure_parameter?(
40
+ cfn_model, sub_property[sub_property_name]
41
+ ) || insecure_string_or_dynamic_reference?(
42
+ cfn_model, sub_property[sub_property_name]
43
+ )
44
+ end
45
+
46
+ sub_property_checks_result
47
+ end
48
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfn-nag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.54
4
+ version: 0.4.55
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Kascic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-07 00:00:00.000000000 Z
11
+ date: 2019-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -200,12 +200,13 @@ files:
200
200
  - lib/cfn-nag/custom_rules/IotPolicyWildcardActionRule.rb
201
201
  - lib/cfn-nag/custom_rules/IotPolicyWildcardResourceRule.rb
202
202
  - lib/cfn-nag/custom_rules/KMSKeyRotationRule.rb
203
+ - lib/cfn-nag/custom_rules/KinesisStreamStreamEncryptionRule.rb
203
204
  - lib/cfn-nag/custom_rules/LambdaPermissionInvokeFunctionActionRule.rb
204
205
  - lib/cfn-nag/custom_rules/LambdaPermissionWildcardPrincipalRule.rb
205
206
  - lib/cfn-nag/custom_rules/ManagedPolicyOnUserRule.rb
206
207
  - lib/cfn-nag/custom_rules/MissingBucketPolicyRule.rb
207
208
  - lib/cfn-nag/custom_rules/NeptuneDBClusterStorageEncryptedRule.rb
208
- - lib/cfn-nag/custom_rules/OpsWorksStackRdsDbInstancePasswordRule.rb
209
+ - lib/cfn-nag/custom_rules/OpsWorksStackRdsDbInstancesDbPasswordRule.rb
209
210
  - lib/cfn-nag/custom_rules/PolicyOnUserRule.rb
210
211
  - lib/cfn-nag/custom_rules/RDSDBClusterMasterUserPasswordRule.rb
211
212
  - lib/cfn-nag/custom_rules/RDSDBClusterStorageEncryptedRule.rb
@@ -250,6 +251,7 @@ files:
250
251
  - lib/cfn-nag/custom_rules/boolean_base_rule.rb
251
252
  - lib/cfn-nag/custom_rules/passrole_base_rule.rb
252
253
  - lib/cfn-nag/custom_rules/password_base_rule.rb
254
+ - lib/cfn-nag/custom_rules/sub_property_with_list_password_base_rule.rb
253
255
  - lib/cfn-nag/ip_addr.rb
254
256
  - lib/cfn-nag/jmes_path_discovery.rb
255
257
  - lib/cfn-nag/jmes_path_evaluator.rb
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'cfn-nag/violation'
4
- require 'cfn-nag/util/enforce_reference_parameter'
5
- require 'cfn-nag/util/enforce_string_or_dynamic_reference'
6
- require_relative 'base'
7
-
8
- class OpsWorksStackRdsDbInstancePasswordRule < BaseRule
9
- def rule_text
10
- 'OpsWorks Stack RDS DBInstance Password property should not show password ' \
11
- 'in plain text, resolve an unsecure ssm string, or have a default value for parameter.'
12
- end
13
-
14
- def rule_type
15
- Violation::FAILING_VIOLATION
16
- end
17
-
18
- def rule_id
19
- 'F54'
20
- end
21
-
22
- def audit_impl(cfn_model)
23
- opsworks_stacks = cfn_model.resources_by_type('AWS::OpsWorks::Stack')
24
- violating_opsworks_stacks = opsworks_stacks.select do |opsworks_stack|
25
- violating_db_instances?(cfn_model, opsworks_stack)
26
- end
27
- violating_opsworks_stacks.map(&:logical_resource_id)
28
- end
29
-
30
- private
31
-
32
- def db_instance_has_insecure_password?(cfn_model, dbinstance)
33
- if dbinstance.key? 'DbPassword'
34
- if insecure_parameter?(cfn_model, dbinstance['DbPassword'])
35
- true
36
- elsif insecure_string_or_dynamic_reference?(cfn_model, dbinstance['DbPassword'])
37
- true
38
- elsif dbinstance['DbPassword'].nil?
39
- true
40
- end
41
- else
42
- true
43
- end
44
- end
45
-
46
- def violating_db_instances?(cfn_model, opsworks_stack)
47
- if !opsworks_stack.rdsDbInstances.nil?
48
- violating_dbinstances = opsworks_stack.rdsDbInstances.select do |dbinstance|
49
- db_instance_has_insecure_password?(cfn_model, dbinstance)
50
- end
51
- !violating_dbinstances.empty?
52
- else
53
- false
54
- end
55
- end
56
- end