(q^5+q^6)/(q^7+q^8)=

设生产某种产品的总成本函数为C(q)=20q+q^2+20,收入函数为R(q)=100q-4q^2(q表示产量)_百度知道
设生产某种产品的总成本函数为C(q)=20q+q^2+20,收入函数为R(q)=100q-4q^2(q表示产量)
(1)当q=10时的边际成本和边际收入(2)产量q为多少时最大利润,利润的最大值为多少
我有更好的答案
1)分别对C(q),L取得最大值300;(q)=100-8q
边际成本C'(10)=20+2*10=40,
边际收入R'(10)=100-8*10=20;(q)=-10q+80.
故产量q为8时利润最大,利润的最大值为300、R(q)关于q的求导,得
C&#39,R&#39,当q=8时;(q)=20+2q.(2)利润L(q)=R-C=-5q^2+80q-20,
对L(q)关于q的求导,得
令L'(q)=0,得 q=8,
采纳率:86%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。『中統古董文物館/Chung Ton Curios Museum』!!匿名用户不能发表回复!|鳥哥的 Linux 私房菜
底下尚未更新
第十三章、Linux 帳號管理與 ACL 權限設定
最近更新日期:
要登入 Linux 系統一定要有帳號與密碼才行,否則怎麼登入,您說是吧?不過,
不同的使用者應該要擁有不同的權限才行吧?我們還可以透過 user/group 的特殊權限設定,
來規範出不同的群組開發專案呢~在 Linux 的環境下,我們可以透過很多方式來限制使用者能夠使用的系統資源,
提到的 ulimit 限制、還有特殊權限限制,如 umask 等等。
透過這些舉動,我們可以規範出不同使用者的使用資源。另外,還記得系統管理員的帳號嗎?對!
就是 root 。請問一下,除了 root 之外,是否可以有其他的系統管理員帳號?
為什麼大家都要盡量避免使用數字型態的帳號?如何修改使用者相關的資訊呢?這些我們都得要瞭解瞭解的!
ACL 的設定(,
:驗證類別(type)、控制標準(flag)、模組與參數
13.1 Linux 的帳號與群組
管理員的工作中,相當重要的一環就是『管理帳號』啦!因為整個系統都是你在管理的,
並且所有一般用戶的帳號申請,都必須要透過你的協助才行!所以你就必須要瞭解一下如何管理好一個伺服器主機的帳號啦!
在管理 Linux 主機的帳號時,我們必須先來瞭解一下 Linux 到底是如何辨別每一個使用者的!
13.1.1 使用者識別碼: UID 與 GID
雖然我們登入 Linux 主機的時候,輸入的是我們的帳號,但是其實 Linux
主機並不會直接認識你的『帳號名稱』的,他僅認識 ID 啊 (ID 就是一組號碼啦)。
由於電腦僅認識 0 與 1,所以主機對於數字比較有概念的;至於帳號只是為了讓人們容易記憶而已。
而你的 ID 與帳號的對應就在 /etc/passwd 當中哩。
如果你曾經在網路上下載過
類型的檔案,
那麼應該不難發現,在解壓縮之後的檔案中,檔案擁有者的欄位竟然顯示『不明的數字』?奇怪吧?這沒什麼好奇怪的,因為 Linux
說實在話,他真的只認識代表你身份的號碼而已!
那麼到底有幾種 ID 呢?還記得我們在內有提到過,
每一個檔案都具有『擁有人與擁有群組』的屬性嗎?沒錯啦~每個登入的使用者至少都會取得兩個 ID ,一個是使用者
ID (User ID ,簡稱 UID)、一個是群組 ID (Group ID ,簡稱 GID)。
那麼檔案如何判別他的擁有者與群組呢?其實就是利用 UID 與 GID 啦!每一個檔案都會有所謂的擁有者 ID
與擁有群組 ID ,當我們有要顯示檔案屬性的需求時,系統會依據 /etc/passwd 與 /etc/group 的內容,
找到 UID / GID 對應的帳號與群組名稱再顯示出來!我們可以作個小實驗,你可以用 root 的身份
vim /etc/passwd ,然後將你的一般身份的使用者的
ID 隨便改一個號碼,然後再到你的一般身份的目錄下看看原先該帳號擁有的檔案,你會發現該檔案的擁有人變成了
『數字了』呵呵!這樣可以理解了嗎?來看看底下的例子:
# 1. 先察看一下,系統裡面有沒有一個名為 dmtsai 的用戶?
[root@study ~]# id dmtsai
uid=1000(dmtsai) gid=1000(dmtsai) groups=1000(dmtsai),10(wheel)
&==確定有這個帳號喔!
[root@study ~]# ll -d /home/dmtsai
drwx------. 17 dmtsai dmtsai 4096 Jul 17 19:51 /home/dmtsai
# 瞧一瞧,使用者的欄位正是 dmtsai 本身喔!
# 2. 修改一下,將剛剛我們的 dmtsai 的 1000 UID 改為 2000 看看:
[root@study ~]# vim /etc/passwd
....(前面省略)....
dmtsai:x:2000:1000:dmtsai:/home/dmtsai:/bin/bash &==修改一下特殊字體部分,由 1000 改過來
[root@study ~]# ll -d /home/dmtsai
drwx------. 17 1000 dmtsai 4096 Jul 17 19:51 /home/dmtsai
# 很害怕吧!怎麼變成 1000 了?因為檔案只會記錄 UID 的數字而已!
# 因為我們亂改,所以導致 1000 找不到對應的帳號,因此顯示數字!
# 3. 記得將剛剛的 2000 改回來!
[root@study ~]# vim /etc/passwd
....(前面省略)....
dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash
&==『務必一定要』改回來!
你一定要瞭解的是,上面的例子僅是在說明 UID 與帳號的對應性,在一部正常運作的 Linux 主機環境下,上面的動作不可隨便進行,
這是因為系統上已經有很多的資料被建立存在了,隨意修改系統上某些帳號的 UID
很可能會導致某些程序無法進行,這將導致系統無法順利運作的結果,
因為權限的問題啊!所以,瞭解了之後,請趕快回到 /etc/passwd 裡面,將數字改回來喔!
舉例來說,如果上面的測試最後一個步驟沒有將 2000 改回原本的 UID,那麼當 dmtsai 下次登入時將沒有辦法進入自己的家目錄!
因為他的 UID 已經改為 2000 ,但是他的家目錄 (/home/dmtsai) 卻記錄的是 1000 ,由於權限是 700 ,
因此他將無法進入原本的家目錄!是否非常嚴重啊?
13.1.2 使用者帳號
Linux 系統上面的使用者如果需要登入主機以取得 shell 的環境來工作時,他需要如何進行呢?
首先,他必須要在電腦前面利用 tty1~tty6 的終端機提供的 login 介面,並輸入帳號與密碼後才能夠登入。
如果是透過網路的話,那至少使用者就得要學習 ssh 這個功能了 (伺服器篇再來談)。
那麼你輸入帳號密碼後,系統幫你處理了什麼呢?
先找尋 /etc/passwd 裡面是否有你輸入的帳號?如果沒有則跳出,如果有的話則將該帳號對應的
UID 與 GID (在 /etc/group 中) 讀出來,另外,該帳號的家目錄與 shell 設定也一併讀出;
再來則是核對密碼表啦!這時 Linux 會進入 /etc/shadow 裡面找出對應的帳號與
UID,然後核對一下你剛剛輸入的密碼與裡頭的密碼是否相符?
如果一切都 OK 的話,就進入 Shell 控管的階段囉!
大致上的情況就像這樣,所以當你要登入你的 Linux 主機的時候,那個 /etc/passwd 與 /etc/shadow
就必須要讓系統讀取啦 (這也是很多攻擊者會將特殊帳號寫到 /etc/passwd 裡頭去的緣故),所以呢,如果你要備份
Linux 的系統的帳號的話,那麼這兩個檔案就一定需要備份才行呦!
由上面的流程我們也知道,跟使用者帳號有關的有兩個非常重要的檔案,一個是管理使用者 UID/GID 重要參數的
/etc/passwd ,一個則是專門管理密碼相關資料的 /etc/shadow 囉!那這兩個檔案的內容就非常值得進行研究啦!
底下我們會簡單的介紹這兩個檔案,詳細的說明可以參考 man 5 passwd 及 man 5 shadow ()。
/etc/passwd 檔案結構
這個檔案的構造是這樣的:每一行都代表一個帳號,有幾行就代表有幾個帳號在你的系統中!
不過需要特別留意的是,裡頭很多帳號本來就是系統正常運作所必須要的,我們可以簡稱他為系統帳號,
例如 bin, daemon, adm, nobody 等等,這些帳號請不要隨意的殺掉他呢!這個檔案的內容有點像這樣:
鳥哥在接觸 Linux 之前曾經碰過 Solaris 系統 (1999 年),當時鳥哥啥也不清楚!由於『聽說』Linux
上面的帳號越複雜會導致系統越危險!所以鳥哥就將 /etc/passwd 上面的帳號全部刪除到只剩下 root
與鳥哥自己用的一般帳號!結果你猜發生什麼事?那就是....呼叫昇陽的工程師來維護系統 @_@!糗到一個不行!大家不要學啊!
[root@study ~]# head -n 4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
&==等一下做為底下說明用
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
我們先來看一下每個 Linux 系統都會有的第一行,就是 root 這個系統管理員那一行好了,
你可以明顯的看出來,每一行使用『:』分隔開,共有七個咚咚,分別是:
帳號名稱:
就是帳號啦!用來提供給對數字不太敏感的人類使用來登入系統的!需要用來對應 UID 喔。例如 root 的 UID 對應就是 0 (第三欄位);
早期 Unix 系統的密碼就是放在這欄位上!但是因為這個檔案的特性是所有的程序都能夠讀取,這樣一來很容易造成密碼資料被竊取,
因此後來就將這個欄位的密碼資料給他改放到
中了。所以這裡你會看到一個『 x 』,呵呵!
這個就是使用者識別碼囉!通常 Linux 對於 UID 有幾個限制需要說給您瞭解一下:
0(系統管理員)當 UID 是 0 時,代表這個帳號是『系統管理員』!
所以當你要讓其他的帳號名稱也具有 root 的權限時,將該帳號的 UID 改為 0 即可。
這也就是說,一部系統上面的系統管理員不見得只有 root 喔!
不過,很不建議有多個帳號的 UID 是 0 啦~容易讓系統管理員混亂!
1~999(系統帳號)保留給系統使用的 ID,其實除了 0 之外,其他的 UID 權限與特性並沒有不一樣。預設 1000
以下的數字讓給系統作為保留帳號只是一個習慣。
由於系統上面啟動的網路服務或背景服務希望使用較小的權限去運作,因此不希望使用 root 的身份去執行這些服務,
所以我們就得要提供這些運作中程式的擁有者帳號才行。這些系統帳號通常是不可登入的,
所以才會有我們在提到的 /sbin/nologin 這個特殊的 shell 存在。
根據系統帳號的由來,通常這類帳號又約略被區分為兩種:
1~200:由 distributions 自行建立的系統帳號;
201~999:若使用者有系統帳號需求時,可以使用的帳號 UID。
(可登入帳號)給一般使用者用的。事實上,目前的 linux 核心 (3.10.x 版)已經可以支援到
(2^32-1) 這麼大的 UID 號碼喔!
上面這樣說明可以瞭解了嗎?是的, UID 為 0 的時候,就是 root 呦!所以請特別留意一下你的
/etc/passwd 檔案!
這個與 /etc/group 有關!其實 /etc/group
的觀念與 /etc/passwd 差不多,只是他是用來規範群組名稱與 GID 的對應而已!
使用者資訊說明欄:
這個欄位基本上並沒有什麼重要用途,只是用來解釋這個帳號的意義而已!不過,如果您提供使用 finger 的功能時,
這個欄位可以提供很多的訊息呢!本章後面的
指令會來解釋這裡的說明。
這是使用者的家目錄,以上面為例, root 的家目錄在 /root ,所以當 root 登入之後,就會立刻跑到 /root 目錄裡頭啦!呵呵!
如果你有個帳號的使用空間特別的大,你想要將該帳號的家目錄移動到其他的硬碟去該怎麼作?
沒有錯!可以在這個欄位進行修改呦!預設的使用者家目錄在 /home/yourIDname
我們在 提到很多次,當使用者登入系統後就會取得一個 Shell
來與系統的核心溝通以進行使用者的操作任務。那為何預設 shell 會使用 bash 呢?就是在這個欄位指定的囉!
這裡比較需要注意的是,有一個 shell 可以用來替代成讓帳號無法取得 shell 環境的登入動作!那就是
/sbin/nologin 這個東西!這也可以用來製作純 pop 郵件帳號者的資料呢!
/etc/shadow 檔案結構
我們知道很多程式的運作都與權限有關,而權限與 UID/GID 有關!因此各程式當然需要讀取 /etc/passwd 來瞭解不同帳號的權限。
因此 /etc/passwd 的權限需設定為 -rw-r--r-- 這樣的情況,
雖然早期的密碼也有加密過,但卻放置到 /etc/passwd 的第二個欄位上!這樣一來很容易被有心人士所竊取的,
加密過的密碼也能夠透過暴力破解法去 trial and error (試誤) 找出來!
因為這樣的關係,所以後來發展出將密碼移動到 /etc/shadow 這個檔案分隔開來的技術,
而且還加入很多的密碼限制參數在 /etc/shadow 裡頭呢!在這裡,我們先來瞭解一下這個檔案的構造吧!
鳥哥的 /etc/shadow 檔案有點像這樣:
[root@study ~]# head -n 4 /etc/shadow
root:$6$wtbCCce/PxMeE5wm$KE2IfSJr.YLP7Rcai6oa/T7KFhO...:99:7:::
&==底下說明用
bin:*:99:7:::
daemon:*:99:7:::
adm:*:99:7:::
基本上, shadow 同樣以『:』作為分隔符號,如果數一數,會發現共有九個欄位啊,這九個欄位的用途是這樣的:
帳號名稱:
由於密碼也需要與帳號對應啊~因此,這個檔案的第一欄就是帳號,必須要與 /etc/passwd 相同才行!
這個欄位內的資料才是真正的密碼,而且是經過編碼的密碼 (加密) 啦!
你只會看到有一些特殊符號的字母就是了!需要特別留意的是,雖然這些加密過的密碼很難被解出來,
但是『很難』不等於『不會』,所以,這個檔案的預設權限是『-rw-------』或者是『----------』,亦即只有 root
才可以讀寫就是了!你得隨時注意,不要不小心更動了這個檔案的權限呢!
另外,由於各種密碼編碼的技術不一樣,因此不同的編碼系統會造成這個欄位的長度不相同。
舉例來說,舊式的 DES, MD5 編碼系統產生的密碼長度就與目前慣用的 SHA 不同()!SHA
的密碼長度明顯的比較長些。由於固定的編碼系統產生的密碼長度必須一致,因此『當你讓這個欄位的長度改變後,該密碼就會失效(算不出來)』。
很多軟體透過這個功能,在此欄位前加上 ! 或 * 改變密碼欄位長度,就會讓密碼『暫時失效』了。
最近更動密碼的日期:
這個欄位記錄了『更動密碼那一天』的日期,不過,很奇怪呀!在我的例子中怎麼會是 16559
呢?呵呵,這個是因為計算 Linux 日期的時間是以 1970 年 1 月 1 日作為 1 而累加的日期,1971 年 1 月 1 日則為 366 啦!
得注意一下這個資料呦!上述的 16559 指的就是
那一天啦!瞭解乎?
而想要瞭解該日期可以使用本章後面
指令的幫忙!至於想要知道某個日期的累積日數,
可使用如下的程式計算:
[root@study ~]# echo $(($(date --date="" +%s)/86400+1))
上述指令中, 為你想要計算的日期,86400 為每一天的秒數, %s 為
以來的累積總秒數。
由於 bash 僅支援整數,因此最終需要加上 1 補齊
密碼不可被更動的天數:(與第 3 欄位相比)
第四個欄位記錄了:這個帳號的密碼在最近一次被更改後需要經過幾天才可以再被變更!如果是 0 的話,
表示密碼隨時可以更動的意思。這的限制是為了怕密碼被某些人一改再改而設計的!如果設定為
20 天的話,那麼當你設定了密碼之後, 20 天之內都無法改變這個密碼呦!
密碼需要重新變更的天數:(與第 3 欄位相比)
經常變更密碼是個好習慣!為了強制要求使用者變更密碼,這個欄位可以指定在最近一次更改密碼後,
在多少天數內需要再次的變更密碼才行。你必須要在這個天數內重新設定你的密碼,否則這個帳號的密碼將會『變為過期特性』。
而如果像上面的 99999 (計算為 273 年) 的話,那就表示,呵呵,密碼的變更沒有強制性之意。
密碼需要變更期限前的警告天數:(與第 5 欄位相比)
當帳號的密碼有效期限快要到的時候 (第 5 欄位),系統會依據這個欄位的設定,發出『警告』言論給這個帳號,提醒他『再過 n
天你的密碼就要過期了,請盡快重新設定你的密碼呦!』,如上面的例子,則是密碼到期之前的
7 天之內,系統會警告該用戶。
密碼過期後的帳號寬限時間(密碼失效日):(與第 5 欄位相比)
密碼有效日期為『更新日期(第3欄位)』+『重新變更日期(第5欄位)』,過了該期限後使用者依舊沒有更新密碼,那該密碼就算過期了。
雖然密碼過期但是該帳號還是可以用來進行其他工作的,包括登入系統取得 bash 。不過如果密碼過期了,
那當你登入系統時,系統會強制要求你必須要重新設定密碼才能登入繼續使用喔,這就是密碼過期特性。
那這個欄位的功能是什麼呢?是在密碼過期幾天後,如果使用者還是沒有登入更改密碼,那麼這個帳號的密碼將會『失效』,
亦即該帳號再也無法使用該密碼登入了。要注意密碼過期與密碼失效並不相同。
帳號失效日期:
這個日期跟第三個欄位一樣,都是使用 1970 年以來的總日數設定。這個欄位表示:
這個帳號在此欄位規定的日期之後,將無法再使用。
就是所謂的『帳號失效』,此時不論你的密碼是否有過期,這個『帳號』都不能再被使用!
這個欄位會被使用通常應該是在『收費服務』的系統中,你可以規定一個日期讓該帳號不能再使用啦!
最後一個欄位是保留的,看以後有沒有新功能加入。
舉個例子來說好了,假如我的 dmtsai 這個使用者的密碼欄如下所示:
dmtsai:$6$M4IphgNP2TmlXaSS$B418YFroYxxmm....::7:5:16679:
這表示什麼呢?先要注意的是 16559 是
。所以 dmtsai 這個使用者的密碼相關意義是:
由於密碼幾乎僅能單向運算(由明碼計算成為密碼,無法由密碼反推回明碼),因此由上表的資料我們無法得知 dmstai 的實際密碼明文 (第二個欄位);
此帳號最近一次更動密碼的日期是
能夠再次修改密碼的時間是 5 天以後,也就是
以前 dmtsai
不能修改自己的密碼;如果使用者還是嘗試要更動自己的密碼,系統就會出現這樣的訊息:
You must wait longer to change your password
passwd: Authentication token manipulation error
畫面中告訴我們:你必須要等待更久的時間才能夠變更密碼之意啦!
由於密碼過期日期定義為 60 天後,亦即累積日數為: 19,經過計算得到此日數代表日期為 。
這表示:『使用者必須要在
(前 5 天不能改) 到
天限制內去修改自己的密碼,若
之後還是沒有變更密碼時,該密碼就宣告為過期』了!
警告日期設為 7 天,亦即是密碼過期日前的 7 天,在本例中則代表
如果使用者一直沒有更改密碼,那麼在這 7 天中,只要 dmtsai 登入系統就會發現如下的訊息:
Warning: your password will expire in 5 days
如果該帳號一直到
都沒有更改密碼,那麼密碼就過期了。但是由於有 5 天的寬限天數,
因此 dmtsai 在
前都還可以使用舊密碼登入主機。
不過登入時會出現強制更改密碼的情況,畫面有點像底下這樣:
You are required to change your password immediately (password aged)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user dmtsai.
Changing password for dmtsai
(current) UNIX password:
你必須要輸入一次舊密碼以及兩次新密碼後,才能夠開始使用系統的各項資源。如果你是在
以後嘗試以
dmtsai 登入的話,那麼就會出現如下的錯誤訊息且無法登入,因為此時你的密碼就失效去啦!
Your please contact your system administrator
如果使用者在
以前變更過密碼,那麼第 3 個欄位的那個 16559 的天數就會跟著改變,因此,
所有的限制日期也會跟著相對變動喔!^_^
無論使用者如何動作,到了 16679 (大約是
左右) 該帳號就失效了~
透過這樣的說明,您應該會比較容易理解了吧?由於 shadow 有這樣的重要性,因此可不能隨意修改喔!
但在某些情況底下你得要使用各種方法來處理這個檔案的!舉例來說,常常聽到人家說:『我的密碼忘記了』,
或者是『我的密碼不曉得被誰改過,跟原先的不一樣了』,這個時候怎麼辦?
一般用戶的密碼忘記了:這個最容易解決,請系統管理員幫忙,
他會重新設定好你的密碼而不需要知道你的舊密碼!利用 root 的身份使用
指令來處理即可。
root 密碼忘記了:這就麻煩了!因為你無法使用 root 的身份登入了嘛!
但我們知道 root 的密碼在 /etc/shadow 當中,因此你可以使用各種可行的方法開機進入 Linux 再去修改。
例如重新開機進入單人維護模式()後,系統會主動的給予 root 權限的 bash 介面,
此時再以 passwd 修改密碼即可;或以 Live CD 開機後掛載根目錄去修改 /etc/shadow,將裡面的 root 的密碼欄位清空,
再重新開機後 root 將不用密碼即可登入!登入後再趕快以 passwd 指令去設定 root 密碼即可。
曾經聽過一則笑話,某位老師主要是在教授 Linux 作業系統,但是他是兼任的老師,因此對於該系的電腦環境不熟。
由於當初安裝該電腦教室 Linux 作業系統的人員已經離職且找不到聯絡方式了,也就是說 root 密碼已經沒有人曉得了!
此時該老師就對學生說:『在 Linux 裡面 root 密碼不見了,我們只能重新安裝』...感覺有點無力~
又是個被 Windows 制約的人才!
另外,由於 Linux 的新舊版本差異頗大,舊的版本 (CentOS 5.x 以前) 還活在很多伺服器內!因此,如果你想要知道 shadow 是使用哪種加密的機制時,
可以透過底下的方法去查詢喔!
[root@study ~]# authconfig --test | grep hashing
password hashing algorithm is sha512
# 這就是目前的密碼加密機制!
13.1.3 關於群組: 有效與初始群組、groups, newgrp
認識了帳號相關的兩個檔案 /etc/passwd 與 /etc/shadow 之後,你或許還是會覺得奇怪,
那麼群組的設定檔在哪裡?還有,在 /etc/passwd 的第四欄不是所謂的 GID 嗎?那又是啥?
呵呵~此時就需要瞭解 /etc/group 與 /etc/gshadow 囉~
/etc/group 檔案結構
這個檔案就是在記錄 GID 與群組名稱的對應了~鳥哥測試機的 /etc/group 內容有點像這樣:
[root@study ~]# head -n 4 /etc/group
daemon:x:2:
這個檔案每一行代表一個群組,也是以冒號『:』作為欄位的分隔符號,共分為四欄,每一欄位的意義是:
群組名稱:
就是群組名稱啦!同樣用來給人類使用的,基本上需要與第三欄位的 GID 對應。
群組密碼:
通常不需要設定,這個設定通常是給『群組管理員』使用的,目前很少有這個機會設定群組管理員啦!
同樣的,密碼已經移動到 /etc/gshadow 去,因此這個欄位只會存在一個『x』而已;
就是群組的 ID 啊。我們 /etc/passwd 第四個欄位使用的 GID 對應的群組名,就是由這裡對應出來的!
此群組支援的帳號名稱:
我們知道一個帳號可以加入多個群組,那某個帳號想要加入此群組時,將該帳號填入這個欄位即可。
舉例來說,如果我想要讓 dmtsai 與 alex 也加入 root 這個群組,那麼在第一行的最後面加上『dmtsai,alex』,注意不要有空格,
使成為『 root:x:0:dmtsai,alex 』就可以囉~
談完了 /etc/passwd, /etc/shadow, /etc/group 之後,我們可以使用一個簡單的圖示來瞭解一下 UID / GID 與密碼之間的關係,
圖示如下。其實重點是 /etc/passwd 啦,其他相關的資料都是根據這個檔案的欄位去找尋出來的。
下圖中, root 的 UID 是 0 ,而 GID 也是 0 ,去找 /etc/group 可以知道 GID 為 0
時的群組名稱就是 root 哩。
至於密碼的尋找中,會找到 /etc/shadow 與 /etc/passwd 內同帳號名稱的那一行,就是密碼相關資料囉。
圖13.1.1、帳號相關檔案之間的 UID/GID 與密碼相關性示意圖
至於在 /etc/group 比較重要的特色在於第四欄啦,因為每個使用者都可以擁有多個支援的群組,這就好比在學校唸書的時候,
我們可以加入多個社團一樣! ^_^。不過這裡你或許會覺得奇怪的,那就是:『假如我同時加入多個群組,那麼我在作業的時候,到底是以那個群組為準?』
底下我們就來談一談這個『有效群組』的概念。
請注意,新版的 Linux 中,初始群組的用戶群已經不會加入在第四個欄位!例如我們知道 root 這個帳號的主要群組為 root,但是在上面的範例中,
你已經不會看到 root 這個『用戶』的名稱在 /etc/group 的 root 那一行的第四個欄位內囉!這點還請留意一下即可!
有效群組(effective group)與初始群組(initial group)
還記得每個使用者在他的 /etc/passwd 裡面的第四欄有所謂的 GID 吧?那個 GID 就是所謂的『初始群組
(initial group) 』!也就是說,當使用者一登入系統,立刻就擁有這個群組的相關權限的意思。
舉例來說,我們上面提到 dmtsai 這個使用者的 /etc/passwd 與 /etc/group 還有 /etc/gshadow
相關的內容如下:
[root@study ~]# usermod -a -G users dmtsai
&==先設定好次要群組
[root@study ~]# grep dmtsai /etc/passwd /etc/group /etc/gshadow
/etc/passwd:dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash
/etc/group:wheel:x:10:dmtsai
&==次要群組的設定、安裝時指定的
/etc/group:users:x:100:dmtsai
&==次要群組的設定
/etc/group:dmtsai:x:1000:
&==因為是初始群組,所以第四欄位不需要填入帳號
/etc/gshadow:wheel:::dmtsai
&==次要群組的設定
/etc/gshadow:users:::dmtsai
&==次要群組的設定
/etc/gshadow:dmtsai:!!::
仔細看到上面這個表格,在 /etc/passwd 裡面,dmtsai 這個使用者所屬的群組為 GID=1000 ,搜尋一下 /etc/group
得到 1000 是那個名為 dmtsai 的群組啦!這就是 initial group。因為是初始群組,
使用者一登入就會主動取得,不需要在 /etc/group 的第四個欄位寫入該帳號的!
但是非 initial group 的其他群組可就不同了。舉上面這個例子來說,我將 dmtsai 加入 users
這個群組當中,由於 users 這個群組並非是 dmtsai 的初始群組,因此,
我必須要在 /etc/group 這個檔案中,找到 users 那一行,並且將 dmtsai 這個帳號加入第四欄,
這樣 dmtsai 才能夠加入 users 這個群組啊。
那麼在這個例子當中,因為我的 dmtsai 帳號同時支援 dmtsai, wheel 與 users 這三個群組,
因此,在讀取/寫入/執行檔案時,針對群組部分,只要是 users, wheel 與 dmtsai 這三個群組擁有的功能,
我 dmtsai 這個使用者都能夠擁有喔!這樣瞭呼?不過,這是針對已經存在的檔案而言,
如果今天我要建立一個新的檔案或者是新的目錄,請問一下,新檔案的群組是 dmtsai, wheel 還是
users ?呵呵!這就得要檢查一下當時的有效群組了 (effective group)。
groups: 有效與支援群組的觀察
如果我以 dmtsai 這個使用者的身份登入後,該如何知道我所有支援的群組呢?
很簡單啊,直接輸入 groups 就可以了!注意喔,是 groups 有加 s 呢!結果像這樣:
[dmtsai@study ~]$ groups
dmtsai wheel users
在這個輸出的訊息中,可知道 dmtsai 這個用戶同時屬於 dmtsai, wheel 及 users 這三個群組,而且,
第一個輸出的群組即為有效群組 (effective group) 了。
也就是說,我的有效群組為 dmtsai 啦~此時,如果我以 touch 去建立一個新檔,例如:
『 touch test 』,那麼這個檔案的擁有者為 dmtsai ,而且群組也是 dmtsai 的啦。
[dmtsai@study ~]$ touch test
[dmtsai@study ~]$ ll test
-rw-rw-r--. 1 dmtsai dmtsai 0 Jul 20 19:54 test
這樣是否可以瞭解什麼是有效群組了?通常有效群組的作用是在新建檔案啦!那麼有效群組是否能夠變換?
newgrp: 有效群組的切換
那麼如何變更有效群組呢?就使用 newgrp 啊!不過使用 newgrp 是有限制的,那就是你想要切換的群組必須是你已經有支援的群組。舉例來說, dmtsai 可以在 dmtsai/wheel/users
這三個群組間切換有效群組,但是 dmtsai 無法切換有效群組成為 sshd 啦!使用的方式如下:
[dmtsai@study ~]$ newgrp users
[dmtsai@study ~]$ groups
users wheel dmtsai
[dmtsai@study ~]$ touch test2
[dmtsai@study ~]$ ll test*
-rw-rw-r--. 1 dmtsai dmtsai 0 Jul 20 19:54 test
-rw-r--r--. 1 dmtsai users
0 Jul 20 19:56 test2
[dmtsai@study ~]$ exit
# 注意!記得離開 newgrp 的環境喔!
此時,dmtsai 的有效群組就成為 users 了。我們額外的來討論一下 newgrp 這個指令,這個指令可以變更目前使用者的有效群組,
而且是另外以一個 shell 來提供這個功能的喔,所以,以上面的例子來說,
dmtsai 這個使用者目前是以另一個 shell 登入的,而且新的 shell 給予 dmtsai 有效 GID 為
users 就是了。如果以圖示來看就是如下所示:
圖13.1.2、newgrp 的運作示意圖
雖然使用者的環境設定(例如環境變數等等其他資料)不會有影響,但是使用者的『群組權限』將會重新被計算。
但是需要注意,由於是新取得一個 shell ,因此如果你想要回到原本的環境中,請輸入 exit 回到原本的 shell 喔!
既然如此,也就是說,只要我的用戶有支援的群組就是能夠切換成為有效群組!好了,
那麼如何讓一個帳號加入不同的群組就是問題的所在囉。你要加入一個群組有兩個方式,一個是透過系統管理員 (root) 利用
幫你加入,如果 root 太忙了而且你的系統有設定群組管理員,那麼你可以透過群組管理員以
幫你加入他所管理的群組中!詳細的作法留待下一小節再來介紹囉!
/etc/gshadow
剛剛講了很多關於『有效群組』的概念,另外,也提到 newgrp 這個指令的用法,但是,如果 /etc/gshadow 這個設定沒有搞懂得話,那麼 newgrp 是無法動作的呢!
鳥哥測試機的 /etc/gshadow 的內容有點像這樣:
[root@study ~]# head -n 4 /etc/gshadow
這個檔案內同樣還是使用冒號『:』來作為欄位的分隔字元,而且你會發現,這個檔案幾乎與 /etc/group
一模一樣啊!是這樣沒錯~不過,要注意的大概就是第二個欄位吧~第二個欄位是密碼欄,
如果密碼欄上面是『!』或空的時,表示該群組不具有群組管理員!至於第四個欄位也就是支援的帳號名稱囉~
這四個欄位的意義為:
密碼欄,同樣的,開頭為 ! 表示無合法密碼,所以無群組管理員
群組管理員的帳號 (相關資訊在
有加入該群組支援的所屬帳號 (與 /etc/group 內容相同!)
以系統管理員的角度來說,這個 gshadow 最大的功能就是建立群組管理員啦!
那麼什麼是群組管理員呢?由於系統上面的帳號可能會很多,但是我們 root 可能平時太忙碌,所以當有使用者想要加入某些群組時,
root 或許會沒有空管理。此時如果能夠建立群組管理員的話,那麼該群組管理員就能夠將那個帳號加入自己管理的群組中!
可以免去 root 的忙碌啦!不過,由於目前有類似
之類的工具,
所以這個群組管理員的功能已經很少使用了。我們會在後續的 gpasswd 中介紹這個實作。
13.2 帳號管理
好啦!既然要管理帳號,當然是由新增與移除使用者開始的囉~底下我們就分別來談一談如何新增、
移除與更改使用者的相關資訊吧~
13.2.1 新增與移除使用者: useradd, 相關設定檔, passwd, usermod, userdel
要如何在 Linux 的系統新增一個使用者啊?呵呵~真是太簡單了~我們登入系統時會輸入 (1)帳號與 (2)密碼,
所以建立一個可用的帳號同樣的也需要這兩個資料。那帳號可以使用 useradd 來新建使用者,密碼的給予則使用 passwd
這個指令!這兩個指令下達方法如下:
[root@study ~]# useradd [-u UID] [-g 初始群組] [-G 次要群組] [-mM]\
[-c 說明欄] [-d 家目錄絕對路徑] [-s shell] 使用者帳號名
選項與參數:
:後面接的是 UID ,是一組數字。直接指定一個特定的 UID 給這個帳號;
:後面接的那個群組名稱就是我們上面提到的 initial group 啦~
該群組的 GID 會被放置到 /etc/passwd 的第四個欄位內。
:後面接的群組名稱則是這個帳號還可以加入的群組。
這個選項與參數會修改 /etc/group 內的相關資料喔!
:強制!不要建立使用者家目錄!(系統帳號預設值)
:強制!要建立使用者家目錄!(一般帳號預設值)
:這個就是 /etc/passwd 的第五欄的說明內容啦~可以隨便我們設定的啦~
:指定某個目錄成為家目錄,而不要使用預設值。務必使用絕對路徑!
:建立一個系統的帳號,這個帳號的 UID 會有限制 (參考 /etc/login.defs)
:後面接一個 shell ,若沒有指定則預設是 /bin/bash 的啦~
:後面接一個日期,格式為『YYYY-MM-DD』此項目可寫入 shadow 第八欄位,
亦即帳號失效日的設定項目囉;
:後面接 shadow 的第七欄位項目,指定密碼是否會失效。0為立刻失效,
-1 為永遠不失效(密碼只會過期而強制於登入時重新設定而已。)
範例一:完全參考預設值建立一個使用者,名稱為 vbird1
[root@study ~]# useradd vbird1
[root@study ~]# ll -d /home/vbird1
drwx------. 3 vbird1 vbird1 74 Jul 20 21:50 /home/vbird1
# 預設會建立使用者家目錄,且權限為 700 !這是重點!
[root@study ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird1:x:::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:99:7:::
/etc/group:vbird1:x:1004:
&==預設會建立一個與帳號一模一樣的群組名
其實系統已經幫我們規定好非常多的預設值了,所以我們可以簡單的使用『 useradd 帳號 』來建立使用者即可。
CentOS 這些預設值主要會幫我們處理幾個項目:
在 /etc/passwd 裡面建立一行與帳號相關的資料,包括建立 UID/GID/家目錄等;
在 /etc/shadow 裡面將此帳號的密碼相關參數填入,但是尚未有密碼;
在 /etc/group 裡面加入一個與帳號名稱一模一樣的群組名稱;
在 /home 底下建立一個與帳號同名的目錄作為使用者家目錄,且權限為 700
由於在 /etc/shadow 內僅會有密碼參數而不會有加密過的密碼資料,因此我們在建立使用者帳號時,
還需要使用『 passwd 帳號 』來給予密碼才算是完成了使用者建立的流程。如果由於特殊需求而需要改變使用者相關參數時,
就得要透過上述表格中的選項來進行建立了,參考底下的案例:
範例二:假設我已知道我的系統當中有個群組名稱為 users ,且 UID 1500 並不存在,
請用 users 為初始群組,以及 uid 為 1500 來建立一個名為 vbird2 的帳號
[root@study ~]# useradd -u 1500 -g users vbird2
[root@study ~]# ll -d /home/vbird2
drwx------. 3 vbird2 users 74 Jul 20 21:52 /home/vbird2
[root@study ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird2:x:::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:99:7:::
# 看一下,UID 與 initial group 確實改變成我們需要的了!
在這個範例中,我們建立的是指定一個已經存在的群組作為使用者的初始群組,因為群組已經存在,
所以在 /etc/group 裡面就不會主動的建立與帳號同名的群組了!
此外,我們也指定了特殊的 UID 來作為使用者的專屬 UID 喔!瞭解了一般帳號後,我們來瞧瞧那啥是系統帳號 (system
account) 吧!
範例三:建立一個系統帳號,名稱為 vbird3
[root@study ~]# useradd -r vbird3
[root@study ~]# ll -d /home/vbird3
ls: cannot access /home/vbird3: No such file or directorya
&==不會主動建立家目錄
[root@study ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird3:x:699:699::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:16636::::::
/etc/group:vbird3:x:699:
我們在談到 UID 的時候曾經說過一般帳號應該是 1000 號以後,那使用者自己建立的系統帳號則一般是小於 1000 號以下的。
所以在這裡我們加上 -r 這個選項以後,系統就會主動將帳號與帳號同名群組的 UID/GID 都指定小於 1000 以下,
在本案例中則是使用 699(UID) 與 699(GID) 囉!此外,由於系統帳號主要是用來進行運作系統所需服務的權限設定,
所以系統帳號預設都不會主動建立家目錄的!
由這幾個範例我們也會知道,使用 useradd 建立使用者帳號時,其實會更改不少地方,至少我們就知道底下幾個檔案:
使用者帳號與密碼參數方面的檔案:/etc/passwd, /etc/shadow
使用者群組相關方面的檔案:/etc/group, /etc/gshadow
使用者的家目錄:/home/帳號名稱
那請教一下,你有沒有想過,為何『 useradd vbird1 』會主動在 /home/vbird1
建立起使用者的家目錄?家目錄內有什麼資料且來自哪裡?為何預設使用的是 /bin/bash 這個 shell
?為何密碼欄位已經都規範好了 (0:99999:7 那一串)?呵呵!這就得要說明一下 useradd 所使用的參考檔案囉!
useradd 參考檔
其實 useradd 的預設值可以使用底下的方法呼叫出來:
[root@study ~]# useradd -D
&==預設的群組
HOME=/home
&==預設的家目錄所在目錄
INACTIVE=-1
&==密碼失效日,在 shadow 內的第 7 欄
&==帳號失效日,在 shadow 內的第 8 欄
SHELL=/bin/bash
&==預設的 shell
SKEL=/etc/skel
&==使用者家目錄的內容資料參考目錄
CREATE_MAIL_SPOOL=yes
&==是否主動幫使用者建立郵件信箱(mailbox)
這個資料其實是由 /etc/default/useradd 呼叫出來的!你可以自行用 vim
去觀察該檔案的內容。搭配上頭剛剛談過的範例一的運作結果,上面這些設定項目所造成的行為分別是:
GROUP=100:新建帳號的初始群組使用 GID 為 100 者
系統上面 GID 為 100 者即是 users 這個群組,此設定項目指的就是讓新設使用者帳號的初始群組為 users 這一個的意思。
但是我們知道 CentOS 上面並不是這樣的,在 CentOS 上面預設的群組為與帳號名相同的群組。
舉例來說, vbird1 的初始群組為 vbird1 。怎麼會這樣啊?這是因為針對群組的角度有兩種不同的機制所致,
這兩種機制分別是:
私有群組機制:
系統會建立一個與帳號一樣的群組給使用者作為初始群組。
這種群組的設定機制會比較有保密性,這是因為使用者都有自己的群組,而且家目錄權限將會設定為 700
(僅有自己可進入自己的家目錄) 之故。使用這種機制將不會參考 GROUP=100 這個設定值。代表性的 distributions
有 RHEL, Fedora, CentOS 等;
公共群組機制:
就是以 GROUP=100
這個設定值作為新建帳號的初始群組,因此每個帳號都屬於 users 這個群組,
且預設家目錄通常的權限會是『 drwxr-xr-x ... username users ... 』,由於每個帳號都屬於 users
群組,因此大家都可以互相分享家目錄內的資料之故。代表 distributions 如 SuSE等。
由於我們的 CentOS 使用私有群組機制,因此這個設定項目是不會生效的!不要太緊張啊!
HOME=/home:使用者家目錄的基準目錄(basedir)
使用者的家目錄通常是與帳號同名的目錄,這個目錄將會擺放在此設定值的目錄後。所以 vbird1 的家目錄就會在
/home/vbird1/ 了!很容易理解吧!
INACTIVE=-1:密碼過期後是否會失效的設定值
檔案結構當中談過,第七個欄位的設定值將會影響到密碼過期後,
在多久時間內還可使用舊密碼登入。這個項目就是在指定該日數啦!如果是 0 代表密碼過期立刻失效,
如果是 -1 則是代表密碼永遠不會失效,如果是數字,如 30 ,則代表過期 30 天後才失效。
EXPIRE=:帳號失效的日期
內的第八欄位,你可以直接設定帳號在哪個日期後就直接失效,而不理會密碼的問題。
通常不會設定此項目,但如果是付費的會員制系統,或許這個欄位可以設定喔!
SHELL=/bin/bash:預設使用的 shell 程式檔名
系統預設的 shell 就寫在這裡。假如你的系統為 mail server ,你希望每個帳號都只能使用 email 的收發信件功能,
而不許使用者登入系統取得 shell ,那麼可以將這裡設定為 /sbin/nologin ,如此一來,新建的使用者預設就無法登入!
也免去後續使用
進行修改的手續!
SKEL=/etc/skel:使用者家目錄參考基準目錄
這個咚咚就是指定使用者家目錄的參考基準目錄囉~舉我們的範例一為例, vbird1 家目錄 /home/vbird1
內的各項資料,都是由 /etc/skel 所複製過去的~所以呢,未來如果我想要讓新增使用者時,該使用者的環境變數 ~/.bashrc
就設定妥當的話,您可以到 /etc/skel/.bashrc 去編輯一下,也可以建立 /etc/skel/www 這個目錄,那麼未來新增使用者後,在他的家目錄下就會有 www
那個目錄了!這樣瞭呼?
CREATE_MAIL_SPOOL=yes:建立使用者的 mailbox
你可以使用『 ll /var/spool/mail/vbird1 』看一下,會發現有這個檔案的存在喔!這就是使用者的郵件信箱!
除了這些基本的帳號設定值之外, UID/GID 還有密碼參數又是在哪裡參考的呢?那就得要看一下 /etc/login.defs 啦!
這個檔案的內容有點像底下這樣:
/var/spool/mail
&==使用者預設郵件信箱放置目錄
PASS_MAX_DAYS
&==/etc/shadow 內的第 5 欄,多久需變更密碼日數
PASS_MIN_DAYS
&==/etc/shadow 內的第 4 欄,多久不可重新設定密碼日數
PASS_MIN_LEN
&==密碼最短的字元長度,已被 pam 模組取代,失去效用!
PASS_WARN_AGE
&==/etc/shadow 內的第 6 欄,過期前會警告的日數
&==使用者最小的 UID,意即小於 1000 的 UID 為系統保留
&==使用者能夠用的最大 UID
SYS_UID_MIN
&==保留給使用者自行設定的系統帳號最小值 UID
SYS_UID_MAX
&==保留給使用者自行設定的系統帳號最大值 UID
&==使用者自訂群組的最小 GID,小於 1000 為系統保留
&==使用者自訂群組的最大 GID
SYS_GID_MIN
&==保留給使用者自行設定的系統帳號最小值 GID
SYS_GID_MAX
&==保留給使用者自行設定的系統帳號最大值 GID
CREATE_HOME
&==在不加 -M 及 -m 時,是否主動建立使用者家目錄?
&==使用者家目錄建立的 umask ,因此權限會是 700
USERGROUPS_ENAB yes
&==使用 userdel 刪除時,是否會刪除初始群組
ENCRYPT_METHOD SHA512
&==密碼加密的機制使用的是 sha512 這一個機制!
這個檔案規範的資料則是如下所示:
mailbox 所在目錄:
使用者的預設 mailbox 檔案放置的目錄在 /var/spool/mail,所以 vbird1 的 mailbox 就是在
/var/spool/mail/vbird1 囉!
shadow 密碼第 4, 5, 6 欄位內容:
透過 PASS_MAX_DAYS 等等設定值來指定的!所以你知道為何預設的 /etc/shadow 內每一行都會有『
0:99999:7 』的存在了嗎?^_^!不過要注意的是,由於目前我們登入時改用 PAM 模組來進行密碼檢驗,所以那個
PASS_MIN_LEN 是失效的!
UID/GID 指定數值:
雖然 Linux 核心支援的帳號可高達 232 這麼多個,不過一部主機要作出這麼多帳號在管理上也是很麻煩的!
所以在這裡就針對 UID/GID 的範圍進行規範就是了。上表中的 UID_MIN 指的就是可登入系統的一般帳號的最小 UID ,至於
UID_MAX 則是最大 UID 之意。
要注意的是,系統給予一個帳號 UID 時,他是 (1)先參考 UID_MIN 設定值取得最小數值; (2)由 /etc/passwd 搜尋最大的 UID 數值,
將 (1) 與 (2) 相比,找出最大的那個再加一就是新帳號的 UID 了。我們上面已經作出 UID 為 1500 的 vbird2 ,
如果再使用『 useradd vbird4 』時,你猜 vbird4 的 UID 會是多少?答案是: 1501 。
所以中間的
的號碼就空下來啦!
而如果我是想要建立系統用的帳號,所以使用 useradd -r sysaccount
這個 -r 的選項時,就會找『比 201 大但比 1000 小的最大的 UID 』就是了。 ^_^
使用者家目錄設定值:
為何我們系統預設會幫使用者建立家目錄?就是這個『CREATE_HOME = yes』的設定值啦!這個設定值會讓你在使用 useradd 時,
主動加入『 -m 』這個產生家目錄的選項啊!如果不想要建立使用者家目錄,就只能強制加上『 -M 』的選項在 useradd
指令執行時啦!至於建立家目錄的權限設定呢?就透過
這個設定值啊!因為是 077 的預設設定,因此使用者家目錄預設權限才會是『 drwx------ 』哩!
使用者刪除與密碼設定值:
使用『USERGROUPS_ENAB yes』這個設定值的功能是:
如果使用 userdel 去刪除一個帳號時,且該帳號所屬的初始群組已經沒有人隸屬於該群組了,
那麼就刪除掉該群組,舉例來說,我們剛剛有建立 vbird4 這個帳號,他會主動建立 vbird4 這個群組。
若 vbird4 這個群組並沒有其他帳號將他加入支援的情況下,若使用 userdel vbird4 時,該群組也會被刪除的意思。
至於『ENCRYPT_METHOD SHA512』則表示使用 SHA512 來加密密碼明文,而不使用舊式的 MD5() 。
現在你知道啦,使用 useradd 這支程式在建立 Linux 上的帳號時,至少會參考:
/etc/default/useradd
/etc/login.defs
/etc/skel/*
這些檔案,不過,最重要的其實是建立 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow
還有使用者家目錄就是了~所以,如果你瞭解整個系統運作的狀態,也是可以手動直接修改這幾個檔案就是了。
OK!帳號建立了,接下來處理一下使用者的密碼吧!
剛剛我們講到了,使用 useradd 建立了帳號之後,在預設的情況下,該帳號是暫時被封鎖的,
也就是說,該帳號是無法登入的,你可以去瞧一瞧 /etc/shadow 內的第二個欄位就曉得囉~
那該如何是好?怕什麼?直接給他設定新密碼就好了嘛!對吧~設定密碼就使用 passwd 囉!
[root@study ~]# passwd [--stdin] [帳號名稱]
&==所有人均可使用來改自己的密碼
[root@study ~]# passwd [-l] [-u] [--stdin] [-S] \
[-n 日數] [-x 日數] [-w 日數] [-i 日數] 帳號 &==root 功能
選項與參數:
--stdin :可以透過來自前一個管線的資料,作為密碼輸入,對 shell script 有幫助!
:是 Lock 的意思,會將 /etc/shadow 第二欄最前面加上 ! 使密碼失效;
:與 -l 相對,是 Unlock 的意思!
:列出密碼相關參數,亦即 shadow 檔案內的大部分資訊。
:後面接天數,shadow 的第 4 欄位,多久不可修改密碼天數
:後面接天數,shadow 的第 5 欄位,多久內必須要更動密碼
:後面接天數,shadow 的第 6 欄位,密碼過期前的警告天數
:後面接天數,shadow 的第 7 欄位,密碼失效天數
範例一:請 root 給予 vbird2 密碼
[root@study ~]# passwd vbird2
Changing password for user vbird2.
New UNIX password: &==這裡直接輸入新的密碼,螢幕不會有任何反應
BAD PASSWORD: The password is shorter than 8 characters &==密碼太簡單或過短的錯誤!
Retype new UNIX password:
&==再輸入一次同樣的密碼
passwd: all authentication tokens updated successfully.
&==竟然還是成功修改了!
root 果然是最偉大的人物!當我們要給予使用者密碼時,透過 root 來設定即可。
root 可以設定各式各樣的密碼,系統幾乎一定會接受!所以您瞧瞧,如同上面的範例一,明明鳥哥輸入的密碼太短了,
但是系統依舊可接受 vbird2 這樣的密碼設定。這個是 root 幫忙設定的結果,那如果是使用者自己要改密碼呢?
包括 root 也是這樣修改的喔!
範例二:用 vbird2 登入後,修改 vbird2 自己的密碼
[vbird2@study ~]$ passwd
&==後面沒有加帳號,就是改自己的密碼!
Changing password for user vbird2.
Changing password for vbird2
(current) UNIX password: &==這裡輸入『原有的舊密碼』
New UNIX password: &==這裡輸入新密碼
BAD PASSWORD: The password is shorter than 8 characters &==密碼太短!不可以設定!重新想
New password:
&==這裡輸入新想的密碼
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
# 同樣的,密碼設定在字典裡面找的到該字串,所以也是不建議!無法通過,再想新的!
New UNIX password: &==這裡再想個新的密碼來輸入吧
Retype new UNIX password: &==通過密碼驗證!所以重複這個密碼的輸入
passwd: all authentication tokens updated successfully. &==有無成功看關鍵字
passwd 的使用真的要很注意,尤其是 root 先生啊!鳥哥在課堂上每次講到這裡,說是要幫自己的一般帳號建立密碼時,
有一小部分的學生就是會忘記加上帳號,結果就變成改變 root 自己的密碼,最後.... root 密碼就這樣不見去!唉~
要幫一般帳號建立密碼需要使用『 passwd 帳號 』的格式,使用『
passwd 』表示修改自己的密碼!拜託!千萬不要改錯!
與 root 不同的是,一般帳號在更改密碼時需要先輸入自己的舊密碼 (亦即 current 那一行),然後再輸入新密碼 (New 那一行)。
要注意的是,密碼的規範是非常嚴格的,尤其新的 distributions 大多使用 PAM 模組來進行密碼的檢驗,包括太短、
密碼與帳號相同、密碼為字典常見字串等,都會被 PAM 模組檢查出來而拒絕修改密碼,此時會再重複出現『 New 』這個關鍵字!
那時請再想個新密碼!若出現『 Retype 』才是你的密碼被接受了!重複輸入新密碼並且看到『 successfully
』這個關鍵字時才是修改密碼成功喔!
與一般使用者不同的是, root 並不需要知道舊密碼就能夠幫使用者或 root 自己建立新密碼!
但如此一來有困擾~就是如果你的親密愛人老是告訴你『我的密碼真難記,幫我設定簡單一點的!』時,
千萬不要妥協啊!這是為了系統安全...
為何使用者要設訂自己的密碼會這麼麻煩啊?這是因為密碼的安全性啦!如果密碼設定太簡單,
一些有心人士就能夠很簡單的猜到你的密碼,如此一來人家就可能使用你的一般帳號登入你的主機或使用其他主機資源,
對主機的維護會造成困擾的!所以新的 distributions 是使用較嚴格的 PAM 模組來管理密碼,這個管理的機制寫在 /etc/pam.d/passwd
當中。而該檔案與密碼有關的測試模組就是使用:pam_cracklib.so,這個模組會檢驗密碼相關的資訊,
並且取代 /etc/login.defs 內的 PASS_MIN_LEN 的設定啦!關於 PAM 我們在本章後面繼續介紹,這裡先談一下,
理論上,你的密碼最好符合如下要求:
密碼不能與帳號相同;
密碼盡量不要選用字典裡面會出現的字串;
密碼需要超過 8 個字元;
密碼不要使用個人資訊,如身份證、手機號碼、其他電話號碼等;
密碼不要使用簡單的關係式,如 1+1=2, Iamvbird 等;
密碼盡量使用大小寫字元、數字、特殊字元($,_,-等)的組合。
為了方便系統管理,新版的 passwd 還加入了很多創意選項喔!鳥哥個人認為最好用的大概就是這個『 --stdin 』了!
舉例來說,你想要幫 vbird2 變更密碼成為 abc543CC ,可以這樣下達指令呢!
範例三:使用 standard input 建立用戶的密碼
[root@study ~]# echo "abc543CC" | passwd --stdin vbird2
Changing password for user vbird2.
passwd: all authentication tokens updated successfully.
這個動作會直接更新使用者的密碼而不用再次的手動輸入!好處是方便處理,缺點是這個密碼會保留在指令中,
未來若系統被攻破,人家可以在 /root/.bash_history 找到這個密碼呢!所以這個動作通常僅用在 shell script
的大量建立使用者帳號當中!要注意的是,這個選項並不存在所有 distributions 版本中,
請使用 man passwd 確認你的 distribution 是否有支援此選項喔!
如果你想要讓 vbird2 的密碼具有相當的規則,舉例來說你要讓 vbird2 每 60 天需要變更密碼,
密碼過期後 10 天未使用就宣告帳號失效,那該如何處理?
範例四:管理 vbird2 的密碼使具有 60 天變更、密碼過期 10 天後帳號失效的設定
[root@study ~]# passwd -S vbird2
(Password set, SHA512 crypt.)
# 上面說明密碼建立時間 ()、0 最小天數、99999 變更天數、7 警告日數與密碼不會失效 (-1)
[root@study ~]# passwd -x 60 -i 10 vbird2
[root@study ~]# passwd -S vbird2
0 60 7 10 (Password set, SHA512 crypt.)
那如果我想要讓某個帳號暫時無法使用密碼登入主機呢?舉例來說, vbird2 這傢伙最近老是胡亂在主機亂來,
所以我想要暫時讓她無法登入的話,最簡單的方法就是讓她的密碼變成不合法 (shadow 第 2 欄位長度變掉)!
處理的方法就更簡單的!
範例五:讓 vbird2 的帳號失效,觀察完畢後再讓她失效
[root@study ~]# passwd -l vbird2
[root@study ~]# passwd -S vbird2
0 60 7 10 (Password locked.)
# 嘿嘿!狀態變成『 LK, Lock 』了啦!無法登入喔!
[root@study ~]# grep vbird2 /etc/shadow
vbird2:!!$6$iWWO6T46$uYStdkB7QjcUpJaCLB.OOp...::7:10::
# 其實只是在這裡加上 !! 而已!
[root@study ~]# passwd -u vbird2
[root@study ~]# grep vbird2 /etc/shadow
vbird2:$6$iWWO6T46$uYStdkB7QjcUpJaCLB.OOp...::7:10::
# 密碼欄位恢復正常!
是否很有趣啊!您可以自行管理一下你的帳號的密碼相關參數喔!接下來讓我們用更簡單的方法來查閱密碼參數喔!
除了使用 passwd -S 之外,有沒有更詳細的密碼參數顯示功能呢?有的!那就是 chage 了!他的用法如下:
[root@study ~]# chage [-ldEImMW] 帳號名
選項與參數:
-l :列出該帳號的詳細密碼參數;
-d :後面接日期,修改 shadow 第三欄位(最近一次更改密碼的日期),格式 YYYY-MM-DD
-E :後面接日期,修改 shadow 第八欄位(帳號失效日),格式 YYYY-MM-DD
-I :後面接天數,修改 shadow 第七欄位(密碼失效日期)
-m :後面接天數,修改 shadow 第四欄位(密碼最短保留天數)
-M :後面接天數,修改 shadow 第五欄位(密碼多久需要進行變更)
-W :後面接天數,修改 shadow 第六欄位(密碼過期前警告日期)
範例一:列出 vbird2 的詳細密碼參數
[root@study ~]# chage -l vbird2
Last password change
: Jul 20, 2015
Password expires
: Sep 18, 2015
Password inactive
: Sep 28, 2015
Account expires
Minimum number of days between password change
Maximum number of days between password change
Number of days of warning before password expires
的介紹中談到了處理 vbird2 這個帳號的密碼屬性流程,使用 passwd -S
卻無法看到很清楚的說明。如果使用 chage 那可就明白多了!如上表所示,我們可以清楚的知道 vbird2 的詳細參數呢!
如果想要修改其他的設定值,就自己參考上面的選項,或者自行 man chage 一下吧!^_^
chage 有一個功能很不錯喔!如果你想要讓『使用者在第一次登入時,
強制她們一定要更改密碼後才能夠使用系統資源』,可以利用如下的方法來處理的!
範例二:建立一個名為 agetest 的帳號,該帳號第一次登入後使用預設密碼,但必須要更改過密碼後,
使用新密碼才能夠登入系統使用 bash 環境
[root@study ~]# useradd agetest
[root@study ~]# echo "agetest" | passwd --stdin agetest
[root@study ~]# chage -d 0 agetest
[root@study ~]# chage -l agetest | head -n 3
Last password change
: password must be changed
Password expires
: password must be changed
Password inactive
: password must be changed
# 此時此帳號的密碼建立時間會被改為
,所以會有問題!
範例三:嘗試以 agetest 登入的情況
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user agetest.
Changing password for agetest
(current) UNIX password:
&==這個帳號被強制要求必須要改密碼!
非常有趣吧!你會發現 agetest 這個帳號在第一次登入時可以使用與帳號同名的密碼登入,
但登入時就會被要求立刻更改密碼,更改密碼完成後就會被踢出系統。再次登入時就能夠使用新密碼登入了!
這個功能對學校老師非常有幫助!因為我們不想要知道學生的密碼,那麼在初次上課時就使用與學號相同的帳號/密碼給學生,
讓她們登入時自行設定她們的密碼,如此一來就能夠避免其他同學隨意使用別人的帳號,也能夠保證學生知道如何更改自己的密碼!
所謂這『人有失手,馬有亂蹄』,您說是吧?所以囉,當然有的時候會『不小心手滑了一下』在 useradd
的時候加入了錯誤的設定資料。或者是,在使用 useradd 後,發現某些地方還可以進行細部修改。
此時,當然我們可以直接到 /etc/passwd 或 /etc/shadow 去修改相對應欄位的資料,
不過,Linux 也有提供相關的指令讓大家來進行帳號相關資料的微調呢~那就是 usermod 囉~
[root@study ~]# usermod [-cdegGlsuLU] username
選項與參數:
:後面接帳號的說明,即 /etc/passwd 第五欄的說明欄,可以加入一些帳號的說明。
:後面接帳號的家目錄,即修改 /etc/passwd 的第六欄;
:後面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內的第八個欄位資料啦!
:後面接天數,為 shadow 的第七欄位。
:後面接初始群組,修改 /etc/passwd 的第四個欄位,亦即是 GID 的欄位!
:後面接次要群組,修改這個使用者能夠支援的群組,修改的是 /etc/group 囉~
:與 -G 合用,可『增加次要群組的支援』而非『設定』喔!
:後面接帳號名稱。亦即是修改帳號名稱, /etc/passwd 的第一欄!
:後面接 Shell 的實際檔案,例如 /bin/bash 或 /bin/csh 等等。
:後面接 UID 數字啦!即 /etc/passwd 第三欄的資料;
:暫時將使用者的密碼凍結,讓他無法登入。其實僅改 /etc/shadow 的密碼欄。
:將 /etc/shadow 密碼欄的 ! 拿掉,解凍啦!
如果你仔細的比對,會發現 usermod 的選項與
非常類似!
這是因為 usermod 也是用來微調 useradd 增加的使用者參數嘛!不過 usermod 還是有新增的選項,
那就是 -L 與 -U ,不過這兩個選項其實與 passwd 的 -l, -u 是相同的!而且也不見得會存在所有的
distribution 當中!接下來,讓我們談談一些變更參數的實例吧!
範例一:修改使用者 vbird2 的說明欄,加上『VBird's test』的說明。
[root@study ~]# usermod -c "VBird's test" vbird2
[root@study ~]# grep vbird2 /etc/passwd
vbird2:x::VBird's test:/home/vbird2:/bin/bash
範例二:使用者 vbird2 這個帳號在
[root@study ~]# usermod -e "" vbird2
[root@study ~]# chage -l vbird2 | grep 'Account expires'
Account expires
: Dec 31, 2015
範例三:我們建立 vbird3 這個系統帳號時並沒有給予家目錄,請建立他的家目錄
[root@study ~]# ll -d ~vbird3
ls: cannot access /home/vbird3: No such file or directory
&==確認一下,確實沒有家目錄的存在!
[root@study ~]# cp -a /etc/skel /home/vbird3
[root@study ~]# chown -R vbird3:vbird3 /home/vbird3
[root@study ~]# chmod 700 /home/vbird3
[root@study ~]# ll -a ~vbird3
drwx------.
3 vbird3 vbird3
&==使用者家目錄權限
drwxr-xr-x. 10 root
4096 Jul 20 22:51 ..
-rw-r--r--.
1 vbird3 vbird3
6 06:06 .bash_logout
-rw-r--r--.
1 vbird3 vbird3
6 06:06 .bash_profile
-rw-r--r--.
1 vbird3 vbird3
6 06:06 .bashrc
drwxr-xr-x.
4 vbird3 vbird3
4 17:51 .mozilla
# 使用 chown -R 是為了連同家目錄底下的使用者/群組屬性都一起變更的意思;
# 使用 chmod 沒有 -R ,是因為我們僅要修改目錄的權限而非內部檔案的權限!
這個功能就太簡單了,目的在刪除使用者的相關資料,而使用者的資料有:
使用者帳號/密碼相關參數:/etc/passwd, /etc/shadow
使用者群組相關參數:/etc/group, /etc/gshadow
使用者個人檔案資料: /home/username, /var/spool/mail/username..
整個指令的語法非常簡單:
[root@study ~]# userdel [-r] username
選項與參數:
:連同使用者的家目錄也一起刪除
範例一:刪除 vbird2 ,連同家目錄一起刪除
[root@study ~]# userdel -r vbird2
這個指令下達的時候要小心了!通常我們要移除一個帳號的時候,你可以手動的將 /etc/passwd 與 /etc/shadow
裡頭的該帳號取消即可!一般而言,如果該帳號只是『暫時不啟用』的話,那麼將
/etc/shadow 裡頭帳號失效日期 (第八欄位) 設定為 0 就可以讓該帳號無法使用,但是所有跟該帳號相關的資料都會留下來!
使用 userdel 的時機通常是『你真的確定不要讓該用戶在主機上面使用任何資料了!』
另外,其實使用者如果在系統上面操作過一陣子了,那麼該使用者其實在系統內可能會含有其他檔案的。
舉例來說,他的郵件信箱 (mailbox) 或者是 之類的檔案。
所以,如果想要完整的將某個帳號完整的移除,最好可以在下達 userdel -r username 之前,
先以『 find / -user username 』查出整個系統內屬於 username 的檔案,然後再加以刪除吧!
13.2.2 使用者功能
不論是 useradd/usermod/userdel ,那都是系統管理員所能夠使用的指令,
如果我是一般身份使用者,那麼我是否除了密碼之外,就無法更改其他的資料呢?
當然不是啦!這裡我們介紹幾個一般身份使用者常用的帳號資料變更與查詢指令囉!
id 這個指令則可以查詢某人或自己的相關 UID/GID 等等的資訊,他的參數也不少,不過,都不需要記~反正使用 id 就全部都列出囉!
另外,也回想一下,我們在前一章談到的迴圈時,就有用過這個指令喔! ^_^
[root@study ~]# id [username]
範例一:查閱 root 自己的相關 ID 資訊!
[root@study ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:
s0-s0:c0.c1023
# 上面資訊其實是同一行的資料!包括會顯示 UID/GID 以及支援的所有群組!
# 至於後面那個 context=... 則是 SELinux 的內容,先不要理會他!
範例二:查閱一下 vbird1 吧~
[root@study ~]# id vbird1
uid=1003(vbird1) gid=1004(vbird1) groups=1004(vbird1)
[root@study ~]# id vbird100
id: vbird100: No such user
&== id 這個指令也可以用來判斷系統上面有無某帳號!
finger 的中文字面意義是:『手指』或者是『指紋』的意思。這個 finger 可以查閱很多使用者相關的資訊喔!
大部分都是在 /etc/passwd 這個檔案裡面的資訊啦!不過,這個指令有點危險,所以新的版本中已經預設不安裝這個軟體!
好啦!現在繼續來安裝軟體先~記得 的安裝方式!
假設你已經將光碟機或光碟映像檔掛載在 /mnt 底下了,所以:
[root@study ~]# df -hT /mnt
Filesystem
Used Avail Use% Mounted on
0 100% /mnt
# 先確定是有掛載光碟的啦!
[root@study ~]# rpm -ivh /mnt/Packages/finger-[0-9]*
我們就先來檢查檢查使用者資訊吧!
[root@study ~]# finger [-s] username
選項與參數:
:僅列出使用者的帳號、全名、終端機代號與登入時間等等;
:列出與後面接的帳號相同者,而不是利用部分比對 (包括全名部分)
範例一:觀察 vbird1 的使用者相關帳號屬性
[root@study ~]# finger vbird1
Login: vbird1
Directory: /home/vbird1
Shell: /bin/bash
Never logged in.
由於 finger 類似指紋的功能,他會將使用者的相關屬性列出來!如上表所示,其實他列出來的幾乎都是 /etc/passwd 檔案裡面的東西。列出的資訊說明如下:
Login:為使用者帳號,亦即 /etc/passwd 內的第一欄位;
Name:為全名,亦即 /etc/passwd 內的第五欄位(或稱為註解);
Directory:就是家目錄了;
Shell:就是使用的 Shell 檔案所在;
Never logged in.:figner 還會調查使用者登入主機的情況喔!
No mail.:調查 /var/spool/mail 當中的信箱資料;
No Plan.:調查 ~vbird1/.plan 檔案,並將該檔案取出來說明!
不過是否能夠查閱到 Mail 與 Plan 則與權限有關了!因為 Mail / Plan 都是與使用者自己的權限設定有關,
root 當然可以查閱到使用者的這些資訊,但是 vbird1 就不見得能夠查到 vbird3 的資訊,
因為 /var/spool/mail/vbird3 與 /home/vbird3/ 的權限分別是 660, 700 ,那 vbird1 當然就無法查閱的到!
這樣解釋可以理解吧?此外,我們可以建立自己想要執行的預定計畫,當然,最多是給自己看的!可以這樣做:
範例二:利用 vbird1 建立自己的計畫檔
[vbird1@study ~]$ echo "I will study Linux during this year." & ~/.plan
[vbird1@study ~]$ finger vbird1
Login: vbird1
Directory: /home/vbird1
Shell: /bin/bash
Last login Mon Jul 20 23:06 (CST) on pts/0
I will study Linux during this year.
範例三:找出目前在系統上面登入的使用者與登入時間
[vbird1@study ~]$ finger
Login Time
Office Phone
Jul 20 17:59
在範例三當中,我們發現輸出的資訊還會有 Office, Office Phone 等資訊,那這些資訊要如何記錄呢?
底下我們會介紹 chfn 這個指令!來看看如何修改使用者的 finger 資料吧!
chfn 有點像是: change finger 的意思!這玩意的使用方法如下:
[root@study ~]# chfn [-foph] [帳號名]
選項與參數:
:後面接完整的大名;
:您辦公室的房間號碼;
:辦公室的電話號碼;
:家裡的電話號碼!
範例一:vbird1 自己更改一下自己的相關資訊!
[vbird1@study ~]$ chfn
Changing finger information for vbird1.
Name []: VBird Tsai test
&==輸入你想要呈現的全名
Office []: DIC in KSU
&==辦公室號碼
Office Phone []: 06-
&==辦公室電話
Home Phone []: 06-1234567
&==家裡電話號碼
&==確認身份,所以輸入自己的密碼
Finger information changed.
[vbird1@study ~]$ grep vbird1 /etc/passwd
vbird1:x::VBird Tsai test,DIC in KSU,06-,06-1234567:/home/vbird1:/bin/bash
# 其實就是改到第五個欄位,該欄位裡面用多個『 , 』分隔就是了!
[vbird1@study ~]$ finger vbird1
Login: vbird1
Name: VBird Tsai test
Directory: /home/vbird1
Shell: /bin/bash
Office: DIC in KSU, 06-
Home Phone: 06-1234567
Last login Mon Jul 20 23:12 (CST) on pts/0
I will study Linux during this year.
# 就是上面特殊字體呈現的那些地方是由 chfn 所修改出來的!
這個指令說實在的,除非是你的主機有很多的用戶,否則倒真是用不著這個程式!這就有點像是 bbs
裡頭更改你『個人屬性』的那一個資料啦!不過還是可以自己玩一玩!尤其是用來提醒自己相關資料啦! ^_^
這就是 change shell 的簡寫!使用方法就更簡單了!
[vbird1@study ~]$ chsh [-ls]
選項與參數:
:列出目前系統上面可用的 shell ,其實就是 /etc/shells 的內容!
:設定修改自己的 Shell 囉
範例一:用 vbird1 的身份列出系統上所有合法的 shell,並且指定 csh 為自己的 shell
[vbird1@study ~]$ chsh -l
/sbin/nologin
&==所謂:合法不可登入的 Shell 就是這玩意!
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
&==這就是 C shell 啦!
# 其實上面的資訊就是我們在
中談到的 /etc/shells 啦!
[vbird1@study ~]$ chsh -s /bin/ grep vbird1 /etc/passwd
Changing shell for vbird1.
&==確認身份,請輸入 vbird1 的密碼
Shell changed.
vbird1:x::VBird Tsai test,DIC in KSU,06-,06-1234567:/home/vbird1:/bin/csh
[vbird1@study ~]$ chsh -s /bin/bash
# 測試完畢後,立刻改回來!
[vbird1@study ~]$ ll $(which chsh)
-rws--x--x. 1 root root 23856 Mar
6 13:59 /bin/chsh
不論是 chfn 與 chsh ,都是能夠讓一般使用者修改 /etc/passwd 這個系統檔的!所以你猜猜,這兩個檔案的權限是什麼?
的功能啦!看到這裡,想到前面!
這就是 Linux 的學習方法~ ^_^
13.2.3 新增與移除群組
OK!瞭解了帳號的新增、刪除、更動與查詢後,再來我們可以聊一聊群組的相關內容了。
基本上,群組的內容都與這兩個檔案有關:/etc/group, /etc/gshadow。
群組的內容其實很簡單,都是上面兩個檔案的新增、修改與移除而已,
不過,如果再加上有效群組的概念,那麼 newgrp 與 gpasswd 則不可不知呢!
[root@study ~]# groupadd [-g gid] [-r] 群組名稱
選項與參數:
:後面接某個特定的 GID ,用來直接給予某個 GID ~
:建立系統群組啦!與 /etc/login.defs 內的 GID_MIN 有關。
範例一:新建一個群組,名稱為 group1
[root@study ~]# groupadd group1
[root@study ~]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:1503:
/etc/gshadow:group1:!::
# 群組的 GID 也是會由 1000 以上最大 GID+1 來決定!
曾經有某些版本的教育訓練手冊談到,為了讓使用者的 UID/GID 成對,她們建議新建的與使用者私有群組無關的其他群組時,使用小於 1000 以下的 GID 為宜。
也就是說,如果要建立群組的話,最好能夠使用『 groupadd -r 群組名』的方式來建立啦!
不過,這見仁見智啦!看你自己的抉擇囉!
類似的,這個指令僅是在進行 group 相關參數的修改而已。
[root@study ~]# groupmod [-g gid] [-n group_name] 群組名
選項與參數:
:修改既有的 GID 數字;
:修改既有的群組名稱
範例一:將剛剛上個指令建立的 group1 名稱改為 mygroup , GID 為 201
[root@study ~]# groupmod -g 201 -n mygroup group1
[root@study ~]# grep mygroup /etc/group /etc/gshadow
/etc/group:mygroup:x:201:
/etc/gshadow:mygroup:!::
不過,還是那句老話,不要隨意的更動 GID ,容易造成系統資源的錯亂喔!
呼呼! groupdel 自然就是在刪除群組的囉~用法很簡單:
[root@study ~]# groupdel [groupname]
範例一:將剛剛的 mygroup 刪除!
[root@study ~]# groupdel mygroup
範例二:若要刪除 vbird1 這個群組的話?
[root@study ~]# groupdel vbird1
groupdel: cannot remove the primary group of user 'vbird1'
為什麼 mygroup 可以刪除,但是 vbird1 就不能刪除呢?原因很簡單,『有某個帳號 (/etc/passwd) 的 initial group 使用該群組!』
如果查閱一下,你會發現在 /etc/passwd 內的 vbird1 第四欄的 GID 就是 /etc/group 內的 vbird1
那個群組的 GID ,所以囉,當然無法刪除~否則 vbird1 這個使用者登入系統後,
就會找不到 GID ,那可是會造成很大的困擾的!那麼如果硬要刪除 vbird1 這個群組呢?
你『必須要確認 /etc/passwd 內的帳號沒有任何人使用該群組作為
initial group 』才行喔!所以,你可以:
修改 vbird1 的 GID ,或者是:
刪除 vbird1 這個使用者。
gpasswd:群組管理員功能
如果系統管理員太忙碌了,導致某些帳號想要加入某個專案時找不到人幫忙!這個時候可以建立『群組管理員』喔!
什麼是群組管理員呢?就是讓某個群組具有一個管理員,這個群組管理員可以管理哪些帳號可以加入/移出該群組!
那要如何『建立一個群組管理員』呢?就得要透過 gpasswd 囉!
# 關於系統管理員(root)做的動作:
[root@study ~]# gpasswd groupname
[root@study ~]# gpasswd [-A user1,...] [-M user3,...] groupname
[root@study ~]# gpasswd [-rR] groupname
選項與參數:
:若沒有任何參數時,表示給予 groupname 一個密碼(/etc/gshadow)
:將 groupname 的主控權交由後面的使用者管理(該群組的管理員)
:將某些帳號加入這個群組當中!
:將 groupname 的密碼移除
:讓 groupname 的密碼欄失效
# 關於群組管理員(Group administrator)做的動作:
[someone@study ~]$ gpasswd [-ad] user groupname
選項與參數:
:將某位使用者加入到 groupname 這個群組當中!
:將某位使用者移除出 groupname 這個群組當中。
範例一:建立一個新群組,名稱為 testgroup 且群組交由 vbird1 管理:
[root@study ~]# groupadd testgroup
&==先建立群組
[root@study ~]# gpasswd testgroup
&==給這個群組一個密碼吧!
Changing the password for group testgroup
New Password:
Re-enter new password:
# 輸入兩次密碼就對了!
[root@study ~]# gpasswd -A vbird1 testgroup
&==加入群組管理員為 vbird1
[root@study ~]# grep testgroup /etc/group /etc/gshadow
/etc/group:testgroup:x:1503:
/etc/gshadow:testgroup:$6$MnmChP3D$mrUn.Vo.buDjObMm8F2emTkvGSeuWikhRzaKHxpJ...:vbird1:
# 很有趣吧!此時 vbird1 則擁有 testgroup 的主控權喔!身份有點像板主啦!
範例二:以 vbird1 登入系統,並且讓他加入 vbird1, vbird3 成為 testgroup 成員
[vbird1@study ~]$ id
uid=1003(vbird1) gid=1004(vbird1) groups=1004(vbird1) ...
# 看得出來,vbird1 尚未加入 testgroup 群組喔!
[vbird1@study ~]$ gpasswd -a vbird1 testgroup
[vbird1@study ~]$ gpasswd -a vbird3 testgroup
[vbird1@study ~]$ grep testgroup /etc/group
testgroup:x:1503:vbird1,vbird3
很有趣的一個小實驗吧!我們可以讓 testgroup 成為一個可以公開的群組,然後建立起群組管理員,
群組管理員可以有多個。在這個案例中,我將 vbird1 設定為 testgroup 的群組管理員,所以 vbird1
就可以自行增加群組成員囉~呼呼!然後,該群組成員就能夠使用
13.2.4 帳號管理實例
帳號管理不是隨意建置幾個帳號就算了!有時候我們需要考量到一部主機上面可能有多個帳號在協同工作!
舉例來說,在大學任教時,我們學校的專題生是需要分組的,這些同一組的同學間必須要能夠互相修改對方的資料檔案,
但是同時這些同學又需要保留自己的私密資料,因此直接公開家目錄是不適宜的。那該如何是好?
為此,我們底下提供幾個例子來讓大家思考看看囉:
任務一:單純的完成上頭交代的任務,假設我們需要的帳號資料如下,你該如何實作?
myuser11st usermygroup1可以password
myuser22nd usermygroup1可以password
myuser33rd user無額外支援不可以password
處理的方法如下所示:
# 先處理帳號相關屬性的資料:
[root@study ~]# groupadd mygroup1
[root@study ~]# useradd -G mygroup1 -c "1st user" myuser1
[root@study ~]# useradd -G mygroup1 -c "2nd user" myuser2
[root@study ~]# useradd -c "3rd user" -s /sbin/nologin myuser3
# 再處理帳號的密碼相關屬性的資料:
[root@study ~]# echo "password" | passwd --stdin myuser1
[root@study ~]# echo "password" | passwd --stdin myuser2
[root@study ~]# echo "password" | passwd --stdin myuser3
要注意的地方主要有:myuser1 與 myuser2 都有支援次要群組,但該群組不見得會存在,因此需要先手動建立他!
然後 myuser3 是『不可登入系統』的帳號,因此需要使用 /sbin/nologin 這個 shell 來給予,這樣該帳號就無法登入囉!
這樣是否理解啊!接下來再來討論比較難一些的環境!如果是專題環境該如何製作?
任務二:我的使用者 pro1, pro2, pro3
是同一個專案計畫的開發人員,我想要讓這三個用戶在同一個目錄底下工作,
但這三個用戶還是擁有自己的家目錄與基本的私有群組。假設我要讓這個專案計畫在 /srv/projecta 目錄下開發,
可以如何進行?
# 1. 假設這三個帳號都尚未建立,可先建立一個名為 projecta 的群組,
再讓這三個用戶加入其次要群組的支援即可:
[root@study ~]# groupadd projecta
[root@study ~]# useradd -G projecta -c "projecta user" pro1
[root@study ~]# useradd -G projecta -c "projecta user" pro2
[root@study ~]# useradd -G projecta -c "projecta user" pro3
[root@study ~]# echo "password" | passwd --stdin pro1
[root@study ~]# echo "password" | passwd --stdin pro2
[root@study ~]# echo "password" | passwd --stdin pro3
# 2. 開始建立此專案的開發目錄:
[root@study ~]# mkdir /srv/projecta
[root@study ~]# chgrp projecta /srv/projecta
[root@study ~]# chmod 2770 /srv/projecta
[root@study ~]# ll -d /srv/projecta
drwxrws---. 2 root projecta 6 Jul 20 23:32 /srv/projecta
由於此專案計畫只能夠給 pro1, pro2, pro3 三個人使用,所以 /srv/projecta 的權限設定一定要正確才行!
所以該目錄群組一定是 projecta ,但是權限怎麼會是 2770 呢還記得 吧?為了讓三個使用者能夠互相修改對方的檔案,
這個 SGID 是必須要存在的喔!如果連這裡都能夠理解,嘿嘿!您的帳號管理已經有一定程度的概念囉! ^_^
但接下來有個困擾的問題發生了!假如任務一的 myuser1 是 projecta 這個專案的助理,他需要這個專案的內容,
但是他『不可以修改』專案目錄內的任何資料!那該如何是好?你或許可以這樣做:
將 myuser1 加入 projecta 這個群組的支援,但是這樣會讓 myuser1 具有完整的 /srv/projecta 的使用權限,
myuser1 是可以刪除該目錄下的任何資料的!這樣是有問題的;
將 /srv/projecta 的權限改為 2775 ,讓 myuser1 可以進入查閱資料。但此時會發生所有其他人均可進入該目錄查閱的困擾!
這也不是我們要的環境。
真要命!傳統的 Linux 權限無法針對某個個人設定專屬的權限嗎?其實是可以啦!接下來我們就來談談這個功能吧!
13.2.5 使用外部身份認證系統
在談 ACL 之前,我們再來談一個概念性的操作~因為我們目前沒有伺服器可供練習....
有時候,除了本機的帳號之外,我們可能還會使用到其他外部的身份驗證伺服器所提供的驗證身份的功能!舉例來說,
windows 底下有個很有名的身份驗證系統,稱為 Active Directory (AD)的東西,還有 Linux 為了提供不同主機使用同一組帳號密碼,
也會使用到 LDAP, NIS 等伺服器提供的身份驗證等等!
如果你的 Linux 主機要使用到上面提到的這些外部身份驗證系統時,可能就得要額外的設定一些資料了!
為了簡化使用者的操作流程,所以 CentOS 提供一隻名為 authconfig-tui 的指令給我們參考,這個指令的執行結果如下:
圖13.2.1、使用外部身份驗證伺服器的方式
你可以在該畫面中使用 [tab] 按鈕在各個項目中間切換。因為我們尚未談到伺服器的章節,所以什麼 NIS 啦、LDAP 啦都還沒有提供!
反正,未來在"伺服器篇"談到外部身份驗證的設定時,你知道有個 authconfig-tui 就好了!
上圖中最多可供操作的,大概僅有支援 MD5 這個早期的密碼格式就是了!此外,不要隨便將已經啟用的項目 (上頭有星號 * 的項目) 取消喔!
可能某些帳號會失效...
13.3 主機的細部權限規劃:ACL 的使用
從開始,我們就一直強調 Linux 的權限概念是非常重要的!
但是傳統的權限僅有三種身份 (owner, group, others) 搭配三種權限 (r,w,x)
而已,並沒有辦法單純的針對某一個使用者或某一個群組來設定特定的權限需求,例如前一小節最後的那個任務!
此時就得要使用 ACL 這個機制啦!這玩意挺有趣的,底下我們就來談一談:
13.3.1 什麼是 ACL 與如何支援啟動 ACL
ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統的
owner,group,others 的 read,write,execute 權限之外的細部權限設定。ACL
可以針對單一使用者,單一檔案或目錄來進行 r,w,x 的權限規範,對於需要特殊權限的使用狀況非常有幫助。
那 ACL 主要可以針對哪些方面來控制權限呢?他主要可以針對幾個項目:
使用者 (user):可以針對使用者來設定權限;
群組 (group):針對群組為對象來設定其權限;
預設屬性 (mask):還可以針對在該目錄下在建立新檔案/目錄時,規範新資料的預設權限;
也就是說,如果你有一個目錄,需要給一堆人使用,每個人或每個群組所需要的權限並不相同時,在過去,傳統的 Linux 三種身份的三種權限是無法達到的,
因為基本上,傳統的 Linux 權限只能針對一個用戶、一個群組及非此群組的其他人設定權限而已,無法針對單一用戶或個人來設計權限。
而 ACL 就是為了要改變這個問題啊!好了,稍微了解之後,再來看看如何讓你的檔案系統可以支援 ACL 吧!
如何啟動 ACL
事實上,原本 ACL 是 unix-like 作業系統的額外支援項目,但因為近年以來 Linux 系統對權限細部設定的熱切需求,
因此目前 ACL 幾乎已經預設加入在所有常見的 Linux 檔案系統的掛載參數中 (ext2/ext3/ext4/xfs等等)!所以你無須進行任何動作,
ACL 就可以被你使用囉!不過,如果你不放心系統是否真的有支援 ACL 的話,那麼就來檢查一下核心掛載時顯示的資訊吧!
[root@study ~]# dmesg | grep -i acl
0.330377] systemd[1]: systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT
+SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)
0.878265] SGI XFS with ACLs, security attributes, large block/inode numbers, no
debug enabled
瞧!至少 xfs 已經支援這個 ACL 的功能囉!
13.3.2 ACL 的設定技巧: getfacl, setfacl
好了,既然知道我們的 filesystem 有支援 ACL 之後,接下來該如何設定與觀察 ACL 呢? 很簡單,利用這兩個指令就可以了:
getfacl:取得某個檔案/目錄的 ACL 設定項目;
setfacl:設定某個目錄/檔案的 ACL 規範。
先讓我們來瞧一瞧 setfacl 如何使用吧!
setfacl 指令用法介紹及最簡單的『 u:帳號:權限 』設定
[root@study ~]# setfacl [-bkRd] [{-m|-x} acl參數] 目標檔名
選項與參數:
-m :設定後續的 acl 參數給檔案使用,不可與 -x 合用;
-x :刪除後續的 acl 參數,不可與 -m 合用;
-b :移除『所有的』 ACL 設定參數;
-k :移除『預設的』 ACL 參數,關於所謂的『預設』參數於後續範例中介紹;
-R :遞迴設定 acl ,亦即包括次目錄都會被設定起來;
-d :設定『預設 acl 參數』的意思!只對目錄有效,在該目錄新建的資料會引用此預設值
上面談到的是 acl 的選項功能,那麼如何設定 ACL 的特殊權限呢?特殊權限的設定方法有很多,
我們先來談談最常見的,就是針對單一使用者的設定方式:
# 1. 針對特定使用者的方式:
# 設定規範:『 u:[使用者帳號列表]:[rwx] 』,例如針對 vbird1 的權限規範 rx :
[root@study ~]# touch acl_test1
[root@study ~]# ll acl_test1
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1
[root@study ~]# setfacl -m u:vbird1:rx acl_test1
[root@study ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 權限部分多了個 + ,且與原本的權限 (644) 看起來差異很大!但要如何查閱呢?
[root@study ~]# setfacl -m u::rwx acl_test1
[root@study ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 設定值中的 u 後面無使用者列表,代表設定該檔案擁有者,所以上面顯示 root 的權限成為 rwx 了!
上述動作為最簡單的 ACL 設定,利用『 u:使用者:權限 』的方式來設定的啦!設定前請加上 -m 這個選項。
如果一個檔案設定了 ACL 參數後,他的權限部分就會多出一個 + 號了!但是此時你看到的權限與實際權限可能就會有點誤差!
那要如何觀察呢?就透過 getfacl 吧!
getfacl 指令用法
[root@study ~]# getfacl filename
選項與參數:
getfacl 的選項幾乎與 setfacl 相同!所以鳥哥這裡就免去了選項的說明啊!
# 請列出剛剛我們設定的 acl_test1 的權限內容:
[root@study ~]# getfacl acl_test1
# file: acl_test1
&==說明檔名而已!
# owner: root
&==說明此檔案的擁有者,亦即 ls -l 看到的第三使用者欄位
# group: root
&==此檔案的所屬群組,亦即 ls -l 看到的第四群組欄位
&==使用者列表欄是空的,代表檔案擁有者的權限
user:vbird1:r-x
&==針對 vbird1 的權限設定為 rx ,與擁有者並不同!
group::r--
&==針對檔案群組的權限設定僅有 r
&==此檔案預設的有效權限 (mask)
other::r--
&==其他人擁有的權限囉!
上面的資料非常容易查閱吧?顯示的資料前面加上 # 的,代表這個檔案的預設屬性,包括檔名、檔案擁有者與檔案所屬群組。
底下出現的 user, group, mask, other 則是屬於不同使用者、群組與有效權限(mask)的設定值。
以上面的結果來看,我們剛剛設定的 vbird1 對於這個檔案具有 r 與 x 的權限啦!這樣看的懂嗎?
如果看的懂的話,接下來讓我們再測試其他類型的 setfacl 設定吧!
特定的單一群組的權限設定:『 g:群組名:權限 』
# 2. 針對特定群組的方式:
# 設定規範:『 g:[群組列表]:[rwx] 』,例如針對 mygroup1 的權限規範 rx :
[root@study ~]# setfacl -m g:mygroup1:rx acl_test1
[root@study ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user:vbird1:r-x
group::r--
group:mygroup1:r-x
&==這裡就是新增的部分!多了這個群組的權限設定!
other::r--
針對有效權限設定:『 m:權限 』
基本上,群組與使用者的設定並沒有什麼太大的差異啦!如上表所示,非常容易瞭解意義。不過,你應該會覺得奇怪的是,
那個 mask 是什麼東西啊?其實他有點像是『有效權

我要回帖

更多关于 Q是谁 的文章

 

随机推荐