天天看點

sudo

起因:

    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 ,如需轉載請自行聯系原作者

上一篇: cisco QOS限速
下一篇: mysql備份shell