Linux 的帳號與群組

来源:百度文库 编辑:神马文学网 时间:2024/04/16 19:18:39
Linux 的帳號與群組2006-12-02 20:02


■Linux 的帳號與群組

Linux 主機並不會直接認識你的『帳號名稱』的,他僅認識 ID
ID 與帳號的對應就在 /etc/passwd
密碼資料在 /etc/shadow
每個程序都需要取得 uid 與 gid 來判斷權限
每個登入的使用者至少都會取得兩個 ID ,一個是使用者 ID (User ID ,簡稱 UID)、 一個是群組 ID (Group ID ,簡稱 GID)。


§帳號管理 最重要的兩個檔案就是『 /etc/passwd 與 /etc/shadow 』

/etc/passwd
每一行都代表一個帳號,有幾行就代表有幾個帳號在你的系統中
格式:  帳號名稱:密碼:UID:GID:使用者資訊說明欄:家目錄:Shell   (每一行使用『:』分隔開,共有七個咚咚)
例:   root:x:0:0:root:/root:/bin/bash
UID:1~65534 之間的帳號並沒有不同, 也就是除了 0 之外,其他的 UID 並沒有不一樣,預設 500 以下給系統作為保留帳號只是一個習慣
 
/etc/shadow
格式:  帳號名稱:密碼:最近更動密碼的日期:密碼不可被更動的天數:密碼需要重新變更的天數:密碼需要變更期限前的警告期限:密碼過期的恕限時間:帳號失效日期:保留
密碼:  如果是在密碼欄的第一個字元為『 * 』或者是『 ! 』,表示這個帳號並不會被用來登入的意思。

例如單人維護模式,或者是以 live CD (KNOPPIX) 來進入 Linux 系統。之後,將硬碟順利掛載,然後進入 /etc/shadow 這個檔案中,將 root 的密碼這一欄全部清空!然後再登入 Linux 一次,這個時候 root 將不需要密碼 (有的時候需要輸入空白字元) 就可以登入了


§ 群組管理 最重要的兩個檔案就是 /etc/group 與 /etc/gshadow

/etc/group
格式:  群組名稱:群組密碼:GID:支援的帳號名稱
例:   root:x:0:root
       bin:x:1:root,bin,daemon

支援的帳號名稱:加入這個群組裡面的所有的帳號, 我們知道,一個使用者是可以加入多個群組的。舉例來說,如果我想要讓 dmtsai 也加入 root 這個群組,那麼在第一行的最後面加上『,dmtsai』,注意不要有空格, 使成為『 root:x:0:root,dmtsai』就可以囉~

/etc/gshadow
格式: 群組名稱:密碼欄:群組管理員的帳號:該群組的所屬帳號
例:  root:::root
      bin:::root,bin,daemon

密碼欄,同樣的,開頭為 ! 表示無法登入; 該群組的所屬帳號 (與 /etc/group 內容相同!)


第二天:

有效群組(effective group)與初始群組(initial group)
這就得要檢查一下當時的有效群組了 (effective group)。

該如何知道我所有支援的群組呢?
[dmtsai@linux ~]$ groups

那麼如何變更有效群組呢?    newgrp + 群組名  
[dmtsai@linux ~]$ newgrp users
[dmtsai@linux ~]$ groups
users dmtsai
要離開新的有效群組時,輸入『 exit 』即可
newgrp 會額外以另一個 login 來提供使用者登入到另一個 shell 中, 並且將有效群組改為 newgrp 後面接的那個群組,若沒有接群組,則預設群組為 initial group


■帳號管理

§ 新增使用者: useradd

相關設定檔
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow
/home/username

