如何在cf-serverd中使用参数化捆绑包?

时间:2016-03-21 12:30:02

标签: cfengine

在我的cf-serverd的promises.cf中,我有一个像

这样的包
bundle server host_rules(key, host) {
    access:
        "/srv/cfengine3/$(host)"
        admit_keys      => { "$(key)" };
}

我试图用

实现它
body common control {
        bundlesequence =>
        {
        generic_rules,
        host_rules("MD5=362c5fcf568b492f78ae392229299c05", "foo.example.com"),
        };
}

但是(使用cfengine-3.8.1)这似乎没有效果。例如。 cf-serverd -v仅报告generic_rules捆绑中的访问规则,并拒绝访问foo.example.com的文件。

generic_rules(这是一个简单的bundle server generic_rules { ... }捆绑包)似乎在未列出常见bundlesequence时进行评估。

如何在cf-serverd设置中展开host_rules捆绑包?

编辑:

我打算只将一些目录访问到由其密钥标识的相应主机。我知道可以在路径名中使用$(connection.key)但不喜欢它,因为

  • 它是不可读的(有几十个无意义的目录 MD5=...名称使得查找目录归属变得困难 到'foo.example.com')

  • 当客户端密钥发生变化时会产生麻烦(例如,因为它是 妥协或因为主机将被重新安装)。 'git'(是的 用于组织我的cfengine规则)不支持重命名 文件/目录,我会失去'git mv'的变化历史。

4 个答案:

答案 0 :(得分:1)

供参考:https://groups.google.com/d/msg/help-cfengine/ba5i_1UXPrU/xaWciJoIDQAJ

bundle server my_host_access_rules
{
  vars:
    # You can build a map of hostname to keys.
    # You might prefer to do this in an external data file formated as
JSON and
    # use readjson to read it in.
    #
    # {
    #   "hub":     "SHA=e...",
    #   "host001": "SHA=b..."
    # }

    "name_to_key[hub]" string =>
"SHA=ee29780b3c86d486699f97e30c5924431475b1b06e02c2724dd925c1524afef6";
    "hosts" slist => getindices( name_to_key );

  access:
    # Grant access to the directory named for the currently iterated
host to the public key sha for that host.
    "/srv/cfengine3/$(hosts)/."
      admit_keys => { "$(name_to_key[$(hosts)])" };
} 

我在3.7.3的预发布版本上对此进行了测试,并且我不需要空主机名。

答案 1 :(得分:0)

供参考:https://groups.google.com/forum/#!topic/help-cfengine/ba5i_1UXPrU

当客户端连接时,连接变量由cf-serverd扩展。在connection.hostname的情况下,变量扩展为连接代理的主机名,由cf-serverd中的反向DNS查找确定。所以你需要确保你有适当的反向DNS分辨率才能使用它。如果不是按主机名组织文件,而是按密钥组织它们,您应该能够允许每个主机使用以下内容访问其自己的目录:

  bundle server my_special_access_rules
  {
    access:
        # /srv/cfengine3/MD5=0a9082478b1a1466f6e56fd5e48db8c4/directory full of files
        "/srv/cfengine3/$(connnection.key)"
          shortcut => "host_cfinput",
          admit_keys => { $(connetion.key) };
  }

然后在代理程序包中,您可以执行此操作:

  bundle agent have_a_copy_of_my_files
  {
    files:
        # Using the shortcut
        "/tmp/myfiles/."
          copy_from => remote_dcp("host_cfinput", $(sys.policy_hub)),
          depth_search => recurse(inf);

        # Without using the shortcut
        "/tmp/another_myfiles/."
          copy_from => remote_dcp("/srv/cfengine3/$(sys.key_digest)/.", $(sys.policy_hub)),
          depth_search => recurse(inf);
  }

现在,您可以在/srv/cfengine3/中为主机的公钥sha命名的每个主机都有一个目录。每个主机只允许访问自己的目录,因为您已将目录以1:1的关系映射到admit_keys。

答案 2 :(得分:0)

由于cf-serverd不支持此类捆绑包已经转为out,我倾向于通过迭代列表来实现这一点:

bundle server host_list {
    vars:
        "keymap" data => parsejson('
        {
        "foo.example.com" : ["MD5=362c5fcf568b492f78ae392229299c05"],
        }');

        "hosts" slist   => maparray("$(this.k)", keymap);

    access:
        "/srv/cfengine3/$(hosts)"
        admit_keys      => { $(keymap[${hosts}]) };

        "/srv/cfengine3/KEYS/$(hosts)"
        admit_keys      => { $(keymap[${hosts}]) };
}

可以通过

定义快捷方式
        "/srv/cfengine3/$(connection.hostname)"
        admit_hostnames => { },
        shortcut        => "host_cfinput";

admit_hostnames标签似乎很重要;其他$(connection.hostname)未展开。

答案 3 :(得分:0)

试试这个:

bundle server host_list {
    vars:
        # Each host should only have one key
        "keymap" data => parsejson('
        {
          "foo.example.com" : "MD5=362c5fcf568b492f78ae392229299c05",
        }');

        "hosts" slist   => getindices( keymap );

    access:
        "/srv/cfengine3/$(hosts)"
        admit_keys      => { $(keymap[${hosts}]) };

        "/srv/cfengine3/KEYS/$(hosts)"
        admit_keys      => { $(keymap[${hosts}]) };
}