身分變換 (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)