1. 程式人生 > >9月12好上課筆記

9月12好上課筆記

1. Apache基於域名配置虛擬主機:

  開啟Apache安裝目錄下的配置檔案conf/extra/httpd-vhosts.conf,新增如下配置資訊:

  <VirtualHost _default_:80>

    DocumentRoot "D:/wamp/www"

    ServerName www.jtw.com

  </VirtualHost>

  <VirtualHost *:80>

       ServerAdmin [email protected]

       DocumentRoot "D:/wamp/www2"

       ServerName www.wujuntian.com

       ErrorLog "logs/wujuntian.log"

       CustomLog "logs/wujuntian.log" common

      <Directory "D:/wamp/www2">

           Options Indexes FollowSymLinks MultiViews

           AllowOverride None

           Require all granted

      </Directory>

  </VirtualHost>

  這裡配置了兩個虛擬主機,其中第一個是預設虛擬主機,找不到虛擬主機的域名訪問也由這個虛擬主機來提供服務。這兩個主機使用的都是80埠,第一個虛擬主機指定域名為“www.jtw.com”,伺服器目錄為“D:/wamp/www”,第二個虛擬你主機指定域名為“www.wujuntian.com”,伺服器目錄為“D:/wamp/www2”。

  然後在Apache主配置檔案conf/httpd.conf中包含這個配置檔案:

  Include conf/extra/httpd-vhosts.conf

  最後重啟Apache伺服器,就可以通過訪問兩個不同的域名訪問同一個伺服器上的兩個目錄了。

  注意:如果只是在本地進行配置測試的話,需要在hosts檔案中加入域名到本地IP地址的對映(hosts檔案位置:C:\Windows\System32\drivers\etc):

  127.0.0.1       www.jtw.com

  127.0.0.1       www.wujuntian.com
2. Apache基於埠配置虛擬主機:

  首先在Apache配置檔案conf/httpd.conf中修改配置讓Apache伺服器監聽多個埠:

  Listen 8080

  Listen 80

  這裡監聽兩個埠,配置兩個虛擬主機。

  然後在配置檔案conf/extra/httpd-vhosts.conf,新增如下配置資訊:

  <VirtualHost _default_:80>

    DocumentRoot "D:/wamp/www"

  </VirtualHost>

  <VirtualHost *:8080>

       ServerAdmin 
[email protected]
   DocumentRoot "D:/wamp/www2"    <Directory "D:/wamp/www2">    Options Indexes FollowSymLinks MultiViews    AllowOverride None    Require all granted   </Directory>   </VirtualHost>   在Apache主配置檔案conf/httpd.conf中包含這個配置檔案:   Include conf/extra/httpd-vhosts.conf   最後重啟Apache伺服器,就可以通過同一個IP地址的不同埠來訪問同一個伺服器上的兩個不同目錄了。   注意:Web伺服器預設使用的是80埠,所以訪問80埠的站點時可以不用加上“:80”,但是訪問其他埠時必須帶上埠號。   在<VirtualHost></VirtualHost>段中的配置可以覆蓋外面的配置。

1. 限制使用者訪問的方式:

  1. 限制訪問服務的客戶端主機

  2. 需要使用者名稱和密碼

2. 行為使用者驗證需要兩步:

  1. 建立一個包含使用者名稱和密碼的檔案

  2. 伺服器上的哪些資源需要保護,哪些使用者可以進行訪問

3. 建立使用者資料庫

  許多使用者名稱和密碼需要建立在一個檔案中。出於安全考慮,這個檔案不能放在文件目錄裡。在這個例子裡,這個檔案建立在/usr/local/etc/httpd目錄裡,名字叫users。

  這個檔案包含許多使用者名稱和密碼。使用者名稱和密碼通過冒號分割,每個使用者單獨佔一行。但是你不能直接在這個檔案中直接輸入使用者名稱和密碼,因為儲存在這個檔案中的密碼是加密的。程式htpasswd可以用來建立該檔案,新增或者修改使用者。

  使用htpasswd建立該檔案,新增使用者名稱‘snow’,密碼‘snow’的使用者到該檔案(/usr/local/httpd/user)

1 htpasswd -c /usr/local/etc/httpd/users snow

