0

在我的 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 { ... }捆绑包)似乎在未列出 common 时进行了评估bundlesequence

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

编辑:

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

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

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

4

4 回答 4

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 的预发布版本上对此进行了测试,我不需要有一个空的主机名。

于 2016-03-22T17:16:46.470 回答
0

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

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

  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 的关系映射到 admission_keys,因此每个主机只允许访问其自己的目录。

于 2016-03-22T16:18:54.830 回答
0

事实证明cf-serverd 不支持此类捆绑包,我倾向于通过迭代列表来实现这一点:

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存在标签似乎很重要。else$(connection.hostname)不展开。

于 2016-03-22T16:36:36.110 回答
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}]) };
}
于 2016-03-22T19:10:47.437 回答