我试图通过 pam 模块限制对特定 SLS 文件的调用
state.apply
。
external_auth:
pam:
myuser:
- '@runner':
- jobs.list_job
- '*':
- test.ping
- 'state.apply':
args:
- 'path/to/sls'
当我通过 CherryPy API 调用 API 时,我得到 401。
curl http://sat_master/run -H 'content-type: application/json' \
-d [{"tgt":"target","arg":["path/to/sls"],"kwarg":{"pillar":{"foo1":"bar1","foo2":"bar2"}},"client":"local_async","fun":"state.apply","username":"myuser","password":"<passwrod>","eauth":"pam"}]
我也尝试过:
external_auth:
pam:
myuser:
- '@runner':
- jobs.list_job
- '*':
- test.ping
- 'state.apply':
args:
- '.*'
external_auth:
pam:
myuser:
- '@runner':
- jobs.list_job
- '*':
- test.ping
- 'state.apply':
args:
- '.*'
kwargs:
'.*' : '.*'
如果我不指定
args
,它会起作用:
external_auth:
pam:
myuser:
- '@runner':
- jobs.list_job
- '*':
- test.ping
- state.apply
如何正确做?
args
字段应该是函数对象的字段。 IE。 :
错误:
'*':
- state.apply:
args:
- 'path/to/sls'
JSON 等价物
{
"*": [
{
"state.apply": null,
"args": [
"path/to/sls"
]
}
]
}
右:
'*':
- state.apply:
args:
- 'path/to/sls'
JSON 等价物
{
"*": [
{
"state.apply": {
"args": [
"path/to/sls"
]
}
}
]
}
原因在于我们传递值或创建限制的方式。
例如,如果您需要为 cmd.run 创建限制并仅允许具有此参数的函数
arg:"shell=powershell"
arg:"[System.Convert]::ToBase64String($pwd.path)"
这就是我在 .conf 中需要的
对 yourUser 的限制,在所有目标中 - '*' 只允许 cmd.run 如果参数是 #1 shell=powershell 并且第二个值是技巧,这是一个接受值 [System.Convert] 的 redex 函数::ToBase64String($pwd.path)
如果我限制使用失败的值,则需要传递正则表达式 这是测试正则表达式的好工具 https://regex101.com/
external_auth:
pam:
yourUSer:
- '*':
- cmd.run:
args:
- 'shell=powershell'
- '\[System\.Convert\]::ToBase64String\(\$pwd\.path\)'
curl --location 'https://master:8000' \
--header 'X-Auth-Token: YOURTOKE' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client=local' \
--data-urlencode 'tgt=targetID' \
--data-urlencode 'fun=cmd.run' \
--data-urlencode 'arg=shell=powershell' \
--data-urlencode 'arg=[System.Convert]::ToBase64String($pwd.path)'