-c引數告訴htpasswd建立一個新的users檔案。當你執行該命令時,將提示輸入該使用者的密碼並確認。你可以新增其它的使用者到該檔案中,不過必須去掉-c引數。這個命名也可以用來修改密碼。當你新增一個使用者後,/usr/local/etc/httpd/users檔案看起來想這樣:

1 snow:$apr1$VmvJWi7o$diZjyiUiHkd8pSmb/8/gE0

第一個列是使用者名稱,第二列是加密過後的密碼。

4. 配置服務

為了讓server使用在該檔案中的使用者名稱和密碼,你需要配置一個realm,為了使用.htaccess檔案限制一個目錄的訪問,你首先需要修改apache的配置檔案(如何找到apache的配置檔案),使目錄使用.htaccess的形式限制訪問,這個被AuthConfig屬性控制,如果你想限制/var/www目錄的訪問,你修改apache的配置檔案:

1 <Directory /var/www/>
2          Options Indexes FollowSymLinks
3          AllowOverride AuthConfig
4          Require all granted
5 </Directory>

然後在/var/www目錄中建立一個.htaccess檔案,內容如下:

AuthName "restricted stuff"
AuthType Basic
AuthUserFile /usr/local/etc/httpd/users

require valid-user

第一個指令AuthName,為這個資源配置一個realm名字,只要使用者輸入有效的使用者名稱和密碼,相同realm名字的其他資源也可以通過這個使用者訪問,這樣做,主要是為了建立兩個區域,使同一個使用者可以訪問這兩個區域。

第二個指令AuthType告訴服務使用哪種協議進行認證,目前來說,僅有Baisc可用。但是出現了Digest,而且已經被標準化啦,只要瀏覽器實現了它,就可以使用它。digest認證比Basic認證更安全。

第三個指令AuthUserFile告訴服務被htpasswd建立的檔案在哪裡。

第四個指令require告訴服務該檔案中的哪些使用者可以訪問該檔案,valid-user引數是告訴服務該檔案中的任何使用者都可以訪問該資源,你也可以配置特定使用者可以訪問該資源。例如:

require user snow john

只有snow,john兩個使用者可以訪問該資源,其他使用者都會被拒絕。

如果一個使用者被允許訪問不同的區域,他們僅僅需要輸入一次密碼,但是如果在不同的區域有不同的realm,使用者需要再次輸入他的密碼。

5. 使用Groups

如果你想要users檔案的一些使用者訪問一個資源,你需要在require行列出所有的使用者,如果你有很多使用者的話,這種方式是不太好的。有一種方式可以解決這種問題,就是用一個group檔案,你可以使用require行限制到特定的group。例如:有一個叫作staff的組,它包含所有訪問特定資源的使用者。

1 require group staff

多個group也可以使用,使用者也可以同時使用,

require group staff admin
require user adminuser

 它允許組staff和admin訪問資源和使用者adminuser訪問資源。

group檔案的形式:

staff: martin jane

admin: art adminuser

staff和admin是組,martin和jane屬於staff組,art和adminuser屬於admin組。

AuthGroupFile指令是告訴group檔案在哪裡。記住,在group檔案中一行的最大長度是8000字元(大約8K),如果你有超過行的長度的使用者數,你可以再寫一行伴隨著相同組。

當你新增AuthGroupFIle指令時,遇到如下錯誤時:/var/www/html/.htaccess: Invalid command 'AuthGroupFile', perhaps misspelled or defined by a module not included in the server configuration。請執行:

1 sudo a2enmod authz_groupfile

6. 伴隨著許多使用者的問題

使用htpasswd建立使用者和以文字的形式管理組相對來說比較簡單,但是如果使用者增多,伺服器要做許多的處理來找響應的組和密碼資訊,這種處理必須在每個請求中都要做(受保護的區域,儘管使用者僅僅輸入一次密碼,但是在每次請求中,都必須重新認證),如果伴隨著很多使用者,那是相當慢的,增加伺服器負載。比較塊的訪問是使用DBM格式檔案,它允許服務做比較塊的搜尋,但是管理DBM檔案也是比較複雜的。

7. 儲存使用者資訊的其他方式

