Chapter 10 Linux的帳號管理

壹. 使用者管理

一.  帳號相關檔案: /etc/passwd
/etc/passwd是記錄所有系統user資料的檔案,所記錄的資料包括username、password(經過系統加密後之密文,shadow 版本的passwd此項為符號"x")、user id、group id、comment ( 關於user之基本資料,此為一說明項目)、user home directory、user's default shell。
每一個user在/etc/passwd中均有一行描述其本身之資料,其資料共有7個欄位,其間並以符號" : "區隔之。

以下以user root為例,說明每一欄位的意義:

root:sWJw6DpG5oE8I:0:0:root:/root:/bin/bash

username: root,這是user login 系統必須輸入作為身分辨認的字串,username在/etc/passwd中必須唯一。

password: sWJw6DpG5oE8I,這是user密碼經過加密後處理過後之結果,由於加密過程加入所謂"slat"的參數,同樣的密碼所得加密之結果並不相同,這個欄位會跟user輸入之密碼經系統加密後之結果比對,作為是否允許使用者進入系統之依據。linux系統中密碼加密的過程是不可逆的,因此無法以倒推之方式求的使用者的密碼—即使是super user也作不到。(shadow版本的passwd欄位為符號"x",真正password存在檔案/etc/shadow中)

uid: 0,其實真正用來辨別user的是uid而非username,建立user時uid必須(最好)唯一存在。root之uid固定為0。

gid: 0,這個欄位是user default所屬的群組名稱。

comment: root,這個欄位是/etc/passwd 7個欄位中唯一沒有作用的欄位,你可以將關於user相關資料,以任何格式(除字元": "外)填寫於此。這欄位最主要為輔助管理者了解user。

home: /root,這欄位記載的是user的home directory。User login系統後,
系統會自動將其工作目錄改變至此,通常此一目錄之owner應為
此一User。

Default shell: /bin/bash,這是user login 系統後default shell。

二. 帳號相關檔案: /etc/shadow
這是為了加強使用者管理安全機制,而存在的一個檔案,檔案的屬性為600(rw- --- ---)。此檔案管理與使用者密碼有關的事項,每一位使用者在這個檔案中,均應擁有一行。以下是 範例及這9個欄位所代表意義的簡單說明:

[root@test /root]# cat shadow

root:$i9EsoQ:12959:0:99999:7:::
bin:*:12959:0:99999:7:::
daemon:*:12959:0:99999:7:::

  1. Login name:
    這是使用者名稱,與/etc/passwd相呼應。

  2. passwd:
    使用者密碼(加密過之結果)

  3. 使用者最近更改密碼的時間
    這個欄位是個數字,單位是日,計算是以1970年1月1日起算。例如22代表1970/1/23。代表的意義是該使用者最後一次更改密碼的時間是1970/1/23。

  4. 密碼不可被改變的天數
    如果是 0 的話, 表示密碼隨時都可以更改。如果設定為 5的話,表示當你設定密碼之後, 5天之內都無法改變這個密碼。

  5. 密碼必需要重新更新的天數
    更改密碼之後,經過設定的天數,必須要重新設定密碼,否則這個帳號將會失效。但如果像上面的 99999 的話,表示密碼不需要重新輸入。

  6. 密碼過期前, 開始警告的時間
    單位是日。例如7, 代表密碼過期前7天開始警告使用者。系統預設值是7天。

  7. 密碼到期後, 帳號被寬限的天數
    單位是日。例如7, 代表密碼過期後7天取消帳號。

  8. 帳號密碼失效日期
    計算和第三個欄位一樣,都是使用1970 年以後的總日數設定。這個欄位表示帳號在此規定的日期之後,將無法再使用

  9. 保留欄位
    最後一個欄位是保留的,看以後有沒有新功能加入。

三. 群組(group)相關檔案: /etc/group

這個檔案記錄 gid 與群組名稱的對應,常見內容如下:

root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
也是以冒號:作為欄位的分隔符號,共分為四欄,每一欄位的意義是:

1. 群組名稱:就是群組名稱。

2. 群組密碼:通常不需要設定,因為我們很少使用到群組登入,密碼是被紀錄在 /etc/gshadow 中。

