使用者管理(二)

身分變換 (su)

在 Linux 中要作身份的變換,如由一般使用者變成 root,或由 root 變成一般使用者來測試環境,或一般使用者變成另一個使用者,可以使用 su 這個指令來作變換:
[root@localhost /]# su – kevin (root 轉變成一般使用者 kevin 不用密碼)
[kevin@localhost ~]$ su – david
密碼: (一般使用者 kevin 轉變成一般使用者 david 要密碼)
[david@localhost ~]$ su – (不加任何使用者名稱即是轉換成 root)
密碼: (一般使用者 david 轉變成 root 要密碼)
[root@localhost ~]#

當使用 su 時,如果帶有 選項,則表示會啟動新帳號的 login script,會載入新帳號的使用者環境,如果沒有的話,則會保留原使用者的使用者環境。

==============================

sudo

除了使用 su 轉換身份外,較安全的作法是用 sudo 授權一般使用者以 root 身份執行特定的指令。sudo 的存取權限設定在 /etc/sudoers 檔案中,可用 vi 作編輯,但是最好是用 visudo 指令來編輯,它除了使用 vi 編輯外,還有語法正確性檢查的功能。

如果想給 kevin 這個帳號具有全部的管理功能,可是又不方便分享 root 的密碼,可在 /etc/sudoers 寫入這一段:
kevin  ALL=(ALL)  ALL
這樣 kevin 可以用他自己的密碼在所有主機上以 sudo 執行任何指令。

如果要給特定幾個人,使用特定幾個指令:
User_Alias    MANAGERS=kevin, david, john
Cmnd_Alias    MAN_COMMANDS=/erc/rc.d/init.d/httpd, /etc/rc.d/init.d/mysqld
MANAGERS    ALL=MAN_COMMANDS

上面是指定 kevin, david, john 三個帳號可以用 sudo 執行 /etc/rc.d/init.d/httpd 和 /etc/rc.d/init.d/mysqld 兩個指令。

sudo 的動作會記錄在 /var/log/secure 上:
#tail  -2  /var/log/secure
Feb  7 23:59:13 localhost sudo:    david : TTY=pts/1 ; PWD=/home/david ; USER=root ; COMMAND=/etc/rc.d/init.d/mysqld status
Feb  7 23:59:23 localhost sudo:    david : TTY=pts/1 ; PWD=/home/david ; USER=root ; COMMAND=/etc/rc.d/init.d/httpd status

==============================

執行檔的 SUID 與 SGID

在系統中有些檔案有權限的限制,如儲存密碼的 /etc/shadow,只設定成 root 才能讀取的 400,但因 /usr/bin/passwd 有 SUID,所以當一般使用者執行 /usr/bin/passwd 時,會轉換成 /usr/bin/passwd 擁有者的身份,即 root,來執行此程式:
# ls  -l  /etc/shadow
-r——– 1 root root 1639  4月  5 23:31 /etc/shadow
# ls  -l  /usr/bin/passwd
-rwsr-xr-x 1 root root 22960  7月 17  2006 /usr/bin/passwd

要將執行檔設定成 SUID 或 SGID 可用 chmod 指令來設定:
#chmod  u+s  FILE_NAME 或  #chmod  4755  FILE_NAME
#chmod  g+s  FILE_NAME #chmod  2755  FILE_NAME
#chmod  ug+s  FILE_NAME 或  #chmod  6755  FILE_NAME

==============================

目錄的 SGID

例如在一個分享目錄中,將目錄的群組權限設成 SGID,所有屬於這個群組的使用者都可以在這個目錄中讀寫:
# mkdir /shared
# chmod 2770 /shared (將目錄 SGID,設成 2770,也可使用 chmod  g+ws  /shared)
# chown root.kevin /shared (改變群組為 kevin)
# ls -ld /shared
drwxrws— 2 root kevin 4096  2月  7 22:40 /shared
# su – david (轉換成 david 身份)
$ id david (david 屬於 kevin 群組)
uid=602(david) gid=602(david) groups=602(david),501(kevin),601(john) context=root:system_r:unconfined_t:SystemLow-SystemHigh
$ touch /shared/david.txt (建立一個檔案)
$ ls -l /shared
總計 4
-rw-rw-r– 1 david kevin 0  2月  7 22:41 david.txt
(david 建立的檔案,可是因為 SGID,群組屬於目錄擁有者群組 kevin,所以只要屬於 kevin 群組的人都可以讀寫這個檔案)

==============================

Sticky Bit

如果設成 SGID 的話,所有的人都可以刪除別人的檔案 (刪除檔案的條件:1. 檔案擁有者、2. 檔案所在目錄的擁有者、3. root ps.有w權限只代表可以寫入,並不代表可以刪除),以上例而言,因為可寫入的人都是 kevin 的群組,而該目錄的群組是屬於 kevin,所以只要是 kevin 群組的人對其內的所有檔案都可以刪除。

如果要讓所有人都可以寫入,但是無法刪除別人的檔案,可以使用 Sticky Bit,系統中 /tmp 目錄即是最好的例子:
# ls -ld /tmp
drwxrwxrwt 15 root root 4096  2月  7 22:18 /tmp

將目錄設成 Sticky Bit 的方式:
#chmod  o+t  /DIRECTORY
#chmod  1777  /DIRECTORY

如果目錄權限出現 T 即代表 other 的 x 權限是關閉的。

==============================

權限遮罩 (umask)

如果沒有檔案權限遮罩 (umask),所有建立出來的檔案權限會是 666,目錄會是 777,系統中 root 的 umask 是 022,一般使用者是 002:
檔案:

root:
權限  rw-  rw-  rw-
遮罩  —  -w-  -w-
-----------
權限  rw-  r–  r–  (644)

一般使用者:
權限  rw-  rw-  rw-
遮罩  —  —  -w-
-----------
權限  rw-  rw-  r–  (664)

目錄:

root:
權限  rwx  rwx  rwx
遮罩  —  -w-  -w-
-----------
權限  rwx  r-x  r-x  (755)

一般使用者:
權限  rwx  rwx  rwx
遮罩  —  —  -w-
-----------
權限  rwx  rwx  r-x  (775)