apache僅能訪問在文字檔案中的使用者資訊,但是有各種各樣的模組允許使用者資訊儲存到資料庫中。除了有DBM格式(mod_auth_dbm module),使用者資訊和組資訊也可以儲存以DB的格式檔案(mod_auth_db),或者各種各樣的資料庫也可以使用。例如mSQL(mod_auth_msql),Postgres95(mod_auth_95),或者相容DBI的資料庫(mod_auth_dbi),也可以有一個額外的程式檢測使用者和密碼是否有效(主要是用介面來檢測資料庫或者認證服務)。modules也可以用來檢測系統密碼檔案或者使用Kerberos系統。

8. 限制不同的方法

在上面的例子中,require指令並沒有包含在<Limit>指令中,這樣意味著它應用到所有的請求方法,但是在一些應用中,需要將其放入<Limit>部分,例如:

1 <Limit GET POST PUT>
2     require valid-user
3 </Limit>

 在Apache中,最好忽略<Limit>標籤,是為了確保保護應用到所有的方法中。但是,這種格式主要用來限制特定的方法。例如:僅僅限制POST方法。

複製程式碼

AuthName "restrict posting"
AuthType Basic
AuthUserFile /usr/local/etc/httpd/users

<Limit POST>
    require group staff
</Limit>

複製程式碼

 僅僅組staff的成員可以訪問POST方法,其他的使用者(未認證的)可以使用其它的方法。例如:GET方法。這樣做,主要是為了CGI程式讓任何人可以訪問。但是僅僅授權的使用者可以請求POST方法。

9. 被主機或者使用者限制

apache很有可能同時使用使用者和主機限制,正常情況下,apache需要兩個條件同時滿足,那即是,來自允許的主機或者域名的使用者必須輸入有效的使用者名稱和密碼才能進行資源訪問。但是Satisfy any指令被使用在.htaccess檔案或者<Directory>,<Location>,<Files>部分,當這個指令被使用的時候,來自允許的主機或者域名不需要輸入使用者名稱和密碼就能進行訪問,來自不允許的主機或者域名必須輸入有效的使用者名稱和密碼。

10. WWW認證如何進行工作?

在HTTP中使用者認證的方法相當簡單,因為HTTP是無狀態的協議。只要一個請求完成,伺服器並不會記得關於那個請求的任何資訊。瀏覽器需要在每次請求中重新發送使用者名稱和密碼。這就是他的工作原理。

當第一次訪問需要認證的資源時,伺服器返回401狀態(未授權)和包含一個WWW-Authenticate響應頭,這個包含認證策略(目前僅有Basic允許)和realm名字。瀏覽器然後詢問使用者名稱和密碼。然後再次請求相同的資源。這一次包含Authorization頭,它包含策略名字(Basic)和使用者名稱和密碼。

伺服器檢測使用者名稱和密碼,如果他們有效,就返回頁面,如果密碼無效或者使用者並不允許,伺服器返回401狀態,瀏覽器將會繼續詢問使用者名稱和密碼。

假如使用者名稱和密碼有效,使用者將會繼續請求另一個保護的資源,在這種情況下,伺服器繼續返回401狀態,瀏覽器伴隨著使用者名稱和密碼繼續請求該資源,但是,這種將會很慢的。所以瀏覽器在接下來的請求中傳送Authorization頭,瀏覽器必須保證傳送使用者名稱和密碼到相同的伺服器上。(如果使用者資訊傳送到不同的伺服器,將會不安全的)

瀏覽器需要記住使用者名稱和密碼。所以它可以傳送使用者名稱和密碼資訊在接下來的請求中。但是在測試認證的時候,將會引起問題,因為瀏覽器第一次已經記住使用者名稱和密碼資訊,強制瀏覽器再次詢問使用者名稱和密碼將會很困難的。

11. 安全和數字認證

認證允許資源被訪問,是針對特定的使用者。但是存在著一些潛在的安全問題。

  • 確保資源被限制在所有的方法中,例如:如果使用<Limit GET>,將會使其他的請求方法不被保護。
  • 使用者名稱和密碼放在文字檔案中,雖然密碼是加密的,但是並不是絕對安全的。該檔案不能被系統中的其他使用者訪問,更不能放在文件目錄。(該目錄可以被來自於網路的使用者訪問)
  • 使用者名稱和密碼應該要絕對安全。使用者不應該告訴其他人他們的密碼。
  • Basic認證策略在網路中傳遞密碼是以非加密的方式傳遞的。所以他們可以被攔截。數字認證主要用來解決這個問題。