範例一:完全參考預設值建立一個使用者,名稱為 vbird1
[root@linux ~]# useradd vbird1
[root@linux ~]# ls -l /home
drwxr-xr-x   3 vbird1 vbird1 4096 Aug 30 17:33 vbird1
[root@linux ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird1:x:502:502::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:13025:0:99999:7:::
/etc/group:vbird1:x:502:

範例二:我知道我的系統當中有個群組名稱為 users ,且 UID 700 並不存在,
            請用這兩個參數給予 vbird2 建立一個帳號!
[root@linux ~]# useradd -u 700 -g users vbird2
[root@linux ~]# ls -l /home
drwxr-xr-x   3 vbird2 users  4096 Aug 30 17:43 vbird2
[root@linux ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:13025:0:99999:7:::


第三天:

使用 useradd 建立了帳號之後,在預設的情況下,該帳號是暫時被封鎖的, 也就是說,該帳號是無法登入的,你可以去瞧一瞧 /etc/shadow 內的第二個欄位就曉得囉....多了個‘!‘號
得用passwd [username] 設定密碼後激活

§ 修改帳號相關資料: usermod        可以直接到 /etc/passwd 或 /etc/shadow 去修改相對應欄位的資料

[root@linux ~]# usermod [-cdegGlsuLU] username
-c  :後面接帳號的說明,即 /etc/passwd 第五欄的說明欄,可以加入一些帳號的說明。
-d  :後面接帳號的家目錄,即修改 /etc/passwd 的第六欄;
-e  :後面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內的第八個欄位資料啦!
-g  :後面接 group name,修改 /etc/passwd 的第四個欄位,亦即是 GID 的欄位!
-G  :後面接 group name,修改這個使用者能夠支援的群組,修改的是 /etc/group 囉~
-l  :後面接帳號名稱。亦即是修改帳號名稱, /etc/passwd 的第一欄!
-s  :後面接 Shell 的實際檔案,例如 /bin/bash 或 /bin/csh 等等。
-u  :後面接 UID 數字啦!即 /etc/passwd 第三欄的資料;
-L  :暫時將使用者的密碼凍結,讓他無法登入。其實僅改 /etc/shadow 的密碼欄。
-U  :將 /etc/shadow 密碼欄的 ! 拿掉,解凍啦!

範例一:修改使用者 dmtsai 的說明欄,加上『VBird‘s test』的說明。
[root@linux ~]# usermod -c "VBird‘s test" dmtsai
[root@linux ~]# grep dmtsai /etc/passwd
dmtsai:x:501:501:VBird‘s test:/home/dmtsai:/bin/bash

範例二:使用者 dmtsai 密碼在 2006/01/01 失效。
[root@linux ~]# usermod -e "2006-01-01" dmtsai
[root@linux ~]# grep dmtsai /etc/shadow
dmtsai:$1$24ISJM4K$bbdijdreoieaVaBMAHsm6.:13026:0:99999:7::13149:

範例三:暫時凍結 dmtsai 的密碼!
[root@linux ~]# usermod -L dmtsai
[root@linux ~]# grep dmtsai /etc/shadow
dmtsai:!$1$24ISJM4K$bbdijdreoieaVaBMAHsm6.:13026:0:99999:7::13149:
# 注意到,密碼欄(第二欄)多了一個 ! 號!那個驚嘆號會讓密碼無效喔!
[root@linux ~]# usermod -U dmtsai  <==這樣就解開了!

範例四:萬一 dmtsai 這個傢伙被建立時忘記建立家目錄,該如何是好?
[root@linux ~]# usermod -d /home/dmtsai2 -m dmtsai
# 如果僅是 -d /home/dmtsai2 表示僅修改 /etc/passwd 第六欄的內容而已,
# 如果加上 -m 這個參數,則表示新建一個家目錄的意思!
# 另外,如果原本的家目錄是 /home/dmtsai ,那 -d /home/dmtsai2 -m
# 會將原本的 /home/dmtsai 更名為 /home/dmtsai2 喔!


§ 刪除使用者相關資料 :userdel
/etc/passwd
/etc/shadow
/home/username

[root@linux ~]# userdel [-r] username
參數:
-r  :連同使用者的家目錄也一起刪除 (所有的相關目錄)
使用 userdel 的時機通常是『 你真的確定不要讓該用戶在主機上面使用任何資料了!』
常我們要移除一個帳號的時候,你可以手動的將 /etc/passwd 與 /etc/shadow 裡頭的該帳號取消即可!一般而言,如果該帳號只是『 暫時不啟用』的話,那麼將 /etc/shadow 裡頭最後倒數一個欄位設定為 0 就可以讓該帳號無法使用,但是所有跟該帳號相關的資料都會留下來!
先以『 find / -user username 』查出整個系統內屬於 username 的檔案, 然後再加以刪除吧
 

§ 使用者功能:chfn, chsh, finger, id    一般身份使用者常用的帳號資料變更指令
   useradd, usermod, userdel ,都是系統管理員所能夠使用的指令

※ 更改使用者的 shell  : chsh
[dmtsai@linux ~]$ chsh [-ls]
參數:
-l  :列出目前系統上面可用的 shell ,其實就是 /etc/shells 的內容!
-s  :設定修改自己的 Shell 囉

範例一:列出目前系統上面所以的 shell ,並且指定 csh 為自己的 shell
[dmtsai@linux ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/bin/ksh
/bin/tcsh
/bin/csh
/bin/zsh
[dmtsai@linux ~]$ chsh -s /bin/csh; grep dmtsai /etc/passwd
Password:  <==為了防止帳號被亂搞~所以需要輸入 dmtsai 的密碼確認!
Shell changed.
dmtsai:x:501:501::/home/dmtsai:/bin/csh

※ 查詢某人或自己的相關 UID/GID 等等的資訊 :id
[root@linux ~]# id [username]


第四天:

■群組管理

§ 新增群組 : groupadd

[root@linux ~]# groupadd [-g gid] [-r]
參數:
-g  :後面接某個特定的 GID ,用來直接給予某個 GID ~
-r  :建立系統群組啦!與 /etc/login.defs 內的 GID_MIN 有關。
範例:

範例一:新建一個群組,名稱為 group1
[root@linux ~]# groupadd group1
[root@linux ~]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:502:
/etc/gshadow:group1:!::
# 注意注意!在 /etc/gshadow 裡面可以發現,密碼是不許登入的喔!

 § 修改帳號相關資料: groupmod

[root@linux ~]# groupmod [-g gid] [-n group_name]
參數:
-g  :修改既有的 GID 數字
-n  :修改既有的群組名稱
範例:

範例一:將剛剛上個指令建立的 group2 名稱改為 groupname , GID 為 103
[root@linux ~]# groupmod -g 103 -n groupname group2
[root@linux ~]# grep groupname /etc/group /etc/gshadow
/etc/group:groupname:x:103:
/etc/gshadow:groupname:!::

 
 § 刪除群組:groupdel

[root@linux ~]# groupdel [groupname]

範例一:將剛剛的 groupname 刪除!
[root@linux ~]# groupdel groupname
......
為什麼 groupname 可以刪除,但是 dmtsai 就不能刪除呢?『有某個帳號 (/etc/passwd) 的 initial group 使用該群組!』
『必須要確認 /etc/passwd 內的帳號沒有任何人使用該群組作為 initial group 』才行,你可以:
修改 dmtsai 的 GID ,或者是:
刪除 dmtsai 這個使用者。


■密碼管理: passwd

如何尋找 passwd 這個指令?
使用 which passwd 即可

如何察看 passwd 這個檔案的屬性?並請說明他的屬性為何?
使用 ls -l `which passwd` 即可!他具有 SUID 的屬性!

什麼是 SUID ?
就是該程式在被執行的過程中,具有程式擁有者的權限!

我該如何查詢 /etc/passwd 與 /usr/bin/passwd 的用法與架構?
分別使用 man passwd 及 man 5 passwd


第五天:

[root@linux ~]# passwd [-lunxwS] username
參數:
-l  :將 username 這個帳號的密碼鎖住 (lock),在 /etc/shadow 內的密碼欄修訂~
-u  :將 -l 的 lock 解開!
-S  :顯示目前這個 username 的相關資訊。
範例:

範例一:將 dmtsai 這個使用者的密碼凍結,並觀察他!
[root@linux ~]# passwd -l dmtsai
Locking password for user dmtsai.
passwd: Success
[root@linux ~]# passwd -S dmtsai
Password locked.
[root@linux ~]# grep dmtsai /etc/shadow
dmtsai:!!$1$TDy6D7eg$jVJV/FMaQn14v5Kl7sqw6/:13026:0:99999:7::13149:

範例二:將上述密碼凍結解開
[root@linux ~]# passwd -u dmtsai

 
■使用者身份切換:su

[root@linux ~]# su [-lcm] [username]
參數:
-   :如果執行 su - 時,表示該使用者想要變換身份成為 root ,且使用 root 的
      環境設定參數檔,如 /root/.bash_profile 等等。
-l  :後面可以接使用者,例如 su -l dmtsai ,這個 -l 好處是,可使用欲變換身份者
      他的所有相關環境設定檔。
-m  :-m 與 -p 是一樣的,表示『使用目前的環境設定,而不重新讀取新使用者的設定檔。』
-c  :僅進行一次指令,所以 -c 後面可以加上指令喔!
範例:
範例一:由原本的 dmtsai 這個使用者,變換身份成為 root 。
[dmtsai@linux ~]$ su
Password: <==這裡輸入 root 的密碼喔!
[root@linux ~]# env
USER=dmtsai
USERNAME=root
MAIL=/var/spool/mail/dmtsai
LOGNAME=dmtsai
# 注意到了嗎?如果使用 su 沒有加上 - 的話,那麼很多原本使用者的相關設定會繼續存在,
# 這也會造成後來的 root 身份在執行時的困擾。最常見的就是 PATH 這個變數的問題!

[root@linux ~]# exit  <==這樣可以離開 su 的環境!
[dmtsai@linux ~]$ su -
Password: <==這裡輸入 root 的密碼喔!
[root@linux ~]# env
USER=root
MAIL=/var/spool/mail/root
LOGNAME=root
# 瞭解差異了吧?!所以,下次在變換成為 root 時,記得最好使用 su - 喔!

範例二:使用 root 的身份,執行 head -n 3 /etc/shadow
[dmtsai@linux ~]$ su - -c "head -n 3 /etc/shadow"
Password: <==這裡輸入 root 的密碼喔!
root:$1$jaldj9843u29jlj9u839jljlcghjlE/:12959:0:99999:7:::
bin:*:12959:0:99999:7:::
daemon:*:12959:0:99999:7:::

範例三:原本是 dmtsai 這個使用者,想要變換身份成為 vbird 時?
[dmtsai@linux ~]$ su -l vbird
Password: <==這裡輸入 vbird 的密碼喔!

特別留意的則是 su 的使用方式上, 由於『是否讀入欲切換的身份者的環境參數檔案』的不同, 所以您必須要留意喔!
您如果要切換成為某個身份,使用『 su - 』或者是『 su -l usename 』 會比較好一點~否則容易造成環境變數的差異~
當 root 使用 su 切換身份時,他並不需要輸入密碼喔!


第五天:

■使用者身份切換:sudo

sudo 是怎樣工作的呢?
當使用者執行 sudo 時,系統會主動的去尋找 /etc/sudoers 檔案,判斷該使用者是否有執行 sudo 的權限;
若使用者具有可執行 sudo 的權限後,便讓使用者『輸入使用者自己的密碼』來確認;
若密碼輸入成功,便開始進行 sudo 後續接的指令;
不過, root 執行 sudo 時,不需要輸入密碼;
若欲切換的身份與執行者身份相同,那也不需要輸入密碼。

使用者能夠執行的指令是可以被限制的!sudo 的執行權限與 /etc/sudoers 這的檔案有關
在預設的情況下,只有 root 才能夠使用 sudo 呢!至於編輯 /etc/sudoers 則需要 visudo 這個指令。(其語法比較難記,參考電子檔案)
[root@linux ~]# visudo
.........................
# User privilege specification
root    ALL=(ALL) ALL
dmtsai  ALL=(ALL) ALL     <==這裡將 dmtsai 製作成完全可用!
.........................

[root@linux ~]# sudo [-u [username|#uid]] command
參數:
-u  :後面可以接使用者帳號名稱,或者是 UID。例如 UID 是 500 的身份,可以:
      -u #500 來作為切換到 UID 為 500 的那位使用者。
範例:

範例一:一般身份使用者使用 sudo 在 /root 底下建立目錄:
[dmtsai@linux ~]$ sudo mkdir /root/testing
We trust you have received the usual lecture from the local System
Administrator. 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: <==這裡輸入 dmtsai 自己的密碼
dmtsai is not in the sudoers file.  This incident will be reported.
# 瞧!因為 dmtsai 不在 /etc/sudoers ,所以他就無法執行 sudo 喔!

範例二:假設 dmtsai 已經具有 sudo 的執行權限,如何在 /root 底下建立目錄?
[dmtsai@linux ~]$ sudo mkdir /root/testing
Password: <==這裡輸入 dmtsai 自己的密碼

範例三:如何將 sudo 與 su 搭配使用?
[dmtsai@linux ~]$ sudo su -

範例四:dmtsai 想要切換身份成為 vbird 來進行 touch 時?
[dmtsai@linux ~]$ sudo -u vbird touch /home/vbird/test


第六天:

 § 查詢使用者: w, who,finger, last, lastlog

 § 使用者對談: talk, mesg, wall    使用者在線上才能夠進行

write 是僅針對一個使用者來傳『簡訊』,『對所有系統上面的使用者傳送簡訊』用 wall

我以 vbird 傳送一個訊息給 dmtsai 時,可以這樣做:
[vbird@linux ~]$ write dmtsai
Hi, How are you doing today....
Nothing.... just say hello to you!
<==這裡按下 [ctrl]+d

 此時,另一端的 dmtsai 在他的終端介面上就會出現如下所示:
[dmtsai@linux ~]$
Hi, How are you doing today....
Nothing.... just say hello to you!
EOF

如果 dmtsai 這個人不想要接受任何訊息     [dmtsai@linux ~]$ mesg n
當 vbird 再次下達 write 時,就會出現:
[vbird@linux ~]$ write dmtsai
write: dmtsai has messages disabled
如果想要解開的話,再次下達『 mesg y 』

 § 使用者郵件信箱: mail

一般來說, mailbox 都會放置在 /var/spool/mail 裡面,一個帳號一個 mailbox (檔案)
如何寄出信件呢?『 mail username@localhost -s "郵件標題" 』

舉例來說,我以 vbird 寄信給 dmtsai ,信件標題是『 nice to meet you 』,則:
[vbird@linux ~]$ mail dmtsai -s "nice to meet you"
Hello, D.M. Tsai
Nice to meet you in the network.
You are so nice.  byebye!
.   <==這裡很重要喔,結束時,最後一行輸入小數點 . 即可!
Cc:  <==這裡是所謂的『副本』,不需要寄給其他人,所以直接 [Enter]
[vbird@linux ~]$  <==出現提示字元,表示輸入完畢了!

你可以先用 vi 將信件內容編好, 然後再以 mail dmtsai -s "nice to meet you" < filename  來將檔案內容傳輸即可

 § 手動增加使用者,一些檢查群組、帳號相關的指令  pwck,  pwconv, chpasswd
pwck 這個指令在檢查 /etc/passwd 這個帳號設定檔內的資訊,與實際的家目錄是否存在等資訊
chpasswd 可以『讀入未加密前的密碼,並且經過加密後, 將加密後的密碼寫入 /etc/shadow 當中。』這個指令很常被使用在大量建置帳號的情況中

 § 手動來移除這個帳號

1.先以 find / -user account 找出所有的帳號檔案,並將他刪除;
2.將 /etc/passwd 與 /etc/shadow 的相關資料刪除;
3.將 /etc/group 及 /etc/gshadow 相關資料刪除;
4.將 /home 底下關於該帳號的目錄刪除;
5.到 /var/spool/mail 以及 /var/spool/cron 裡面將相關的使用者檔案刪除。

 § 不開放終端機登入的帳號 (ex>mail acccount)

如果想要建立一個不能登入系統的帳號, 例如單純使用郵件收發信件而已的帳號,那麼又該如何設定呢?
因為不需要登入系統,所以建議 shell 欄位給予 /sbin/nologin ;
因為不需要登入,所以家目錄也可以先不建立。
假設我的系統裡面有個叫做 mail 的群組 (/etc/group) ,他的 GID 是 12 (以 FC4 為例), 另外,這個使用者的帳號為 popuser ,假設 UID 為 720 ,那麼該如何建立呢?
1. 修改帳號屬性
[root@linux ~]# vi /etc/passwd
popuser:x:720:12::/home/popuser:/sbin/nologin
2. 密碼同步,並且給予密碼!
[root@linux ~]# pwconv
[root@linux ~]# passwd popuser