起因:
linux中root擁有最高權限,有時候我們希望把部分權限授予給某個使用者,這個時候我們可以設定類似于passwd指令,設定suid,然後結合組權限進行管理,但是這種方法沒有辦法控制一些後面跟參數的指令,比如我們希望使用者都可以執行ifup eth0但是無法執行ifup eth1,而且這種方法也不安全,比如當我們臨時有事離開而忘了關電腦,此時又登入某個使用者,這個時候如果有人利用這個使用者執行一些危險操作,我們無法防範也無從追責,這個時候sudo就派上用場了。
su(switch user ):切換使用者身份
suid:當使用設定了suid權限的指令的時候,程序屬主為指令本身屬主,而不是目前啟用指令使用者身份
sudo(switch user do COMMAND):某個使用者能夠以某個使用者的身份在某主機執行某條指令
這裡的某主機指的是通過某主機連接配接到本地伺服器執行指令,而不是在那台主機上執行指令,跟ssh 不一樣,當執行sudo指令的時候需要輸入自身指令,sudo以此鑒定使用者身份,并寫入日志作為日後追責的依據。
sudo的配置檔案:/etc/sudoers 可以利用visudo進行編輯,這個指令可以鑒别sudoers的文法格式錯誤,類似crontab -e,幫助文檔:man 5 sudoers
一個sudo條目:
who which_host=(runas) [TAG:]command
TAG可有可無,比較常見的有:NOPASSWD,表示不需要密碼登入,其他比較少用不深究
who的可選格式如下:
User ::= ’!’* user name |
’!’* #uid |
’!’* %group |
’!’* %#gid |
’!’* +netgroup |
’!’* %:nonunix_group |
’!’* %:#nonunix_gid |
’!’* User_Alias
!表示取反,使用者可以直接接使用者名,也可以#跟uid,或者%跟組名, ::=和* |隻是幫助文檔的格式,沒有特殊意義
which_host:
Host ::= ’!’* host name |
’!’* ip_addr |
’!’* network(/netmask)? |
’!’* Host_Alias
runas:
Runas_Member ::= ’!’* user name |
’!’* #uid |
’!’* %group |
’!’* %#gid |
’!’* %:nonunix_group |
’!’* %:#nonunix_gid |
’!’* +netgroup |
’!’* Runas_Alia
command:
Cmnd ::= ’!’* command name |
’!’* directory |
’!’* "sudoedit" |
’!’* Cmnd_Alias
每個部分都可以做成别名,别名必須全部而且隻能使用大寫英文字母的組合,别名必須事先定義,而且别名也可以引用别人事先定義好的别名。
别名引用:直接輸入别名即可
别名格式: 關鍵字 别名 = 使用者 (多個使用者之間用,隔開,定義多個别名用:\換行分開)例如:
User_Alias FULLTIMERS = millert, mikef, dowdy
Runas_Alias OP = root, operator
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh,\(寫不下的時候用\續行)
/usr/local/bin/tcsh, /usr/bin/rsh,\
/usr/local/bin/zsh
sudo指令:
-l:列出目前使用者可以使用的所有sudo類指令
-k:讓認證資訊失效(sudo的時候,輸入密碼預設有5分鐘的過期時間,在這個時間内,不再需要輸入密碼)
一個例子:給使用者tom 授予useradd權限
答: visudo 添加 tom ALL=(ALL) /usr/sbin/useradd(這裡指令要寫完整路徑,否則報錯)
特殊例子:給使用者tom授予passwd權限
答:visudo添加 tom ALL=(root) /usr/bin/passwd
看起來沒有問題,但是這裡有個嚴重漏洞,當tom執行passwd并且後面不接使用者名的時候,因為sudo是以使用者root身份執行的,是以會修改root的密碼,這個時候我們可以改寫成visudo添加
tom ALL=(root) /usr/bin/passwd [a-zA-Z]* ! /usr/bin/passwd root
注:這裡的 [a-zA-Z]*是檔案名比對規則,因為你不加! /usr/bin/passwd root是無法單獨執行passwd的,正規表達式則可以。
本文轉自biao007h51CTO部落格,原文連結:http://blog.51cto.com/linzb/1858696 ,如需轉載請自行聯系原作者