3. GID:就是群組的 ID。 

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

四. 命令

1. 新增 user

方法一:可以使用命令adduser或useradd

Example:

[root@test /root]#adduser  -u 601  -g 0  -d /home/s88  -s /bin/bash  -p abcdef  s88

或用script 改成對話的模式, 如下:

[root@test /root]# /sbin/adduser

Adding a new user. The username should not exceed 8 characters
in length, or you may run into problems later.

Enter login name for new account (^C to quit): user1

Editing information for new user [user1]

Full Name: test user
GID [100]:
Group 'users', GID 100
First unused uid is 503

UID [503]:

Home Directory [/home/user1]:

Shell [/bin/bash]: /bin/tcsh

….

Password [user1]:
Information for new user [user1]:
Home directory: [/home/user1] Shell: [/bin/tcsh]
uid: [503] gid: [100]

Is this correct? [y/N]: y

Adding login [user1] and making directory [/home/user1]

Adding the files from the /etc/skel directory:
./.less -> /home/user1/./.less
./.lessrc -> /home/user1/./.lessrc
 

方式二 : 以手動方式建立(除非必要,盡量少用), 也可以說adduser這個指令做了以下事情:
(1).改變/etc/passwd內容,並依據所給資料,建立屬於新user "user1"的欄 位。
(2).改變/etc/shadow內容,並依據所給資料,建立屬於新user "user1"的欄 位。
(3).建立user1的目錄(/home/user1),並將該目錄owner改為user1。
(4).把必要的初始shell script copy 該user之目錄之下。
(5).給定user1初始password。
 

2. 刪除 User
方式一:使用指令deluser 或 userdel

範例:

[root@test /root]# /usr/sbin/userdel -r s88

使用"serdel -r"除了帳號移除之外, 也會將home directory(例如:/home/s88)及電子郵件檔案(例如:/var/spool/mail/s88)刪除。

方式二:以手動方式刪除
Step1.
編輯/etc/passwd及/dec/shadow,將user帳號自檔案中刪除。
Step2
刪除user home directory。

 

3. 更改密碼

可以使用 [root@test /root]# passwd [username]這個指令來達成 。

如果是身份是 root ,由於 root 具有最大的權力,所以 root 可以利用 "passwd username"來幫使用者修改他們的密碼,如果使用者的密碼不見了, root 是可以幫他們進行密碼的修改,而不需要知道舊密碼。

如果是一般使用者,直接輸入" passwd", 就能修改自己的密碼。

密碼需要經過系統的驗證, 一般來說,輸入的密碼最好要符合底下的要求:
      a. 密碼不能與帳號相同。
      b. 密碼選用英文與其他符號混合的字串。
      c. 密碼需要超過 8 個字元。


使用passwd修改密碼, 只能接受三次密碼輸入,如果輸入的密碼都不被接受,只好重新執行 passwd。經過 passwd username 的執行後,您的帳號就會有密碼,此時,可以察看 /etc/shadow ,就會知道密碼內容被改過了。

範例一:如果 root 要幫 s88 修改密碼
[root@test /root]# passwd s88
Changing password for user s88.
New password:  <==這裡直接輸入新的密碼
BAD PASSWORD: it is based on a dictionary word  <==密碼太簡單時的錯誤警告
Retype new password:  <==再輸入一次相同的密碼


範例二: s88 這個使用者想要修改自己的密碼時
[s88@test /]$ passwd
Changing password for user s88.
Changing password for s88
(current) Linux password: <==這裡輸入原有的舊密碼
New password: <==這裡輸入新密碼
BAD PASSWORD: it is based on your username <==錯誤警告
New password: <==輸入一個新的密碼
Retype new PASSWORD: <==再輸入一次相同的密碼
附註: 如果root 密碼忘記了,怎麼辦?

這個時候須要使用到 /etc/shadow 這個資料,因為密碼是在這個檔案中,只要能夠以各種方法開機
進入 Linux ,例如單人維護模式,或者是以光碟片開機(KNOPPIX)來進入 Linux 系統。
之後,將硬碟順利掛載,然後進入 /etc/shadow 這個檔案中,將 root 的密碼這一欄全部清空,
然後再登入 Linux 一次,這個時候 root 將不需要密碼就可以登入了,再以 passwd 設定 root 密碼即可。 
 
