Chef bash资源是否会创建历史记录条目

74次阅读
没有评论

问题描述

想知道在使用Chef bash资源时,是否会创建历史记录条目。他知道在命令行中使用密码是一个不好的主意,因为bash命令可以记录在历史记录中。但是,当他在Chef bash资源中运行命令时,查看历史记录时却没有看到任何条目。这是否意味着Chef bash资源不会记录历史记录?在Chef bash资源中使用密码是否安全?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Chef中,可以使用data bags来安全地存储敏感信息,如密码。data bags是一种特定于Chef的功能,用于存储和管理敏感数据。以下是使用data bags的步骤:
1. 创建一个data bag,用于存储密码或其他敏感信息。
2. 在data bag中创建一个data bag item,用于存储具体的敏感信息。
3. 在Chef的recipe中使用data bag item来获取敏感信息,并在bash资源中使用它。
下面是一个示例代码片段,演示如何使用data bags来安全地存储和使用密码:

# 创建一个data bag
knife data bag create passwords

# 在data bag中创建一个data bag item,存储密码
knife data bag create passwords mysql
# 输入密码信息

# 在Chef的recipe中使用data bag item获取密码
password = data_bag_item('passwords', 'mysql')['password']

# 在bash资源中使用密码
bash 'run_command_with_password' do
  code <<-EOH
    # 使用密码执行命令
    command_with_password #{password}
  EOH
  sensitive true  # 避免将密码打印到屏幕或日志中
end

在上面的示例中,我们首先使用knife data bag create命令创建了一个名为passwordsdata bag。然后,使用knife data bag create命令在data bag中创建了一个名为mysqldata bag item,并输入了密码信息。在Chef的recipe中,我们使用data_bag_item方法获取了data bag item中存储的密码,并在bash资源中使用它来执行命令。通过使用data bags,我们可以安全地存储和使用敏感信息,避免将密码记录在历史记录中。
请注意,在使用bash资源时,还需要将sensitive属性设置为true,以避免将敏感信息打印到屏幕或日志中。

方案2

使用bash资源是一种最后的选择,通常更适合使用自定义资源和shell_out方法来执行命令。如果你只是想防止将密码写入磁盘,你还需要在资源块内设置sensitive值,否则Chef将以明文形式将其记录到/var/log/chef(或你的chef-client配置的日志位置)。
另一种方法是使用自定义资源和shell_out方法来执行命令,而不是使用bash资源。这种方法可以更好地控制命令的执行和敏感信息的处理。以下是一个示例代码片段,演示如何使用自定义资源和shell_out方法来执行命令:

# 定义一个自定义资源
resource_name :custom_bash

property :command, String, name_property: true
property :password, String, sensitive: true

action :run do
  # 使用shell_out方法执行命令
  shell_out!(new_resource.command, env: { 'PASSWORD' => new_resource.password })
end

在上面的示例中,我们定义了一个名为custom_bash的自定义资源,它有两个属性:commandpassword。在run操作中,我们使用shell_out方法执行命令,并将密码作为环境变量传递给命令。通过使用自定义资源和shell_out方法,我们可以更好地控制命令的执行和敏感信息的处理。
请注意,无论使用哪种方法,都需要确保在Chef的配置中设置了适当的日志位置,以避免将敏感信息记录到日志中。

正文完