在一些厨师零运行(将节点状态保存为本地.json文件)后,我很遗憾在节点文件中找到它:
...
"ssmtp": {
"auth_username": "secret user name",
"auth_password": "even-more-secret password"
}
Chef Server上的相同运行会将节点数据保存在服务器上。这当然是一个问题,我将不得不更换凭证,修改食谱等。我仍在调查导致这一点的原因,但我的问题是:
如何为配方创建rspec / chefspec测试以验证特定节点属性是否未永久保存在节点的.json文件或Chef服务器上?
我想将此添加到我的规格中,以确保它再也不会发生。
这里的一个重要教训是,任何进入任何节点属性的方法最终都会保存在节点对象表示中。
答案 0 :(得分:2)
Chef Server将保存所有属性,即使它们是正常或默认或其他优先级。您可以使用node.run_state来解决这个问题,elkstack可以用来“在厨师 - 客户端运行期间隐藏瞬态数据。”
您可以在_lumberjack_secrets.rb社区食谱中看到这一点,最明显的是save-widget食谱。
设置 node.run_state
:
if <CONDITION ABBREVIATED>
node.run_state['lumberjack_decoded_key'] = Base64.decode64(lumberjack_secrets['key'])
....
end
正在使用 node.run_state
:
lumberjack_keypair = node.run_state['lumberjack_decoded_key'] && node.run_state['lumberjack_decoded_certificate']
至于测试,我自己没有“测试过”,但你会测试以确保属性没有设置,如下所示:
it 'should not have secret attributes set' do
node = chef_run.node
expect (node['my_secret']).to be_nil
end
答案 1 :(得分:0)
密钥位于Chef docs的注释中,&#34;普通属性是一个在节点对象中保留的设置。普通属性具有比默认属性更高的属性优先级。&#34; 如果属性是&#34;正常&#34;那么将问题分解为测试。属性。
深入研究Chef :: Node和Chef :: Node :: Attribute类代码,我发现你可以调用node.attributes.normal
来获得正常的属性。所以这个简洁的测试正确失败,表明我的秘密信息 将永久存储在节点对象中!
it 'does not have a normal attribute node[ssmtp][auth_password]' do
expect(subject.node.attributes.normal['ssmtp'].keys).to_not include 'auth_password'
end
导致这个体面的错误消息:
Failure/Error: expect(subject.node.attributes.normal['ssmtp'].keys).to_not include 'auth_password'
expected ["auth_username", "auth_password"] not to include "auth_password"
如果未设置特定值,您也可以测试,但我认为测试密钥不存在更重要。
不知怎的,我总是从简单地制定一个问题到这里发布的新见解。它就是这样。