從系統管理員的角度討論UNIX安全問題(轉)

BSDLite發表於2007-08-11
從系統管理員的角度討論UNIX安全問題(轉)[@more@] 本文從系統管理員的角度討論安全問題.系統管理員是管理系統的人:啟動系統,停止系統執行,安裝新軟體,增加新使用者,刪除老使用者,以及完成保持系統發展和執行的日常事務工作。
  
  1.安全管理
  安全管理主要分為四個方面:
  (1)防止未授權存取:這是電腦保安最重要的問題:未被使用系統的人進入系統.使用者意識,良好的口令管理(由系統管理員和使用者雙方配合),登入活動記錄和報告,使用者和網路活動的週期檢查,這些都是防止未授權存取的關鍵。
  (2)防止洩密:這也是電腦保安的一個重要問題.防止已授權或未授權的使用者相互存取相互的重要資訊.檔案系統查帳,su登入和報告,使用者意識,加密都是防止洩密的關鍵。
  (3)防止使用者拒絕系統的管理:這一方面的安全應由作業系統來完成.一個系統不應被一個有意試圖使用過多資源的使用者損害.不幸的是,UNIX不能很好地限制使用者對資源的使用,一個使用者能夠使用檔案系統的整個磁碟空間,而UNIX基本不能阻止使用者這樣做.系統管理員最好用PS命令,記帳程式df和du週期地檢查系統.查出過多佔用CUP的程式和大量佔用磁碟的檔案。
  (4)防止丟失系統的完整性:這一安全方面與一個好系統管理員的實際工作(例如:週期地備份檔案系統,系統崩潰後執行fsck檢查,修復檔案系統,當有新使用者時,檢測該使用者是否可能使系統崩潰的軟體)和保持一個可靠的作業系統有關(即使用者不能經常性地使系統崩潰).
  本文其餘部分主要涉及前兩個問題,第三個問題在"安全查帳"一節討論。
  
  2.超級使用者
  一些系統管理命令只能由超級使用者執行.超級使用者擁有其他使用者所沒有的特權,超級使用者不管檔案存取許可方式如何,都可以讀,寫任何檔案,執行任何程式。系統管理員通常使用命令: /bin/su 或以 root 進入系統從而成為超級使用者.在後面文章中以#表示應敲入必須由超級使用者執行的命令,用$表示應敲入由所有其他使用者執行的命令。
  
  3.檔案系統安全
  (1)UNIX檔案系統概述
  UNIX檔案系統是UNIX系統的心臟部分,提供了層次結構的目錄和檔案.檔案系統將磁碟空間劃分為每1024個位元組一組,稱為塊(block)(也有用512位元組為一塊的,如:SCO XENIX).編號從0到整個磁碟的最大塊數.全部塊可劃分為四個部分,塊0稱為引導塊,檔案系統不用該塊;塊1稱為專 用塊,專用塊含有許多資訊,其中有磁碟大小和全部塊的其它兩部分的大小.從塊2開始是i節點表,i節點表中含有i節點,表的塊數是可變的,後面將做討論.i節點表之後是空閒儲存塊(資料儲存塊),可用於存放檔案內容.檔案的邏輯結構和物理結構是十分不同的,邏輯結構是使用者敲入cat命令後所看到的檔案,使用者可得到表示檔案內容的字元流.物理結構是檔案實際上如何存放在磁碟上的儲存格式.使用者認為自己的檔案是邊疆的字元流,但實際上檔案可能並不是以邊疆的方式存放在磁碟上的,長於一塊的檔案通常將分散地存放在盤上.然而當使用者存取檔案時,UNIX檔案系統將以正確的順序取各塊,給使用者提供檔案的邏輯結構.當然,在UNIX系統的某處一定會有一個表,告訴檔案系統如何將物理結構轉換為邏輯結構.這就涉及到i節點了.i節點是一個64位元組長的表,含有有關一個檔案的資訊,其中有檔案大小,檔案所有者,檔案存取許可方式,以及檔案為普通檔案,目錄檔案還是特別檔案等.在i節點中最重要的一項是磁碟地址表.該表中有13個塊號.前10個塊號是檔案前10塊的存放地址.這10個塊號能給出一個至多10塊長的檔案的邏輯結構,檔案將以塊號在磁碟地址表中出現的順序依次取相應的塊。
  當檔案長於10塊時又怎樣呢?磁碟地址表中的第十一項給出一個塊號,這個塊號指出的塊中含有256個塊號,至此,這種方法滿足了至多長於266塊的檔案(272,384位元組).如果檔案大於266塊,磁碟地址表的第十二項給出一個塊號,這個塊號指出的塊中含有256個塊號,這256個塊號的每一個塊號又指出一塊,塊中含256個塊號,這些塊號才用於取檔案的內容.磁碟地址中和第十三項索引定址方式與第十二項類似,只是多一級間接索引。
  這樣,在UNIX系統中,檔案的最大長度是16,842,762塊,即17,246,988,288位元組,有幸是是UNIX系統對檔案的最大長度(一般為1到2M位元組)加了更實際的限制,使使用者不會無意中建立一個用完整個磁碟窨所有塊的檔案.檔案系統將檔名轉換為i節點的方法實際上相當簡單.一個目錄實際上是一個含有目錄表的檔案:對於目錄中的每個檔案,在目錄表中有一個入口項,入口項中含有檔名和與檔案相應的i節點號.當使用者敲入cat xxx時,檔案系統就在當前目錄表中查詢名為xxx的入口項,得到與檔案xxx相應的i節點號,然後開始取含有檔案xxx的內容的塊。
  
  (2)保持系統安全
  . 考慮系統中一些關鍵的薄弱環節:
  a. 系統是否有MODEM?電話號碼是否公佈
  b. 系統是否連線到?還有什麼系統也連線到該網路
  c. 系統管理員是否使用未知來處或來處不可靠的程式
  d. 系統管理員是否將重要資訊放在系統中
  e. 系統的使用者是熟悉系統的使用還是新手
  f. 使用者是否很重視關心安全
  g. 使用者的管理部門是否重視安全
  
  . 保持系統檔案安全的完整性.檢查所有系統檔案的存取許可,任何具有SUID許可的程式都是非法者想偷換的選擇物件.
  . 要特別注意裝置檔案的存取許可.
  . 要審查使用者目錄中具有系統ID/系統小組的SUID/SGID許可的檔案.
  . 在未檢查使用者的檔案系統的SUID/SGID程式和裝置檔案之前,不要安裝使用者的檔案系統.
  . 將磁碟的備份存放在安全的地方.
  . 設定口令時效,如果能存取UNIX的原始碼,將加密口令和資訊移到僅對root可讀的檔案中,並修改系統的口令處理子程式.這樣可增加口令的安全.修改passwd,使passwd能刪去口令打頭和末尾的數字,然後根據spell詞典和/etc/passwd中使用者的個人資訊,檢查使用者的新口令,也檢查使用者新口令中子串等於登入名的情況.如果新口令是spell詞典中的單詞,或/etc/passwd中的入口項的某項值,或是登入名的子串,passwd將不允許使用者改變口令.
  
  . 記錄本系統的使用者及其授權使用的系統.
  . 查出久未使用的登入戶頭,並取消該戶頭.
  . 確保沒有無口令的登入戶頭.
  . 啟動記帳系統.
  . 查出不尋常的系統使用情況,如大量的佔用磁碟,大量的使用CPU時間,大量的程式,大量的使用su的企圖,大量無效的登入,大量的到某一系統的網路傳輸,奇怪的uucp請求.
  . 修改shell,使其等待了一定時間而無任務時終止執行.
  . 修改login,使其列印出使用者登入的最後時間,三次無效登入後,將通訊線掛起,以便系統管理員能檢查出是否有人試圖非法進入系統.確保login不讓root在除控制檯外的任何地方登入.
  . 修改su,使得只有root能以過期口令透過su進入某一戶頭.
  . 當安裝來源不可靠的軟體時,要檢查原始碼和makefile檔案,檢視特殊的子程式呼叫或命令.
  . 即使是安裝來源可靠的軟體,也要檢查是否有SUID(SGID)程式,確認這些許可的確是必要的.如果可能,不要讓這些程式具有系統ID(或組)的SUID(SGID)許可,而應該建立一個新使用者(或給)供該軟體執行.
  
  . 如果系統在辦公室中,門應上鎖,將重要資料儲存在軟盤上或帶上,並鎖起來.
  . 將secure,perms和任何其它做安全檢查的shell程式存取許可置為僅執行,更好的是將這些shell程式存於可拆卸的介質上.
  
  . 記住,只要系統有任何人都可呼叫的撥號線,系統就不可能真正的安全.系統管理員可以很好地防止系統受到偶然的破壞.但是那些有耐心,有計劃,知道自己在幹什麼的破壞者,對系統直接的有預謀的攻擊卻常常能成功.
  
  . 如果系統管理員認為系統已經洩密,則應當設法查出肇事者.若肇事者是本系統的使用者,與使用者的管理部門聯絡,並檢查該使用者的檔案,查詢任何可疑的檔案,然後對該使用者的登入小心地監督幾個星期.如果肇事者不是本系統的使用者,可讓本公司採取合法的措施,並要求所有的使用者改變口令,讓使用者知道出了安全事故,使用者們應當檢查自己的檔案是否有被竄改的跡象.如果系統管理員認為系統軟體已被更改了,就應當從原版系統帶(或;軟盤)上重灌入所有系統軟體,保持系統安全比道歉更好.
  
  (3)裝置檔案
  UNIX系統與邊在本系統上的各種裝置之間的通訊,透過特別檔案來實現就程式而言,磁碟是檔案,MODEM是檔案,甚至記憶體也是檔案.所有連線到系統上的裝置都在/dev目錄中有一個檔案與其對應.當在這些檔案上執行I/O操作時,由UNIX系統將I/O操作轉換成實際裝置的動作.例如,檔案/dev/mem是系統的記憶體,如果cat這個檔案,實際上是在終端顯示系統的記憶體.為了安全起見,這個檔案對普通使用者是不可讀的.因為在任一給定時間,記憶體區可能含有使用者登入口令或執行程式的口令,某部分檔案的編輯緩衝區,緩衝區可能含有用ed -x命令解密後的文字,以及使用者不願讓其他人存取的種種資訊.在/dev中的檔案通常稱為裝置檔案,用ls /dev命令可以看看系統中的一些裝置:
  
  acuo 呼叫自動撥號器
  console 系統控制檯
  dsknn 塊方式操作磁碟分割槽
  kmem 核心記憶體
  mem 記憶體
  lp 印表機
  mto 塊方式操作磁帶
  rdsknn 流方式操作的磁碟分割槽
  rmto 流方式操作的磁帶
  swap 交換區
  syscon 系統終端
  ttynn 終埠
  x25 網路埠
  等等
  
  (4)/etc/mknod命令
  用於建立裝置檔案.只有root能使用這個命令建立裝置檔案.其引數是檔名,字母c或b分別代表字元特別檔案或塊特別檔案,主裝置號,次裝置號.塊特別檔案是像磁帶,磁碟這樣一些以塊為單位存取資料的裝置.字元特別檔案是如像終端,印表機,MODEM,或者其它任何與系統通訊時,一次傳輸一個字元的裝置,包括模仿對磁碟進行字元方式存取的磁碟驅動器.主裝置號指定了系統子程式(裝置驅動程式),當在裝置上執行I/O時,系統將呼叫這個驅動程式.呼叫裝置驅動程式時,次裝置號將傳遞給該驅動程式(次裝置規定具體的磁碟驅動器,帶驅動器,訊號線編號,或磁碟分割槽).每種型別的裝置一般都有自己的裝置驅動程式.
  
  檔案系統將主裝置號和次裝置號存放在i節點中的磁碟地址表內,所以沒有磁碟空間分配給裝置檔案(除i節點本身佔用的磁碟區外).當程式試圖在裝置檔案上執行I/O操作時,系統識別出該檔案是一個特別檔案,並呼叫由主裝置號指定的裝置驅動程式,次裝置號作為呼叫裝置驅動程式的引數.
  
  (5)安全考慮
  將裝置處理成檔案,使得UNIX程式獨立於裝置,即程式不必一定要了解正使用的裝置的任何特性,存取裝置也不需要記錄長度,塊大小,傳輸速度,網路協議等這樣一些資訊,所有煩人的細節由裝置驅動程式去關心考慮,要存取裝置,程式只須開啟裝置檔案,然後作為普通的UNIX檔案來使用.從安全的觀點來看這樣處理很好,因為任何裝置上進行的I/O操作只經過了少量的渠道(即裝置檔案).使用者不能直接地存取裝置.所以如果正確地設定了磁碟分割槽的存取許可,使用者就只能透過UNIX檔案系統存取磁碟.檔案系統有內部安全機制(檔案許可).不幸的是,如果磁碟分割槽裝置得不正確,任何使用者都能夠寫一個程式讀磁碟分割槽中的每個檔案,作法很簡單:讀一i節點,然後以磁碟地址表中塊號出現的順序,依次讀這些塊號指出的存有檔案內容的塊.故除了root以外,決不要使盤分割槽對任何人可寫.因為所有者,檔案存取許可方式這樣一些資訊存放於i節點中,任何人只要具有已安裝分割槽的寫許可,就能設定任何檔案的SUID許可,而不管檔案的所有者是誰,也不必用chmod()命令,還可避過系統建立的安全檢查.
  
  以上所述對記憶體檔案mem,kmem和對換檔案swap也是一樣的.這些檔案含有使用者資訊,一個"耐心"的程式可以將使用者資訊提取出來.要避免磁碟分割槽(以及其它裝置)可讀可寫,應當在建立裝置檔案前先用umask命令設定檔案建立遮蔽值.
  
  一般情況下,UNIX系統上的終埠對任何人都是可寫的,從而使使用者可以用write命令傳送資訊.雖然write命令易引起安全方面的問題,但大多數使用者覺得用write得到其他使用者的資訊很方便,所以系統將終端裝置的存取許可設定成對所有使用者可寫.
  
  /dev目錄應當是755存取許可方式,且屬root所有.
  不允許除root外的任何使用者讀或寫盤分割槽的原則有一例外,即一些程式(通常是資料庫系統)要求對磁碟分割槽直接存取,解決這個問題的經驗的盤分割槽應當由這種程式專用(不安裝檔案系統),而且應當告知使用這種程式的使用者,檔案安全保護將由程式自己而不是UNIX檔案系統完成.
  
  (6)find命令
  find命令用於搜尋目錄樹,並對目錄樹上的所有檔案執行某種操作,引數是目錄名錶(指出從哪些起點開始搜尋),還可給出一個或多個選項,規定對每個檔案執行什麼操作.
  
  
  find . -print 將列出當前工作目錄下的目錄樹的每一個檔案.find / -user bob -print 將列出在系統中可找到的屬於bob使用者的所有檔案.
  find /usr/bob -perm 666 -print 將列出/usr/bob目錄樹下所有存取許可為666的檔案.若將666改為-666則將列出所有具有包含了666在內的存取許可方式的檔案(如777).
  
  find /usr/bob -type b -print 將列出/usr/bob目錄樹下所有塊特別檔案(c為字元特別檔案).
  find / -user root -perm -4000 -exec ls -l {} ; 是一個較複雜一點的命令,-exec COMMAND ;允許對所找到的每個檔案執行指定的命令COMMAND.若COMMAND中含有{},則{}將由find所找到的檔名替換.COMMAND必須以;結束.
  
  以上舉例介紹find的用法,各選項可組合使用以達到更強的功能.
  
  (7)secure程式
  系統管理員應當做一個程式以定期檢查系統中的各個系統檔案,包括檢查裝置檔案和SUID,SGID程式,尤其要注意檢查SUID,SGID程式,檢查/etc/passwd和/etc/group檔案,尋找久未登入的戶頭和校驗各重要檔案是否被修改.(源程式清單將在今後發表)
  
  (8)ncheck命令
  用於檢查檔案系統,只用一個磁碟分割槽名作為引數,將列出i節點號及相應的檔名.i節點相同的檔案為建鏈檔案.注意:所列出的清單檔名與mount命令的第一個域相同的檔名前部分將不會列出來.因為是做檔案系統內部的檢查,ncheck並不知道檔案系統安裝點以上部分的目錄.也可用此命令來搜尋檔案系統中所有的SUID和SGID程式和裝置檔案,使用-s選項來完成此項功能
  
  (9)安裝和拆卸檔案系統
  UNIX檔案系統是可安裝的,這意味著每個檔案系統可以連線到整個目錄樹的任意節點上(根目錄總是被安裝上的).安裝檔案系統的目錄稱為安裝點./etc/mount命令用於安裝檔案系統,用這條命令可將檔案系統安裝在現有目錄結構的任意處.
  
  安裝檔案系統時,安裝點的檔案和目錄都是不可存取的,因此未安裝檔案系統時,不要將檔案存入安裝點目錄.檔案系統安裝後,安裝點的存取許可方式和所有者將改變為所安裝的檔案根目錄的許可方式和所有者.
  
  安裝檔案系統時要小心:安裝點的屬性會改變!還要注意新建的檔案,除非新檔案系統是由標準檔案建立的,系統標準檔案會設定適當的存取許可方式,否則新檔案系統的存取許可將是777!
  
  可用-r選項將檔案系統安裝成只讀檔案系統.需要防寫的帶驅動器和磁碟應當以這種方式來安裝.
  
  不帶任何引數的/etc/mount可獲得系統中所安裝的檔案系統的有關資訊.包括:檔案系統被安裝的安裝點目錄,對應/dev中的哪個裝置,只讀或可讀寫,安裝時間和日期等.
  
  從安全的觀點來講,可安裝系統的危險來自使用者可能請求系統管理員為其安裝使用者自己的檔案系統.如果安裝了使用者的檔案系統,則應在允許使用者存取檔案系統前,先掃描使用者的檔案系統,搜尋SUID/SGID程式和裝置檔案.在除了root外任何人不能執行的目錄中安裝檔案系統,用find命令或secure列出可疑檔案,刪除不屬使用者所有的檔案的SUID/SGID許可.
  
  使用者的檔案系統用完後,可用umount命令卸下檔案系統.並將安裝點目錄的所有者改回root,存取許可改為755.
  
  (10)系統目錄和檔案
  UNIX系統中有許多檔案不允許使用者寫,如:/bin,/usr/bin,/usr/lbin,/etc/passwd,/usr/lib/crontab,/unix,/etc/rc,/etc/inittab這樣一些檔案和目錄(大多數的系統目錄),可寫的目錄允許移動檔案,會引起安全問題.系統管理員應經常檢查系統檔案和目錄的許可許可權和所有者.可做一個程式根據系統提供的規則檔案(在/etc/permlist檔案中)所描述的檔案所有者和許可權規則檢查各檔案.(源程式清單將在今後發表)
  
  注意:如果系統的安全管理不好,或系統是新安裝的,其安全程式不夠高,可以用make方式在安全強的系統上執行上述程式,將許可規則檔案複製到新系 統來,再以設定方式在新系統上執行上述程式,就可提高本系統的安全程式.但要記住,兩個系統必須執行相同的UNIX系統版本
  
  4.作為root執行的程式
  在UNIX系統中,有些程式由系統作為root程式執行.這些程式並不總是具有SUID許可,因為其不少程式僅由root執行,系統管理員需要清楚這些程式做什麼,以及這些程式還將執行其它什麼程式.
  
  (1)啟動系統
  當某些UNIX系統(如SCO UNIX/XENIX)啟動時,是以被稱為單使用者的方式執行,在這種方式中普通使用者不能登入,唯有的程式是init,swapper,以及一些由系統管理員從控制檯執行的程式.UNIX系統的單使用者方式啟動,使系統管理員能在允許普通使用者登入以前,先檢查系統操作,確保系統一切正常,當系統處於單使用者方式時,控制檯作為超級使用者,命令揭示是"#",有些UNIX系統不要確認超級使用者口令就認可控制檯是root,給出#提示符.這就可能成為一個安全問題.
  
  (2)init程式
  UNIX系統總是以某種方式或稱為某種級執行,系統有若干種執行級,這些執行級由init程式控制.UNIX系統啟動時以單使用者方式執行,也叫1級或S級.對於其他使用者登入進入系統,UNIX有一種多使用者執行方式,也叫2級init程式控制系統執行級,它讀入檔案/etc/inittab,該檔案詳細地規定了哪些程式在哪一級執行.當root敲入init n(數字),系統就進入n級.init讀該檔案以確定終止哪些程式,啟動哪些程式.
  
  有效的執行級的數值是從0到6與s.
  注意:由init建立的程式以UID為0執行(root)從/etc/inittab執行的程式也作為root執行,所以系統管理員要確保自己知道/etc/inittab中的程式做什麼工作,確保這些程式以及這些程式所在的目錄直到/和/etc/inittab除root外無人可寫.
  
  (3)進入多使用者
  當UNIX系統進入多使用者方式時,將寢化一系列事件,接著開始執行gettys,允許其他使用者登入進入系統.如果再看看/etc/inittab檔案,會看到gettys定義在執行級2,至少三個shell程/etc/brc,/etc/bcheckrc,/etc/rc*也定義在執行級2.這些程式都在gettys啟動前執行.這些shell程式作為root執行,也不能僅對root可寫還應當檢查shell程式執行的命令,因為這些命令也將作為root執行.
  
  (4)shutdown命令
  用shutdown命令關係統,shutdown shell程式傳送警告通知所有使用者離開系統,在"給定的期限時間"到了後,就終止程式,拆卸檔案系統,進入單使用者方式或關機狀態.一旦進入單使用者方式,所有的gettys停止執行,使用者再不能登入.
  
  進入關機狀態後可將系統關電.
  shutdown僅能由作為root登入的使用者從系統控制檯上執行.所以任何的shutdown執行的命令僅能對root可寫.
  
  (5)系統V的cron程式
  cron在UNIX系統是多使用者方式時執行,根據規定的時間安排執行指定的命令,每隔一分鐘檢查一次檔案/usr/lib/crontab,尋找是否有應當執行的程式?
  
  如果找到要執行的程式,就執行該程式,否則睡眠等待一分鐘.實際的/usr/lib/crontab用於根據全天的規則時間表執行程式,也可在夜晚執行白天不願執行怕降低其他使用者速度的程式.通常由cron執行的程式是如記帳,存檔案這樣的程式.cron一般在系統進入多使用者後由/etc/rc啟動,當shutdown執行killall命令時便終止執行.由cron執行的程式作為root,所以應當注意放什麼程式在crontab中,還要確保/usr/lib/crontab和該表中列出的任何程式對任何人不可寫.
  
  如果使用者需要由cron執行一個程式,系統管理員可用su命令在crontab表中建立一個入口,使使用者的程式不能獲得root的許可權.
  
  (6)系統V版本2之後的cron程式
  在系統V版本2中,cron被修改成允許使用者建立自己的crontab入口,/usr/lib/crontab檔案不再存在,由目錄/usr/spool/cron/crontabs中的檔案代替.這些檔案的格式與crontab相同,但每個檔案與系統中的一個使用者對應,並以某使用者的名義由cron執行.
  
  如果想限制能建立crontab的使用者,可在檔案/usr/lib/cron/cron.allow檔案中列出允許執行crontab命令的使用者.任何未列於該檔案的使用者不能執行crontab.反之,若更願意列出不允許執行crontab命令的使用者,則可將他們列入/usr/lib/cron/cron.deny檔案中,未列於該檔案的其他使用者將被允許建立crontab.
  
  注意:若兩個檔案都存在,系統將使用cron.allow,忽略cron.deny.如果兩個檔案都不存在,則只有root可執行crontab.所以,若要允許系統中的所有使用者都可執行crontab命令,應當建立一個空的cron.deny檔案,如果cron.allow也存在,則刪除該檔案.
  
  這個版本的cron命令的安全程度比前一個高,因為使用者只能看自己的crontab,系統管理員也不必擔心其他使用者的程式是否會作為root執行,由於允許每個系統登入使用者有自己的crontab,也簡化了對程式必須由cron執行,但不必作為root執行的系統程式的處理.
  必須確保root的crontab檔案僅對root可寫,並且該檔案所在的目錄及所有的父目錄也僅對root可寫.
  
  (7)/etc/profile
  每當使用者(包括root在內)登入時,由shell執行/etc/profile檔案,應確保這個檔案以及從這個檔案執行的程式和命令都僅對root可寫. 5./etc/passwd檔案/etc/passwd檔案是UNIX安全的關鍵檔案之一.該檔案用於使用者登入時校驗使用者的口令,當然應當僅對root可寫.檔案中每行的一般格式為:LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL
  
  每行的頭兩項是登入名和加密後的口令,後面的兩個數是UID和GID,接著的一項是系統管理員想寫入的有關該使用者的任何資訊,最後兩項是兩個路徑名:一個是分配給使用者的HOME目錄,第二個是使用者登入後將執行的shell(若為空格則預設為/bin/sh).

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-946279/,如需轉載,請註明出處,否則將追究法律責任。

相關文章