Home | SmbFTPD | Forum |
|
第十四章 網頁伺服器進階應用 網頁伺服器架設之後,世界各地的使用者都可以經由網際網路連到您的主機,如何維護網站安全是一大課題。管理者更需要知道網站的使用情形,系統資源、網路頻寬是否足夠。本章將說明網頁伺服器使用上常見的管理議題,並介紹一些好用的管理工具。讀完本章後,您將進一步了解下列主題:
14.1 HTTP 安全與 SSL 協定 當我們使用網路服務時,經由網路傳送的資料都有可能被他人攔截竊聽。簡單的說,當您從網頁上輸入帳號密碼時,如果有人在您所使用的電腦和伺服器之間攔截,就可以輕易的從網路封包中竊聽到您所輸入的資料。 隨著網路的蓬勃發展,線上交易的使用量日益增加,對於資料的保護更是重要。如果一個線上交易的網站使用普通的 HTTP,則使用者輸入的帳號密碼、交易資料、信用卡號等等都有可能會外洩,更別說交易資料被假造的風險了。為了解決 HTTP 的網路安全,發展出許多加密、認證的機制。其中最常見的就是使用金鑰加密法的 HTTP over SSL (Secure Socket Layer),又稱為 HTTPS,目前國內許多網路銀行都是使用 HTTPS 作為交易安全的第一道關卡。 SSL 的加密方式是由伺服器端提供了一組加解密用的金鑰,在伺服器端所使用的是私密金鑰 (Private key),而客戶端所使用的是公開金鑰 (Public key)。在連線建立後,HTTP 伺服器會將公開金鑰傳給客戶端使用。公開金鑰加密過的資料只能由私密金鑰解密,在客戶端要送出資料之前,會先使用公開金鑰進行加密的動作,而伺服器收到資料後,會使用私密金鑰進行解密。 在 Apache 2 中,預設安裝即支援 SSL,我們只需產生一組金鑰,並設定啟動 SSL 即可。 14.1.1 產生金鑰 正確的憑證產生方法是先產生伺服器用的公鑰及 CSR (Certificate Signing Request),接著將 CSR 送給專門做憑證簽發的公正單位做簽章。或者,我們也可以自己做為一個憑證簽發單位,自己為自己簽發憑證。但由於我們自己產生的憑證不具公信力,所以使用者使用 HTTPS 連到網站時,會出現下列的警告訊息: 圖 14-1 這個警告訊息並不影響加密,不過如果您所架設的是商用網站,您還是得交由公正單位作簽證。 如果您要使用自我簽發的憑證,第一步是要產生簽發單位憑證,我們先建立一個目錄名為 ssl,並將產生的憑證放在該目錄下: # mkdir ssl # cd ssl # openssl genrsa -out ca.key 1024 # openssl req -new -key ca.key -out ca.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:TW State or Province Name (full name) [Some-State]:Taiwan Locality Name (eg, city) []:Taipei Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []:Certificate Authority Common Name (eg, YOUR name) []:MyCA Email Address []:alex@alexwang.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:按 Enter 即可 An optional company name []:按 Enter 即可 # openssl x509 -days 365 -signkey ca.key -in ca.csr -req -out ca.crt # echo "01" > ca.srl 我們在第二個 openssl 指令中必須輸入一些基本資訊,最後產生一個有效期限 365 天的憑證。接著,必須產生 Apache 伺服器用的憑證: # openssl genrsa -out server.key 1024 # openssl req -new -key server.key -out server.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:TW State or Province Name (full name) [Some-State]:Taiwan Locality Name (eg, city) []:Taipei Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []:Web Team Common Name (eg, YOUR name) []:www.alexwang.com Email Address []:alex@alexwang.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:按 Enter 即可 An optional company name []:按 Enter 即可 # openssl x509 -days 365 -CA ca.crt -CAkey ca.key -in server.csr -req -out server.crt 同樣的,我們必須輸入關於這個憑證的一些資料,最後,我們使用之前所產生的憑證簽發一個有效期限 365 天的伺服器用憑證。必須注意的是,在 Common Name 必須輸入您的主機名稱,以避免連線時憑證名稱和網頁名稱不符的警告。另外,我們在產生憑證時,當 OpenSSL 要求輸入用來保護憑證的密碼時,我們都沒有輸入密碼。如果您輸入密碼,則以後 Apache 要啟動時都必須輸入密碼才可以啟動。 最後,我們將伺服器用的憑證複製到 Apache 的設定檔位置: # cp server.crt /usr/local/etc/apache22/server.crt # cp server.key /usr/local/etc/apache22/server.key # chmod 400 /usr/local/etc/apache22/server.crt # chmod 400 /usr/local/etc/apache22/server.key 最後,請將我們製作過程中的憑證刪除: # rm -rf ssl 憑證製作完成後,我們就可以開始設定支援 SSL 的 Apache 了。 14.1.2 設定及啟動 HTTPS 首先,我們必須先修改 /usr/local/etc/apache22/httpd.conf 以使用 SSL 的設定檔:
接著,我們必須先修改 /usr/local/etc/apache22/extra/httpd-ssl.conf 以設定 SSL,請先找到下列區段:
我們必須修改 DocuemntRoot,並將它設為我們網頁根目錄,然後要修改 ServerName,將它設定為我們的主機名稱。 為了要該 Apache 啟動時可以支援 SSL,請在 /etc/rc.conf 中加入 Apache SSL 的設定:
最後,請重新啟動 Apache 即可: # /usr/local/etc/rc.d/apache22 restart 接下來,您就可以使用 https://192.168.0.1 連到您的主機了。請注意,我們使用的連線方法是 https,而非 http。如果您連線的主機名稱和憑證產生的名稱不同,將會有名稱不符的警告訊息。 圖 14-2 14.2 對目錄設定密碼保護 在架設網站時,如果您有特殊需求,必須指定某個目錄只能由某些使用者才能存取,我們可以使用 Apache 內建的目錄保護功能,讓使用者必須輸入使用者名稱及密碼才能存取該目錄。 在開始設定目錄的保護之前,我們必須先修改 httpd.conf,允許使用者可以在網頁目錄中使用認證功能。首先 ,請編輯 /usr/local/etc/apache22/httpd.conf,找到網頁目錄設定的區段:
我們必須先確定 Apache 有載入 mod_auth.so 模組。接著,我們在網頁目錄的區段中 AllowOverride 的部份設定了使用 AuthConfig。如果 AllowOverride 設為 None 表示不允許使用者變更目錄設定,設為 AuthConfig 表示可以使用 AuthDBMGroupFile、 AuthDBMUserFile, AuthGroupFile、AuthName、AuthType 等認證的功能。 另外,在 AccessFileName 中,我們設定了用來保護目錄的設定檔名稱,預設為 .htaccess。 Apache 允許使用者在目錄下放置一個檔案來控制該目錄的存取權限,預設是使用 .htaccess。 我們可以自行用文書軟體編輯一個檔名為 .htaccess 的檔案來設定檔案所在目錄的權限。假設我們要保護的目錄是 /home/www/private/ 這個目錄,請新增一個文字檔 /home/www/private/.htaccess,內容如下:
其中請注意各參數的大小寫。這裡我們設定儲存使用者帳號及密碼的檔案是 /var/http.pw。 接下來我們就可以新增使用者及密碼了。Apache 用來新增密碼的指令為 htpasswd: # /usr/local/sbin/htpasswd -c /var/http.pw username New password: 輸入 username 的密碼 Re-type new password: 再輸入一次 上述指令會建立密碼檔 /var/http.pw 並加入使用者 username。如果您還要再加入第二個使用者,不需要加參數 -c。 接著,我們使用使用瀏覽器連到該目錄時,將出現下列畫面: 圖 14-3 此時輸入你設定的使用者名稱及密碼即可。若輸入的帳號密碼正確,即可正常看到該目錄的內容,否則在輸入三次錯誤之後,將出現禁止存取的頁面。
14.3 虛擬主機 如果您想要使用一台主機管理多個不同名稱的網頁,例如,www.alexwang.com 及 www.twbsd.org 全都連到同一台伺服器,我們可以經由 Apache 虛擬主機的功能,讓不同的網址秀出不同的網頁內容。其本上,就是在一台機器上設定多個主機名稱或 IP,並依不同名稱來決定其根目錄所在。當使用者連線到我們的主機時,每一個不同的名稱所看到的根目錄都不同。 要達到這樣的功能,我們必須先確定主機有多個 DNS 名稱,這樣別人打該主機名稱才會對應到你的 IP。假設你的主機 IP 是 111.222.78.9 ,上面有二個主機名稱,一個是 www.abc.com,另一個是 www.cde.net。 您必須先在 DNS 中設定讓這二個主機名稱都可以對應到 11.22.78.9 這個 IP。 在確認 DNS 設定沒問題後,我們就可以開始設定 Apache 虛擬主機的功能了。請編輯 httpd.conf, 以載入虛擬主機設定檔:
接著我們修改 /usr/local/etc/apache22/extra/httpd-vhost.conf 加入下列設定:
做完上面的設定後,就可以重新啟動 Apache 了。如果你還有別的 Domain Name 指向 111.222.78.9 的話,例如 www.fgh.org ,但你並未設定其 Virtual Host 資料,Apache 將以第一個設定的 Virtual Host 資料為主。在這個範例裡,當你打 www.fgh.org 會連到 www.abc.com 的設定。 必須要注意的是,有些客戶端的連線軟體並不支援 Name-Based 的虛擬主機,要支援 name-based virtual host,客戶端必須送出 HTTP 的標頭,也就是瀏覽器必須支援 HTTP/1.1。不過,請放心,我們常用的 IE、Netscape、lynx 都有支援。 14.4 網頁記錄分析 在我們將所製作好的網頁放在網頁伺服器之後,我們會想知道每一個網頁的瀏覽次數、使用者的停留時間等等,以做為改善網頁的依據。這些資訊都可以從 Apache 的連線記錄檔中獲得,但由於 Apache 的連線記錄中,只有一筆一筆使用者瀏覽網頁的記錄,我們需要使用一些工具來分析記錄檔,讓這些記錄檔能更易於閱讀。 本章將介紹 Webalizer 這套軟體。Webalizer 會讀取 Apache 的連線記錄檔,並將分析結果存成網頁,讓我們可以經由網頁的圖形更輕鬆的了解每一個頁面的使用情形。由於 Webalizer 所進行的分析是經由讀取 log 檔,因此 log 檔的資料越多,分析出來的結果也就越詳盡。 我們使用下列指令安裝 Webalizer: # cd /usr/ports/www/webalizer # make install clean 在安裝完 Webalizer 之後,我們必須先做一些簡單的設定。在 /usr/local/etc/ 有一個 Webalizer 的設定檔範例 webalizer.conf-dist,我們先將它複製一份再開始編輯: # cp /usr/local/etc/webalizer.conf-dist /usr/local/etc/webalizer.conf # ee /usr/local/etc/webalizer.conf 以下我們將一一說明此設定檔的內容,如果您想要更改其中的設定,請將該行開頭的井字號移除再開始修改:
接著我們必須依您的設定在網頁根目錄中建立一個資料夾以儲存 Webalizer 所產生的圖表,假設我們的網頁根目錄是 /home/www,並在其目錄下建立一個子目錄名為 traffic: # mkdir /home/www/traffic 緊接著我們就可以使用下列指令來產生統計圖表: # /usr/local/bin/webalizer 因為我們在 webalizer.conf 中設定了所要使用的 apache 使用記錄的檔名及所產生的圖表存放位置,所以在執行 webalizer 時不必再加任何參數。如果您想指定使用其他的連線記錄檔來做分析,您可以在指令後面加上該記錄檔的檔名,例如: # /usr/local/bin/webalizer /var/log/httpd-access.log 產生了圖表之後,我們就可以使用瀏覽器輸入 http://www.mydomain.com/traffic 連到該網頁。連到該頁面後,您可以看到下列畫面: 圖 14-5 我們可以看到八月份每天平均有 294 人造訪,該月共有 7945 人。點選了該月份後,可以再看該月份更詳細的資料。例如,一天中哪一個時間最多人造訪、哪一個網頁最點選最多次、使用者來源、進到本網站後第一個看的頁面是什麼等等。下圖為最常被點選的頁面統計: 圖 14-6 最後,為了讓分析圖表能定時自動更新,我們可以使用 crontab 每小時定期執行一次分析。 # crontab -e
在上述的 crontab 的設定中,我們讓系統在每小時的第 13 分時執行一次 webalizer,您也可以依您的需求調整更新的時間。存檔離開之後,crontab 會自動載入新的設定,如此一來我們就可以隨時擁有最新的統計資訊了。 14.5 MRTG 流量分析 我們除了可以使用 Webalizer 來了解網頁內容的使用情形外,網站管理者還必須知道目前網站頻寬是否足夠。如果您想要知道網站流量的使用情形,我們可以安裝 MRTG 這套軟體經由網頁來監看網路流量。MRTG 會去收取 SNMP (Simple Network Management Protocol) 所產生的資料,因此所要記錄的機器必須要安裝 SNMP。在你的主機上安裝 MRTG 後,你不僅可以收集自己的流量資料,也可以收集區域網路上其他可以接收到的 SNMP 資料。 14.5.1 安裝 SNMP 在安裝 MRTG 之前,我們先使用 ports 來安裝 SNMP: # cd /usr/ports/net-mgmt/net-snmp # make install clean 安裝完成後,我們必須要先新增一個可以讀取 SNMP 資訊的 community name。所謂的 community name 是一個明碼的字串,我們可以將它視為 management station 和 agent 之間的密碼,是 MRTG 和 net-SNMP 溝通時必須要先傳送的字串。我們可以依不同的網域或主機給予不同的權限,依 community name 的設定來決定不同權限。 一個網路元件可以有多個 community name,一般 SNMP Agent 所預設公開的 community name 是 public。我們不一定要將 community name 設定為 public,因為 public 是一般 SNMP 的預設值,為了安全的問題,我們不將它設為 public。這裡我們將設定 community name 為 mrtg,而且只有 read only 的權限。 要設定 community name 請先新增一個文字檔 /usr/local/share/snmp/snmpd.conf 並加入下列設定:
上述設定中,mrtg 為唯讀的 community name,Office 是您機器所在位置,而 syscontact 所接的字串是您的 Eamil。另外, 我們還必須在 /etc/rc.conf 中加入下列這一行:
接著,請使用下列指令啟動 SNMP: # /usr/local/etc/rc.d/snmpd start 14.5.2 安裝 MRTG 我們使用 ports 來安裝 MRTG: # cd /usr/ports/net-mgmt/mrtg # make install 接著要產生 MRTG 的設定檔 # cd /usr/local/etc/mrtg # rehash # cfgmaker mrtg@alexwang.com >mrtg.cfg 這裡的 mrtg 是我們在安裝 net-snmp 時所設定的值。如果你使用錯的 community name,你可能會從要記錄的設備上得到錯誤回應。而 alexwang.com 是你所要記錄的主機位置。mrtg.cfg 就是所要產生的設定檔名。 如果您想要記錄多個主機,只要在 cfgmaker 時多加入主機名稱即可,例如: # cfgmaker mrtg@alexwang.com public@ftp.alexwang.com >mrtg.cfg 這樣就會同時記錄上面二台主機的流量了。 產生基本的設定檔後,我們可以再編輯剛才產生的設定檔 ee mrtg.cfg,在檔案開頭的部份加入一些客製化的設定:
接著請建立一個你在 mrtg.cfg 中設定的 WorkDIR 的目錄: # mkdir /home/www/mrtg 然後使用指令 indexmaker 來建立 MRTG 的首頁: # indexmaker -title '流量統計' -output /home/www/mrtg/index.html mrtg.cfg 這裡的參數 -title 是該 index.html 檔的 title,而 -output 就是要輸出的檔案位置,預設是stdio(通常指的是螢幕) 。 輸出的檔案 index.html 你也可以使用其他的網頁編輯軟體再去修改美化它。接下來要將 MRTG 的一些圖片檔複製到 mrtg 的目錄裡: # cd /usr/ports/net-mgmt/mrtg/work/mrtg-* # cd images # cp * /home/www/mrtg/ 最後執行 MRTG: # env LANG=C /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg 第一次執行上面的指令可能會有一些錯誤訊息,不要理它,因為是第一次執行 mrtg,所沒有一些舊的圖,只要再多執行幾次就好了。沒問題之後,使用指令 crontab -e 來 讓上述指令每 5 分鐘執行一次,加入下面這一行:
現在你可以使用 http://yourserver/mrtg 來連去看看。 圖 14-7 最後別忘了移除安裝過程的暫存檔: # cd /usr/ports/net-mgmt/mrtg/ # make clean |