将敏感信息排除在节点属性之外

https://blueprints.launchpad.net/openstack-chef/+spec/no-secret-attributes

诸如密码之类的敏感信息不应存储为节点属性,因为它们会被持久化回服务器,因此很容易被检索到。

问题描述

封装的配方(例如 mysql::server)使用节点属性来检索敏感信息,例如与特权帐户关联的密码。 此类型的信息通过加密数据包中的项目指定,但由于涉及节点属性,因此只需从服务器检索节点属性就可以轻易破坏加密机制提供的安全性。

例如(来自 mysql-server)

if node['openstack']['db']['root_user_use_databag']
    super_password = get_password 'user', node['openstack']['db']['root_user_key']
    node.set_unless['mysql']['server_root_password'] = super_password
else
    super_password = node['mysql']['server_root_password']
end

密码是从(可能加密的)数据包中检索并存储到节点属性中,以便由 server 配方在 mysql cookbook 中下游使用。 节点收敛后,任何人想要以明文检索密码所需要做的就是执行 knife node edit NODE_NAME,从而破坏数据包的加密能力。

提议的变更

建议的解决方案是直接操作服务器资源或使用 run_state 来设置密码,具体取决于在给定配方中使用哪个资源。

再次以 MySQL 为例(直接操作资源)

if node['openstack']['db']['root_user_use_databag']
    super_password = get_password 'user', node['openstack']['db']['root_user_key']
else
    super_password = node['mysql']['server_root_password']
end

mysql_service node['mysql']['service_name'] do
  server_root_password super_password
  ...
end

密码仅存储在局部变量中,并直接分配给 mysql_service 资源的 server_root_password 属性。 mysql::server 配方未被调用,并且所有其他资源属性也直接设置(通过 ... 表示)。 由于密码从不存储为节点属性,因此无法通过 knife node edit NODE_NAME 检索。 请注意,其他资源属性(例如 port)仍然可以设置为节点属性值,因此它们默认值仍然可以在 attributes/default.rb 中指定。 另外请注意,上面的示例表明,如果用户希望这样做,仍然可以使用节点属性来存储密码信息。 这可以通过将 ['openstack']['db']['root_user_use_databag'] 设置为其默认值 false 来完成。

备选方案

另一种选择是让封装的配方回退到默认属性值并直接设置资源属性,如 https://sethvargo.com/changing-chef-resources-at-runtime/ 中所述。 但是,这可以说是一种非战略性的解决方法。

数据模型影响

REST API 影响

安全影响

安全性将得到提高,因为密码不再可以作为节点属性访问。

通知影响

其他最终用户影响

没有。 配方将向后兼容,因为指定数据包类型(加密或标准)和名称以及使用数据包所需的关联节点属性的机制将保持不变。 唯一改变的是数据包中包含的数据填充到配方创建的资源中的机制。 请注意,最终用户仍然可以选择完全不使用数据包。

性能影响

其他部署者影响

开发者影响

实现

负责人

  • jswarren

工作项

已知的受影响的配方是

  • cookbook-openstack-ops-database::mysql-server

  • cookbook-openstack-ops-database::postgresql-server

  • cookbook-openstack-ops-messaging::rabbitmq-server

依赖项

参与设置相关资源的 cookbook 需要提供一种机制来将密码设置为资源属性,可以直接设置,或者作为 run_state 属性。 其他不将密码作为节点属性公开的机制也应可接受。

测试

需要测试相关 cookbook,以确保在使用数据包指定密码时,密码值不会反映在用于设置密码的属性中(如果有)。 换句话说,给定的引用 cookbook 或配方仍然可能允许使用节点属性来设置密码,除了上述可能的替代方案之外。 但是,当不使用节点属性来指定密码时,密码然后不得由引用的配方存储为节点属性。

文档影响

文档不应更改,因为配方的黑盒行为应保持不变。 当为替代的密码设置方式做出调整时,与引用的资源配方相关的文档可能需要更改,但这些更改与此处描述的工作无关。

参考资料