天天看點

Linux權限相關:su,sudo,sudoers

關于Linux權限

在使用Linux系統過程中,通常情況下,我們都會使用普通使用者進行日常操作,而root使用者隻有在權限配置設定及系統設定時才會使用,而root使用者的密碼也不可能公開。普通使用者執行到系統程式時,需要臨時提升權限,sudo就是我們常用的指令,僅需要輸入目前使用者密碼,便可以完成權限的臨時提升。在使用sudo指令的過程中,我們經常會遇到目前使用者不在sudoers檔案中的提示資訊,如果解決該問題呢?通過下面幾個步驟,可以很簡單的解決此問題。

  • 切換到root使用者權限:
    su root
               
Linux權限相關:su,sudo,sudoers
  • 檢視/etc/sudoers檔案權限,如果隻讀權限,修改為可寫權限
    ls -l /etc/sudoers
         chmod 777 /etc/sudoers
               
Linux權限相關:su,sudo,sudoers
Linux權限相關:su,sudo,sudoers
  • 執行vi指令,編輯/etc/sudoers檔案

    添加要提升權限的使用者;在檔案中找到root ALL=(ALL) ALL,在該行下添加提升權限的使用者資訊,如:

    root ALL=(ALL) ALL

    user ALL=(ALL) ALL

    說明:格式為(使用者名 網絡中的主機=(執行指令::的目标使用者) 執行的指令範圍)

  • 儲存退出,并恢複/etc/sudoers的通路權限為440
    chmod 440 /etc/sudoers
           ls -l /etc/sudoers
               

然後來解釋一下這幾項的含義:

sudo : 獲得權限,以其它身份來執行指令 如: sudo add user (使用者名)

su和sudo的差別與使用

一. 使用 su 指令臨時切換使用者身份

1、 su 的适用條件和威力

su指令就是切換使用者 的工具,怎麼了解呢?比如我們以普通使用者beinan登入的,但要添加使用者任務,執行useradd ,beinan使用者沒有這個權限,而這個權限恰恰由root所擁有。

解決辦法無法有兩個,

一是退出beinan使用者,重新以root使用者登入,但這種辦法 并不是最好的;

二是我們沒有必要退出beinan使用者,可以用su來切換到root下進行添加使用者的工作,等任務完成後再退出root。我們可以看到當然 通過su 切換是一種比較好的辦法;

通過su可以在使用者之 間切換,如果超級權限使用者root向普通或虛拟使用者切換不需要密碼,什麼是權力?這就是!而普通使用者切換到其它任何使用者都需要密碼驗證;

2、 su 的用法:

su [OPTION選項參數] [使用者]
    -, -l, --login 登入并改變到所切換的使用者環境;
    -c, --commmand=COMMAND 執行一個指令,然後退出所切換到的使用者環境;
           

至于更詳細的,請參看 man su ;

3、 su 的範例:

su 在不加任何參數,預設為切換到root使用者,但沒有轉到root使用者家目錄下,也就是說這時雖然是切換為root使用者了,但并沒有改變root登入環境; 使用者預設的登入環境,可以在/etc/passwd 中查得到,包括家目錄,SHELL定義等;

su 加參數 - ,表示預設切換到root使用者,并且改變到root使用者的環境;

su 參數 - 使用者名

$ su - root            注:這個和su - 是一樣的功能;
                       Password:
                      [[email protected] ~]# pwd
                     /root
                    [***@localhost ~] $ su - linuxsir 注:這是切換到 linuxsir使用者
           

Password: 注:在這裡輸入密碼;

pwd 注:檢視使用者目前所處的位置;

Linux權限相關:su,sudo,sudoers

  id 注:檢視使用者的UID和GID資訊,主要是看是否切換過來了;

Linux權限相關:su,sudo,sudoers

4、 su的優缺點;