數字認證的方式將會使在網路中密碼的方式更安全,在傳送之前,密碼會被加密,然後伺服器會解密它。數字認證工作的方式和Basic認證的方式一樣,數字認證的使用主要依賴於瀏覽器提供商是否寫入他們的產品。Apache已經做了數字認證,被mod_digest模組所編譯。

域名跳轉

域名跳轉也叫做301重定向,當我們變更網站域名,或者申請多個域名指向一個網站的時候,這個時候我們就會用到域名跳轉(或者叫域名重定向redirect、域名轉向)

幾個特徵碼:  401 訪問認證  403 不允許訪問(配置檔案能設定)  404 頁面不存在  301 永久重定向  302 臨時重定向  200 正確

域名跳轉設定:

  1. <VirtualHost *:80>

  2. DocumentRoot "/data/wwwroot/www.123.com"

  3. ServerName www.123.com

  4. ServerAlias 123.com

  5. <IfModule mod_rewrite.c> //需要mod_rewrite模組支援

  6. RewriteEngine on //開啟rewrite功能

  7. RewriteCond %{HTTP_HOST} !^www.123.com$ //定義rewrite的條件,主機名(域名)不是www.123.com滿足條件就跳轉

  8. RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L] //定義rewrite規則,當滿足上面的條件時,這條規則才會執行,並將域名後面的移到www.123.com/後面

  9. </IfModule>

  10. </VirtualHost>

  11. ^/(.*)$表示除域名之外的其他部分,$1也表示這一部分。如https://blog.csdn.net/aoli_shuai/article/list/3,這個^/(.*)$表示/aoli_shuai/article/list/3

域名跳轉需要mod_rewrite模組支援

開啟虛擬主機配置檔案:

  1. [[email protected] ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

  2. <VirtualHost *:80>

  3. DocumentRoot "/data/wwwroot/111.com"

  4. ServerName 111.com

  5. ServerAlias www.111.com www.example.com

  6. # <Directory /data/wwwroot/111.com>

  7. # <FilesMatch 123.php>

  8. # AllowOverride AuthConfig

  9. # AuthName "111.com user auth"

  10. # AuthType Basic

  11. # AuthUserFile /data/.htpasswd

  12. # require valid-user

  13. # </FilesMatch>

  14. # </Directory>

  15. <IfModule mod_rewrite.c>

  16. RewriteEngine on

  17. RewriteCond %{HTTP_HOST} !^111.com$

  18. RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L]

  19. </IfModule>

  20. ErrorLog "logs/111.com-error_log"

  21. CustomLog "logs/111.com-access_log" common

  22. </VirtualHost>

檢測配置檔案語法並重新載入配置檔案

  1. [[email protected] ~]# /usr/local/apache2.4/bin/apachectl -t

  2. Syntax OK

  3. [[email protected] ~]# /usr/local/apache2.4/bin/apachectl graceful

檢測Apache是否載入rewrite模組

[[email protected] ~]# /usr/local/apache2.4/bin/apachectl -M |grep rewrite

沒有載入,去配置檔案設定

  1. [[email protected] ~]# vi /usr/local/apache2.4/conf/httpd.conf

  2. LoadModule alias_module modules/mod_alias.so

  3. LoadModule rewrite_module modules/mod_rewrite.so

  4. LoadModule php5_module modules/libphp5.so

  5. [[email protected] ~]# /usr/local/apache2.4/bin/apachectl -M |grep rewrite

  6. rewrite_module (shared)

訪問www.example.com會跳轉到111.com

  1. [[email protected] ~]# curl -x127.0.0.1:80 www.example.com -I

  2. HTTP/1.1 301 Moved Permanently

  3. Date: Wed, 20 Dec 2017 08:57:28 GMT

  4. Server: Apache/2.4.29 (Unix) PHP/5.6.30

  5. Location: http://111.com/

  6. Content-Type: text/html; charset=iso-8859-1

這裡寫圖片描述

