cfn-nag 0.8.7 → 0.8.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5802d950eab38e40f6073fa29cc4736a052885451e106ff8e6501128e877ad84
4
- data.tar.gz: 36b602473c0e8586b360641825d44aa911a5511afafa614bd4c40c912bee1efc
3
+ metadata.gz: 40a08198632607ba6b27da6855a68dce9296ac85e7d5c0b511efd64297c24089
4
+ data.tar.gz: df6fb8ea0508ebff5ae8d5f74dd4e403294152adfcf43b306e426de33b12eec8
5
5
  SHA512:
6
- metadata.gz: a10f0637676007bfd8c4498f579d71eea6e29e0ae01fe1ad9b82e51b77fc97bf9a2b9f69350b948a5b9794b2970e0e52191783ea50254aeccb5028db3a0b0a68
7
- data.tar.gz: 9bade29b10f95b488c6be7711329c5ea11c21a32169badb0b9c1e83dcd930aac757601ba1ad722da34aaeb2d8c23bf46bdda458be5dcc0b17d2b32b519236ec7
6
+ metadata.gz: bc4b6426631b6777c2a77eb3c7be2fbf776ae1027675c9f420c558cbcc6e2682368889438e05e52a91b0709b06cd4bfcef46ea67d2b051d62b0bbc84b2e843a2
7
+ data.tar.gz: 69874dc93fee2a9f3aca39c2eef7b5d27f2d2805350792b5dcbb8e8b5ad0d9b4a97c97f98f7d15bf75d1588dfee0c6c31a2ad9a4962a6b834aa8babf9ae7cfaa
@@ -11,14 +11,16 @@ class CfnNagConfig
11
11
  fail_on_warnings: false,
12
12
  ignore_fatal: false,
13
13
  rule_repository_definitions: [],
14
- rule_arguments: {})
14
+ rule_arguments: {},
15
+ rule_directory_recursive: false)
15
16
  @rule_directory = rule_directory
16
17
  @custom_rule_loader = CustomRuleLoader.new(
17
18
  rule_directory: rule_directory,
18
19
  allow_suppression: allow_suppression,
19
20
  print_suppression: print_suppression,
20
21
  isolate_custom_rule_exceptions: isolate_custom_rule_exceptions,
21
- rule_repository_definitions: rule_repository_definitions
22
+ rule_repository_definitions: rule_repository_definitions,
23
+ rule_directory_recursive: rule_directory_recursive
22
24
  )
23
25
  @profile_definition = profile_definition
24
26
  @deny_list_definition = deny_list_definition
@@ -130,7 +130,8 @@ class CfnNagExecutor
130
130
  fail_on_warnings: opts[:fail_on_warnings],
131
131
  rule_repository_definitions: @rule_repository_definitions,
132
132
  ignore_fatal: opts[:ignore_fatal],
133
- rule_arguments: merge_rule_arguments(opts)
133
+ rule_arguments: merge_rule_arguments(opts),
134
+ rule_directory_recursive: opts[:rule_directory_recursive]
134
135
  )
135
136
  end
136
137
 
@@ -54,6 +54,11 @@ class Options
54
54
  type: :string,
55
55
  required: false,
56
56
  default: nil
57
+ opt :rule_directory_recursive,
58
+ 'Recursively search extra rule directory',
59
+ type: :boolean,
60
+ required: false,
61
+ default: false
57
62
  opt :profile_path,
58
63
  'Path to a profile file',
59
64
  type: :string,
@@ -27,12 +27,14 @@ class CustomRuleLoader
27
27
  allow_suppression: true,
28
28
  print_suppression: false,
29
29
  isolate_custom_rule_exceptions: false,
30
- rule_repository_definitions: [])
30
+ rule_repository_definitions: [],
31
+ rule_directory_recursive: false)
31
32
  @rule_directory = rule_directory
32
33
  @allow_suppression = allow_suppression
33
34
  @print_suppression = print_suppression
34
35
  @isolate_custom_rule_exceptions = isolate_custom_rule_exceptions
35
36
  @rule_repository_definitions = rule_repository_definitions
37
+ @rule_directory_recursive = rule_directory_recursive
36
38
  @registry = nil
37
39
  end
38
40
 
@@ -43,7 +45,8 @@ class CustomRuleLoader
43
45
  #
44
46
  def rule_definitions(force_refresh: false)
45
47
  if @registry.nil? || force_refresh
46
- @registry = FileBasedRuleRepo.new(@rule_directory).discover_rules
48
+ @registry = FileBasedRuleRepo.new(@rule_directory,
49
+ rule_directory_recursive: @rule_directory_recursive).discover_rules
47
50
  @registry.merge! GemBasedRuleRepo.new.discover_rules