su 的确為管理帶來友善,通過切換到root下,能完成所有系統管理工具,隻要把root的密碼交給任何一個普通使用者,他都能切換到root來完成所有的系統 管理工作;但通過su切換到root後,也有不安全因素;比如系統有10個使用者,而且都參與管理。如果這10個使用者都涉及到超級權限的運用,做為管理者如 果想讓其它使用者通過su來切換到超級權限的root,必須把root權限密碼都告訴這10個使用者;如果這10個使用者都有root權限,通過root權限可 以做任何事,這在一定程度上就對系統的安全造成了威協;想想Windows吧,簡直就是惡夢;“沒有不安全的系統,隻有不安全的人”,我們絕對不能保證這 10個使用者都能按正常操作流程來管理系統,其中任何一人對系統操作的重大失誤,都可能導緻系統崩潰或資料損失;是以su 工具在多人參與的系統管理中,并不是最好的選擇,su隻适用于一兩個人參與管理的系統,畢竟su并不能讓普通使用者受限的使用;超級使用者root密碼應該掌 握在少數使用者手中,這絕對是真理!是以集權而治的存在還是有一定道理的;

二. sudo 授權許可使用的su,也是受限制的su

  1. sudo 的适用條件

    由于su 對切換到超級權限使用者root後,權限的無限制性,是以su并不能擔任多個管理者所管理的系統。如果用su 來切換到超級使用者來管理系統,也不能明确哪些工作是由哪個管理者進行的操作。特别是對于伺服器的管理有多人參與管理時,最好是針對每個管理者的技術特長和 管理範圍,并且有針對性的下放給權限,并且約定其使用哪些工具來完成與其相關的工作,這時我們就有必要用到 sudo。

    通過sudo,我們能 把某些超級權限有針對性的下放,并且不需要普通使用者知道root密碼,是以sudo 相對于權限無限制性的su來說,還是比較安全的,是以sudo 也能被稱為受限制的su ;另外sudo 是需要授權許可的,是以也被稱為授權許可su;

sudo 執行指令的流程是目前使用者切換到root(或其它指定切換到的使用者),然後以root(或其它指定的切換到的使用者)身份執行指令,執行完成後,直接退回到 目前使用者;而這些的前提是要通過sudo的配置檔案/etc/sudoers來進行授權;

2、 從編寫 sudo 配置檔案/etc/sudoers開始

sudo的配置檔案是 /etc/sudoers ,我們可以用他的專用編輯工具visodu ,此工具的好處是在添加規則不太準确時,儲存退出時會提示給我們錯誤資訊;配置好後,可以用切換到您授權的使用者下,通過sudo -l 來檢視哪些指令是可以執行或禁止的;

/etc/sudoers 檔案中每行算一個規則,前面帶有#号可以當作是說明的内容,并不執行;如果規則很長,一行列不下時,可以用\号來續行,這樣看來一個規則也可以擁有多個 行;

/etc/sudoers 的規則可分為兩類;一類是别名定義,另一類是授權規則;别名定義并不是必須的,但授權規則是必須的;

3、 /etc/sudoers 配置檔案中别名規則

别名規則定義格式如 下:

Alias_Type NAME = item1, item2, …

Alias_Type NAME = item1, item2, item3 : NAME = item4, item5

别名類型 (Alias_Type):别名類型包括如下四種

Host_Alias 定義主機名稱;

User_Alias 使用者别名,别名成員可以是使用者,使用者組(前面要加%号)

Runas_Alias 用來定義runas别名,這個别名指定的是“目的使用者”,即sudo 允許切換至的使用者;

Cmnd_Alias 定義指令别名;

NAME 就是别名了,NMAE的命名是包含大寫字母、下劃線以及數字,但必須以一個大寫字母開頭,比如SYNADM、SYN_ADM或SYNAD0是合法 的,sYNAMDA或1SYNAD是不合法的;

item 按中文翻譯是項目,在這裡我們可以譯成成員,如果一個别名下有多個成員,成員與成員之間,通過半角,号分隔;成員在必須是有效并事實存在的。什麼是有效的 呢?比如主機名,可以通過w檢視使用者的主機名(或ip位址),如果您隻是本地機操作,隻通過hostname 指令就能檢視;使用者名當然是在系統中存在的,在/etc/paswd中必須存在;對于定義指令别名,成員也必須在系統中事實存在的檔案名(需要絕對路 徑);

注:我們通過 Host_Alias 定義主機名稱時,項目可以是主機名、可以是單個ip(整段ip位址也可以),也可以是網絡掩碼;如果是主機名,必須是多台機器的網絡中,而且這些機器得能 通過主機名互相通信通路才有效。