Apache訪問日誌詳解

 一、訪問日誌的格式   Apache內建了記錄伺服器活動的功能,這就是它的日誌功能。這個《Apache日誌》系列文章介紹的就是Apache的訪問日誌、錯誤日誌,以及如何分析日誌資料,如何定製Apache日誌,如何從日誌資料生成統計報表等內容。   如果Apache的安裝方式是預設安裝,伺服器一執行就會有兩個日誌檔案生成。這兩個檔案是access_log(在Windows上是access.log)和error_log(在Windows上是error.log)。採用預設安裝方式時,這些檔案可以在/usr/local/apache/logs下找到;對於Windows系統,這些日誌檔案將儲存在Apache安裝目錄的logs子目錄。不同的包管理器會把日誌檔案放到各種不同的位置,所以你可能需要找找其他的地方,或者通過配置檔案檢視這些日誌檔案配置到了什麼地方。   正如其名字所示,訪問日誌access_log記錄了所有對Web伺服器的訪問活動。下面是訪問日誌中一個典型的記錄:   180.168.41.175 - - [19/Aug/2000:14:47:37 -0400] "GET / HTTP/1.0" 200 654

【216.35.116.91 - - [19/Aug/2000:14:47:37 -0400] "GET / HTTP/1.0" 200 654】【可忽略此行】   這行內容由7項構成,上面的例子中有兩項空白,但整行內容仍舊分成了7項。   第一項資訊是遠端主機的地址,即它表明訪問網站的究竟是誰。在上面的例子中,訪問網站的主機是(我用我們公司的域名解析查詢的結果是180.168.41.175)【216.35.116.91忽略】。隨便說一句,這個地址屬於一臺名為si3001.inktomi.com的機器(要找出這個資訊,可以使用nslookup工具查詢DNS),inktomi.com是一家制作Web搜尋軟體的公司。可以看出,僅僅從日誌記錄的第一項出發,我們就可以得到有關訪問者的不少資訊。   預設情況下,第一項資訊只是遠端主機的IP地址,但我們可以要求Apache查出所有的主機名字,並在日誌檔案中用主機名字來替代IP地址。然而,這種做法通常不值得推薦,因為它將極大地影響伺服器記錄日誌的速度,從而也就減低了整個網站的效率。另外,有許多工具能夠將日誌檔案中的IP地址轉換成主機名字,因此要求Apache記錄主機名字替代IP地址是得不償失的。   然而,如果確實有必要讓Apache找出遠端主機的名字,那麼我們可以使用如下指令:   HostNameLookups on   如果HostNameLookups設定成double而不是on,日誌記錄程式將對它找到的主機名字進行反向查詢,驗證該主機名字確實指向了原來出現的IP地址。預設情況下HostNameLookups設定為off。   上例日誌記錄中的第二項是空白,用一個“-”佔位符替代。實際上絕大多數時候這一項都是如此。這個位置用於記錄瀏覽者的標識,這不只是瀏覽者的登入名字,而是瀏覽者的email地址或者其他唯一識別符號。這個資訊由identd返回,或者直接由瀏覽器返回。很早的時候,那時Netscape 0.9還佔據著統治地位,這個位置往往記錄著瀏覽者的email地址。然而,由於有人用它來收集郵件地址和傳送垃圾郵件,所以它未能保留多久,很久之前市場上幾乎所有的瀏覽器就取消了這項功能。因此,到了今天,我們在日誌記錄的第二項看到email地址的機會已經微乎其微了。   日誌記錄的第三項也是空白。這個位置用於記錄瀏覽者進行身份驗證時提供的名字。當然,如果網站的某些內容要求使用者進行身份驗證,那麼這項資訊是不會空白的。但是,對於大多數網站來說,日誌檔案的大多數記錄中這一項仍舊是空白的。   日誌記錄的第四項是請求的時間。這個資訊用方括號包圍,而且採用所謂的“公共日誌格式”或“標準英文格式”。因此,上例日誌記錄表示請求的時間是2000年8月19日星期三14:47:37。時間資訊最後的-0400”表示伺服器所處時區位於UTC之前的4小時。   日誌記錄的第五項資訊或許是整個日誌記錄中最有用的資訊,它告訴我們伺服器收到的是一個什麼樣的請求。該項資訊的典型格式是“METHOD RESOURCE PROTOCOL”,即“方法資源協議”。   在上例中,METHOD是GET,其他經常可能出現的METHOD還有POST和HEAD。此外還有不少可能出現的合法METHOD,但主要就是這三種。   RESOURCE是指瀏覽者向伺服器請求的文件,或URL。在這個例子中,瀏覽者請求的是“/”,即網站的主頁或根。大多數情況下,“/”指向DocumentRoot目錄的index.html文件,但根據伺服器配置的不同它也可能指向其他檔案。   PROTOCOL通常是HTTP,後面再加上版本號。版本號或者是1.0,或者是1.1,但出現1.0的時候比較多。我們知道,HTTP協議是Web得以工作的基礎,HTTP/1.0是HTTP協議的早期版本,而1.1是最近的版本。當前大多數Web客戶程式仍使用1.0版本的HTTP協議。   日誌記錄的第六項資訊是狀態程式碼。它告訴我們請求是否成功,或者遇到了什麼樣的錯誤。大多數時候,這項值是200,它表示伺服器已經成功地響應瀏覽器的請求,一切正常。此處不準備給出狀態程式碼的完整清單以及解釋它們的含義,請參考相關資料瞭解這方面的資訊。但一般地說,2開頭的狀態程式碼表示成功,以3開頭的狀態程式碼表示由於各種不同的原因使用者請求被重定向到了其他位置,以4開頭的狀態程式碼表示客戶端存在某種錯誤,以5開頭的狀態程式碼表示伺服器遇到了某個錯誤。   日誌記錄的第七項表示傳送給客戶端的總位元組數。它告訴我們傳輸是否被打斷(即,該數值是否和檔案的大小相同)。把日誌記錄中的這些值加起來就可以得知伺服器在一天、一週或者一月內傳送了多少資料。   二、配置訪問日誌   訪問日誌檔案的位置實際上是一個配置選項。如果我們檢查httpd.conf配置檔案,可以看到該檔案中有如下這行內容:   CustomLog /usr/local/apache/logs/access_log common   注意,對於版本較早的Apache伺服器,這行內容可能略有不同。它使用的可能不是CustomLog指令,而是TransferLog指令。如果你的伺服器屬於這類情況,建議你儘可能地早日升級伺服器。   CustomLog指令指定了儲存日誌檔案的具體位置以及日誌的格式。至於如何定製日誌檔案的格式以及內容,我們將在這個《Apache日誌》系列文章的後面幾篇討論。上面這行指令指定的是common日誌格式,自從有了Web伺服器開始,common格式就是它的標準格式。由此我們也可以理解,雖然幾乎不再有任何客戶程式向伺服器提供使用者的標識資訊,但訪問日誌卻還保留著第二項內容。   CustomLog指令中的路徑是日誌檔案的路徑。注意,由於日誌檔案是由HTTP使用者開啟的(用User指令指定),因此必須注意這個路徑要有安全保證,防止該檔案被隨意改寫。   《Apache日誌》系列文章的後面幾篇將繼續介紹:Apache錯誤日誌,定製日誌的格式和內容,如何將日誌內容寫入指定的程式而不是檔案,如何從日誌檔案獲得一些非常有用的統計資訊,等等。

