使用Salt安全传送小仆特定文件的最佳方法是什么?

时间:2018-10-25 22:28:47

标签: salt-stack

我有许多文件需要以安全的方式传输到特定的奴才主机,我想使用Salt来自动执行该过程。但是,我在寻找实现主机受限传输的最佳方法时遇到了麻烦。

salt文件服务器非常适合非特定于主机的传输。但是,我需要传输的某些文件是特定于客户的,因此我需要确保只能从特定主机访问它们。假定Pillar是适用于奴才特定限制的理想人选,但我在弄清楚使用支柱作为来源指定文件传输的方式时遇到了麻烦。

据我所知,Pillar仅支持基于SLS的词典数据,不支持文件传输。我已经尝试过使用各种卷积(包括salt:// _ pillar / xxx)构造的路径进行file.managed状态规范的各种组合,但是到目前为止,除了SLS文件中定义的令牌数据之外,我无法访问任何其他内容。

有关如何执行此操作的任何建议?我假设安全的文件传输应该是一种普遍的需求,而不是编写自定义函数,因此应该有一种标准的传输方法。

2 个答案:

答案 0 :(得分:0)

答案取决于您要保护的内容。如果所涉及的文件中只有一部分是“敏感的”(例如,配置文件中的密码),则可能要使用一个模板,将其从支柱中拉出:

# /srv/salt/app/files/app.conf.jinja
[global]
user = {{ salt['pillar.get']("app:user") }}
password = {{ salt['pillar.get']("app:password") }}
# ...and so on

在这种情况下,您无需担心爪牙是否可以访问模板本身。

如果涉及的整个文件都是敏感文件,那么我想想您要设置file_tree external pillar,并使用带有contents_pillar选项的file.managed。那不是我要处理的东西,所以我没有一个很好的例子。

答案 1 :(得分:0)

解决方案简介:使用PILLAR.FILE_TREE

A:在您的主服务器上,设置一个目录,您将从该目录中处理私有文件(例如:/ srv / salt / private)。

B:在下面创建一个“主机”子目录,然后在该目录下为每个将拥有私有文件的主机创建一个目录。

  • / srv / salt / private / hosts / hostA

  • / srv / salt / private / hosts / hostB

  • ...,其中hostA和hostB是目标小兵的ID。

  • 如果要使用节点组而不是主机ID,请参阅文档。

C:在主机目录下,包含您要通过支柱传输的所有文件。

echo “I am Foo\!” > /srv/salt/private/hosts/hostA/testme 

D:在您的主配置文件(例如:/ etc / salt / master)中,包含以下节:

ext_pillar:
 - file_tree:
      root_dir: /srv/salt/private
      follow_dir_links: False
      keep_newline: True
      debug: True

E:创建一个盐状态文件来处理传输。

cat > /srv/salt/files/base/foo.sls << END
/tmp/pt_test:
  file.managed:
    - contents_pillar: testme
END

F:运行支柱刷新,然后运行状态命令:

salt hostA state.apply foo

在最后一步之后,hostA应该有一个名为/ tmp / pt_test的文件,其中包含文本“ I am Foo!”。