4.停用帳號

想停用一個帳號,可以使用 passwd -l 來鎖定(lock)一個帳戶,語法如下:
passwd –l user_name
 
5.恢復帳號
想恢復帳號的使用,可以使用 passwd -u 來解鎖定(unlock)一個帳戶,語法如下:
passwd –u user_name 

6. 群組查詢
如果想知道帳號所屬的群組有那些,可以使用 groups 來查詢,語法如下:
groups

範例:

[root@test /root]# groups

root users

 

. 超級使用者 root - The Super User

-root是UNIX作業系統安裝過程中即已建立之特殊使用者中(root、adm、bin、daemon、uucp…)最為重要的一個(root之uid為0),系統任何維護或變更, 均需透過此一使用者完成之。

-root 擁有至高無上的權力,可以bypass所有系統安全檢查,不受任何權限的 約束﹔root可以讀取、修改或刪除系統上任一個檔案、更改檔案屬性(權限、 擁有者、群組…),改變系統設定及執行一些特殊指令。

-root是一個危險性相當高的帳號,管理者應以戒慎小心的心情使用它,使用 不慎很可能造成無可挽回的大災難! root帳號使用的方式一般有兩種:
(1).以root的身分直接login。
(2).以一般user身分執行指令/bin/su,並輸入root密碼後成為root。

-任何時候﹐都不鼓勵直接用 root 登錄﹐因為它的權限太大﹐會在系統安全上構成威脅。通常是用一般user進行登錄﹐然後真的碰到系統設定的時候﹐才用 su 命令切換為 root 身份執行。

-su 命令的使用:

[root@test /]# su [-lcm] [username]
參數:
-   :如果執行 su - 時,表示該使用者想要變換身份成為root,且使用root 的環境設定參數檔,如/root/.bash_profile 等。
-l  :後面可以接使用者,例如: su -l s88,可變換成s88的身份,並使用他的所有相關環境設定檔。
-m  :表示使用目前的環境設定,而不重新讀取新使用者的設定檔。
-c  :僅進行一次指令,所以 -c 後面可以加上指令。

範例一:由原本的 s88 這個使用者,變換身份成為 root 。
[s88@test /]$ su
Password:                   <---請輸入root 的密碼
[root@test /]# env
USER=s88
USERNAME=root
MAIL=/var/spool/mail/s88
LOGNAME=s88
#如果執行 su 沒有加上 - ,原來使用者的相關設定會繼續存在,這會造成後來以root 身份執行時的困擾,
#最常見的就是 PATH 這個變數的問題。

[root@test /]# exit         <---這樣可以離開 su 的環境
[s88@test /]$ su -
Password:                   <---請輸入root 的密碼
[root@test /]# env
USER=root
MAIL=/var/spool/mail/root
LOGNAME=root

範例二:原本是 s88 這個使用者,想要變換身份成為 student 時?
[s88@test /]$ su -l student
Password:                   <---這裡輸入student 的密碼

範例三:原本是 root 這個使用者,想要變換身份成為 student 時,不需要輸入student 的密碼
[root@test /]# su -l student
[student@test /]$
           
範例四:使用 root 的身份,執行 cat /etc/shadow
[dmtsai@linux ~]$ su - -c "cat /etc/shadow"
Password:                   <---這裡輸入 root 的密碼
root:$1$jaldj9843u29jlj9u839jljlcghjlE/:12959:0:99999:7:::
bin:*:12959:0:99999:7:::
daemon:*:12959:0:99999:7:::
...以下省略

◎root帳號使用的管理 - "事後追查" 及"事前限制"

一. 事後追查 – 系統auditing
事後追查責任的做法,藉助UNIX作業系統auditing的功能,一般而言技術 上及程序上沒有什麼問題。知道root密碼者可能不只一人,有時追查所得 資料,並沒有太大意義,然而事後追查雖並不能讓受損系統恢復正常,但畢 竟追緝元兇總是預防人為故意或無意疏失一個有效的方法。
透過系統auditing,我們可以知道誰,什麼時候,做過什麼事情;也可了解系統的運作歷史。

