Chef Foodcritic规则没有捕获属性字符串

时间:2016-03-16 15:29:56

标签: ruby automated-tests chef

我编写了一条食品规则来捕获任何写入/ etc目录下目录/文件黑名单的企图。

当黑名单路径作为配方中的字符串传递给资源声明时,规则会触发,但是当它们作为属性传递时,规则不会触发:

@resources = [
'file',
'template',
'remote_file',
'remote_directory',
'directory'
]

@blacklist = [
'/etc/ssh/',
'/etc/init',
...
]

rule 'RULE001', 'do not manipulate /etc other than init/,init.d/ & default/' do
  tags %w(security)
  recipe do |ast|
    violations = []
    @resources.each do |resource_type|
      violations << find_resources(ast, type: resource_type).select do |resource|
        res_str = (resource_attribute(resource, 'path' || resource_name(resource)).to_s
        @blacklist.any? { |cmd| res_str.include? cmd }
      end
    end
    violations.flatten
  end
end

使用下面的测试,捕获文字字符串,但是当作为属性传递它们时,它们被传递。谁能看到我失踪的东西?

属性/ default.rb:

default['testbook']['etc-test'] = '/etc/ssh/test.conf'
default['testbook']['etc-dir-test'] = 'etc/ssh/somedir/'

食谱/ default.rb:

#template '/etc/ssh/test.conf' do <-- caught
template node['testbook']['etc-test'] do #<-- not caught
  source 'test.conf'
  owner 'nobody'
  group 'nobody'
  mode '0644'
  action :create
end

#directory '/etc/ssh/somedir' do <-- caught
directory node['testbook']['etc-dir-test'] do <-- not caught
  action :create
end

1 个答案:

答案 0 :(得分:2)

是的,这不是你可以通过静态分析完全处理的事情。 Foodcritic和类似的工具只能处理代码中静态的东西,任何在运行时都可能变化的东西都不会被人知道。