Salt权限控制
受益于灵活多样的Targeting和数以百计的Modules,Salt的远程执行功能是很强大的,在多人生产环境部署时,需要考虑两个问题:
- 远程执行是否只能在master上进行?
- 远程执行的用户权限如何控制?
在哪里执行
除了master之外,Salt Peer允许指定的minion通过master向其他minion发送指令,这个功能默认是关闭的。官网的示例如下:
peer:
.*example.com:
- test.*
- ps.*
- pkg.*
.*foo.org:
- test.*
- ps.*
- pkg.*
在对应的minion上可以通过以下命令测试:
$ salt-call publish.publish '*' test.ping
上面的配置可以看出,Peer只指定了哪些minion可以执行哪些命令,却没有限制目标minion,这也反映了Peer设计时就不是为了做master的远程执行代理的,更偏向minion与minion之间的交互,因此在考虑用户批量执行权限这块,就不用太考虑Peer了,如非特殊,所有远程操作都从master发起。
权限控制
我们准备主要测试使用external_auth
权限配置。在external_auth
配置前面还有个client_acl
,但是感觉功能只是前者的子集,反而是client_acl_blacklist
会有用一些,能够禁用一些用户(特别是root,因为其他用户都用external_auth
的白名单模式管理了)或者模块(在这里禁用的模块是全局禁用,external_auth
配置某些用户有权限用这些模块时,也无法使用了)。
一个测试的配置示例如下:
external_auth:
pam:
jasee:
- test.* # jasee可以在所有minion上使用test模块全部命令
- 'test-db*':
- disk.* # 可以在ID以test-db开头的minion上使用disk模块的全部命令
- 'G@role:web':
- grains.* # 可以在pillar role为web的minion上使用grains和pillar模块的全部命令
- pillar.*
sa%:
- '*':
- cmd.run # sa用户组的用户可以在所有minion上使用cmd模块的run命令
重启master之后,可以通过以下命令测试:
$ salt '*' test.ping -a pam
$ salt '*' test.ping -a pam -T #同时生成一个token(~/salt_token),之后一段时间(默认12小时)不需要使用'-a pam'参数进行重复认证了。
Salt在会先进行权限检查,全部通过后才会开始命令执行。这种配置方式还是比较方便的,不知道为什么Salt不支持N@group
这种Targeting方式,否则会更方便一些。
在官方的文档上,除了支持PAM认证以外还支持LDAP。不过我们是使用Kerberos进行认证,而我并没有找到相关的文档,所以只能通过PAM这种间接的方式了。
在我们的环境上(Kerberos认证+LDAP授权),按照上述配置的时候还出现了以下问题:
- 如果第一次使用了
salt '*' test.ping -a pam -T
命令,是能够执行成功并生成token的。 - 但是此时执行
salt '*' cmd.run 'df -h'
,会提示认证失败,这是和我们配置的sa%
部分是不相符的。 - 此时删除token,执行
salt '*' cmd.run 'df -h' -a pam
命令,能够执行成功。 - 此时再执行
salt '*' cmd.run 'df -h' -a pam -T
命令,命令失败,但是生成了token。 - 此时执行
salt '*' test.ping
,能成功执行。
因此可以看出:
- 当使用
-T
的时候,应该是认证后先生成token,再用token完成命令的授权执行。 - LDAP用户组在使用token的时候是无法识别的。
- 如果放弃使用token,Salt还是能够识别到LDAP用户组的。
不过不使用token的时候为什么能够识别到用户组呢,难道是因为此时顺带用这个用户名和密码去LDAP中查了一下? 开了TRACE级别的日志,也没有看到什么有用的信息。目前看来Salt的认证还是比较简陋的,勉强够用吧。