二. 事前限制 – 保密防諜
事前限制指的是root密碼的保密及root帳號使用限制,希望做到的是:

      1. 不讓不必要之人員知悉root密碼。

      2. 不讓root可以直接進入系統,以增加auditing的精確性: 一般由於管理上的需要, 知道root密碼的人可能不只一人,限制root進入系統的方式,一方面可以增加root使用之安全性,另一方面也可以使auditing的資料之意義更精確, 多少具有對root帳號之使用警示之作用 。

◎系統稽核命令
1. last 指令 – 查詢使用者(包括root)進入系統記錄。這個指令顯示的使用 者記錄包括使用者進入系統的時間、退出系統的時間、進入系統所使用的 機器IP Address,及停留在系統的時間。
Example
cc201:~# last | more
root ttyp0 140.120.2.110 Wed Mar 19 14:05 still logged in
edu ttyp0 140.120.2.110 Wed Mar 19 14:04 - 14:05 (00:00)
woody ttyp0 140.120.2.110 Wed Mar 19 14:04 - 14:04 (00:00)
root ttyp0 140.120.2.110 Wed Mar 19 14:00 - 14:03 (00:03)
root tty1 Wed Mar 19 13:56 - 13:57 (00:00)
runlevel ~ Wed Mar 19 13:56
reboot ~ Wed Mar 19 13:56
shutdown ~ Wed Mar 19 13:54
runlevel ~ Wed Mar 19 13:54

2. lastcomm 指令 – 查詢使用者(包括root)使用指令之記錄,這個指令顯 使用者在何時、使用過什麼指令。這個auditing指令存在於決大部分的UNIX版本上。

Example(generated on Sun Solaris system)
woody@honda: ~ 4 >lastcomm |head
lastcomm woody pts/10 29.80 secs Wed Mar 19 13:53
more woody pts/10 0.09 secs Wed Mar 19 13:53
lastcomm woody pts/10 1.19 secs Wed Mar 19 13:53
biff woody pts/10 0.11 secs Wed Mar 19 13:53
stty woody pts/10 0.09 secs Wed Mar 19 13:53
mail woody pts/10 0.30 secs Wed Mar 19 13:53
cat woody pts/10 0.09 secs Wed Mar 19 13:53
quota woody pts/10 0.28 secs Wed Mar 19 13:53
pt_chmod S root __ 0.08 secs Wed Mar 19 13:53
in.telne root __ 0.39 secs Wed Mar 19 12:38
….

附註:

要使用這個命令需要先啟動記錄檔案, 可使用accton命令啟動, accton 命令的形式為accton file,但是file必須先存在。步驟如下:

           Step1:先使用touch命令來建立pacct檔案:

                    #touch /var/log/pacct

           Step2: 然後執行accton:

                    # accton /var/log/pacct

一旦accton被啓動,就可以使用lastcomm命令監測系統中任何時候執行的命令。若要關閉統計,可以使用不帶任何參數的accton命令。

3. /var/log/lastlog 檔案 –  lastlog命令會讀出 /var/log/lastlog 內的資訊,顯示每個帳號最近一次登入的時間。

Example:

[root@test /]# lastlog
Username  Port     From             Latest
root            tty1                        Tue Oct 10 18:06:20 +0800 2005
bin                                           **Never logged in**
...中間省略...
s88             tty2     test             Mon Oct 11 14:18:49 +0800 2005
 

4. 圖型介面也有管理工具, 請自行測試。

◎限制直接使用root進入系統
在linux作業系統下,可以藉著編輯/etc/securetty這個檔案,限制root可由哪 些方式進入系統。
Example 1:
cc201:/etc# cat /etc/securetty
console
tty1
tty2
tty3
tty4
tty5
tty6
ttyp0
ttyp1
ttyp2
ttyp3
上例允許root從終端機(console、tty1~tty6)及網路(ttyp0~ttyp3)直接進入系
統。(以root 身分login)

Example 2:
cc201:/etc# cat /etc/securetty
console
tty1
tty2
tty3
tty4
tty5
tty6
上例只允許root直接從終端機進入系統。

Example 3:
cc201:/etc# rm /etc/securetty
移除或讓/etc/securetty成為空檔,則完全不允許root直接login