三、程序統計   UNIX可以跟蹤每個使用者執行的每條命令,如果想知道昨晚弄亂了哪些重要的檔案,程序統計子系統可以告訴你。它對還跟蹤一個侵入者有幫助。與連線時間日誌不同,程序統計子系統預設不啟用,它必須啟動。在Linux系統中啟動程序統計使用accton命令,必須用root身份來執行。Accton命令的形式accton file,file必須先存在。先使用touch命令來建立pacct檔案:touch /var/log/pacct,然後執行accton: accton /var/log/pacct。一旦accton被啟用,就可以使用lastcomm命令監測系統中任何時候執行的命令。若要關閉統計,可以使用不帶任何引數的accton命令。   lastcomm命令報告以前執行的檔案。不帶引數時,lastcomm命令顯示當前統計檔案生命週期內紀錄的所有命令的有關資訊。包括命令名、使用者、tty、命令花費的CPU時間和一個時間戳。如果系統有許多使用者,輸入則可能很長。下面的例子:   crond F root ?? 0.00 secs Sun Aug 20 00:16   promisc_check.s S root ?? 0.04 secs Sun Aug 20 00:16   promisc_check root ?? 0.01 secs Sun Aug 20 00:16   grep root ?? 0.02 secs Sun Aug 20 00:16   tail root ?? 0.01 secs Sun Aug 20 00:16   sh root ?? 0.01 secs Sun Aug 20 00:15   ping S root ?? 0.01 secs Sun Aug 20 00:15   ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15   sh root ?? 0.01 secs Sun Aug 20 00:15   ping S root ?? 0.02 secs Sun Aug 20 00:15   ping6.pl F root ?? 0.02 secs Sun Aug 20 00:15   sh root ?? 0.02 secs Sun Aug 20 00:15   ping S root ?? 0.00 secs Sun Aug 20 00:15   ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15   sh root ?? 0.01 secs Sun Aug 20 00:15   ping S root ?? 0.01 secs Sun Aug 20 00:15   sh root ?? 0.02 secs Sun Aug 20 00:15   ping S root ?? 1.34 secs Sun Aug 20 00:15   locate root ttyp0 1.34 secs Sun Aug 20 00:15   accton S root ttyp0 0.00 secs Sun Aug 20 00:15   程序統計的一個問題是pacct檔案可能增長的十分迅速。這時需要互動式的或經過cron機制執行sa命令來保持日誌資料在系統控制內。sa命令報告、清理並維護程序統計檔案。它能把/var/log/pacct中的資訊壓縮到摘要檔案/var/log/savacct和/var/log/usracct中。這些摘要包含按命令名和使用者名稱分類的系統統計資料。sa預設情況下先讀它們,然後讀pacct檔案,使報告能包含所有的可用資訊。sa的輸出有下面一些標記項:   avio--每次執行的平均I/O操作次數   cp--使用者和系統時間總和,以分鐘計   cpu--和cp一樣   k--核心使用的平均CPU時間,以1k為單位   k*sec--CPU儲存完整性,以1k-core秒   re--實時時間,以分鐘計   s--系統時間,以分鐘計   tio--I/O操作的總數   u--使用者時間,以分鐘計   例如:   842 173.26re 4.30cp 0avio 358k   2 10.98re 4.06cp 0avio 299k find   9 24.80re 0.05cp 0avio 291k ***other   105 30.44re 0.03cp 0avio 302k ping   104 30.55re 0.03cp 0avio 394k sh   162 0.11re 0.03cp 0avio 413k security.sh*   154 0.03re 0.02cp 0avio 273k ls   56 31.61re 0.02cp 0avio 823k ping6.pl*   2 3.23re 0.02cp 0avio 822k ping6.pl   35 0.02re 0.01cp 0avio 257k md5sum   97 0.02re 0.01cp 0avio 263k initlog   12 0.19re 0.01cp 0avio 399k promisc_check.s   15 0.09re 0.00cp 0avio 288k grep   11 0.08re 0.00cp 0avio 332k awk   使用者還可以根據使用者而不是命令來提供一個摘要報告。例如sa -m顯示如下:   885 173.28re 4.31cp 0avk   root 879 173.23re 4.31cp 0avk   alias 3 0.05re 0.00cp 0avk   qmailp 3 0.01re 0.00cp 0avk   四、Syslog裝置   Syslog已被許多日誌函式採納,它用在許多保護措施中--任何程式都可以通過syslog紀錄事件。Syslog可以紀錄系統事件,可以寫到一個檔案或裝置中,或給使用者傳送一個資訊。它能紀錄本地事件或通過網路紀錄另一個主機上的事件。   Syslog裝置依據兩個重要的檔案:/etc/syslogd(守護程序)和/etc/syslog.conf配置檔案,習慣上,多數syslog資訊被寫到/var/adm或/var/log目錄下的資訊檔案中(messages.*)。一個典型的syslog紀錄包括生成程式的名字和一個文字資訊。它還包括一個裝置和一個優先順序範圍(但不在日之中出現)。   每個syslog訊息被賦予下面的主要裝置之一:   LOG_AUTH--認證系統:login、su、getty等   LOG_AUTHPRIV--同LOG_AUTH,但只登入到所選擇的單個使用者可讀的檔案中   LOG_CRON--cron守護程序   LOG_DAEMON--其他系統守護程序,如routed   LOG_FTP--檔案傳輸協議:ftpd、tftpd   LOG_KERN--核心產生的訊息   LOG_LPR--系統印表機緩衝池:lpr、lpd   LOG_MAIL--電子郵件系統   LOG_NEWS--網路新聞系統   LOG_SYSLOG--由syslogd(8)產生的內部訊息   LOG_USER--隨機使用者程序產生的訊息   LOG_UUCP--UUCP子系統   LOG_LOCAL0~LOG_LOCAL7--為本地使用保留   Syslog為每個事件賦予幾個不同的優先順序:   LOG_EMERG--緊急情況   LOG_ALERT--應該被立即改正的問題,如系統資料庫破壞   LOG_CRIT--重要情況,如硬碟錯誤   LOG_ERR--錯誤   LOG_WARNING--警告資訊   LOG_NOTICE--不是錯誤情況,但是可能需要處理   LOG_INFO--情報資訊   LOG_DEBUG--包含情報的資訊,通常旨在除錯一個程式時使用   syslog.conf檔案指明syslogd程式紀錄日誌的行為,該程式在啟動時查詢配置檔案。該檔案由不同程式或訊息分類的單個條目組成,每個佔一行。對每類訊息提供一個選擇域和一個動作域。這些域由tab隔開:選擇域指明訊息的型別和優先順序;動作域指明syslogd接收到一個與選擇標準相匹配的訊息時所執行的動作。每個選項是由裝置和優先順序組成。當指明一個優先順序時,syslogd將紀錄一個擁有相同或更高優先順序的訊息。所以如果指明"crit",那所有標為crit、alert和emerg的訊息將被紀錄。每行的行動域指明當選擇域選擇了一個給定訊息後應該把他傳送到哪兒。例如,如果想把所有郵件訊息紀錄到一個檔案中,如下:   #Log all the mail messages in one place   mail.* /var/log/maillog   其他裝置也有自己的日誌。UUCP和news裝置能產生許多外部訊息。它把這些訊息存到自己的日誌(/var/log/spooler)中並把級別限為"err"或更高。例如:   # Save mail and news errors of level err and higher in aspecial file.   uucp,news.crit /var/log/spooler   當一個緊急訊息到來時,可能想讓所有的使用者都得到。也可能想讓自己的日誌接收並儲存。   #Everybody gets emergency messages, plus log them on anther machine   *.emerg *   *.emerg @linuxaid.com.cn   alert訊息應該寫到root和tiger的個人賬號中:   #Root and Tiger get alert and higher messages   *.alert root,tiger   有時syslogd將產生大量的訊息。例如核心("kern"裝置)可能很冗長。使用者可能想把核心訊息紀錄到/dev/console中。下面的例子表明核心日誌紀錄被註釋掉了:   #Log all kernel messages to the console   #Logging much else clutters up the screen   #kern.* /dev/console   使用者可以在一行中指明所有的裝置。下面的例子把info或更高級別的訊息送到/var/log/messages,除了mail以外。級別"none"禁止一個裝置:   #Log anything(except mail)of level info or higher   #Don't log private authentication messages!   *.info:mail.none;authpriv.none /var/log/messages   在有些情況下,可以把日誌送到印表機,這樣網路入侵者怎麼修改日誌都沒有用了。通常要廣泛紀錄日誌。Syslog裝置是一個攻擊者的顯著目標。一個為其他主機維護日誌的系統對於防範伺服器攻擊特別脆弱,因此要特別注意。   有個小命令logger為syslog(3)系統日誌檔案提供一個shell命令介面,使使用者能建立日誌檔案中的條目。用法:logger例如:logger This is a test!   它將產生一個如下的syslog紀錄:Aug 19 22:22:34 tiger: This is a test!   注意不要完全相信日誌,因為攻擊者很容易修改它的。   五、程式日誌   許多程式通過維護日誌來反映系統的安全狀態。su命令允許使用者獲得另一個使用者的許可權,所以它的安全很重要,它的檔案為sulog。同樣的還有sudolog。另外,想Apache有兩個日誌:access_log和error_log。