伺服器建置實務上課補充教材


Point 06:網頁伺服器 (Apache server)
  1. 關於 WWW 的簡介
    1. 什麼是 WWW
      • WWW 是 World Wide Web 的縮寫,其中 Web 有廣播網的意思存在, 所以簡稱為全球資訊網。
      • 使用 WWW 時,需要有 server 與 client 的架構,兩者間傳輸的資料如下:

        • WWW 伺服器不但需要一個可讓用戶端瀏覽的平台,還需要提供用戶端一些資料才行!
        • 伺服器所提供的最主要資料是超文件標籤語言 (Hyper Text Markup Language, HTML)、多媒體檔案 (圖片、影像、聲音、文字等,都屬於多媒體或稱為超媒體)。
        • HTML 只是一些純文字資料,透過所謂的標籤 (<tag>) 來規範所要顯示的資料格式;
        • 在用戶端,透過瀏覽器的對 HTML 以及多媒體的解析,最後呈現在使用者的螢幕上。
    2. http 協定與 apache 軟體的開發
      • 伯納斯-李 (Tim Berners-Lee) 在 1980 年代為了更有效率的讓歐洲核子物理實驗室的科學家可以分享及更新他們的研究成果, 於是他發展出一個超文件傳輸協定 (Hyper Text Transport Protocol, HTTP)
      • 為了讓 HTTP 這個協定得以順利的應用,大約在 90 年代初期由伊利諾大學的國家超級電腦應用中心 (NCSA, http://www.ncsa.illinois.edu/) 開發出伺服器 HTTPd (HTTP daemon 之意)
      • 由於 HTTPd 這個伺服器一直沒有妥善的發展,於是一群社群朋友便發起一個計畫,這個計畫主要在改善原本的 HTTPd 伺服器軟體,他們稱這個改良過的軟體為 Apache,取其『一個修修改改的伺服器 (A patch server)』的雙關語!
      • 這個 Apache 在 1996 年以後便成為 WWW 伺服器上市佔率最高的軟體了 (http://httpd.apache.org/)。
    3. 什麼是 URL (Uniform Resource Locator)
      • <協定>://<主機位址或主機名稱>[:port]/<目錄資源>
    4. 動態 WWW 伺服器
      • 主要的組成元件: 作業系統平台+WWW伺服器+資料庫系統+網頁程式語言,還有 client 的瀏覽器!相關性為:
      • 須注意 WWW 伺服器與資料庫系統為兩個獨立的系統,因此需要透過網頁程式語言進行溝通!
      • Linux 環境: Linux + Apache + Mariadb + PHP --> LAMP
  2. 架設基礎 WWW 伺服器
    1. 軟體安裝需求: httpd, mariadb, mariadb-server, php, php-mysql 等等!
    2. 服務啟動需求: mariadb, httpd 兩個!
    3. 若修改 php 的設定,則需要『重新啟動 httpd 這個服務』!因為 PHP 是 apache 內的一個模組!
    4. 練習:
      1. 啟動 mariadb 服務,啟動完畢後觀察是否啟動埠口?觀察是否有開機啟動?
      2. 由於預設 mariadb 沒有設定 root 密碼,因此執行 mysql_secure_installation 依序完成安全強化作業 (設定 root 密碼為 2727175 看看,其他幾乎均按下 enter 即可!)
      3. 啟動 httpd 服務,啟動完畢後請查看埠口為幾號?同時測試防火牆是否正確對 internet 放行了?
      4. 前往瀏覽器 http://localhost 看看是否正確的啟動了 WWW 呢?
      5. 前往 /var/www/html 建立 index.html,裡面填寫學號與姓名,看看能否順利瀏覽到呢?
      6. 建立 test.php ,內容為: <?php phpinfo(); ?> ,看看有沒有順利瀏覽到一堆資訊呢?
      7. 查詢一下 /var/log/httpd 的內容,分為那兩種資訊?如何查看該資訊代表的意義?
  3. 認識 apache 設定檔基礎設定
    1. 基礎設定檔: /etc/httpd/conf/httpd.conf
    2. 基礎的設定值
      • Listen port: ex> Listen 80:
        可以有多個設定值,如要啟動兩個 httpd 的埠口,可以寫兩個 Listen 的項目。
      • User apache, Group apache:
        設定啟動 httpd 程序的使用者與群組之帳號!
      • ServerAdmin root@localhost:
        管理員的 email,若 httpd 出問題,某些時刻會顯示出管理員的聯絡資訊!所以這裡可以改填管理員的實際 email
      • DocumentRoot "/var/www/html":
        就是設定首頁目錄的位置!所以叫做文件的根目錄 (Document Root 的中文)
      • <Directory "/some/path">....</Directory>:設定某個瀏覽目錄的權限!基本設定如下:
        <Directory "/var/www/html">
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
        </Directory>
        • Options 有:All, None, Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
        • AllowOverride 有:All, None, Options, FileInfo, AuthConfig, Limit
        • Require :限制誰能瀏覽這個目錄的意思~
      • DirectoryIndex index.html
        就是首頁的檔名!預設就是 index.html,是有順序的唷!
      • AddDefaultCharset UTF-8
        預設的顯示語系,會取代掉 html 檔案的 charset 項目,建議這個設定值直接取消!加上註解!
    3. PHP 的基礎設定檔: /etc/httpd/conf.d/php.conf
    4. 練習:
      1. 讓你的 apache 可以監聽 port 80 及 port 9494
      2. 如何在網址列輸入 port 9494 的瀏覽?
      3. 將管理員帳號輸出為 student@your.host.name
      4. 將語系交給網頁自行決定,不要統一使用 utf8 輸出!
      5. 讓 welcome.html 與 welcome.php 也可以是首頁
  4. Apache 的個人首頁設定
    1. 預設系統的個人首頁網址為 http://your.host.name/~username/
    2. 個人首頁的修改:
      • 預設的設定值放置於 /etc/httpd/conf.d/userdir.conf
      • 考慮到用戶的資訊技能,建議統一將目錄放置 www 或 web 目錄下!因此上述檔案建議改成這樣:
        # 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>
        
        # apachectl configtest
        Syntax OK
        
        # systemctl restart httpd
    3. 用戶家目錄權限的設定,例如以 student 為例,應該要這樣處理 (用 student 身份喔!):
      $ chmod 711 ~student
      $ mkdir ~student/www
      $ echo "check student web page" > ~student/www/index.html
      
      之後在網址列輸入 http://your.host.name/~student 查閱是否有資料即可!
    4. 若有需要撰寫程式碼,需要注意 if ... then 的 bash 語法喔!
      # vim somefile.sh
      #!/bin/bash
      
      if [ "${var}" == "" ]; then
      	程式碼寫在這裡
      fi
      
      第一列是宣告底下為甚麼語法寫的程式腳本,而 if 跟中括號之間,需要有空格隔開,這個是重點!不然程式碼會出錯。 另外,如果需要外帶參數,則參數的變數名稱為 ${1} 才對!
    5. 練習:
      • 根據上述資料,設定好個人首頁,個人首頁目錄為 ~user/www !
      • 讓所有新建的用戶預設家目錄均有名為 www 的子目錄
      • 讓所有新建的用戶預設都有 www/index.html 的檔案,內容為『 my directory 』
      • 新建名為 webuser1 的用戶,且該用戶具有個人首頁 (注意權限)
      • 在 /root/bin 建立名為 addwebuser.sh 的腳本,該腳本可以建立新的用戶, 且會主動的修改 /home/帳號 的權限。腳本使用的方式為" addwebuser.sh 帳號 "
  5. 錯誤瀏覽訊息公告
    1. Apache 的訊息代碼意義為:
      • 100-199:一些基本的訊息
      • 200-299:用戶端的要求已成功的達成
      • 300-399:Client 的需求需要其他額外的動作,例如 redirected 等等
      • 400-499:Client 的要求沒有辦法完成(例如找不到網頁)
      • 500-599:主機的設定錯誤問題
      主要的訊息代碼都可以在 access 或者是 error log 裡面找到!
    2. 你可以在 /etc/httpd/conf/httpd.conf 找到錯誤代碼為 404 的設定值,然後處理所需要的顯示項目來處理!
    3. 練習:
      • 讓你的錯誤代碼 404 會自動顯示 http://your.host.name/missing.php 這個檔案
      • 上述的檔案內容中,請使用到 PHP 的 $_SERVER['SERVER_ADMIN'] 這個變數,然後做好相關的連結資料。
  6. httpd 的目錄保護功能 (僅規範到的 IP 來源可以登入瀏覽)
    1. 不同的 Apache 版本其設定不同,CentOS 7 的版本使用的是 Require 這個設定項目,且涵蓋於 <Directory "/path"> 項目內!
    2. 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
    3. 練習:有個目錄放置的資料僅針對內網放行,例如 http://your.host.name/private 這個目錄!
      • 先建立 private 這個目錄,並在該目錄內建立 index.html ,內容就寫『This is private data!!!』
      • 建議建立 /etc/httpd/conf.d/yourname.conf 檔案,內容主要就是有點像這樣:
        <Directory "/some/where">
        	Options XXX
        	AllowOverride XXX
        	Require ip XXX
        	Require ip XXX
        </Directory>
        
        # apachectl configtest
        Syntax OK
        
        # systemctl restart httpd
      • 分別以不同的 IP 瀏覽該目錄 (因為你有多個界面的緣故),看看能不能登入該目錄喔!
  7. 建立使用密碼保護的瀏覽目錄
    1. 承上題,當你的主管會到外部去出差,他也需要用到上述的保護目錄,因此使用固定的 IP 保護就顯的有點蠢~ 此時可以使用 apache 預設提供的密碼保護功能來處理!
    2. 一般建議你使用某個目錄底下,允許使用設定修改的設定檔 .htaccess 這個檔案,而其中僅有 AuthConfig 這個項目應該就 OK 了!不需要全部放行。有點像這樣:
      <Directory "/some/where">
      	Options XXX
      	AllowOverride AuthConfig
      </Directory>
      
      # systemctl restart httpd
      
    3. 接下來切換到該目錄下 (/some/where),建立一個名為 .htaccess 的檔案,這個檔案必須要 (1)指定密碼檔的檔名, (2)指定該密碼檔內可用以驗證的帳號。檔案內容大概像這樣:
      # vim .htaccess
      AuthType	basic
      AuthName	"你要顯示到彈出式視窗的文字"
      AuthUserFile	/some/auth/filename
      require user 	帳號名稱
      # require valid-user
      
    4. 上述的 /some/auth/filename 檔案檔名是自己指定的,但是最好不要放在可被網頁瀏覽的目錄 (就是不要放在 /var/www/html/ 內!)。 至於該檔案的建立方案為:
      # htpasswd [-c] /some/auth/filename username
      
    5. 練習:
      1. 讓你的網址列 http://your.host.name/protect/ 為受保護的目錄,該目錄底下可接受 AuthConfig 的認證設定改寫
      2. 建議密碼檔放置於 /var/www/apache.pw 這個檔案中
      3. 建立一個名為 myroot 的帳號,密碼為 2727175
      4. 若要再增加一個名為 myadmin 帳號,密碼為 2727175 的用戶時,該如何處理?
  8. 使用加密的 https 連線
    1. 關於 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 這個模組即可!
    2. 練習:
      1. 請安裝 mod_ssl 之後,並重新啟動 httpd,同時觀察是否啟動了 443 埠口?
      2. 如何連線到 port 443 ?若有連線的憑證問題,如何查閱憑證資料並放行該次連線?
    3. 自製專屬憑證資料
      • 從前一個練習的憑證資料觀察中,我們可以發現憑證資料可能跟我們系統的原本設定不同,因此, 就讓我們來自製專屬的憑證資料!
      • 練習基本建立憑證的方法為:
        1. 進入 /etc/pki/tls/certs 後,使用『 make yourname.key 』建立一把私鑰 (需要輸入四位數密碼)
        2. 將 yourname.key 更改檔名為 yourname.raw 之後,使用『 openssl rsa -in yourname.raw -out yourname.key 』 來將密碼取消 (否則啟動 httpd 時,會出現問題!建制完畢後, yourname.raw 即可刪除)
        3. 使用『 make yourname.crt SERIAL=YYYYMMDDNN DAYS=3650 』建立憑證檔案,記得 common name 要輸入你的對外主機名稱
        4. 將 yourname.key 挪到 /etc/pki/tls/private 底下,並將權限修訂成為 400 (或 600)。
        5. 接下來請到 /etc/httpd/conf.d/ssl.conf 裡面調整 localhost.crt 與 localhost.key 的項目,重起 httpd 即可!
    4. 讓加密與不加密的資料分開!讓系統比較安全些!請修改 ssl.conf 的內容!假設我們需要將加密資料放置於 /var/www/https 的話, 可以這樣做:
      1. 先建立 /var/www/https 目錄,同時塞一個特色的 index.html 內容在內!
      2. 前往 /etc/httpd/conf.d/ 修改 ssl.conf ,主要修改的項目為:
        DocumentRoot "/var/www/https"
        ServerName your.host.name:443
        
        重新啟動過 httpd 之後,即可生效了!
  9. FTP 的簡易設定
    1. 簡易設定:
      • 由於 FTP 有主動與被動的連線要求,因此,如果要設定 FTP 的話,最好防火牆需要加入 nf_nat_ftp, nf_contrack_ftp 這兩個模組較佳;
      • 防火牆的模組資料放置在 /etc/sysconfig/iptables-config 檔案內
      • CentOS 預設提供的是 vsftpd 這個服務!服務設定檔在 /etc/vsftpd/vsftpd.conf 喔!
      • 練習:
        1. 安裝並且啟動 vsftpd 這個 FTP 軟體
        2. 讓 port 21 與 FTP 相關的模組放行。
    2. Chroot 設定
      • 預設的情況下,使用者登入 FTP 後,可以在檔案系統內到處跑,實在是不合理。
      • 預設 root 無法登入系統的!只有 UID 大於 1000 之後的,才能夠登入 FTP
      • 如果想要將帳號鎖在家目錄內,就得要使用 chroot 這個設定值才行!而相關預設值已經寫入到 vsftpd.conf 中了
      • 不過如果想要正常使用 chroot 的話,還得要加上 allow_writeable_chroot=YES 的設定才行!
      • 練習:
        1. 讓 ftpuser1 可以使用 ftp ,但是這個用戶會被鎖在家目錄中。
        2. 讓 student 可以使用 ftp,且這個用戶可以不用被鎖在家目錄中。
Top
HOME