2011年7月19日

設定 sudo 時要記得禁止一般權限使用者執行 sudo sudo

在設定一般權限使用者可用 sudo 執行何種指令時,有以下兩種作法 (參考鳥哥的文章):

  • 白名單:明確列出使用者可以執行哪些指令,如:
    Cmnd_Alias USERADM = /bin/more, /bin/cat
    user     ALL=USERADM
    使用者只能以 sudo 執行 more 和 cat 指令。
  • 黑名單:明確列出使用者不可執行哪些指令,如:
    Cmnd_Alias NSU = /bin/su
    
    user     ALL=ALL, !NSU
    使用者不可以 sudo 執行 su 指令,其他指令都可以。
sudo sudo 問題只會發生在使用黑名單時,因為除了黑名單中所列的指令,其他指令都可以執行,而 OS 中的指令很多,有時候會發生漏擋的現象,而造成意想不到的結果。

上禮拜中無意發現,原本的黑名單中只有禁止 su 和 visudo 等指令,沒有禁止 sudo 指令,因此若執行「sudo passwd root」會出現「Sorry, user xxx is not allowed to execute '/usr/bin/passwd root' as root on server.」的訊息,這跟預料中的一樣,顯示黑名單有正確發揮作用。

但是若執行「sudo sudo passwd root」(因為當時眼殘,沒注意到已經打了一次 sudo,就重複了),則可以成功變更 root 密碼!因此若要使用黑名單,除了禁止 su、visudo、passwd root、userdel root 等等指令以外,還要記得禁止 sudo 指令,才不會留下漏洞!

由此可知,使用白名單是比較安全的作法,畢竟使用者可以執行哪些指令都清楚的寫在設定檔中,一目了然,就不會有忘記禁止哪些指令的問題了。

2012-04-13更新:
目前使用的黑名單如下:

Cmnd_Alias NSUREAD = /bin/su,/usr/bin/sudo,/usr/sbin/visudo,/usr/bin/passwd root,/usr/sbin/userdel,/sbin/sysctl -w *

比較特別的是最後加上去的「/sbin/sysctl -w *」,主要是禁止一般 user 以 sudo 的方式變更任何系統參數 (例如 net.ipv4.tcp_keepalive_time ),但若只設定「/sbin/sysctl -w」,沒有加上「*」的話,還是可以變更成功 (因為 -w 之後要加上參數的 key=value,例如 /sbin/sysctl -w net.ipv4.tvp_keepalive_time=300),只是不能執行「sudo /sbin/syscrl -w」(不帶任何參數) 而已,但這樣是沒有意義的,因為 -w 後面必定要接欲變更的參數。因此要加上「*」才能禁止一般 user 透過 sudo /sbin/stsctl -w 變更「任何」系統參數。

雖然目前暫時只有針對 sysctl 指令做這樣的限制,但其他需要參數的指令,以及參數內容可能會任意變化的指令,用「*」去擋就對啦!

沒有留言:

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D