第 10 堂課 - 網頁伺服器 (Web Server) + FTP
上次更新日期 2022/11/21
目前一般企業想到的『架站』通常就是架設一個 WWW (Web) 網站!這樣的網站格式主要又分為兩大陣營,其中使用率較高的就是 Linux 陣營! 我們這裡會介紹目前 Linux 上預設的網頁伺服器,就是名為 Apache 的伺服器!快來玩玩!
學習目標
- 了解基礎的 LAMP 網頁伺服器結構
- Apache 的設定檔、主網頁目錄、入口網頁檔名的理解等
- 使用者家目錄 userdir.conf 的設定
- 一般目錄特殊權限的設定
- 加入 https 埠口的支援
- 10.1: WWW 簡介
- 10.2: Apache 基礎安裝與使用
- 10.3: 常見的進階應用
- 10.4: 網頁目錄的瀏覽控制
- 10.5: 使用 https 瀏覽
- 10.6: 課後練習
10.1: WWW 簡介
Web 最早是由 Tim Berners-Lee 爵士為了分享他實驗室的成果而開發出來的一個協定,使用的是 HTML 語法搭配 URL 網址列,就可以快速的取得資料。 再透過超連結的互相連結,讓 Web 在 1990 年代後期就開始熱門起來。為了讓資料有地方可以擺放,當然就需要 Server 提供正確的位址, 因此 Tim Berners-Lee 爵士撰寫出第一個網頁伺服器,稱為 httpd。
因為人腦對於數字的記憶比不上人名,因此 httpd 也是得要搭配上一章談到的 DNS ,這樣大家才方便連結到各個不同的主機器, 再搭配類似 google 的搜尋引擎,就可以讓資料在 Web 上面流通得很廣泛了。簡單的說, WWW 就是:
- WWW 是 World Wide Web 的縮寫,其中 Web 有廣播網的意思存在, 所以簡稱為全球資訊網。
- 使用 WWW 時,需要有 server 與 client 的架構,兩者間傳輸的資料如下:
- 相關的 Server/Client 架構簡易說明如下:
- WWW 伺服器不但需要一個可讓用戶端瀏覽的平台,還需要提供用戶端一些資料才行!
- 上述伺服器所提供的最主要資料是超文件標籤語言 (Hyper Text Markup Language, HTML)、多媒體檔案 (圖片、影像、聲音、文字等,都屬於多媒體或稱為超媒體)。
- HTML 只是一些純文字資料,透過所謂的標籤 (<tag>) 來規範所要顯示的資料格式;
- 在用戶端,透過瀏覽器的對 HTML 以及多媒體的解析,最後呈現在使用者的螢幕上。
- http 協定與 apache 軟體的開發
如前所述,WWW 是由 Tim Berners-Lee 爵士開發出來的,發展的協定稱為超文件傳輸協定 (Hyper Text Transport Protocol, HTTP), 為了讓這個協定可以順利的被應用在電腦上,因此 Tim 大約在 90 年代初期由伊利諾大學的國家超級電腦應用中心 (NCSA, http://www.ncsa.illinois.edu/) 開發出伺服器 HTTPd (HTTP daemon 之意)。
不過後來 HTTPd 這個伺服器的開發並沒有繼續延續下去,妥善率不是很好,於是一群社群朋友便發起一個計畫,這個計畫主要在改善原本的 HTTPd 伺服器軟體,他們稱這個改良過的軟體為 Apache,取其『一個修修改改的伺服器 (A patch server)』的雙關語!
這個 Apache 在 1996 年以後便成為 WWW 伺服器上市佔率最高的軟體了 (http://httpd.apache.org/)。甚至還自己推出自己的授權協議稱為 Apache 授權哩!
- 什麼是 URL (Uniform Resource Locator)
雖然我們都暱稱 URL 為『網址列』,不過,實際名稱為 Uniform Resource Locator (統一資源定位位址)。基本上 URL 的格式有點像這樣:
- <協定>://<主機位址或主機名稱>[:port]/<目錄資源>
在網頁上使用的協定為 http 或 https (傳輸資料有無加密),當然,瀏覽器上面還可以輸入類似 ftp:// 等協定。主機名稱就是 DNS 所設計的主機名稱為主 (雖然可以使用 /etc/hosts 的主機名稱,不過,除了內部傳輸之外,大部分當然使用的就是 DNS 主機名)。至於 :port 則是該協定啟動在非正規埠口的意思。 目錄資源則是該資料放在伺服器的哪個相對目錄的位置上。
- 動態 WWW 伺服器
與我們一般說的會動的圖畫 (如 CSS 動畫或 GIF 動畫或影像資料) 不同,所謂的『動態』指的是網站的內容會隨時更新的意思,這才是所謂的動態網站。 為了達成動態網站,你在設計網頁時,當然就要使用網頁程式語言。這個網頁程式語言會主動到資料庫去撈取資料來顯示,同時, 也可以依據使用者的需求或點擊的特性,來給予適當的內容。因此,所謂的動態網站,你就得要有:
- 適合的作業系統
- WWW 伺服器平台
- 網路資料庫系統: 須注意 WWW 伺服器與資料庫系統為兩個獨立的系統,因此需要透過網頁程式語言進行溝通
- 網頁程式語言
在台灣,上述的環境常見的搭配軟體為:Linux + Apache + Mariadb + PHP --> LAMP (燈)
- 寫出第一個 HTTPd 瀏覽器與伺服器的作者名字為 (歐洲人喔!):
- 承上,這個 httpd 通訊協定,主要是想傳輸什麼資料?
- httpd 這個伺服器後來被社群單位接手繼續管理,接手後將 httpd 改名為什麼軟體?
- URL 網址指的是什麼樣式的網址列?
- 所謂的動態 WWW 伺服器當中的 LAMP 指的是什麼?
10.2: Apache 基礎安裝與使用
在 RockyLinux 9 上面預設的 WWW 伺服器就是 Apache,而 Apache 的軟體名稱在 RockyLinux 上面被稱為 httpd。
- 安裝:安裝 Apache 軟體
- 啟動:使用預設值啟動 Apache 軟體
- 開機啟動:設定開機會啟動這個軟體
- 防火牆:你的 Apache 軟體是對全世界放行的,請觀察或重新設定防火牆
- 測試:打開瀏覽器,輸入網址列的你的主機名稱,看看能否觀察到相關的網頁資料?
- 測試:同時請觀察已經啟動的埠口,是否有讓 httpd 啟動的號碼?
除了 GUI 界面的瀏覽器之外,我們也可以簡單的透過 curl 這個文字型瀏覽器,直接查看網頁的原始碼資料。 在終端機界面的環境下, curl 是個很好的瀏覽器測試工具!
- RockyLinux 9 上預設的 Apache 設定
在 RockyLinux 9 上面,Apache 預設的項目有底下這幾個:
- 基礎設定檔位於: /etc/httpd/conf/httpd.conf
- 附加設定檔位於: /etc/httpd/conf.d/*.conf
- 預設啟動埠口在: port 80
- 預設伺服器管理員 email: root@localhost
- 預設首頁目錄位於: /var/www/html
- 預設首頁檔案檔名: index.html
- 預設所有人均可以瀏覽網頁
- 請改用文字列瀏覽器 curl 檢查本機的網頁首頁
- 請將預設的首頁改成顯示你的大名與學號即可。
- 透過 curl 檢查看看能不能看到你修改的資料?
- 修改基礎設定值
你當然可以修改預設的設定值,只是要自己承擔風險!舉例來說,如果你改了連線埠口,那麼就得要告訴別人你的連線埠口即將跑到類似如下的網址,否則將無法被瀏覽:
- http://localhost:85/
為了避免困擾,底下僅告知一般來說,可能會被管理員更動的設定,其他詳細的設定請自行參考 httpd.conf 內的說明了。
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Listen 80 # 預設 Apache 的監聽埠口
ServerAdmin root@localhost # 可以改成任何一個合法的 email address 即可!出問題時,螢幕會顯示出來!
DocumentRoot "/var/www/html" # 就是預設的首頁目錄位置
<Directory "/var/www/html"> # 針對首頁目錄所進行的各項權限控制項目
Options Indexes FollowSymLinks
AllowOverride None
Require all granted # 設定誰可以瀏覽的參數,詳細語法後續會談到。
</Directory>
<IfModule dir_module> # 設定首頁檔名
DirectoryIndex index.html
</IfModule>
<Files ".ht*"> # 設定在本伺服器中,只要開頭檔名為 .ht 的檔案,就不可以被瀏覽
Require all denied
</Files>
<IfModule alias_module> # 指定 http://server/cgi-bin/ 為 CGI 的主要放置網址
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module> # 指定副檔名的其他功能
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
#AddHandler cgi-script .cgi
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8 # 指定預設的語系資料,通常可以直接註解即可!
# Some examples: # 指定一些常見的錯誤顯示方式,須搭配 Web 常見的錯誤代碼
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
- 多重埠口設計方式:
- 讓 httpd 可以啟動埠口在 80 以及 7788 兩個埠口,修改完畢之後立即重新啟動。 (你可能需要自己處理 SELinux 的問題)
- 承上,如何讓瀏覽器連結上 7788 這個埠口
- 承上,如何確認是連上 port 7788 (hint: 透過 netstat 觀察,而且可能需要透過連續指令下達,否則會看不到連線!)
- 承上,如果要讓 port 7788 對 internet 放行,該如何處理?
- 一般建議設定,不過,可能得要搭配 PHP 等伺服器網頁程式語言的協助才會看到成效!
- 讓管理員的 email 改為 student@mail.lanXX.dic.ksu
- 讓語系資料交給網頁自己管理,取消強制的 utf8 語系輸出
- 增加目錄所在的『首頁檔案』檔名設計:
- 當 index.html 找不到,會再找尋 welcome.html 或 default.html 等檔名作為首頁檔
- 當你在網址列輸入 http://localhost/checkwelcome/ 時,就會輸出 welcome.html 的內容,而 welcome.html 內容請填寫『this filename is welcome.html』即可
上面的例題中,如果你想要查看到 httpd 的連線行為,可能需要特別留意指令操作的速度。這是因為 httpd 連線的功能通常都是『射後不理』, 意思是,WWW server 將資料完全傳給 client 之後,該次連線就會中斷了!並不會持續連線等待用戶端的要求。
10.3: 常見的進階應用
基本上,上述的工作完成後,你的 Web 應該可以順利運做了。不過,在某些情況下,你可能還是得要修改一些設定,會讓你的系統運作的更好。
- Apache 系統效能優化處理
預設的 apache 設定值讓你的 Web 伺服器可以提供小型企業的運作,佔用的 Linux 系統資源也比較少。不過,當你的網站開始大起來, 瀏覽的要求比較多的時候,可能會讓你的 Apache 有點卡卡延遲的情況發生。此時,你的 Apache 應該要佔用比較多的 Linux 資源才對, 才不會讓資源閒置結果讓 apache 效能無法提昇。
由於 Apache 針對系統資源的設定中,提供了數個基本的模組,分別是 worker, prefork, event 等,這幾個模組的設定,主要是放置在底下的設定檔當中:
- /etc/httpd/conf.modules.d/00-mpm.conf
你可以自行前往查閱。不過,如果你想要知道目前的多執行緒模組 (Multi-Processing Module, MPM) 實際上用的是那一個,也可以透過底下的方式來查詢:
[root@localhost ~]# httpd -t -D DUMP_MODULES |grep mpm
mpm_event_module (shared)
RockyLinux 9 使用的是 event 這個模組。當你使用 systemctl status httpd 時,應該會看到有預設數個程序在跑 (請立刻查看一下), 這就是 event 的預設值。如果你想要增加到 10 個預設的 httpd 程序,且未來最多可開到 30 個 httpd 的程序,同時給予一些其他的參數增加連線數, 那可以在 /etc/httpd/conf.d/mpm.conf 這個檔案 (預設不存在,自己手動設定) 增加如下的項目:
[root@localhost ~]# httpd -V Server version: Apache/2.4.51 (Rocky Linux) Server built: Mar 21 2022 00:00:00 Server's Module Magic Number: 20120211:118 Server loaded: APR 1.7.0, APR-UTIL 1.6.1 Compiled using: APR 1.7.0, APR-UTIL 1.6.1 Architecture: 64-bit Server MPM: event threaded: yes (fixed thread count) forked: yes (variable process count) Server compiled with.... -D APR_HAS_SENDFILE [root@localhost ~]# vim /etc/httpd/conf.d/mpm.conf <IfModule mpm_event_module> StartServers 10 MinSpareThreads 75 MaxSpareThreads 250 ThreadLimit 64 ThreadsPerChild 50 MaxRequestWorkers 300 MaxConnectionsPerChild 1000 MaxClients 500 </IfModule> [root@localhost ~]# apachectl configtest Syntax OK [root@localhost ~]# systemctl restart httpd [root@localhost ~]# systemctl status httpd
- 依據上述的說明找到正確的模組,並且設定與上述相同的參數來處理 Apache 的資源使用情況
- 使用 systemctl status httpd 觀察整體程序的輸出是否比之前來的多。
由於 event 這個 MPM 機制會主動的降低 Apache 的 loading,因此,當你的用戶瀏覽的量很少時,httpd 的程序會主動的被降低喔! 你可以持續的 systemctl status httpd 查閱,就可以看到 process 的數量不會固定!
- Apache 的個人首頁設定
一個主機預設只有一個首頁目錄,當然可以指定使用虛擬主機。不過,如果用在類似教學的環境下,想讓所有的學生都擁有自己帳號的個人首頁, 以方便學生自己上傳自己的網頁資料時,可以使用 apache 的內建個人首頁的設定喔。
你可能會看過類似如下的網址列:
- http://your.host.name/~username/
後面那個網址『 /~username 』是否很像我們在 Linux 底下要搜尋某用戶的家目錄所使用的『 ll ~username 』呢!沒錯!那就是個人首頁。 預設的個人首頁是放置在 /home/username/public_html/ 目錄下,不過鳥哥不喜歡這個目錄名稱,比較喜歡單純的 /home/username/www/ 這樣的目錄名, 使用者也好記,我們也好管理。
個人首頁的設定預設是取消的,我們需要修改 /etc/httpd/conf.d/userdir.conf 這個檔案的內容才行!
[root@localhost ~]# vim /etc/httpd/conf.d/userdir.conf <IfModule mod_userdir.c> UserDir www </IfModule> <Directory "/home/*/www"> AllowOverride FileInfo AuthConfig Limit Indexes Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec Require method GET POST OPTIONS </Directory> [root@localhost ~]# apachectl configtest Syntax OK [root@localhost ~]# systemctl restart httpd
上面的設定值一個是設定網頁目錄為 www ,另一個則是宣告該目錄擁有的權限這樣。另外,請務必觀察 httpd 與 homedir 有關的 SELinux 設定項目, 一定要啟用才行!
[root@localhost ~]# getsebool -a | grep http | grep home httpd_enable_homedirs --> off [root@localhost ~]# setsebool -P httpd_enable_homedirs on [root@localhost ~]# getsebool -a | grep http | grep home httpd_enable_homedirs --> on
- 伺服器端的設定行為:
- 先以上述的作法完成 userdir 的個人首頁設定
- 一般帳號建立個人首頁的情境處理:
- 建立一個名為 webuser1 的帳號,密碼設定為 thewebman ;
- 切換到 webuser1 的身份,然後在家目錄建立名為 www 的目錄,且在該目錄下新增 index.html 檔案, 檔案內容就設定為『 I am webuser1 』即可。
- 嘗試到瀏覽器瀏覽 http://your.server.name/~webuser1 看看出了什麼問題?
1) 網頁上面顯示什麼訊息?
2) access log 上面顯示什麼訊息?尤其是錯誤代碼的部份
3) error log 上面顯示什麼訊息?
- 請嘗試自行修改權限資料 (請務必使用最小可達成目的的權限!)
- 在 WWW 伺服器上,若未來每個用戶新建時,都會自動擁有 www 目錄,且該目錄下都會有 index.html,內容為『 Personal web page !』, 又該如何處理?
- 上述動作完成後,請建立 webuser2 的帳號,同時修改好正確的權限,然後使用瀏覽器瀏覽,看看能否得到正確答案?
- 以 FTP 提供個人用戶的網頁上傳
我們知道 ssh 可以提供類似 ftp 的功能來傳輸檔案,也可以直接使用 scp ,或者是類似 filezilla 等圖形界面軟體來傳輸網頁。 不過 ssh 並沒有對全世界放行,同時我們也不建議 ssh 對全世界放行。而且,ssh 的 chroot 需要比較多的技術支援。 因此,如果針對教學環境來說,反而使用傳統的簡易型 FTP 軟體更能有效的設定好個人用戶的資料上傳。
RockyLinux 9 提供了 vsftpd 這個簡易的安全的 FTP 伺服器,安裝好就能立刻使用了:
- 架設 FTP 伺服器階段 (需要那五個步驟呢?)
- 安裝 vsftpd
- 啟動 vsftpd
- 下次開機依舊可以啟動 vsftpd
- 設定好 Internet 可以連線到我的 FTP 埠口
- 在 /etc/sysconfig/iptables-config 裡面加入 nf_conntrack_ftp 以及 nf_nat_ftp 兩個常用的 FTP 模組。設定完畢後務必重新啟動 iptables 服務。
- 測試確認 FTP 系統的正確執行,同時更改伺服器匿名登入的測試
- 在瀏覽器輸入 ftp://your.hostname 確認可以使用匿名 FTP (RockyLinux 9 應該會失敗)
- 使用 systemctl status vsftpd 檢查看看到底我們用啥帳號登入的?
- 找 vsftpd.conf 這個 man page 的說明,輸入剛剛看到的匿名帳號資料,找到開啟匿名登入的設定後,修改 /etc/vsftpd/vsftpd.conf 的內容, 重新啟動 vsftpd 之後,再次測試是否能夠使用匿名登入了?
- 剛剛 systemctl status vsftpd 時,可以看到 tty 使用的是 ftp,能不能查出 ftp 的家目錄所在? 同時,直接查看 ftp 家目錄內容有啥?
- 在 /var/ftp/pub 底下丟入幾個檔案,再回上一步去確認有沒有新增檔案在 pub 目錄下了。
- 一般帳號使用 FTP 的方法:
- 使用瀏覽器輸入 ftp://webuser1@your.hostname/ ,並輸入 webuser1 的密碼,來確認能否登入系統。
- 測試能不能離開使用者家目錄,並且到其他任意的地方去?
- vsftpd 可以匿名登入也能使用實體帳號登入
- 匿名登入會主動跑到 /var/ftp 目錄下去瀏覽資料
- 實體帳號預設可以離開家目錄,且能到系統任何有權限的目錄去瀏覽。
如上練習的最後一題,因為預設 vsftpd 會開放整個系統的瀏覽權,因此需要進行一些簡易的設定比較好。讓使用者無法離開家目錄才是比較正確的作法:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list allow_writeable_chroot=YES # 這一行預設不存在,請自己加入喔! [root@localhost ~]# touch /etc/vsftpd/chroot_list # 寫入這個檔案的用戶才可以脫離家目錄 [root@localhost ~]# systemctl restart vsftpd
如此一來所有的用戶就能夠透過 FTP 來進行網頁的上傳下載囉!也可以透過 notepad++ 來進行線上編修網頁的作業了!
- 依據上述的說明,完成 FTP 的 chroot 功能
- 透過用戶端瀏覽器的功能,測試能否連結到 FTP 伺服器,如 curl ftp://webuser1:thewebman@your.hostname/
- 測試能不能脫離家目錄?(curl ftp://webuser1:thewebman@your.hostname//)
- 錯誤瀏覽訊息公告
你應該經常有的經驗,就是去瀏覽一個網頁時,對方告訴你 404 耶!什麼是 404 呢?這個是 Web 公認的幾個錯誤代碼~常見的錯誤代碼有:
- 100-199:一些基本的訊息
- 200-299:用戶端的要求已成功的達成
- 300-399:Client 的需求需要其他額外的動作,例如 redirected 等等
- 400-499:Client 的要求沒有辦法完成(例如找不到網頁)
- 500-599:主機的設定錯誤問題
一般來說,正常瀏覽與錯誤瀏覽的 log 記錄位置並不相同!你可以根據底下的檔案來找尋錯誤瀏覽的行為:
- 正確瀏覽的登錄檔: /var/log/httpd/access_log
- 錯誤瀏覽的登錄檔: /var/log/httpd/error_log
你可以根據 httpd.conf 裡面的註解資料當中找到 404 這種錯誤代碼的顯示行為。
- 在主設定檔當中,設定發生 404 找不到網頁時,會主動顯示 http://your.hostname/missing.html 這個檔案
- 增加 missing.html 這個檔案,內容請自訂 (通常是增加連結到主網頁即可)
- 故意輸入錯誤的網頁,能不能取得剛剛建立的 missing.html 內容?
使用 404 之後,你在 error_log 裡面,應該就不會出現找不到該檔案的錯誤訊息了!不過,在 access_log 裡面,該檔案的資料還是會出現 404 喔!
10.4: 網頁目錄的瀏覽控制
防火牆可以讓你的 httpd 整個被擋住或整個被放行。但想一想,某個目錄我想要保護在內網才能看,其他的則大家都能看。在這樣的情況下, 防火牆似乎就沒有辦法達成了!這個時候得要使用 apache 提供的相關功能來處理較佳。底下提供兩個方案來達成這個分別瀏覽的目的:
- httpd 的目錄保護功能 (僅規範到的 IP 來源可以登入瀏覽)
我們使用的 apache 是 2.4 版,這一版與前一代使用的瀏覽權限設定完全不同,所以你得要注意版本的差異才行。基本上,針對目錄的權限瀏覽我們可以參考網頁根目錄的設定:
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
上面那個 Require 就是權限控制的重要參數。一般來說,常見的 Require 有底下的幾個基本語法:
- 全部放行: Require all granted
- 全部拒絕: Require all denied
- 部份放行,針對主機名稱的部份: Require host client.host.name
- 部份放行,針對 IP 的部份: Require ip 192.168. 192.168.0.0/16 10.0.0.0/24
- 建立保護目錄:
建立 private 目錄,且建立 private/index.html 檔案,內容為『This is private data!!!』即可 - 建立個別設定檔:
假設為 /etc/httpd/conf.d/vbird.conf ,內容請針對上述目錄進行處理。其中,該目錄只有你的內網 (10.255.xx.0/24) 以及你自己 (127.0.0.0/8) 可以瀏覽,其他來源是不能瀏覽的。 - 重新啟動:
請先檢查語法,若無問題請重新啟動 httpd 服務。 - 嘗試使用內網連線以及外網連線,測試該網頁是否能夠順利的瀏覽與不可瀏覽:
http://localhost/private/
http://localhost4/private/
http://127.0.0.1/private/
http://10.xxx/
http://192.168../
因為 localhost 同時存在於 IPv4 與 IPv6 上面,因此使用上可能會產生一些問題~查看 /etc/hosts,發現到可單純使用 localhost4 指定為 IPv4 的 127.0.0.1 位址,這樣就不會有問題!
- 建立使用密碼保護的瀏覽目錄
上述的動作雖然可以讓你的 Apache 保護某些目錄,不過,如果你經常出差,有時需要查閱該保護目錄時,會不會很麻煩?我是覺得很麻煩~ 所以,此時可以使用 Apache 提供的基礎密碼保護功能來處理。
密碼保護的設定有兩種模式:
- 一種是寫死到主設定檔 (含 httpd.conf 以及 conf.d/*.conf 等檔案,接為主設定檔)
- 一種則是透過受保護目錄底下的 .htaccess 修改設定來處理。不過要能使用 .htaccess 也需要主設定檔的支援才行。
你可能會覺得,既然主設定檔也需要修改才能支援 .htaccess , 那為何不直接寫入主設定檔即可?這是因為主設定檔修改完畢得要重新啟動 httpd ,而修改 .htaccess 只要改完立刻可以生效!無須重啟 httpd。 這對於一般帳號也想要設定密碼保護的情況來說,是相當有幫助的!針對可以使用 .htaccess 的目錄來說,需要增加底下的設定:
<Directory "/some/where"> Options XXX AllowOverride AuthConfig </Directory> # systemctl restart httpd
接下來切換到該目錄下 (/some/where),建立一個名為 .htaccess 的檔案,這個檔案必須要 (1)指定密碼檔的檔名, (2)指定該密碼檔內可用以驗證的帳號。檔案內容大概像這樣
[root@localhost ~]# vim .htaccess
AuthType basic
AuthName "你要顯示到彈出式視窗的文字"
AuthUserFile /some/auth/filename <==這個檔案需要額外建置
require user 帳號名稱 <==只針對某些用戶放行
# require valid-user <==所有記載在密碼檔的用戶均放行
上述的 /some/auth/filename 檔案檔名是自己指定的,但是最好不要放在可被網頁瀏覽的目錄 (就是不要放在 /var/www/html/ 內!)。 至於該檔案的建立方案為:
[root@localhost ~]# htpasswd [-c] /some/auth/filename username
- 伺服器的設定檢查,注意,是找 httpd.conf 或 userdir.conf 或 vbird.conf 呢?
- 先查閱使用者家目錄底下能否支援 AuthConfig 的設定!若不行,請修改成允許 override authconfig 喔!
- 想想看,如果有更新,要不要重新啟動 httpd 呢?
- 用戶自己設定屬於自己的設定檔 (無須重新啟動 httpd 喔)
- 登入 webuser1 ,讓這個用戶的 http://your.hostname/~webuser1/protect/ 目錄是受密碼保護的,且內部 index.html 顯示『 This is protect directory 』
- 假設使用的密碼檔位於瀏覽器瀏覽不到的 /home/webuser1/apache.pw ,且帳號為 nobody 密碼為 iamnobidy
- 另一個 somebody 密碼為 hehesomebody ,也能放行這個目錄。
- 設定完畢務必瀏覽一次確認 (如果出現問題,請前往 /var/log/httpd/ 查看錯誤。同時,若為權限問題, 除了 rwx 之外,也請確認 SELinux 是否有問題!)
10.5: 使用 https 瀏覽
網頁一般都是不加密的,不過這樣的傳輸可能會出問題!因此,進來各主要供應商都建議無論你的資料為何,最好都提供加密的 https 瀏覽為宜。 那麼 https 到底是什麼呢?
- 使用類似 sshd 的金鑰系統,透過 SSL (Secure Socket Layer) 的方式來處理這樣的金鑰系統。 而啟動的埠口會預設啟動於 443 上面。
- 由於 server 的 public key 預設是可以散佈在 internet 上面的,因此,public key 很可能會被竊取。 為此,合法的網址 (URL) 通常都會將自己的 public key 製作成為憑證,讓網址與憑證一致, 再將憑證註冊進合法的第三公正單位資料庫 (Certification Authorities) ,則未來用戶端瀏覽器要瀏覽這個網址時, 會將取得的憑證與 CA 資料庫進行比對,以確定該網址確實就是某公司的註冊這樣。
- 雖然有時候你覺得你的網站資料並不是非常重要,但是,近期以來,幾乎所有的大型 WWW 伺服器都將網站使用 https 來瀏覽了!所以大家也需要考慮一下,是否有此需求才好!
- Apache 使用的 https 機制,只需要加上 mod_ssl 這個模組即可!
- 請安裝 mod_ssl 之後,並重新啟動 httpd,同時觀察是否啟動了 443 埠口?
- 如何連線到 port 443 ?若有連線的憑證問題,如何查閱憑證資料並放行該次連線?
- 若使用 curl 進行連線,又該如何加入參數?
10.6: 課後練習
- (70%)實作題:啟動 Server 作業硬碟 - unit10
- 網路參數的設定,請依據底下的方式來設定好你的網路環境:
- 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- IPv4 的 IP位址: 172.18.255.*/24 ,其中 * 為老師規定的 IP 尾數
- gateway 為 172.18.255.254
- DNS 為 172.16.200.254 以及 168.95.1.1
- 使用 teamd 的機制建立內部區域網路的備援功能:
- team 的界面使用 team0 卡號,且連線名稱請命名為 team0
- team 使用 activebackup 備援功能,不要使用 loadbalance
- team 的實體網卡 (team slave) 請使用 ens7 及 ens8 ,且其連線名稱名稱亦請命名為 ens7, ens8
- team0 網路參數為: 172.19.*.254/24,不需要 gateway
- 主機名稱指定為: server*.example.dic
- 最終你的主機名稱與 IP 的對應為:
server*.example.dic 172.18.255.* 別名為 server* server254.example.dic 172.18.255.254 別名為 server254 server.lan*.example.dic 172.19.*.254 別名為 server client.lan*.example.dic 172.19.*.1 別名為 client
- 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- 基本的伺服器作業系統設定行為:
- 依據底下的說明,選擇距離我們最近的成大網站來作為 yum server 的來源:
成大 ccns 網站: https://mirror.ccns.ncku.edu.tw/howto/#rocky-linux
請記得修改過設定檔,應該要將清單清除 (yum clean all) 較佳。 - 安裝相關的軟體,至少須安裝 vim-enhanced, bash-completion, net-tools, bind-utils, kernel
- 全系統自動升級,且每天凌晨 3 點也會自動升級一次。(請寫入 /etc/crontab 為主)
- 將 SELinux 修改成為 Enforcing 模式,且未來每次開機都自動為 Enforcing 才行
- 依據底下的說明,選擇距離我們最近的成大網站來作為 yum server 的來源:
- 實際設定好本機防火牆
- 請關閉 firewalld 服務,並且自行安裝、啟動 iptables 服務
- 將預設的規則轉存到 /root/firewall.sh 這個檔案內
- 修改上述 firewall.sh 腳本,讓內容有點像底下這樣:
- 首先將全部的規則刪除 (應該有三條指令)
- 設定好預設政策,讓 INPUT 成為 DROP 而 OUTPUT 與 FORWARD 成為 ACCEPT
- 針對 INPUT 前三條規則為 (1)回應封包 (2)放行 lo 界面 (3)放行 icmp 封包
- 放行你自己的內部區域網路那個網域的連線要求 (針對 LAN 的信任設定)
- 讓 ssh 只對外部的區網放行,不會對 Internet 放行 (對 ssh 連線做限制較佳)
- 讓 http 針對整個 Internet 放行 (一般公開的服務設計)
- 最後讓確定的規則轉存到 /etc/sysconfig/iptables 這個設定檔
- 重新啟動 iptables 服務,然後觀察規則是否正確
- 實際設定好 Server 的路由功能
- 讓核心支援 IP 轉遞的功能,並且每次重新開機都可以自動生效
- 修改 /root/firewall.sh ,在該檔案加入清除 nat 表格的規則與自訂鏈的設定
- 增加規則:讓來自內部網路的封包,在路由判斷後,並預計由 ens3 對外網卡出去的封包,全部偽裝成為 ens3 的 IP 位址 (一般在數據機上面的就是 public IP)
- 在 /etc/sysconfig/iptables-config 當中增加 nf_nat_ftp 及 nf_conntrack_ftp 模組功能
- 上述功能在開機後依舊能夠順利啟動
- 基礎 Apache 架設
- WWW 啟動的埠口會同時啟動於 port 80 與 port 1212 這兩個
- 管理員的 email 請設定為 student@server.lanXX.example.dic
- 取消強制使用 UTF8 的語系設定
- 設定 index.html, welcome.html, default.html 作為你的首頁檔名
- 當瀏覽 http://localhost 時,會顯示你的學號與姓名
- 讓你的伺服器可以同時提供 port 80 與 port 1212 的網路連線 (防火牆功能思考)
- 個人首頁的設定
- 針對個人首頁的 Apache 設定:
- 瀏覽器瀏覽 http://localhost/~username 時,會顯示 /home/username/web/index.html 的內容
- 針對新建用戶的設計:
- 預設建立新用戶時,該用戶的家目錄會存在一個名為 web 的目錄
- 且內含一個 index.html 的檔案,檔案內容填寫『 Personal web page 』即可。
- 為了擔心個人用戶用爆系統容量,因此請設定好 /home 這個目錄的檔案系統得要支援磁碟容量配額 (quota) 的功能。
- 若 /home 為獨立 partition,請根據既有的檔案系統設計磁碟配額檔案系統支援
- 若 /home 並不存在獨立的 partition ,那你可能得要針對根目錄進行 quota 的設定 (雖然這不是個好建議!)。 但是 Linux 核心預設不能讓根目錄掛載為支援 quota,因此需要動點小手術。請參考 https://help.directadmin.com/item.php?id=557 來取得正確的 quota 支援。(註,我們只需要 userquota 即可, projectquota 可以不予理會)
- 大量批次建立帳號:建立一隻名為『 /root/webuser.sh 』的腳本
- 建立一個名為 /root/webuser.txt 的檔案,/root/webuser.txt 的內容有點像這樣:
alex dora hank
- /root/webuser.sh 的腳本使用 for, do, done 的迴圈功能,會針對上述 /root/webuser.txt 的檔案進行如下動作:
- 使用預設方式建立用戶,且用戶的密碼與帳號相同。
- 建立用戶後,會給予該用戶 soft/hard 分別為 400MB/500MB 的可用磁碟容量
- 讓該用戶的家目錄權限設定為 711
- 建置完畢後請執行一次該腳本,並使用 http://localhost/~alex 確認該帳號是存在的! (很可能需要額外處理權限或者是 SELinux 的問題)
- 建立一個名為 /root/webuser.txt 的檔案,/root/webuser.txt 的內容有點像這樣:
- 處理使用者透過 FTP 上傳/下載的問題:
- 讓 alex, dora, hand 可以使用 ftp 上傳/下載資料到伺服器上
- 且這三個用戶必須是 chroot 的使用環境。
- 伺服器的防火牆必須要放行 FTP (注意 port 的放行以及 FTP 的相關模組設定與載入)
- 針對個人首頁的 Apache 設定:
- 受保護目錄的建置
- 固定來源的目錄保護:
- 在瀏覽 http://localhost/pro_one/ 這個網址時,會顯示『 This is protect one directory 』
- 只有底下的 IP 或網域,才可以瀏覽上述網址,其餘來源則沒有權限瀏覽:
127.0.0.0/8
172.18.255.*/32
172.19.*.0/24
- 密碼保護:
- 在瀏覽 http://localhost/pro_two/ 這個網址時,會顯示『I am Protect two hehe 』的字樣。
- 但是瀏覽時,會需要輸入帳號與密碼,帳號為 student 密碼為 student,輸入完畢才能瀏覽
- 額外指定部份:
- 請使用 .htaccess 的方式來處理這個題目
- 假設密碼檔位於 /var/www/apache.pw 這個檔案內
- 正確輸入帳密會顯示『 I am Protect two hehe 』的字樣。
- 固定來源的目錄保護:
- 網路參數的設定,請依據底下的方式來設定好你的網路環境:
- (10%)實作題:啟動 client 作業硬碟
- 網路參數的設定,請依據底下的方式來設定好:
- 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- IPv4 的 IP位址: 172.19.*.1/24 ,其中 * 為老師規定的 IP 尾數
- gateway 為 172.19.*.254
- DNS 為 172.16.200.254 以及 168.95.1.1
- 主機名稱指定為: client.lan*.example.dic
- 最終你的主機名稱與 IP 的對應為:
server*.example.dic 172.18.255.* 別名為 server* server254.example.dic 172.18.255.254 別名為 server254 server.lan*.example.dic 172.19.*.254 別名為 server client.lan*.example.dic 172.19.*.1 別名為 client
- 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- 實際設定好本機防火牆
- 預設請使用 firewalld 防火牆服務,不要使用 iptables 服務!
- 請將預設的領域 (zone) 改為 work 領域,且 ens3 為其管理之界面網卡
- 預計放行的服務主要有 ssh 與 http 兩個服務,其他還可能有預設會啟用的 dhcp 用戶端服務。
- 查詢 rich rule (man firewalld.richlanguage),確認來自本機同一個 LAN 網段的封包,通通給予放行。
- 上述放行的防火牆服務,在下次重新開機後,依舊會存在才行
- 網路參數的設定,請依據底下的方式來設定好:
- (20%)簡易問答題:(第一題 2 分,其餘 3 分)
從具有 GUI 及中文的用戶端 Linux ,使用『 ssh root@172.19.*.254 』登入你的 Server ,之後建立 /root/ans.txt 的檔案,並將底下各題目的答案寫入你 server 當中!
- 所謂的 LAMP Server 在 WWW 上面一般指的是什麼意思?
- 傳統 FTP 的傳輸有所謂的命令通道與資料流通道,這兩個通道分別透過哪個埠口進行資料連接?
- FTP 有所謂的 active mode 與 passive mode,請問這兩種模式是如何進行傳輸的?
- 為了解決因為 NAT 造成的 FTP 傳輸困擾,那兩個 iptables 模組可以被拿來做監聽的應用?
- 當在 apache 上面設計的網頁出問題,或者是 http 本身出問題,可以查詢那一個登錄檔
- 以『 apache code status 』為關鍵字到 google 查詢,查出 200, 403, 404, 500 這四個錯誤碼的實際意義為何 (必須翻譯為你自己了解的語意)?
- 查詢 httpd.conf 內的 Options 設定值,裡面的 Indexes, FollowSymLinks, ExecCGI 的意義為何?
- 上傳成績
- 請將 Server/Client 的硬碟通通啟動,並且確認兩者間的連線沒有問題;
- 在 Server 硬碟上面登入,然後用 root 的身份執行 vbird_server_check_unit ,並依據提示資料填寫你的學號與 IP 尾數
- 該程式會偵測你的系統,並且通知你哪個部份可能有問題,你需要持續觀察或者重新處理的部份會交代妥當。
- 若一切沒問題,螢幕就會出現如下的字樣,然後你就能夠使用 links 去檢查你的檔案是否有順利的上傳了!
- Please use links http://172.18.255.250/upload/unit10 to check your filename
- 2022/11/21:將整體資料在 RockyLinux 9 上實作對題目的解釋稍微更新,同時修訂 ftp 連線直接加上密碼