簡體   English   中英

Ansible - 我們是否需要在所有主機上配置具有 root 訪問權限的 sudo?

[英]Ansible - Do we need to configure sudo with root access on all hosts?

我有一個簡單的 ansible 測試手冊,可以在 locahost 和一個遠程主機上運行。
該劇本運行 linux 命令“pvs”,需要以 root 身份運行。
我在 ansible.cfg 中變成了=true。
在 localhost 上,用戶 test1 在 /etc/sudoers 中配置為“ugly” ALL=(ALL:ALL) NOPASSWD: ALL - 因為顯然沒有其他解決方案可以在不提供密碼的情況下以批處理模式以 root 身份啟動命令,正如 Vladimir 所證實的那樣:
在遠程節點上使用 sudoers 限制 Ansible 腳本模塊
(我可以做 Cmnd_Alias,但最后,ansible 需要 /bin/sh.. 所以沒有必要用其他命令來限制它)
而且,當我運行下面的劇本時,我還必須在遠程機器上配置相同的 sudoers 配置。
這是否意味着,在我們管理的所有機器上,我們需要讓這個“ansible”用戶通過 sudo 獲得 root 訪問權限? 我希望不會,否則這是一個非常大的安全問題。您有什么建議的解決方法或與我分享限制 root 訪問權限的想法嗎?

我的 ansible.cfg:

[privilege_escalation]
become                  = true # (this I need otherwise command  "pvs" will not run)
become_method           = sudo
become_user             = root
become_ask_pass         = false # (this also I need, do not want any manuel providing)
default_become          = true

劇本:

 1 ---
  2 - name: test remote machine connection
  3   #hosts: localhost
  4   hosts: all
  5   gather_facts: no
  6
  7   tasks:
  8     - name: get physical volumes
  9       #shell: pvs # OK for localhost, but NOT for remote host, as sudo is not configured
 10       #command:   # Same as above for remote host : "Missing sudo password"
 11         #cmd: pvs
 12       raw: pvs    # Same as above for remote host : "Missing sudo password"
 13       register: output
 14
 15     - name: Show output
 16       debug:
 17         msg: "{{ output.stdout }}"
 18

結果:

PLAY [test remote machine connection] *************************************************************************************

TASK [get physical volumes] *******************************************************************************************************
fatal: [sh2]: FAILED! => {"msg": "Missing sudo password"}
changed: [localhost]

TASK [Show output] ********************************************************************************************************
ok: [localhost] => {
    "msg": "  PV         VG             Fmt  Attr PSize   PFree  \n  /dev/xvdc  prdvvg         lvm2 a--  <10.00g  <2.00g\n  /dev/xvde  prdvvg         lvm2 a--  <10.00g <10.00g\n  /dev/xvdf  clone_prdtm1vg lvm2 a--  <10.00g  <2.00g\n  /dev/xvdg  clone_prdtm1vg lvm2 a--  <10.00g <10.00g\n"
}

PLAY RECAP ****************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
sh2                        : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

謝謝

如果你真的害怕擁有 nopasswd sudo 的用戶帳戶,那么有幾個選項:

  • 使用 pam_ssh [1] 使用 ssh 代理(由 Ansible 從 controller 傳遞到目標主機)具有無密碼 sudo。 它不會保護您的主機免受 controller 的影響,但至少,來自隨機用戶的本地進程不能自我升級。
  • 使用 ansible 的特殊帳戶,其他人無法運行任何東西(基本上,代理到 root),或者只是將服務器配置為 root。 這很簡單:通過 ssh 密鑰(無密碼)創建一個僅 ssh 訪問的用戶,並允許該用戶使用無密碼 sudo。 sudoers.d 片段如下所示: specialuser ALL=(ALL) NOPASSWD: ALL 這里的弱保護是主機上的任何人都不能成為specialuser沒有 root,只有 ansible controller 可以訪問該specialuser的私鑰。 這一切都不是無懈可擊,但至少你的qemu用戶不再可以通過簡單的 sudo 調用成為 root。
  • 您可能會嘗試為 ansible(又名連接插件)找到替代傳輸,但您所關心的主要是蒸汽軟件,因為問題是 ansible 可以做任何它想做的事情。

因此,對於 sudo,可以使用 pam_ssh,對於 ansible,可以使用專用用戶。

[1] https://wiki.gentoo.org/wiki/Pam_ssh_agent_auth

不幸的是,我認為沒有執行命令的選項需要 root 權限而沒有 sudoers 文件。

正如在此處回答的那樣,您只能允許您要執行的一個特定命令。 這可能像以下行:

ansible ALL=(ALL:ALL) NOPASSWD: /bin/sh -c echo BECOME-SUCCESS*; * pvs

如果您還沒有的話,另一個提高安全性的選項是在每個主機上創建一個特定的 ansible-user 並僅通過 SSH 允許從一個特定主機獲得的私鑰/公鑰進行身份驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM