關于群組: 有效與初始群組、groups, newgrp管理員的工作中,相當重要的一環就是『管理賬號』啦!
- 使用者標識符: UID 與 GID
雖然我們登陸 Linux 主機的時候,輸入的是我們的賬號,但是其實 Linux 主機并不會直接認識你的『賬號名稱』的,他僅認識 ID 啊 (ID 就是一組號碼啦)。 由于計算機僅認識 0 與 1,所以主機對于數字比較有概念的;至于賬號只是為了讓人們容易記憶而已。 而你的 ID 與賬號的對應就在 /etc/passwd 當中哩。每個登陸的使用者至少都會取得兩個 ID ,一個是使用者 ID (User ID ,簡稱 UID)、一個是群組 ID (Group ID ,簡稱 GID)。
那么文件如何判別他的擁有者與群組呢?其實就是利用 UID 與 GID 啦!每一個文件都會有所謂的擁有者 ID 與擁有群組 ID ,當我們有要顯示文件屬性的需求時,系統會依據 /etc/passwd 與 /etc/group 的內容, 找到 UID / GID 對應的賬號與組名再顯示出來!
你登錄系統,系統幫你處理了什么呢?
- 先找尋 /etc/passwd 里面是否有你輸入的賬號?如果沒有則跳出,如果有的話則將該賬號對應的 UID 與 GID (在 /etc/group 中) 讀出來,另外,該賬號的家目錄與 shell 配置也一并讀出;
- 再來則是核對口令表啦!這時 Linux 會進入 /etc/shadow 里面找出對應的賬號與 UID,然后核對一下你剛剛輸入的口令與里頭的口令是否相符?
- 如果一切都 OK 的話,就進入 Shell 控管的階段啰!
跟使用者賬號有關的有兩個非常重要的文件,一個是管理使用者 UID/GID 重要參數的 /etc/passwd ,一個則是專門管理口令相關數據的 /etc/shadow 啰!那這兩個文件的內容就非常值得進行研究啦!
- /etc/passwd 文件結構
這個文件的構造是這樣的:每一行都代表一個賬號,有幾行就代表有幾個賬號在你的系統中! 不過需要特別留意的是,里頭很多賬號本來就是系統正常運行所必須要的,我們可以簡稱他為系統賬號, 例如 bin, daemon, adm, nobody 等等,這些賬號請不要隨意的殺掉他呢! 這個文件的內容有點像這樣:
[root@localhost ~]# cat /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinOperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinvcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologinrpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologinrpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologinnfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologinsshd:x:74:74:PRivilege-separated SSH:/var/empty/sshd:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologin每一行使用『:』分隔開,共有七個咚咚,分別是:
- 賬號名稱: 就是賬號啦!用來對應 UID 的。例如 root 的 UID 對應就是 0 (第三字段);
- 口令: 早期 Unix 系統的口令就是放在這字段上!但是因為這個文件的特性是所有的程序都能夠讀取,這樣一來很容易造成口令數據被竊取, 因此后來就將這個字段的口令數據給他改放到 /etc/shadow 中了。所以這里你會看到一個『 x 』,呵呵!
- UID: 這個就是使用者標識符啰!通常 Linux 對于 UID 有幾個限制需要說給您了解一下:
id 范圍 該 ID 使用者特性 0 (系統管理員)
當 UID 是 0 時,代表這個賬號是『系統管理員』! 所以當你要讓其他的賬號名稱也具有 root 的權限時,將該賬號的 UID 改為 0 即可。 這也就是說,一部系統上面的系統管理員不見得只有 root 喔! 不過,很不建議有多個賬號的 UID 是 0 啦~ 1~499 (系統賬號)
保留給系統使用的 ID,其實除了 0 之外,其他的 UID 權限與特性并沒有不一樣。默認 500 以下的數字讓給系統作為保留賬號只是一個習慣。 由于系統上面啟動的服務希望使用較小的權限去運行,因此不希望使用 root 的身份去運行這些服務, 所以我們就得要提供這些運行中程序的擁有者賬號才行。這些系統賬號通常是不可登陸的。根據系統賬號的由來,通常系統賬號又約略被區分為兩種: 1~99:由 distributions 自行創建的系統賬號; 100~499:若用戶有系統賬號需求時,可以使用的賬號 UID。
500~65535 (可登陸賬號)
給一般使用者用的。事實上,目前的 linux 核心 (2.6.x 版)已經可以支持到 4294967295 (2^32-1) 這么大的 UID 號碼喔! - GID: 這個與 /etc/group 有關!其實 /etc/group 的觀念與 /etc/passwd 差不多,只是他是用來規范組名與 GID 的對應而已!
- 用戶信息說明欄: 這個字段基本上并沒有什么重要用途,只是用來解釋這個賬號的意義而已!不過,如果您提供使用 finger 的功能時, 這個字段可以提供很多的信息呢!
- 家目錄: 這是用戶的家目錄,以上面為例, root 的家目錄在 /root ,所以當 root 登陸之后,就會立刻跑到 /root 目錄里頭啦!呵呵! 如果你有個賬號的使用空間特別的大,你想要將該賬號的家目錄移動到其他的硬盤去該怎么作? 沒有錯!可以在這個字段進行修改呦!默認的用戶家目錄在 /home/yourIDname
- Shell: 當用戶登陸系統后就會取得一個 Shell 來與系統的核心溝通以進行用戶的操作任務。那為何默認 shell 會使用 bash 呢?就是在這個字段指定的啰! 這里比較需要注意的是,有一個 shell 可以用來替代成讓賬號無法取得 shell 環境的登陸動作!那就是 /sbin/nologin 這個東西!這也可以用來制作純 pop 郵件賬號者的數據呢!
- /etc/shadow 文件結構
我們知道很多程序的運行都與權限有關,而權限與 UID/GID 有關!因此各程序當然需要讀取 /etc/passwd 來了解不同賬號的權限。 因此 /etc/passwd 的權限需配置為 -rw-r--r-- 這樣的情況, 雖然早期的口令也有加密過,但卻放置到 /etc/passwd 的第二個字段上!這樣一來很容易被有心人士所竊取的, 加密過的口令也能夠透過暴力破解法去 try and error (試誤) 找出來!
因為這樣的關系,所以后來發展出將口令移動到 /etc/shadow 這個文件分隔開來的技術, 而且還加入很多的口令限制參數在 /etc/shadow 里頭呢!在這里,我們先來了解一下這個文件的構造吧!
[root@localhost ~]# cat /etc/shadowroot:$6$9MO6Rei52Ks4sUwV$U7nP7q/SZkeVgYo0mFmtm4SD6SEVRe6PVSd.xYIIOyxmIAnACQQHPeXYxdo/VA4gEUgz9erdECMQPj1KSFrXV0:16377:0:99999:7:::bin:*:15513:0:99999:7:::daemon:*:15513:0:99999:7:::adm:*:15513:0:99999:7:::lp:*:15513:0:99999:7:::sync:*:15513:0:99999:7:::shutdown:*:15513:0:99999:7:::halt:*:15513:0:99999:7:::mail:*:15513:0:99999:7:::uucp:*:15513:0:99999:7:::operator:*:15513:0:99999:7:::games:*:15513:0:99999:7:::gopher:*:15513:0:99999:7:::ftp:*:15513:0:99999:7:::nobody:*:15513:0:99999:7:::vcsa:!!:16377::::::rpc:!!:16377:0:99999:7:::rpcuser:!!:16377::::::nfsnobody:!!:16377::::::sshd:!!:16377::::::ntp:!!:16381::::::基本上, shadow 同樣以『:』作為分隔符,如果數一數,會發現共有九個字段啊,這九個字段的用途是這樣的:
- 賬號名稱: 由于口令也需要與賬號對應啊~因此,這個文件的第一欄就是賬號,必須要與 /etc/passwd 相同才行!
- 口令: 這個字段內的數據才是真正的口令,而且是經過編碼的口令 (加密) 啦! 你只會看到有一些特殊符號的字母就是了!需要特別留意的是,雖然這些加密過的口令很難被解出來, 但是『很難』不等于『不會』,所以,這個文件的默認權限是『-rw-------』或者是『-r--------』,亦即只有 root 才可以讀寫就是了!你得隨時注意,不要不小心更動了這個文件的權限呢! 另外,由于各種口令編碼的技術不一樣,因此不同的編碼系統會造成這個字段的長度不相同。 舉例來說,舊式的 DES 編碼系統產生的口令長度就與目前慣用的 md5 不同!MD5 的口令長度明顯的比較長些。由于固定的編碼系統產生的口令長度必須一致,因此『當你讓這個字段的長度改變后,該口令就會失效(算不出來)』。 很多軟件透過這個功能,在此字段前加上 ! 或 * 改變口令字段長度,就會讓口令『暫時失效』了。
- 最近更動口令的日期: 這個字段記錄了『更動口令那一天』的日期,不過,很奇怪呀!在我的例子中怎么會是 14126 呢?呵呵,這個是因為計算 Linux 日期的時間是以 1970 年 1 月 1 日作為 1 而累加的日期,1971 年 1 月 1 日則為 366 啦! 得注意一下這個數據呦!上述的 14126 指的就是 2008-09-04 那一天啦!了解乎? 而想要了解該日期可以使用本章后面 chage 命令的幫忙!
- 口令不可被更動的天數:(與第 3 字段相比) 第四個字段記錄了:這個賬號的口令在最近一次被更改后需要經過幾天才可以再被變更!如果是 0 的話, 表示口令隨時可以更動的意思。這的限制是為了怕口令被某些人一改再改而設計的!如果配置為 20 天的話,那么當你配置了口令之后, 20 天之內都無法改變這個口令呦!
- 口令需要重新變更的天數:(與第 3 字段相比) 經常變更口令是個好習慣!為了強制要求用戶變更口令,這個字段可以指定在最近一次更改口令后, 在多少天數內需要再次的變更口令才行。你必須要在這個天數內重新配置你的口令,否則這個賬號的口令將會『變為過期特性』。 而如果像上面的 99999 (計算為 273 年) 的話,那就表示,呵呵,口令的變更沒有強制性之意。
- 口令需要變更期限前的警告天數:(與第 5 字段相比) 當賬號的口令有效期限快要到的時候 (第 5 字段),系統會依據這個字段的配置,發出『警告』言論給這個賬號,提醒他『再過 n 天你的口令就要過期了,請盡快重新配置你的口令呦!』,如上面的例子,則是口令到期之前的 7 天之內,系統會警告該用戶。
- 口令過期后的賬號寬限時間(口令失效日):(與第 5 字段相比) 口令有效日期為『升級日期(第3字段)』+『重新變更日期(第5字段)』,過了該期限后用戶依舊沒有升級口令,那該口令就算過期了。 雖然口令過期但是該賬號還是可以用來進行其他工作的,包括登陸系統取得 bash 。不過如果口令過期了, 那當你登陸系統時,系統會強制要求你必須要重新配置口令才能登陸繼續使用喔,這就是口令過期特性。 那這個字段的功能是什么呢?是在口令過期幾天后,如果使用者還是沒有登陸更改口令,那么這個賬號的口令將會『失效』, 亦即該賬號再也無法使用該口令登陸了。要注意口令過期與口令失效并不相同。
- 賬號失效日期: 這個日期跟第三個字段一樣,都是使用 1970 年以來的總日數配置。這個字段表示: 這個賬號在此字段規定的日期之后,將無法再使用。 就是所謂的『賬號失效』,此時不論你的口令是否有過期,這個『賬號』都不能再被使用! 這個字段會被使用通常應該是在『收費服務』的系統中,你可以規定一個日期讓該賬號不能再使用啦!
- 保留: 最后一個字段是保留的,看以后有沒有新功能加入。
- 一般用戶的口令忘記了:這個最容易解決,請系統管理員幫忙, 他會重新配置好你的口令而不需要知道你的舊口令!利用 root 的身份使用 passwd 命令來處理即可。
- root 口令忘記了:這就麻煩了!因為你無法使用 root 的身份登陸了嘛! 但我們知道 root 的口令在 /etc/shadow 當中,因此你可以使用各種可行的方法啟動進入 Linux 再去修改。 例如重新啟動進入單人維護模式后,系統會主動的給予 root 權限的 bash 接口, 此時再以 passwd 修改口令即可;或以 Live CD 啟動后掛載根目錄去修改 /etc/shadow,將里面的 root 的口令字段清空, 再重新啟動后 root 將不用口令即可登陸!登陸后再趕快以 passwd 命令去配置 root 口令即可。
賬號管理認識了賬號相關的兩個文件 /etc/passwd 與 /etc/shadow 之后,你或許還是會覺得奇怪, 那么群組的配置文件在哪里?還有,在 /etc/passwd 的第四欄不是所謂的 GID 嗎?那又是啥? 呵呵~此時就需要了解 /etc/group 與 /etc/gshadow 啰~
- /etc/group 文件結構
這個文件就是在記錄 GID 與組名的對應了~鳥哥測試機的 /etc/group 內容有點像這樣:
[root@localhost ~]# head -n 4 /etc/grouproot:x:0:bin:x:1:bin,daemondaemon:x:2:bin,daemonsys:x:3:bin,adm這個文件每一行代表一個群組,也是以冒號『:』作為字段的分隔符,共分為四欄,每一字段的意義是:
- 組名: 就是組名啦!
- 群組口令: 通常不需要配置,這個配置通常是給『群組管理員』使用的,目前很少有這個機會配置群組管理員啦! 同樣的,口令已經移動到 /etc/gshadow 去,因此這個字段只會存在一個『x』而已;
- GID: 就是群組的 ID 啊。我們 /etc/passwd 第四個字段使用的 GID 對應的群組名,就是由這里對應出來的!
- 此群組支持的賬號名稱: 我們知道一個賬號可以加入多個群組,那某個賬號想要加入此群組時,將該賬號填入這個字段即可。 舉例來說,如果我想要讓 dmtsai 也加入 root 這個群組,那么在第一行的最后面加上『,dmtsai』,注意不要有空格, 使成為『 root:x:0:root,dmtsai 』就可以啰~
新增與移除群組新增與移除使用者: useradd, 相關配置文件, passwd, usermod, userdel
- useradd
[root@www ~]# useradd [-u UID] [-g 初始群組] [-G 次要群組] [-mM]/> [-c 說明欄] [-d 家目錄絕對路徑] [-s shell] 使用者賬號名選項與參數:-u :后面接的是 UID ,是一組數字。直接指定一個特定的 UID 給這個賬號;-g :后面接的那個組名就是我們上面提到的 initial group 啦~ 該群組的 GID 會被放置到 /etc/passwd 的第四個字段內。-G :后面接的組名則是這個賬號還可以加入的群組。 這個選項與參數會修改 /etc/group 內的相關數據喔!-M :強制!不要創建用戶家目錄!(系統賬號默認值)-m :強制!要創建用戶家目錄!(一般賬號默認值)-c :這個就是 /etc/passwd 的第五欄的說明內容啦~可以隨便我們配置的啦~-d :指定某個目錄成為家目錄,而不要使用默認值。務必使用絕對路徑!-r :創建一個系統的賬號,這個賬號的 UID 會有限制 (參考 /etc/login.defs)-s :后面接一個 shell ,若沒有指定則默認是 /bin/bash 的啦~-e :后面接一個日期,格式為『YYYY-MM-DD』此項目可寫入 shadow 第八字段, 亦即賬號失效日的配置項目啰;-f :后面接 shadow 的第七字段項目,指定口令是否會失效。0為立刻失效, -1 為永遠不失效(口令只會過期而強制于登陸時重新配置而已。)范例一:完全參考默認值創建一個用戶,名稱為 vbird1[root@www ~]# useradd vbird1[root@www ~]# ll -d /home/vbird1drwx------ 4 vbird1 vbird1 4096 Feb 25 09:38 /home/vbird1# 默認會創建用戶家目錄,且權限為 700 !這是重點!- passwd
[root@www ~]# passwd [-l] [-u] [--stdin] [-S] /> [-n 日數] [-x 日數] [-w 日數] [-i 日期] 賬號 <==root 功能選項與參數:--stdin :可以透過來自前一個管線的數據,作為口令輸入,對 shell script 有幫助!-l :是 Lock 的意思,會將 /etc/shadow 第二欄最前面加上 ! 使口令失效;-u :與 -l 相對,是 Unlock 的意思!-S :列出口令相關參數,亦即 shadow 文件內的大部分信息。-n :后面接天數,shadow 的第 4 字段,多久不可修改口令天數-x :后面接天數,shadow 的第 5 字段,多久內必須要更動口令-w :后面接天數,shadow 的第 6 字段,口令過期前的警告天數-i :后面接『日期』,shadow 的第 7 字段,口令失效日期范例一:請 root 給予 vbird2 口令[root@www ~]# passwd vbird2Changing passWord for user vbird2.New UNIX password: <==這里直接輸入新的口令,屏幕不會有任何反應BAD PASSWORD: it is WAY too short <==口令太簡單或過短的錯誤!Retype new UNIX password: <==再輸入一次同樣的口令passwd: all authentication tokens updated successfully. <==竟然還是成功修改了!root 果然是最偉大的人物!當我們要給予用戶口令時,透過 root 來配置即可。 root 可以配置各式各樣的口令,系統幾乎一定會接受!所以您瞧瞧,如同上面的范例一,明明鳥哥輸入的口令太短了, 但是系統依舊可接受 vbird2 這樣的口令配置。這個是 root 幫忙配置的結果,那如果是用戶自己要改口令呢? 包括 root 也是這樣修改的喔!范例二:用 vbird2 登陸后,修改 vbird2 自己的口令[vbird2@www ~]$ passwd <==后面沒有加賬號,就是改自己的口令!Changing password for user vbird2.Changing password for vbird2(current) UNIX password: <==這里輸入『原有的舊口令』New UNIX password: <==這里輸入新口令BAD PASSWORD: it is based on a dictionary word <==口令檢驗不通過,請再想個新口令New UNIX password: <==這里再想個來輸入吧Retype new UNIX password: <==通過口令驗證!所以重復這個口令的輸入passwd: all authentication tokens updated successfully. <==有無成功看關鍵詞- usermod
在 useradd 的時候加入了錯誤的配置數據?;蛘呤牵谑褂?useradd 后,發現某些地方還可以進行細部修改。 此時,當然我們可以直接到 /etc/passwd 或 /etc/shadow 去修改相對應字段的數據, 不過,Linux 也有提供相關的命令讓大家來進行賬號相關數據的微調呢~那就是 usermod 啰~
[root@www ~]# usermod [-cdegGlsuLU] username選項與參數:-c :后面接賬號的說明,即 /etc/passwd 第五欄的說明欄,可以加入一些賬號的說明。-d :后面接賬號的家目錄,即修改 /etc/passwd 的第六欄;-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內的第八個字段數據啦!-f :后面接天數,為 shadow 的第七字段。-g :后面接初始群組,修改 /etc/passwd 的第四個字段,亦即是 GID 的字段!-G :后面接次要群組,修改這個使用者能夠支持的群組,修改的是 /etc/group 啰~-a :與 -G 合用,可『添加次要群組的支持』而非『配置』喔!-l :后面接賬號名稱。亦即是修改賬號名稱, /etc/passwd 的第一欄!-s :后面接 Shell 的實際文件,例如 /bin/bash 或 /bin/csh 等等。-u :后面接 UID 數字啦!即 /etc/passwd 第三欄的數據;-L :暫時將用戶的口令凍結,讓他無法登陸。其實僅改 /etc/shadow 的口令欄。-U :將 /etc/shadow 口令欄的 ! 拿掉,解凍啦!如果你仔細的比對,會發現 usermod 的選項與 useradd 非常類似! 這是因為 usermod 也是用來微調 useradd 添加的使用者參數嘛!不過 usermod 還是有新增的選項, 那就是 -L 與 -U ,不過這兩個選項其實與 passwd 的 -l, -u 是相同的!而且也不見得會存在所有的 distribution 當中!
- userdel
這個功能就太簡單了,目的在刪除用戶的相關數據,而用戶的數據有:
- 用戶賬號/口令相關參數:/etc/passwd, /etc/shadow
- 使用者群組相關參數:/etc/group, /etc/gshadow
- 用戶個人文件數據: /home/username, /var/spool/mail/username..
整個命令的語法非常簡單:
[root@www ~]# userdel [-r] username選項與參數:-r :連同用戶的家目錄也一起刪除范例一:刪除 vbird2 ,連同家目錄一起刪除[root@www ~]# userdel -r vbird2這個命令下達的時候要小心了!通常我們要移除一個賬號的時候,你可以手動的將 /etc/passwd 與 /etc/shadow 里頭的該賬號取消即可!一般而言,如果該賬號只是『暫時不激活』的話,那么將 /etc/shadow 里頭賬號失效日期 (第八字段) 配置為 0 就可以讓該賬號無法使用,但是所有跟該賬號相關的數據都會留下來! 使用 userdel 的時機通常是『你真的確定不要讓該用戶在主機上面使用任何數據了!』
另外,其實用戶如果在系統上面操作過一陣子了,那么該用戶其實在系統內可能會含有其他文件的。 舉例來說,他的郵件信箱 (mailbox) 的文件。 所以,如果想要完整的將某個賬號完整的移除,最好可以在下達 userdel -r username 之前, 先以『 find / -user username 』查出整個系統內屬于 username 的文件,然后再加以刪除吧。
使用者身份切換
- groupadd
[root@www ~]# groupadd [-g gid] [-r] 組名選項與參數:-g :后面接某個特定的 GID ,用來直接給予某個 GID ~-r :創建系統群組啦!與 /etc/login.defs 內的 GID_MIN 有關。范例一:新建一個群組,名稱為 group1[root@www ~]# groupadd group1[root@www ~]# grep group1 /etc/group /etc/gshadow/etc/group:group1:x:702:/etc/gshadow:group1:!::# 群組的 GID 也是會由 500 以上最大 GID+1 來決定!- groupdel
[root@www ~]# groupdel [groupname]范例一:將剛剛的 mygroup 刪除![root@www ~]# groupdel mygroup范例二:若要刪除 vbird1 這個群組的話?[root@www ~]# groupdel vbird1groupdel: cannot remove user's primary group.- gpasswd:群組管理員功能
# 關于系統管理員(root)做的動作:[root@www ~]# gpasswd groupname[root@www ~]# gpasswd [-A user1,...] [-M user3,...] groupname[root@www ~]# gpasswd [-rR] groupname選項與參數: :若沒有任何參數時,表示給予 groupname 一個口令(/etc/gshadow)-A :將 groupname 的主控權交由后面的使用者管理(該群組的管理員)-M :將某些賬號加入這個群組當中!-r :將 groupname 的口令移除-R :讓 groupname 的口令欄失效# 關于群組管理員(Group administrator)做的動作:[someone@www ~]$ gpasswd [-ad] user groupname選項與參數:-a :將某位使用者加入到 groupname 這個群組當中!-d :將某位使用者移除出 groupname 這個群組當中。范例一:創建一個新群組,名稱為 testgroup 且群組交由 vbird1 管理:[root@www ~]# groupadd testgroup <==先創建群組[root@www ~]# gpasswd testgroup <==給這個群組一個口令吧!Changing the password for group testgroupNew Password:Re-enter new password:# 輸入兩次口令就對了![root@www ~]# gpasswd -A vbird1 testgroup <==加入群組管理員為 vbird1[root@www ~]# grep testgroup /etc/group /etc/gshadow/etc/group:testgroup:x:702:/etc/gshadow:testgroup:$1$I5ukIY1.$o5fmW.cOsc8.K.FHAFLWg0:vbird1:# 很有趣吧!此時 vbird1 則擁有 testgroup 的主控權喔!身份有點像板主啦!范例二:以 vbird1 登陸系統,并且讓他加入 vbird1, vbird3 成為 testgroup 成員[vbird1@www ~]$ iduid=504(vbird1) gid=505(vbird1) groups=505(vbird1) ....# 看得出來,vbird1 尚未加入 testgroup 群組喔![vbird1@www ~]$ gpasswd -a vbird1 testgroup[vbird1@www ~]$ gpasswd -a vbird3 testgroup[vbird1@www ~]$ grep testgroup /etc/grouptestgroup:x:702:vbird1,vbird3
在 Linux 系統當中還要作身份的變換?這是為啥?可能有底下幾個原因啦!
- 使用一般賬號:系統平日操作的好習慣 事實上,為了安全的緣故,一些老人家都會建議你,盡量以一般身份使用者來操作 Linux 的日常作業!等到需要配置系統環境時, 才變換身份成為 root 來進行系統管理,相對比較安全啦!避免作錯一些嚴重的命令,例如恐怖的『 rm -rf / 』(千萬作不得!)
- 用較低權限啟動系統服務 相對于系統安全,有的時候,我們必須要以某些系統賬號來進行程序的運行。 舉例來說, Linux 主機上面的一套軟件,名稱為 apache ,我們可以額外創建一個名為 apache 的用戶來啟動 apache 軟件啊,如此一來,如果這個程序被攻破,至少系統還不至于就損毀了~
軟件本身的限制 在遠古時代的 telnet 程序中,該程序默認是不許使用 root 的身份登陸的,telnet 會判斷登陸者的 UID, 若 UID 為 0 的話,那就直接拒絕登陸了。所以,你只能使用一般使用者來登陸 Linux 服務器。 此外, ssh (注3) 也可以配置拒絕 root 登陸喔!那如果你有系統配置需求該如何是好啊?就變換身份??!
由于上述考慮,所以我們都是使用一般賬號登陸系統的,等有需要進行系統維護或軟件升級時才轉為 root 的身份來動作。 那如何讓一般使用者轉變身份成為 root 呢?主要有兩種方式喔:
- 以『 su - 』直接將身份變成 root 即可,但是這個命令卻需要 root 的口令,也就是說,如果你要以 su 變成 root 的話,你的一般使用者就必須要有 root 的口令才行;
- 以『 sudo 命令 』運行 root 的命令串,由于 sudo 需要事先配置妥當,且 sudo 需要輸入用戶自己的口令, 因此多人共管同一部主機時, sudo 要比 su 來的好喔!至少 root 口令不會流出去!
底下我們就來說一說 su 跟 sudo 的用法啦!
su 是最簡單的身份切換命令了,他可以進行任何身份的切換??!方法如下:[root@www ~]# su [-lm] [-c 命令] [username]選項與參數:- :單純使用 - 如『 su - 』代表使用 login-shell 的變量文件讀取方式來登陸系統;若使用者名稱沒有加上去,則代表切換為 root 的身份。-l :與 - 類似,但后面需要加欲切換的使用者賬號!也是 login-shell 的方式。-m :-m 與 -p 是一樣的,表示『使用目前的環境配置,而不讀取新使用者的配置文件』-c :僅進行一次命令,所以 -c 后面可以加上命令喔!這個 su 的用法當中,有沒有加上那個減號『 - 』差很多喔! 因為涉及 login-shell 與 non-login shell 的變量讀取方法。這里讓我們以一個小例子來說明吧!范例一:假設你原本是 vbird1 的身份,想要使用 non-login shell 的方式變成 root[vbird1@www ~]$ su <==注意提示字符,是 vbird1 的身份喔!Password: <==這里輸入 root 的口令喔![root@www vbird1]# id <==提示字符的目錄是 vbird1 喔!uid=0(root) gid=0(root) groups=0(root),1(bin),... <==確實是 root 的身份![root@www vbird1]# env | grep 'vbird1'USER=vbird1PATH=/usr/local/bin:/bin:/usr/bin:/home/vbird1/bin <==這個影響最大!MAIL=/var/spool/mail/vbird1 <==收到的 mailbox 是 vbird1PWD=/home/vbird1 <==并非 root 的家目錄LOGNAME=vbird1# 雖然你的 UID 已經是具有 root 的身份,但是看到上面的輸出信息嗎?# 還是有一堆變量為原本 vbird1 的身份,所以很多數據還是無法直接利用。[root@www vbird1]# exit <==這樣可以離開 su 的環境!單純使用『 su 』切換成為 root 的身份,讀取的變量配置方式為 non-login shell 的方式,這種方式很多原本的變量不會被改變, 尤其是我們之前談過很多次的 PATH 這個變量,由于沒有改變成為 root 的環境 (一堆 /sbin, /usr/sbin 等目錄都沒有被包含進來), 因此很多 root 慣用的命令就只能使用絕對路徑來運行咯。其他的還有 MAIL 這個變量,你輸入 mail 時, 收到的郵件竟然還是 vbird1 的,而不是 root 本身的郵件!是否覺得很奇怪??!所以切換身份時,請務必使用如下的范例二:范例二:使用 login shell 的方式切換為 root 的身份并觀察變量[vbird1@www ~]$ su -Password: <==這里輸入 root 的口令喔![root@www ~]# env | grep rootUSER=rootMAIL=/var/spool/mail/rootPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/binPWD=/rootHOME=/rootLOGNAME=root# 了解差異了吧?下次變換成為 root 時,記得最好使用 su - 喔![root@www ~]# exit <==這樣可以離開 su 的環境!su 就這樣簡單的介紹完畢,總結一下他的用法是這樣的:
- 若要完整的切換到新使用者的環境,必須要使用『 su - username 』或『 su -l username 』, 才會連同 PATH/USER/MAIL 等變量都轉成新用戶的環境;
- 如果僅想要運行一次 root 的命令,可以利用『 su - -c "命令串" 』的方式來處理;
- 使用 root 切換成為任何使用者時,并不需要輸入新用戶的口令;
雖然使用 su 很方便啦,不過缺點是,當我的主機是多人共管的環境時,如果大家都要使用 su 來切換成為 root 的身份,那么不就每個人都得要知道 root 的口令,這樣口令太多人知道可能會流出去, 很不妥當呢!怎辦?透過 sudo 來處理即可!
minimal版沒有sudo軟件,yum install sudo安裝一下,下面的visudo同樣需要sudo軟件。
相對于 su 需要了解新切換的用戶口令 (常常是需要 root 的口令), sudo 的運行則僅需要自己的口令即可! 甚至可以配置不需要口令即可運行 sudo 呢!由于 sudo 可以讓你以其他用戶的身份運行命令 (通常是使用 root 的身份來運行命令),因此并非所有人都能夠運行 sudo , 而是僅有規范到 /etc/sudoers 內的用戶才能夠運行 sudo 這個命令喔!
[root@www ~]# sudo [-b] [-u 新使用者賬號]選項與參數:-b :將后續的命令放到背景中讓系統自行運行,而不與目前的 shell 產生影響-u :后面可以接欲切換的使用者,若無此項則代表切換身份為 root 。范例一:你想要以 sshd 的身份在 /tmp 底下創建一個名為 mysshd 的文件[root@www ~]# sudo -u sshd touch /tmp/mysshd[root@www ~]# ll /tmp/mysshd-rw-r--r-- 1 sshd sshd 0 Feb 28 17:42 /tmp/mysshd# 特別留意,這個文件的權限是由 sshd 所創建的情況喔!范例二:你想要以 vbird1 的身份創建 ~vbird1/www 并于其中創建 index.html 文件[root@www ~]# sudo -u vbird1 sh -c "mkdir ~vbird1/www; cd ~vbird1/www; /> echo 'This is index.html file' > index.html"[root@www ~]# ll -a ~vbird1/wwwdrwxr-xr-x 2 vbird1 vbird1 4096 Feb 28 17:51 .drwx------ 5 vbird1 vbird1 4096 Feb 28 17:51 ..-rw-r--r-- 1 vbird1 vbird1 24 Feb 28 17:51 index.html# 要注意,創建者的身份是 vbird1 ,且我們使用 sh -c "一串命令" 來運行的!sudo 可以讓你切換身份來進行某項任務,例如上面的兩個范例。范例一中,我們的 root 使用 sshd 的權限去進行某項任務! 要注意,因為我們無法使用『 su - sshd 』去切換系統賬號 (因為系統賬號的 shell 是 /sbin/nologin), 這個時候 sudo 真是他 X 的好用了!立刻以 sshd 的權限在 /tmp 底下創建文件!查閱一下文件權限你就了解意義啦! 至于范例二則更使用多重命令串 (透過分號 ; 來延續命令進行),使用 sh -c 的方法來運行一連串的命令, 如此真是好方便!
但是 sudo 默認僅有 root 能使用?。槭裁茨??因為 sudo 的運行是這樣的流程:
- 當用戶運行 sudo 時,系統于 /etc/sudoers 文件中搜尋該使用者是否有運行 sudo 的權限;
- 若使用者具有可運行 sudo 的權限后,便讓使用者『輸入用戶自己的口令』來確認;
- 若口令輸入成功,便開始進行 sudo 后續接的命令(但 root 運行 sudo 時,不需要輸入口令);
- 若欲切換的身份與運行者身份相同,那也不需要輸入口令。
所以說,sudo 運行的重點是:『能否使用 sudo 必須要看 /etc/sudoers 的配置值, 而可使用 sudo 者是透過輸入用戶自己的口令來運行后續的命令串』喔!由于能否使用與 /etc/sudoers 有關, 所以我們當然要去編輯 sudoers 文件啦!不過,因為該文件的內容是有一定的規范的,因此直接使用 vi 去編輯是不好的。 此時,我們得要透過 visudo 去修改這個文件喔!
一般來說,visudo 的配置方式有幾種簡單的方法喔,底下我們以幾個簡單的例子來分別說明:
假如我們要讓 vbird1 這個賬號可以使用 root 的任何命令,那么可以簡單的這樣進行修改即可:
[root@www ~]# visudo....(前面省略)....root ALL=(ALL) ALL <==找到這一行,大約在 76 行左右vbird1 ALL=(ALL) ALL <==這一行是你要新增的!....(前面省略)....有趣吧!其實 visudo 只是利用 vi 將 /etc/sudoers 文件呼叫出來進行修改而已,所以這個文件就是 /etc/sudoers 啦!其實 visudo 只是利用 vi 將 /etc/sudoers 文件呼叫出來進行修改而已,所以這個文件就是 /etc/sudoers 啦! 這個文件的配置其實很簡單,如上面所示,如果你找到 76 行 (有 root 配置的那行) 左右,看到的數據就是:
使用者賬號 登陸者的來源主機名=(可切換的身份) 可下達的命令root ALL=(ALL) ALL <==這是默認值上面這一行的四個組件意義是:
- 系統的哪個賬號可以使用 sudo 這個命令的意思,默認為 root 這個賬號;
- 當這個賬號由哪部主機聯機到本 Linux 主機,意思是這個賬號可能是由哪一部網絡主機聯機過來的, 這個配置值可以指定客戶端計算機(信任用戶的意思)。默認值 root 可來自任何一部網絡主機
- 這個賬號可以切換成什么身份來下達后續的命令,默認 root 可以切換成任何人;
- 可用該身份下達什么命令?這個命令請務必使用絕對路徑撰寫。 默認 root 可以切換任何身份且進行任何命令之意。
[vbird1@www ~]$ tail -n 1 /etc/shadow <==注意!身份是 vbird1tail: cannot open `/etc/shadow' for reading: Permission denied# 因為不是 root 嘛!所以當然不能查詢 /etc/shadow[vbird1@www ~]$ sudo tail -n 1 /etc/shadow <==透過 sudoWe trust you have received the usual lecture from the local SystemAdministrator. It usually boils down to these three things: #1) Respect the privacy of others. <==這里僅是一些說明與警示項目 #2) Think before you type. #3) With great power comes great responsibility.Password: <==注意??!這里輸入的是『 vbird1 自己的口令 』pro3:$1$GfinyJgZ$9J8IdrBXXMwZIauANg7tW0:14302:0:99999:7::: # 看!vbird1 竟然可以查詢 shadow !
- 利用群組以及免口令的功能處理 visudo
我們在本章前面曾經創建過 pro1, pro2, pro3 ,這三個用戶能否透過群組的功能讓這三個人可以管理系統? 可以的,而且很簡單!同樣我們使用實際案例來說明:
[root@www ~]# visudo <==同樣的,請使用 root 先配置....(前面省略)....%wheel ALL=(ALL) ALL <==大約在 84 行左右,請將這行的 # 拿掉!# 在最左邊加上 % ,代表后面接的是一個『群組』之意!改完請儲存后離開[root@www ~]# usermod -a -G wheel pro1 <==將 pro1 加入 wheel 的支持上面的配置值會造成『任何加入 wheel 這個群組的使用者,就能夠使用 sudo 切換任何身份來操作任何命令』的意思。 你當然可以將 wheel 換成你自己想要的群組名。接下來,請分別切換身份成為 pro1 及 pro2 試看看 sudo 的運行。
上面兩點都會讓使用者能夠利用 root 的身份進行任何事情!這樣總是不太好~如果我想要讓用戶僅能夠進行部分系統任務, 比方說,系統上面的 myuser1 僅能夠幫 root 修改其他用戶的口令時,亦即『當使用者僅能使用 passwd 這個命令幫忙 root 修改其他用戶的口令』時,你該如何撰寫呢?可以這樣做:
[root@www ~]# visudo <==注意是 root 身份myuser1 ALL=(root) /usr/bin/passwd <==最后命令務必用絕對路徑上面的配置值指的是『myuser1 可以切換成為 root 使用 passwd 這個命令』的意思。其中要注意的是: 命令字段必須要填寫絕對路徑才行!否則 visudo 會出現語法錯誤的狀況發生! 此外,上面的配置是有問題的!我們使用底下的命令操作來讓您了解:[myuser1@www ~]$ sudo passwd myuser3 <==注意,身份是 myuser1Password: <==輸入 myuser1 的口令Changing password for user myuser3. <==底下改的是 myuser3 的口令喔!這樣是正確的New UNIX password:Retype new UNIX password:passwd: all authentication tokens updated successfully.[myuser1@www ~]$ sudo passwdChanging password for user root. <==見鬼!怎么會去改 root 的口令?恐怖?。∥覀兙谷蛔?root 的口令被 myuser3 給改變了!下次 root 回來竟無法登陸系統...欲哭無淚~怎辦? 所以我們必須要限制用戶的命令參數!修改的方法為將上述的那行改一改先:[root@www ~]# visudo <==注意是 root 身份myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, / !/usr/bin/passwd root由于屏幕一行寫不完,我將這行寫成兩行,所以上面第一行最后加上反斜杠啰。加上驚嘆號『 ! 』代表『不可運行』的意思。 因此上面這一行會變成:可以運行『 passwd 任意字符』,但是『 passwd 』與『 passwd root 』這兩個命令例外! 如此一來 myuser1 就無法改變 root 的口令了!這樣這位使用者可以具有 root 的能力幫助你修改其他用戶的口令, 而且也不能隨意改變 root 的口令!很有用處的!
sudo 搭配 su 的使用方式:
很多時候我們需要大量運行很多 root 的工作,所以一直使用 sudo 覺得很煩ㄟ!那有沒有辦法使用 sudo 搭配 su , 一口氣將身份轉為 root ,而且還用用戶自己的口令來變成 root 呢?是有的!而且方法簡單的會讓你想笑! 我們創建一個 ADMINS 帳戶別名,然后這樣做:
[root@www ~]# visudoUser_Alias ADMINS = pro1, pro2, pro3, myuser1ADMINS ALL=(root) /bin/su -接下來,上述的 pro1, pro2, pro3, myuser1 這四個人,只要輸入『 sudo su - 』并且輸入『自己的口令』后, 立刻變成 root 的身份!不但 root 口令不會外流,用戶的管理也變的非常方便! 這也是實務上面多人共管一部主機時常常使用的技巧呢!這樣管理確實方便,不過還是要強調一下大前提, 那就是『這些你加入的使用者,全部都是你能夠信任的用戶』!
新聞熱點
疑難解答