版權宣告 線上(批次)新增移除修改 user帳號程式 (User_Admin) 2.2版 程式設計 : Worren Feung 馮國棟 E-mail : worren.feung@msa.hinet.net worren@worren.77bbs.com d8621064@knight.fcu.edu.tw worren@77bbs.com HomePage : http://worren.77bbs.com http://worren.panfamily.org BBS : telnet://77bbs.com telnet://bbs2.77bbs.com(備份站) Worren.bbs@77bbs.com 本程式版權所有。在非營利單位、或非營利販售散佈的情況下,歡迎使用、修改。 並請以「廣告條款」、GUN GPL 來推廣User_Admin的使用及程式的精進。 小弟才疏學淺,程式內容或許會有許些問題,敬請各位先進前輩指教。 2002/4/2 0.1版 2002/4/14 0.5版 2002/5/13 1.0版 Release 2002/5/15 1.1版 2002/5/16 1.1.1版 2002/5/29 1.2版 2002/6/5 1.3版 2002/6/6 1.4版 test 2002/6/12 2.0版 Release 2002/6/16 2.1版 2002/12/15 2.2版 緣起 小弟目前正在屏東的一所小學(餉潭國小)裡服替代役, 這套程式是幫助學校裡管理 mail server而產生的; 而我覺得應該還算不錯用, 故release出來給大家用! 此程式會一直維護到我退伍, 敬請各位先進來信指教! ps: 我大概2003年底退伍...還很久的...:( 說明 特別注意 : 本程式或許會造成系統上的漏洞, 請小心使用! 已知問題 : 在經過多位先進的指教, 漏洞的問題已經改善了很多了! 只要有設定在user_admin群組的ID的密碼,就可以php模式執行系統上的 sudo程式. 故user_admin群組的user越少越好,密碼越特別越好,因得知 user_admin群組中任一user及apache runner(www)的密碼,且會使用php 語言就機乎等於擁有root身份權限了! 測式系統 : FreeBSD 4.5-RELEASE以上, apache1.3.2以上 , php4.2以上 適用系統 : Unix 應該都可以用...只要把有/無 shadow的 password檔指定好即可! 特別注意 : 我並沒有真正地把這程式安裝在Linux機器上跑過, 手邊沒有機器可以安裝Linux了。 功 能 : 以利用unix系統指令, 透過php的執行函數的組合, 可以在線上讓網管人員直接新增/移除user、修改user密碼、批次新增移除. 所須配合 程式 : sudo (Linux已內建). 安 裝 : 由於我是在FreeBSD下寫這程式, so預設以FreeBSD的情況來寫安裝步驟, 其它UNIX系統應該只是要注意 config.php裡的兩個檔案 要確定上述需配合的程式是可以跑的...Format_Number.php已附上! a)將本程式所有的檔案放在一路徑下,編輯config.php ps: Linux的使用者請將config_linux.php 更名成config.php來做適當修改! 將 master.passwd, passwd , user_admin ,暫存檔(/etc就可了), guest和vip 各別的家目錄.....等 的路徑指定正確. ps:Linux的中對應到FreeBSD的master.passwd為 /etc/shadow log檔的路徑所在, 我預設為/var/log/user_admin , 請手動建立這個目錄, 並且確定"www"這個user可以寫讀... 如, chown www:www /var/log/user_admin User_Admin所在的路徑請chown為apache的runner ex: chown www:www /home/www/user_admin 編輯相關字串. 定義apache runner(指"www"這個系統id)是否有密碼,最好是有!! 以加強安全性. 編輯vip和guest group的gid, 因為user_admin 中的"一般user" 是依照 group,"guest"的gid; 而"特別使用者"即指vip 編輯不可刪除名單list, 避免這些id被砍, 每個id之間以","隔開 編輯不可新增名單list, 避免和系統衝突, 每個id之間以","隔開 編輯user_admin所要用的安全性定義(應該用預設值就可以滿足您了) b)將apache的runner id(不是 nobody就是www,我是用www,因太多種程式用nobody) 以visudo 加入 : %user_admin ALL = (ALL) PASSWD:ALL www ALL = (%user_admin) PASSWD:ALL 以root身份修改www的密碼, case 1: 不要密碼, 請以vipw把密碼欄位清空, 不要留下"*" ex:www::80:80::0:0:www:/nonexistent:/sbin/nologin case 2: 要密碼, 請由root以passwd www來修改(強烈建議選用此項) 記得 config.php裡的 $is_wwwpass要="yes"(default) c)建立一user_admin的group ,並將準備要使用此管理程式的userid加入之,ex: edit /etc/group , 加入 user_admin:*:1100:worren,changycc,pank 對應到config.php, 建立一guest,一vip的group; ex: edit /etc/group , 加入 guest:*:31: vip:*:32: d)編 auth.php 第22行左右 if ( $username=="worren" or $username=="changycc" or $username=="pank") { $okusername=$username; } ...... 增加移除可以讓系統上的某些user可以使用本程式.. 如要新增一個系統上的 "ero" , 讓他可以使用本程式... if ( $username=="worren" or $username=="changycc" or $username=="pank" or $username=="ero") { $okusername=$username; } ...... 當然, 也要將"ero" 加入user_admin群組: user_admin:*:1100:worren,changycc,pank,ero 反之亦然 e)新增兩個系統帳號, quota_guest及quota_vip, 並為此兩個user設quota, 如此, 程式裡的"特別使用者"會套用 quota_vip的設定; "一般使用者"和 "批次新增"的使用者都會套用quota_guest 的設定.若沒有設, 應該也沒 差吧!?程式還是可以跑的! 設定方法: 以root的身份執行 edquota quota_guest, 然後會以預設編輯器出現設定畫面: Quotas for user quota_guest: /home: blocks in use: 0, limits (soft = 3500, hard = 3000) inodes in use: 0, limits (soft = 3500, hard = 3000) 如是, 系統將會給quota_guest有3000bytes - 3500 bytes的空間. 而user_admin所建立的"一般使用者"(include批次新增的)也會如是! quota_vip則對應到特別使用者. 有關其它quota的用法請自行看相關文件 f)compile check.c(for FreeBSD的我已經附上compile過的檔,此步驟可不做): 若您是Linux的使用者, 請編輯check.c的第8~9行處,FreeBSD的使用者請跳過此步驟 原來的模樣: #define PATH_TO_SHADOW "/etc/master.passwd" //這行是FreeBSD的設定 //#define PATH_TO_SHADOW "/etc/shadow" //這行是linux的設定 改成: //#define PATH_TO_SHADOW "/etc/master.passwd" //這行是FreeBSD的設定 #define PATH_TO_SHADOW "/etc/shadow" //這行是linux的設定 再來下指令 gcc -o check -lcrypt check.c ;當然,要compile前 最好把附上for FreeBSD版的check這個檔給殺了! ********************************* * * * -=-=-=-=-History-=-=-=-=- * * * ********************************* 1.1版 bugs fixed: a)加強系統安全性, 不用把master.passwd 的可讀權限提升到www可讀.. b)1.0版的程式碼裡都是我自己的預設路徑, 現已修正可讓user由config.php 裡修改. 1.1.1版 security fixed a)感謝sheng的指教, 1.1版中為了讓www可讀master.passwd, 卻也造 成了系統漏洞, 此版中修正了這個問題! 1.2版 function added a)新增log檔, 清楚地記錄每一個動做, 提高安全性. b)新增unremoveable user list, 避免重要帳號被砍. (感謝 Vincent W.K Chu , vincent@amalay.com 來信指教) security fixed a)1.1.1版之前, 系統上一般user也可以透過php的exec語法來執行sudo.. 現在程式核心的部份重寫, 這個問題已解決! 除非有系統上 user_admin 群組的密碼, 才有可能執行sudo! known bugs a)新增帳號時, 若密碼小於6位元會有問題...因passwd指令會產生不同的結果! 以致script不能如期去跑! 暫且由php以程式碼來控制密碼字元長度! 若要事 後修正的話,是可以小於6個字元的. b)由於程式核心重寫, 為求程式之穩定及系統之安全, 程式執行速度會稍慢. 1.3版 bugs fixed a)1.2版重寫的核心程式, 當管理員簽入時若輸入錯誤的密碼就會導致整個 程式無法使用. 現在問題已解決! b)1.3版的速度會比1.2版快一點點. 只有一點點...-_- function added a)新增guest和vip錄徑, 可各別指向! b)新增不可新增之帳號名單, 以免和系統衝突. 1.3.1版 bugs fixed a)沒測到修改密碼功能有疏失 in new code ...已修正. 1.4版 test (這版沒有release出去) what's new: a)print出 user table 的方式之程式碼做進一步的修改, 加強程式的結構性, 亦加快程式的速度. b)新增顯式模示功能--只show出特別user, show出以xxoo開頭的user, show 出全部的user 2.0版 RELEASE what's new a)新增可選擇系統user,www,是否有password. 強烈建議選擇"有" -->login劃面中, private password是管理員的password欄; public password 是www的password欄. bugs fixed a)改善1.x版的相容性的問題, 捨棄以expect, 改以php的popen(). 不用再安裝一堆有的沒有的怪東西. b)改善說明檔寫得不夠完善.(我是很迷糊的...攪不好目前這份文件還是有 缺漏的) known bugs a)在loging時, username輸入對了, 但password(無論是 private password 或 public password)輸入錯的話, 會出現 Warning: fopen("/etc/passwd_www", "r") - No such file or directory in /usr/home/www/user_admin_2.0/auth.php on line 44 非必要的訊息. 但這不影響操作. 有必要時我才會想辦法fix這bug, or有 那位user知道如何讓php在特定的情況下不show出警告訊息. b)新增user時, "姓名"欄位遇到某些中文字時(含有"@"字元)就無法新增. 是因為pw的雙位元字相容性的問題. 只要用英文名就ok了! security note a)本是要以pipe的方式來減低交談式的script,但是鑑於各位先進的指教說 明此法可以ps or top的方式show 出user的password, 連我自己也馬上想 出寫出一個可以紀錄各user執行的log檔,可記錄各管理員user未加密的 password. 故仍採以交談式的script為主. 目前仍未測的任何問題. thanks KTH 和 Thinker兄的指教.得以2.0版的改版. Yen-Ming Lee ,sheng 等提供意見. 2.1版 what's new? files: check.c("check" is what compiled) what's update? files: lib.php , auth.php, config.php(version string only), -->若是舊user, 可以只update check.c, lib.php, auth.php 這三個檔就好了! security: 修改login機制, 原本的機制是只要有心人士寫個script就可以抓到 /etc/master.passwd 下來做暴力編碼工作. 現在做了一個亂數加密的機制. 相信是更好的一個機制! 當然, 若有網友可以提供更好的方法, 也煩請 指教!...:) 有興趣的網友請參考 check.c 及 lib.php 裡的function ua_check_pass() (原security漏洞感謝 Vincent W.K Chu , vincent@amalay.com 來信指教) 2.2版 what's new? files: chmod.php new function : 新增可以設定user的家目錄的安全性, 並可透過config.php來手動設定! what's update? files: lib.php , index.php, footer.php, config.php、batch*.php、adduser*.php who need this new version? 想要在新增user時就給這位user的家目錄設好權限。有高、中、低、其它 四種。 其中除了"其它"之外, 三種都是定義在 config.php中,請升級的各位大大注意一下這部份的設定。 若您選擇了"其它"的安全性,user_admin會以 mask值 700 來設定。 客問答 Q&A: 以下是這一陣子收到有關user_admin的E-mail整理出來的問題. 1.Q:Linux 可以跑user_admin嗎? A:應該可以, 不過我沒試過, 因為我手邊沒有Linux的機器, 如果Linux內建的sudo和我所使用的版本相差不大, 以致不 影響script的流程的話, 那就是可以用. ps:請有在Linux or其它UNIX Like系統上用過成功的先進mail告訴偶一下...^_^ 2.Q:Windows系列的系統可以跑user_admin嗎? A:不行. 3.Q:為什麼1.2版裡, 當管理員login時打錯密碼, 程式就不跑了, 並出現 一些怪訊息; 即使我重新安裝了user_admin也一樣? A:Sorry,因為我最近公事的業務量增高,而又急於修改1.0-RELEASE上的 安全漏洞, 在極少的時間裡面把核心程式重寫, 沒有很多的時間測試. 所以,程式流程上出了些問題. 不過1.3以後的版本就已解決了! 4.Q:user_admin的版本編號是怎麼取的? A:......沒有怎麼取的..原則上整數版的就是最穩定的! but可能會有漏洞. 而有小數的, 就是修改漏洞 or bug時的版本.但可能較不穩..-_- 如: 1.0版會比1.1 or 1.2版穩, 但是有一定的漏洞及bugs 目前最新的2.0版是最少漏洞及bug的最穩定版. 5.Q:user_admin的相關參考書籍是...? A:....沒有相關參考書籍....不過參考下面的文件,應該就寫得出來了! FreeBSD handbook , apache 1.3.x 相關文件 , PHP4.0手冊 6.Q:替代役很涼ㄛ~~? 不然你怎有時間寫這程式? A:看單位吧? 當常備役也有很涼的. 不過我是正好遇上肯給我時間空間 的老大(長官,也就是我服役單位的校長), 讓我玩玩這些東西. 一般 來講, 偏遠地區的小學(人數少的小學)會比較輕鬆, 不過晚上很無聊 就是了, 還好校長讓我拉了一條網路線到我的宿舍, 也讓我們跟住宿 的老師一起供一條第四台的線, 我才不會那麼無聊! ps: 怎麼會問這種問題...哈... 7.Q:1.3版裡有"不可刪除名單" ? 難道...有可能會有user重覆新增了 but卻不曉得的? A:0.1版就已經有避免這個問題了! 不可刪除名單的用意是在不讓不懂 系統的網管新增了不該新增的帳號. 8.Q:user_admin最小硬體需求? A:我在P-75+32MB ram的機器處理約0.5k個user的速度和在 PII-333 dual cpu+128MB ram 的機器差不多....除非您要處理的資料有上萬筆,否則 Pentium-75+32MB ram如此基本的機器應該就可以勝任了. 9.Q:我想要將user_admin當做套裝系統中的一個程式可以嗎? A:只要是非營利單位(ex:教育單位)可以免費使用及任意修改散佈! 但請mail告知. 但是若是公司行號般的營利單位就不可以免費使用修改散佈! 請mail洽詢. 10.Q:請問Worren您幾歲了? 星座血型呢? 什麼科系畢業的? A:我今年25歲, 我是1978年生的. 我是雙子座, AB型的. 逢甲大學紡織工程系畢業. ps:....要幫我借紹女友嗎?怎問這種問題...哈~ 11.Q:每次進入這個系統都會印出所有的user, 而我系統上的user有幾百個, 是否可以用什麼方法改善這個問題? A:目前的2.0版已經有可以選擇顯式模式的功能了! 請試用看看!.. 12.Q:www 的密碼欄位若是 "*"會有怎麼樣的結果? 其家目錄和shell要怎麼設? A:我也不知道.不過應該跑不起來吧. 家目錄和shell就設成 /nonexistent:/sbin/nologin 就可以了! 13.Q:為什麼看不到非user_adimn建立的系統user? 為什麼還有一般user和特別user之分? A:因為user_admin當初的設計是給不熟悉UNIX系統但卻又非得當網管的人用的! 故必須要過濾掉一些系統id. 如root, mysql...etc,免得管理員又會問: 這 些帳號我沒有建立,怎會在? 可不可以刪除..等...的問題. 故user_admin的設計是: 以gid為vip(32)為特別使用者, guest(31)為一般使用者. (當然31,32是要在 /etc/group 和 config.php中設定) 而當初我的設計是guest(一般user)是開批次帳號給學生時用的; 而vip(特別user)是各別開帳號給教職員工用的. 那或許您又會問了,在主選單裡也有開一般user帳號的功能ㄚ...對ㄚ~..這是附加的. 想說...或許也有家長委員也會想開帳號! 14.Q:quota在user_admin是怎麼樣run的? A:必須先開quota_guest , quota_vip 這兩個系統帳號,分別給予做quota的設定. 當您以user_admin開一般user帳號時,會把quota_guest的設定copy過去, 當您以user_admin開特別user帳號時,會把quota_vip的設定copy過去. 若您沒有開quota_guest 或 quota_vip的話, 則其對應的功能就會無效用. 未來展望 敬請各位先進指導程式該怎麼寫才較好用/人性化 最近有收到一些前輩來信以及在BBS上討論指導, 心中萬分感激....