在我的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'的变化历史。
答案 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}]) };
}