48
51
 
49
52
  @registry = RuleRepositoryLoader.new.merge(@registry, @rule_repository_definitions)
@@ -23,7 +23,7 @@ class IamRolePassRoleWildcardResourceRule < BaseRule
23
23
  violating_roles = cfn_model.resources_by_type('AWS::IAM::Role').select do |role|
24
24
  violating_policies = role.policy_objects.select do |policy|
25
25
  violating_statements = policy.policy_document.statements.select do |statement|
26
- passrole_action?(statement) && wildcard_resource?(statement)
26
+ statement.effect == 'Allow' && passrole_action?(statement) && wildcard_resource?(statement)
27
27
  end
28
28
  !violating_statements.empty?
29
29
  end
@@ -16,7 +16,7 @@ class PassRoleBaseRule < BaseRule
16
16
 
17
17
  violating_policies = policies.select do |policy|
18
18
  violating_statements = policy.policy_document.statements.select do |statement|
19
- passrole_action?(statement) && wildcard_resource?(statement)
19
+ statement.effect == 'Allow' && passrole_action?(statement) && wildcard_resource?(statement)
20
20
  end
21
21
  !violating_statements.empty?
22
22
  end
@@ -8,8 +8,9 @@ require 'logging'
8
8
  # client's choosing
9
9
  #
10
10
  class FileBasedRuleRepo
11
- def initialize(rule_directory)
11
+ def initialize(rule_directory, rule_directory_recursive: false)
12
12
  @rule_directory = rule_directory
13
+ @rule_directory_recursive = rule_directory_recursive
13
14
  validate_extra_rule_directory rule_directory
14
15
  end
15
16
 
@@ -19,7 +20,8 @@ class FileBasedRuleRepo
19
20
  # we look on the file system, and we load from the file system into a Class
20
21
  # that the runtime can refer back to later from the registry which is effectively
21
22
  # just a set of rule definitons
22
- discover_rule_classes(@rule_directory).each do |rule_class|
23
+ discover_rule_classes(@rule_directory,
24
+ rule_directory_recursive: @rule_directory_recursive).each do |rule_class|
23
25
  rule_registry.definition(rule_class)
24
26
  end
25
27
 
@@ -34,12 +36,18 @@ class FileBasedRuleRepo
34
36
  raise "Not a real directory #{rule_directory}"
35
37
  end
36
38
 
37
- def discover_rule_filenames(rule_directory)
39
+ def locate_rule_files(rule_directory, rule_directory_recursive)
40
+ return Dir.glob(File.join(rule_directory, '**/*Rule.rb')).sort if rule_directory_recursive
41
+
42
+ Dir[File.join(rule_directory, '*Rule.rb')].sort
43
+ end
44
+
45
+ def discover_rule_filenames(rule_directory, rule_directory_recursive: false)
38
46
  rule_filenames = []
39
47
  unless rule_directory.nil?
40
- rule_filenames += Dir[File.join(rule_directory, '*Rule.rb')].sort
48
+ rule_filenames += locate_rule_files(rule_directory, rule_directory_recursive)
41
49
  end
42
- rule_filenames += Dir[File.join(__dir__, '..', 'custom_rules', '*Rule.rb')].sort
50
+ rule_filenames += locate_rule_files(File.join(__dir__, '..', 'custom_rules'), rule_directory_recursive)
43
51
 
44
52
  # Windows fix when running ruby from Command Prompt and not bash
45
53
  rule_filenames.reject! { |filename| filename =~ /_rule.rb$/ }
@@ -47,10 +55,13 @@ class FileBasedRuleRepo
47
55
  rule_filenames
48
56
  end
49
57
 
50
- def discover_rule_classes(rule_directory)
58
+ def discover_rule_classes(rule_directory, rule_directory_recursive: false)
51
59
  rule_classes = []
52
60
 
53
- rule_filenames = discover_rule_filenames(rule_directory)
61
+ rule_filenames = discover_rule_filenames(
62
+ rule_directory,
63
+ rule_directory_recursive: rule_directory_recursive
64
+ )
54
65
  rule_filenames.each do |rule_filename|
55
66
  require(File.absolute_path(rule_filename))
56
67
  rule_classname = File.basename(rule_filename, '.rb')
@@ -2,5 +2,5 @@
2
2
 
3
3
  module CfnNagVersion
4
4
  # This is managed at release time via scripts/publish.sh
5
- VERSION = '0.8.7'
5
+ VERSION = '0.8.10'
6
6
  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.8.7
4
+ version: 0.8.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Kascic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-29 00:00:00.000000000 Z
11
+ date: 2022-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake