作者:藍風 摘要: 建立一個新用戶 修改用戶的個人設置 文件目錄的權限設置 兩個重要文件:passwd與group 建立一個新用戶 建立一個新的用戶包括兩個步驟,第一步是使用useradd命令完成一個新用戶的初始化設置工作;第二步是用passwd為這個新用戶設置密碼。例如,我們要給系統添加一個用戶叫floatboat,密碼為fan2001z,那相關的操作是: useradd floatboat <回車> 這時候系統沒有任何顯示。接著: passwd floatboat <回車> 系統顯示: Changing passWord for user floatboat New UNIX password: 你輸入: fan2001z<回車> 注意,由於Linux並不采用類似windows的密碼回顯(顯示為*號)——為避免你輸入密碼時被人注意到有多少位——所以,輸入的這些字符你是看不見的。 系統顯示: Retype new UNIX password: 你再重新輸入一次密碼,然後回車確認,這時系統會顯示: passwd:all authentication tokens updated sUCcessfully 表示你修改密碼成功了。 到這裡,新用戶的創建工作就算完成了。下面,我們再補充一些有關增加新用戶的常識: 1、useradd所做的初始化操作已經包括在/home目錄下為floatboat帳號建立一個名為floatboat的主目錄。如果你不想使用這個缺省的目錄,而希望把他的主目錄放在/home/goal裡(還放在/home下,只是一種良好的習慣,沒有其他什麼特別的要求),可以使用useradd的參數-d,命令如下: useradd -d /home/goal floatboat 2、useradd的初始化操作還包括為用戶單獨建立一個與用戶名同名的組(floatboat組)。這叫用戶私有組的機制,與默認組機制相對應。對用戶分組一是方便管理,二是可以明確權限。復雜的我們將在以後的深入內容中探討。我們如果想讓此用戶加入一個已有的組的話,可以使用-g參數。例如我們想讓floatboat加入webusers組,那麼可以使用以下命令: useradd -g webusers floatboat 同樣的,我們還可以使用-G參數使他同時加入多個組,例如webusers和FTPusers: useradd -G ftpusers,webusers floatboat 3、passwd命令為一個用戶設置密碼,但它實質上是一個修改密碼的程序。只有超級用戶和用戶自己可以修改密碼,其它的普通用戶沒有給他修改密碼的權利。用戶密碼的組成要盡量的復雜,最好包括字母、數字和特殊符號,而且最好設成6位以上。太短passwd程序不允許,只是單純的字母或單純的數字,passwd也會有意見。你都會看見passwd出現的提示的,不要害怕,仔細看看到底它是怎麼說的:) 4、你在增加一個新用戶的時候,也可以設置用戶登錄的shell。缺省的,系統提供了/bin/bash。你如果非要指定的話,可以使用-s參數就可以了。例如 useradd -d /www -s /usr/bin/passwd floatboat 注意,這些參數是可以一塊使用的,如上例所示,它表示增加新用戶,並把其主目錄路徑設置在/www,登錄的shell為/usr/bin/passwd。關於shell的更詳細的說明,請參考下面的修改用戶的個人設置相關內容。 5、刪除一個用戶可以使用userdel命令,直接帶用戶名做參數就可以了。 修改用戶的設置 對現有用戶的修改,比較常用的主要是修改密碼(使用passwd就好了),修改用戶的登錄shell,修改用戶所屬的默認組,設置帳號有效期,修改用戶的說明信息等等,偶爾也會用到修改用戶主目錄。 修改用戶的登錄shell 使用chsh命令可以修改自己的shell,只有超級用戶才能用chsh username為其它用戶修改shell設置。注意,指定的shell必須是列入/etc/shells文件中的shell,否則該用戶將不能登陸。 一般,比較常見的shells文件包括下面這些shell: /bin/bash2 /bin/bash /bin/sh /bin/ash /bin/bsh /bin/tcsh /bin/csh 而網管們還喜歡在裡面加上/usr/bin/passwd,這是為了不然用戶通過控制台或telnet登錄系統,卻可以使用修改帳戶密碼(比如在FTP裡用)。以及/bin/false,也就是不讓這個用戶登錄的意思喽^&^,連FTP也不能用。 你也可以使用usermod命令修改shell信息,如下所示: usermod -s /bin/bash floatboat 其中/bin/bash和floatboat應取相應的shell路徑文件名及用戶名。 還有一種情況,就是你為用戶設置了一個空的shell(就是""),也就是說,這個用戶沒有shell。呵呵,絕對沒有在我還未曾見過,因為這種用戶登錄後,系統還是會給它一個shell用的。不信你試試: usermod -s "" floatboat 這種用戶根據系統的不同,會有一個sh或bash進行操作,我也沒有看出功能上和其它普通用戶登錄有什麼不同。 修改用戶所屬的默認組 這個功能也可以通過usermod命令來實現,使用-g參數,例如把floatboat的默認組改為nobody,可以使用如下命令: username -g nobody floatboat nobody在類UNIX系統中一般都意味著沒有任何權限。 設置帳號有效期 如果使用了影子口令,則可以使用如下命令來修改一個帳號的有效期: usermod -e MM/DD/YY username 例如把用戶floatboat的有效期定為2001年12月31日: usermod -e 12/31/01 floatboat 如果把該用戶的有效期設為已經過去的時間,就可以暫時禁止該用戶登錄系統。 修改用戶的說明信息 修改用戶的說明信息,最簡單的方法莫過於直接修改/etc/passwd文件,找到對應的用戶記錄行,例如下列行: floatboat:x:503:503::/home/floatboat:/bin/bash 你可以直接在第四個冒號和第五個冒號之間插入該用戶的說明就可以了。其實,很多用戶設置都可以在這修改,比如該行最後一部分/bin/bash就是用戶登錄shell的設置。關於這個/etc/passwd文件,我們後面將進一步的深入探討。 修改用戶主目錄 修改用戶的主目錄主要使用usermod命令的-d參數,例如: usermod -d /www floatboat 這一行將floatboat的主目錄改到/www。如果想將現有主目錄的主要內容轉移到新的目錄,應該使用-m開關,如下所示: usermod -d -m /www floatboat 文件目錄的權限 linux下,每一個文件、每一個目錄都有一個屬主,並針對用戶自己、用戶所在組、其它所有帳號(組)分別設定讀、寫、執行三種權限。例如,我(假定是webusers組的floatboat帳戶的擁有者)使用如下命令建立一個新的文件 touch mytestfile 然後我們使用ls -l mytestfile這一命令來查看這個文件的權限狀態(關於ls命令,可以查閱本站的命令查詢),可以得到如下的屏幕輸出顯示: -rw-rw-r-- 1 floatboat webusers 0 Feb 6 21:37 mytestfile 輸出由空格分為9個部分,我們比較關心第一、三、四個字段,分別表示文件權限屬性、文件所有者帳戶、文件所屬組。 ◆使用chown命令修改文件的主人 當你新建立一個文件的時候,文件的所有者當然就是你了。這一事實只有超級用戶(比如說root)才可以通過chown命令改變(例如chown otheruser mytestfile,把mytestfile文件的屬主改為otheruser)。普通用戶不能把自己的文件“送”給別人,不然你把有特殊目的的程序給了root怎麼辦?:) chown命令的用法比較簡單。這裡我先假設你現在擁有超級用戶權限,那麼你就可以使用如下命令將一個文件“送給”floatboat了: chown floatboat /home/floatboat/thefileisrootcreate.txt(假定該文件是由root創建的) 修改一個目錄的所有者也是類似的: chown floatboat /home/newboat 當然,如果這個目錄還有子目錄及文件需要同時送給floatboat,chown也是支持-R參數的: chown -R floatboat /home/newboat 如果你同時想修改文件/目錄所屬的組的話,你可以使用以下命令方便的達到目的: chown -R floatboat.ftpusers /home/newboat 這樣,不但文件主人得到了修改,文件所屬的組也變成了ftpusers ◆修改文件的組屬性 文件所屬組你倒是可以改變,前提是: 1、你的超級用戶。 2、你同時屬於兩個或兩個以上的組。 兩個條件你至少具備一個,你才能夠把文件所屬舊組變為新組。使用如下的命令將當前目錄下所有Html文件所屬的組改為httpd: chgrp httpd *.html 和chown命令一樣,chgrp也可以使用-R參數對一個目錄內的所有文件和子目錄進行遞歸的修改組屬性。 <提示>:你可以使用不帶參數的groups命令查看自己屬於哪個組。 文件權限的設定是我們這一小節討論的核心,我們主要介紹chmod命令的兩種用法。 ◆使用訪問字符串設置文件目錄權限 正如前面所說的,每一個文件、目錄都針對用戶自己、用戶所在組、其它所有帳號(組)分別有讀、寫、執行三種權限及其組合。當一個普通用戶新建一個文件的時候,它默認的訪問權限顯示就如我們剛才所舉例子的第一個字段所示。總共十位字符“-rw-rw-r--”,第一位是目錄區分標志,如果是d的話,表示這是一個目錄。第二到四位分別表示文件所有者的讀(r:read)、寫(w:write)、執行(x:execute)屬性,第五到七位是文件所屬組的讀、寫、執行權限,第八到第十位則是其它用戶的讀、寫、執行權限。如果對應的位是相應的字母,就是有這相應權限,否則為“-”,表示沒有獲得這個許可。象剛才例子中的文件就是自己可讀寫,本組可讀寫,其它用戶可讀,所有的用戶(包括自己)都不能執行它。 我們的用u、g、o分別來指代用戶(user)、組(group)、其它帳戶(other),就可以方便的設置文件和目錄的權限了。當然,我們也可以用a來表示所有的這三項。 例如,我們要對所有perl的腳本文件設定權限,對所有用戶都可以讀和執行,文件所有者還允許寫許可,那麼我們可以使用如下命令: chmod a+rx,u+w *.pl 注意:如果要使用多個訪問字符串,它們之間要用逗號隔開,各個許可字符串之間不允許有空格。正如上例所示。 如果要修改目錄中所有文件和子目錄的權限屬性,可以使用chmod提供的-R參數來遞歸修改。例如,下列命令將/www/site1目錄及其下面的子目錄的權限屬性設定為所有者和組可讀、寫、執行,其它用戶不可訪問: chmod -R a+rwx,o-rwd /www/site1 注意,不要輕易使用-R選項,這可能會帶來安全隱患。 使用字符串方便了理解,單輸入那麼多字母還是有點累,如果你對8進制有些概念的話,可以使用下面介紹的方法來做權限設置。 ◆使用八進制數設置文件目錄權限 我們知道,在ls -l的輸出中,文件權限表示為“-rw-rw-r--”,前一位只和是否為目錄有關,其它九位正好可以分成三段,每段三位,“rw-”、“rw-”和“r--”,“-”代表無效“0”,其它字符代表有效“1”,那麼這個文件的權限就是“110”、“110”、“100”,把這個2進制串轉換成對應的8進制數就是6、6、4,也就是說該文件的權限為664(三位八進制數)。我們也可以使用類似這種三位八進制數來設定文件授權,如上邊兩個例子,就也可以寫為: chmod 755 *.pl chmod -R 770 /www/site1 是不是很簡潔?關鍵在於你能根據你需要設定的權限正確的選擇八進制數(利用八進制數的二進制表示可以非常輕易的做到這一點)。 ◆讀、寫、執行的權限說明 1、所謂寫的權限,也就是對文件修改和刪除的權限。如果目錄的寫權限也對你開放了,則可以創建、刪除或修改該目錄下的任何文件或自目錄——即使該文件和子目錄並不屬於你。 2、對目錄有只讀許可的用戶,不能用cd命令進入該目錄;還必須同時有執行許可才可以進入該目錄。 3、必須同時擁有讀和執行權限才可以使用ls這樣的程序列出目錄內容清單。 4、只對目錄有執行權限的用戶,想訪問該目錄下的文件有讀權限的文件,必須知道該文件名才可以訪問。 兩個重要文件:passwd與group 在linux的安全機制裡,/etc/passwd與/etc/group這兩個文件占著非常重要的地位。它們控制著linux的用戶和組一些重要設置。 ◆/etc/passwd文件說明 下面是一個RHlinux裡普通的passwd文件的例子: root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin: daemon:x:2:2:daemon:/sbin: …… operator:x:11:0:operator:/root: games:x:12:100:games:/usr/games: gopher:x:13:30:gopher:/usr/lib/gopher-data: ftp:x:14:50:FTP User:/home/ftp: nobody:x:99:99:Nobody:/: xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false named:x:25:25:Named:/var/named:/bin/false postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash lanf:x:500:500::/home/hujm:/bin/bash mysql:x:101:101:MySQL server:/var/lib/mysql:/bin/bash imnotroot:x:0:0::/home/imnotroot:/bin/bash 在這個文件裡只有一個普通帳號lanf。其它都是系統或系統服務的進程需要的帳號,包括我們非常熟悉的root這個超級用戶。在passwd的文件裡,每一行被冒號(":")分成7個部分,分別是: [用戶名]:[密碼]:[UID]:[GID]:[身份描述]:[主目錄]:[登錄shell] 其中: ⒈[用戶名]是passwd文件裡各記錄行唯一的有"唯一性"要求的域。也就是說每一行的第一個區域的內容都不能相同,其它區域就無所謂了。 ⒉[密碼]區域在以前,保存著一個經過不可逆的哈希算法進行DES加密的13位字符,但不包括單引號和冒號。這13位字符中,前兩位是密鑰,在加密的時候隨機生成的。由於這個字符串不包括單引號,所以以前有一種不修改密碼又禁止用戶登錄的方式就是在密碼前面加一個單引號。值得注意的是,現在由於使用了shadow口令,在密碼區域只有一個x字符。 ⒊[UID]雖然是系統用來標志文件歸屬,確定各種權限的標志,但這個區域的內容並不要求唯一的。比較常見而又與安全問題相關的一個例子是有多個UID和GID均為0的用戶帳號。注意到在該文件最後一行還有一個UID和GID為0的用戶imnotroot,雖然它聲稱自己不是root,但是它卻有和root完全相同的權限,因為系統並非根據[用戶名],而是根據UID和GID來分用戶的權力的。所以,這種情況無疑為系統埋下了安全的炸彈。但是,當imnorroot做鎖定屏幕等操作的時候,如果它的密碼和root的不一樣,它將無法解鎖,因為系統只是查到第一個UID為0的用戶(自然是root)後,就不在往下查找了——它當UID也是唯一的。 ⒋[GID]用戶默認的組ID,這個ID可以在文件/etc/group裡查到對應的組名。 ⒌[身份描述]:就是用戶的身份說明,默認的是無任何說明,可人工添加。 ⒍[主目錄]:用戶的主目錄,可以使用前面介紹的命令修改。 ⒎[登錄shell]:用戶登錄時系統提供的shell,請參考前面的有關內容。 <注意>:[UID]和[GID]小於500的一般都是系統自己保留,不做普通用戶和組的標識的,所以新增加的用戶和組一般都是UID和GID大於500的。 ◆/etc/group文件說明 下面是RH的一個group文件的例子: root:x:0:root,hujm,hjm bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin,adm adm:x:4:root,adm,daemon tty:x:5: disk:x:6:root lp:x:7:daemon,lp mem:x:8: kmem:x:9: wheel:x:10:root mail:x:12:mail news:x:13:news uucp:x:14:uucp …… hujm:x:503:root,mynoshell,hjm mysql:x:101: mynoshell:x:505: ftpusers:x:506: 它總共分四個部分: [組名]:[密碼域]:[GID]:[組員列表] 意思非常明顯,需要說明一下的是,由於組一般都不用密碼保護,所以雖然看起來密碼域有個X字符,其實那只表示使用了SHADOW(對應文件為gshadow)。組員列表用逗號分隔各個帳號。另外,一個組的組員如果默認登錄組就是它的話,那麼在組員列表裡將不顯示這個組員的帳號,例如用如下命令增加的用戶: useradd -g ftpusers floatboat 在/etc/group文件裡ftpusers的組員列表將不顯示這個組員(真是失敗),而只是在passwd文件中的GID被設置為506。而使用如下命令: usermod -G ftpusers,mysql,webusers floatboat 就可以看見相關的組後邊加上了floatboat帳號。當然,你可以直接用vi來直接編輯這個文件。 group文件和passwd文件是通過GID聯系在一起的,這有點象關系數據庫。根據passwd文件中一個帳戶的GID,可以在group文件中找到對應的組名。如果采用了用戶私有組機制的話,那麼一般新增一個帳號,就會有對應的一個與帳號同名的組增加到group文件中。雖然這時passwd文件中具有唯一性的[用戶名]字段和group文件中具有唯一性的[組名]字段一樣,並不代表著它們是通過這兩個字段形成一一對應的關系的。千萬別忘記,系統對數字(UID,GID)更加敏感^_^。 再有一點應該注意,你統計一個組的組成員的時候,千萬別只記得看組成員列表哦,還應該查找默認登錄組也是這個組的用戶——它們可不一定在列表裡。 〈提示〉新組的增加可以使用groupadd newgroupname。