Linux系統中掩耳盜鈴的sudo配置

  今天在這裏討論Linux系統中一個非常滑稽的系統配置失誤,就是sudo,爲什麼說是滑稽的配置呢,就是因爲如果配置不當的話,普通用戶非常容易就可以提權到root用戶,而且沒有一點技術含量,系統管理員自己以爲已經做好了權限管理,其實如果配置不當,權限漏洞已經出現。

  很多公司Linux系統都會用到sudo來配置普通用戶可以執行的超級用戶權限,一是爲了系統管理員更安全的操作系統,二是可以爲研發人員提供可控的權限範圍,下面就看一下我們在系統中常見的sudo配置文件。

admin ALL=(ALL) NOPASSWD: /app/nginx/sbin/nginx

  這一段配置文件顯示admin用戶可以通過sudo來調用root權限啓動nginx,相信這也是經常使用sudo的功能之一,因爲如果nginx啓動的是80端口的話,普通用戶是無法啓動的,因爲系統限制了1024以下的端口監聽只有root權限纔可以操作,問題大多出現在這個sbin目錄下的nginx可執行文件上,因爲我們既然要將nginx的管理權限交付給普通用戶admin,那麼大部分情況是nginx的所有文件權限所屬用戶及組也都爲admin,就像下面顯示的這樣。

[admin@localhost sbin]$ ll
總用量 3004-rwxr-xr-x 1 admin admin 3066035 9月  10 2014 nginx

  但是如果sbin目錄下的nginx文件權限也爲admin用戶,而此時該文件還在sudo權限配置中,那麼問題就來了,admin用戶可以將系統任意命令copy過來變成nginx文件,到這裏大家應該知道潛在的風險是有多大了,只要是任何命令文件admin用戶有隻讀權限,那麼就可以把文件變成nginx,隨意以root身份執行該命令,因爲sudo只關心執行的文件名,而不關心文件內容本身,如果此時admin用戶需要提權到root用戶下也很簡單,只要將系統的vi命令copy到sbin目錄下並重命名爲nginx,當文件替換後,此時的nginx文件就變成了系統的vi命令,如果admin用戶此時運行sudo nginx時就是以root用戶的權限來執行vi動作了,例如用戶執行sudo nginx /etc/sudoers,他就可以用root身份來編輯這個文件,從而給自己開放一個NO PASSWORD ALL的權限,只要保存sudo配置文件,執行sudo su -就可以輕鬆切換到root權限中來了,而後再將被替換的nginx文件復原,此時用root權限就可以輕鬆留下系統後門,同時再清空操作記錄,完成整個操作而不留痕跡,下面來總結一下admin提權需要的幾步操作。

[admin@localhost ~]$ sudo -l用戶 admin 可以在該主機上運行以下命令:
    (ALL) NOPASSWD: /app/nginx/sbin/nginx
[admin@localhost ~]$ which vi
/bin/vi
[admin@localhost ~]$ cp /bin/vi /app/nginx/sbin/nginx
[admin@localhost ~]$ sudo /app/nginx/sbin/nginx /etc/sudoers   //注意此時已經是調用root權限vi編輯sudoers文件了
[admin@localhost ~]$ sudo -l用戶 admin 可以在該主機上運行以下命令:
    (ALL) NOPASSWD: ALL
[admin@localhost ~]$ sudo su - root
[root@localhost ~]#   //用戶成功切換到root權限

  避免這樣的問題發生其實也很簡單,就是將我們需要執行的文件所屬權限都改爲root即可,這樣普通用戶就沒有辦法用copy的方法來改寫這個文件,因爲他對於該文件已經沒有操作權限了,從而也就規避了這種提權風險。

  最後提一下發現這個配置問題的過程,在很早剛開始負責運維工作時,那個時候還是在一家傳統互聯網企業,甲方對於權限的控制非常嚴格,對於系統操作人員只提供普通用戶權限,如果普通用戶需要操作apache或者是nginx等就需要配置sudo,由於申請root權限的流程非常繁瑣,在一次非常緊急的系統故障處理中就發現了這個方法,而當時的sudo可執行文件就存在權限所屬的問題,最終提權成功了,不過這種方法還是不鼓勵大家去做哈,如果在生產系統中發現有這樣的問題,應該及時更新修復,避免由於權限泄漏導致的更多問題。

原創文章首發自阿布的博客,本文地址:http://www.abuve.com/article/16


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章