User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun 注:定義使用者别名,下有四個成員;要在系統中确實在存在的;
            User_Alias NETAD=beinan,bnnb 注:定義使用者别名NETAD ,我想讓這個别名下的使用者來管理網絡,是以取了NETAD的别名;
          User_Alias WEBMASTER=linuxsir 注:定義使用者别名WEBMASTER,我想用這個别名下的使用者來管理網站;
             User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun:NETAD=beinan,bnnb:WEBMASTER=linuxsir 注:上面三行的别名定義,可以通過這一行來實作,請看前面的說明,是不是符合?
          Cmnd_Alias USERMAG=/usr/sbin/adduser,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod
         注意:指令别名下的成 員必須是檔案或目錄的絕對路徑;
       Cmnd_Alias DISKMAG=/sbin/fdisk,/sbin/parted
        Cmnd_Alias NETMAG=/sbin/ifconfig,/etc/init.d/network
       Cmnd_Alias KILL = /usr/bin/kill
     Cmnd_Alias PWMAG = /usr/sbin/reboot,/usr/sbin/halt
      Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
                            /usr/local/bin/tcsh, /usr/bin/rsh, \
                            /usr/local/bin/zsh
           

注:這行定義指令别名 有點長,可以通過 \ 号斷行;

Cmnd_Alias SU = /usr/bin/su,/bin,/sbin,/usr/sbin,/usr/bin

在上面的例子中,有 KILL和PWMAG的指令别名定義,我們可以合并為一行來寫,也就是等價行;

Cmnd_Alias KILL = /usr/bin/kill:PWMAG = /usr/sbin/reboot,/usr/sbin/halt 注:這一行就代表了KILL和PWMAG指令别名,把KILL和PWMAG的别名定義合并在一行寫也是可以的;

Runas_Alias OP = root, operator

Runas_Alias DBADM=mysql:OP = root, operator 注:這行是上面兩行的等價行;至于怎麼了解Runas_Alias ,我們必須得通過授權規則的執行個體來了解;

4、 /etc/sudoers中的授權規則

授權規則是配置設定權限的 執行規則,我們前面所講到的定義别名主要是為了更友善的授權引用别名;如果系統中隻有幾個使用者,其實下放權限比較有限的話,可以不用定義别名,而是針對系 統使用者直接直接授權,是以在授權規則中别名并不是必須的;

授權規則并不是無章可 尋,我們隻說基礎一點的,比較簡單的寫法,如果您想詳細了解授權規則寫法的,請參看man sudoers

授權使用者 主機=指令動作

這三個要素缺一不可, 但在動作之前也可以指定切換到特定使用者下,在這裡指定切換的使用者要用( )号括起來,如果不需要密碼直接運作指令的,應該加NOPASSWD:參數,但這些可以省略;舉例說明;

執行個體 一:

beinan ALL=/bin/chown,/bin/chmod

如果我們在/etc /sudoers 中添加這一行,表示beinan 可以在任何可能出現的主機名的系統中,可以切換到root使用者下執行 /bin/chown 和/bin/chmod 指令,通過sudo -l 來檢視beinan 在這台主機上允許和禁止運作的指令;

值得注意的是,在這裡 省略了指定切換到哪個使用者下執行/bin/shown 和/bin/chmod指令;在省略的情況下預設為是切換到root使用者下執行;同時也省略了是不是需要beinan使用者輸入驗證密碼,如果省略了,預設 為是需要驗證密碼。

為了更詳細的說明這 些,我們可以構造一個更複雜一點的公式;

授權使用者 主機=[(切換到哪些使用者或使用者組)] [是否需要密碼驗證] 指令1,[(切換到哪些使用者或使用者組)] [是否需要密碼驗證] [指令2],[(切換到哪些使用者或使用者組)] [是否需要密碼驗證] [指令3]…

注 解:

凡是[ ]中的内容,是可以省略;指令與指令之間用,号分隔;通過本文的例子,可以對照着看哪些是省略了,哪些地方需要有空格;

在[(切換到哪些使用者 或使用者組)] ,如果省略,則預設為root使用者;如果是ALL ,則代表能切換到所有使用者;注意要切換到的目的使用者必須用()号括起來,比如(ALL)、(beinan)

繼續閱讀