我的問題是在使用Ansible时,如何限制一般使用者(regular user)在sudo權限下只能實行某些指令,而不是像root user一樣無限制。
舉例來說,如果在managed node中有個regular user叫做"ianyc",且sudoers file裡這樣規範:
"ianyc ALL=(ALL) /bin/ls"
代表此user僅能透過sudo執行ls指令。
然而在Ansible controller node中,如果我執行以下playbook:
-hosts: linux
become: yes
become_method: sudo
vars_files:
-/etc/ansible/sensitiveData.yml
vars:
ansible_become_pass: "{{ linuxSudoPassword }}"
tasks:
-name: list the directory
command: ls /root
register: result
-debug: var=result
其中linux代表managed node群組而sensitiveData是vault file,存放sudo password。會得到以下錯誤訊息:
"Sorry, user ianyc is not allowed to execute '/bin/sh -c echo BECOME-SUCCESS-orzksvkkqakoaplykpvjkycejidpddgv; /usr/bin/python /home/ianyc/.ansible/tmp/ansible-tmp-1554271272.93-107453846539342/AnsiballZ_setup.py' as root on localhost.localdomain."
請問這是什麼意思以及為什麼會發生此錯誤?
除此之外,我亦嘗試將"/bin/sh"加入到sudoer file中:
"ianyc ALL=(ALL) /bin/ls, /bin/sh"
如此一来,Ansible是可以執行的,但是問題會變成...
"不止sudo ls可以執行,而是全部指令(ex: touch /root/file1...etc)都可以執行"
因此,我想問在操作Ansible時,有没有什麼方法可以限制regular user在使用sudo權限時只能做特定的某些事?
給您一個笨方法
這我常用來在網頁上需要 root 權限去執行的方式
您在 root 權限下寫個有 su root 權限的 c 名稱 myls.c
#include <stdlib.h>
#include <unistd.h>
int main(){
setuid(0);
system("ls -la /root");
return 0;
}
寫好 就編譯(要裝 gcc)
gcc -o myls myls.c
改權限 su root 權限 及移至使用者目錄
chmod 4550 myls
mv myls /home/ianyc/.
那 使用者 ianyc 就可經由執行 myls 去用 root 權限 ls 那 /root 目錄了....
缺點是任何使用者都可經由執行 myls 去用 root 權限 ls 那 /root 目錄
所以 myls 只放到 ianyc 的家目錄就好