[
  {
    "id": "TWGCB-04-007-0001",
    "category": "Apache模組",
    "name": "Log Config模組",
    "description": "這項原則設定決定是否啟用Log Config模組，此模組提供彈性的方式將用戶端請求記錄至日誌，並可配合使用LogFormat指令自訂日誌格式\n啟用Log Config模組時，將用戶端請求記錄在日誌中，可供管理者掌握網頁伺服器使用情形，輔以判斷是否有異常存取之情況\nApache伺服器管理者可依需求掛載所需的模組，以增加相關功能。第一種掛載方式是靜態(Static)掛載模組，在編譯原始碼階段，就將所需之模組編譯進來，另一種較彈性的模組掛載方式為動態(Dynamic)掛載模組，有需要時才掛載進來，可透過在Apache設定檔內加上LoadModule之方式，或移除LoadModule行首之註解符號(#)，即可動態載入相關模組",
    "method": "執行以下任一操作以啟用Log Config模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認未載入--disable-log-config參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，檢查載入Log Config模組的LoadModule指令，新增或修改成以下內容：\nLoadModule log_config_module modules/mod_log_config.so",
    "expected": "啟用",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q log_config && echo PASS || echo FAIL",
    "remediation": "sudo a2enmod log_config && sudo systemctl restart apache2"
  },
  {
    "id": "TWGCB-04-007-0002",
    "category": "Apache模組",
    "name": "WebDAV模組",
    "description": "這項原則設定決定是否啟用WebDAV (Web Distributed Authoring and Versioning)模組，Apache之mod_dav與mod_dav_fs模組支援WebDAV功能\nWebDAV是一種以HTTP或HTTPS通訊協定為基礎，提供與遠端伺服器進行檔案維護的標準，允許用戶端在網頁伺服器上建立、移動及刪除檔案與資源\n停用WebDAV模組可降低在網路上暴露可能遭攻擊之程式碼路徑的數量，以及減少可能因存取控制設定錯誤而導致未經授權存取檔案之情況，進而提升網頁伺服器安全性\n使用動態掛載模組方式時，在LoadModule行首新增註解符號(#)，即可停用該模組",
    "method": "執行以下任一操作以停用WebDAV模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認--enable-modules未載入mod_dav與mod_dav_fs參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，移除載入WebDAV模組的LoadModule指令，或修改成以下內容：\n##LoadModule dav_module modules/mod_dav.so\n##LoadModule dav_fs_module modules/mod_dav_fs.so",
    "expected": "停用",
    "check_cmd": "apachectl -M 2>/dev/null | grep -qE 'dav_module|dav_fs' && echo FAIL || echo PASS",
    "remediation": "sudo a2dismod dav dav_fs && sudo systemctl restart apache2"
  },
  {
    "id": "TWGCB-04-007-0003",
    "category": "Apache模組",
    "name": "Status模組",
    "description": "這項原則設定決定是否啟用Status模組，以提供當前伺服器性能之統計資訊\n啟用Status模組時，管理者可透過HTML頁面呈現網頁伺服器目前使用情形，以了解伺服器效能與負載\n停用Status模組時，可避免針對伺服器負載進行攻擊之惡意人士，利用伺服器狀態資訊調整與優化攻擊方式\n使用動態掛載模組方式時，在LoadModule行首新增註解符號(#)，即可停用該模組",
    "method": "執行以下任一操作以停用Status模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認已載入--disable-status參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，移除載入Status模組的LoadModule指令，或修改成以下內容：\n##LoadModule status_module modules/mod_status.so",
    "expected": "停用",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q status_module && echo FAIL || echo PASS",
    "remediation": "sudo a2dismod status && sudo systemctl restart apache2"
  },
  {
    "id": "TWGCB-04-007-0004",
    "category": "Apache模組",
    "name": "Autoindex模組",
    "description": "這項原則設定決定是否啟用Autoindex模組，此模組會自動產生目錄索引，並可透過網頁瀏覽\n伺服器可透過使用者撰寫之網頁(如index.html)產生目錄索引，或由Autoindex模組自動生成目錄索引\n停用Autoindex模組可避免暴露對攻擊者有用的資訊，例如命名慣例、目錄結構及路徑\n使用動態掛載模組方式時，在LoadModule行首新增註解符號(#)，即可停用該模組",
    "method": "執行以下任一操作以停用Autoindex模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認已載入--disable-autoindex參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，移除載入Autoindex模組的LoadModule指令，或修改成以下內容：\n##LoadModule autoindex_module modules/mod_autoindex.so",
    "expected": "停用",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q autoindex_module && echo FAIL || echo PASS",
    "remediation": "sudo a2dismod autoindex && sudo systemctl restart apache2"
  },
  {
    "id": "TWGCB-04-007-0005",
    "category": "Apache模組",
    "name": "Proxy模組",
    "description": "這項原則設定決定是否啟用Proxy模組，此模組允許伺服器成為HTTP與其他協定的代理伺服器(正向或反向代理)。如果安裝使用Apache的目的不是要代理或轉送來自其他網路的請求，應停用Proxy模組\n掃描啟用Proxy功能之網頁伺服器是一種常見的攻擊，攻擊者透過Proxy攻擊其他伺服器時，可以藉此隱匿身分，甚至進而進入到其他受保護的網路中，因此，建議網頁伺服器停用Proxy模組\n使用動態掛載模組方式時，在LoadModule行首新增註解符號(#)，即可停用該模組",
    "method": "執行以下任一操作以停用Proxy模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認--enable-modules未載入mod_proxy參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，移除載入Proxy模組的LoadModule指令，或修改成以下內容：\n##LoadModule proxy_module modules/mod_proxy.so\n##LoadModule proxy_connect_module modules/mod_proxy_connect.so\n##LoadModule proxy_ftp_module modules/mod_proxy_ftp.so\n##LoadModule proxy_http_module modules/mod_proxy_http.so\n##LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so\n##LoadModule proxy_scgi_module modules/mod_proxy_scgi.so\n##LoadModule proxy_ajp_module modules/mod_proxy_ajp.so\n##LoadModule proxy_balancer_module modules/mod_proxy_balancer.so\n##LoadModule proxy_express_module modules/mod_proxy_express.so\n##LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so\n##LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so",
    "expected": "停用",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q proxy_module && echo FAIL || echo PASS",
    "remediation": "sudo a2dismod proxy proxy_http proxy_ftp && sudo systemctl restart apache2"
  },
  {
    "id": "TWGCB-04-007-0006",
    "category": "Apache模組",
    "name": "User Directories模組",
    "description": "這項原則設定決定是否啟用User Directories模組，此模組允許透過UserDir指令設定使用者目錄所對應的真實目錄，進而存取使用者目錄與檔案，例如瀏覽網址http://example.com/~user01/，可存取user01使用者所建立之目錄與檔案，瀏覽網址http://example.com/~root/，可存取系統根目錄(/)\n停用User Directories模組，可避免任意人存取到使用者原先要分享給其他特定使用者的檔案，且當系統上建立新使用者帳戶時，亦可防止任意人利用此方式透過網站取得新使用者所建立的檔案\n使用動態掛載模組方式時，在LoadModule行首新增註解符號(#)，即可停用該模組",
    "method": "執行以下任一操作以停用User Directories模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認已載入--disable-userdir參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，移除載入User Directories模組的LoadModule指令，或修改成以下內容：\n##LoadModule userdir_module modules/mod_userdir.so",
    "expected": "停用",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q userdir_module && echo FAIL || echo PASS",
    "remediation": "sudo a2dismod userdir && sudo systemctl restart apache2"
  },
  {
    "id": "TWGCB-04-007-0007",
    "category": "Apache模組",
    "name": "Info模組",
    "description": "這項原則設定決定是否啟用Info模組，此模組可透過在網址後面加上「/server-info」存取有關伺服器組態設定資訊\n停用Info模組，可避免從Apache網頁伺服器之組態設定指令洩漏機敏資訊(如系統路徑、使用者名稱/密碼、資料庫名稱等)\n使用動態掛載模組方式時，在LoadModule行首新增註解符號(#)，即可停用該模組",
    "method": "執行以下任一操作以停用Info模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認--enable-modules未載入mod_info參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，移除載入Info模組的LoadModule指令，或修改成以下內容：\n##LoadModule info_module modules/mod_info.so",
    "expected": "停用",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q info_module && echo FAIL || echo PASS",
    "remediation": "sudo a2dismod info && sudo systemctl restart apache2"
  },
  {
    "id": "TWGCB-04-007-0008",
    "category": "權限與所有權",
    "name": "以非root身分運行Apache網頁伺服器",
    "description": "這項原則設定決定是否使用指定之Apache使用者帳戶與群組運行Apache網頁伺服器\nApache通常以root權限啟動，並使用80與443埠進行通訊，建立一個專屬且非root權限之帳戶運行網頁服務，可避免不同服務間之交互影響，以提升安全性",
    "method": "決定要運行Apache網頁伺服器之使用者與群組名稱(以下以apache為例，機關可依需求調整)\n檢查apache使用者與群組是否存在，若不存在請執行以下指令，建立帳戶與群組：\n#groupadd -r apache\n#useradd apache -r -g apache -d /var/www -s /sbin/nologin\n在Apache設定檔(如httpd.conf)中設定apache使用者與群組，新增以下內容：\nUser apache\nGroup apache",
    "expected": "以非root身分(如apache)使用者與群組運行Apache網頁伺服器",
    "check_cmd": "ps aux | grep -E '[a]pache|[h]ttpd' | grep -qv root && echo PASS || echo FAIL",
    "remediation": "編輯 /etc/apache2/apache2.conf:\nUser www-data\nGroup www-data"
  },
  {
    "id": "TWGCB-04-007-0009",
    "category": "權限與所有權",
    "name": "運行Apache網頁伺服器之帳戶禁止登入系統",
    "description": "這項原則設定決定運行Apache網頁伺服器之帳戶是否可登入系統\n確保運行Apache網頁伺服器之帳戶僅能提供服務，無法登入系統，可降低資安風險",
    "method": "確認用於運行Apache網頁伺服器之帳戶名稱(如apache)\n開啟終端機，執行以下指令，設定apache帳戶使用nologin shell：\n#chsh -s /sbin/nologin apache",
    "expected": "禁止登入系統",
    "check_cmd": "getent passwd www-data 2>/dev/null | grep -qE 'nologin|/bin/false' && echo PASS || echo FAIL",
    "remediation": "sudo usermod -s /usr/sbin/nologin www-data"
  },
  {
    "id": "TWGCB-04-007-0010",
    "category": "權限與所有權",
    "name": "鎖定運行Apache網頁伺服器之帳戶密碼",
    "description": "這項原則設定決定是否要針對運行Apache網頁伺服器之帳戶(如apache)鎖定密碼\n基於縱深防禦措施，運行Apache網頁伺服器之帳戶可透過密碼鎖定機制，使該帳戶無法登入系統，並防止使用者透過su指令變更為運行Apache網頁伺服器之帳戶",
    "method": "確認用於運行Apache網頁伺服器之帳戶名稱(如apache)\n開啟終端機，執行以下指令，以鎖定apache帳戶之密碼：\n#passwd -l apache",
    "expected": "鎖定密碼",
    "check_cmd": "passwd -S www-data 2>/dev/null | awk '{print $2}' | grep -qE '^L|^LK' && echo PASS || echo FAIL",
    "remediation": "確認用於運行Apache網頁伺服器之帳戶名稱(如apache)\n開啟終端機，執行以下指令，以鎖定apache帳戶之密碼：\n#passwd -l apache"
  },
  {
    "id": "TWGCB-04-007-0011",
    "category": "權限與所有權",
    "name": "設定Apache目錄與檔案之擁有者",
    "description": "這項原則設定決定Apache目錄(ServerRoot)與檔案之擁有者\nApache目錄與檔案包含Apache軟體安裝的所有目錄與檔案，惟網站目錄(/htdocs)如有內容更新需求，可以除外\nApache目錄與檔案之擁有者應設為root，藉此可降低遭未經授權人士竄改資料的風險",
    "method": "檢視Apache設定檔(如httpd.conf)，取得ServerRoot目錄路徑\n開啟終端機，執行下列指令，將ServerRoot目錄與檔案的擁有者設為「root」：\n#chown -R root (ServerRoot目錄)",
    "expected": "root",
    "check_cmd": "stat -c '%U:%G' /etc/apache2/apache2.conf 2>/dev/null | grep -q 'root:root' && echo PASS || echo FAIL",
    "remediation": "sudo chown root:root /etc/apache2/apache2.conf"
  },
  {
    "id": "TWGCB-04-007-0012",
    "category": "權限與所有權",
    "name": "設定Apache目錄與檔案之所屬群組",
    "description": "這項原則設定決定Apache目錄(ServerRoot)與檔案之所屬群組\nApache目錄與檔案包含Apache軟體安裝的所有目錄與檔案，惟網站目錄(/htdocs)如有內容更新需求，可以除外\nApache目錄與檔案之所屬群組應設為root，藉此可降低遭未經授權人士竄改資料的風險",
    "method": "檢視Apache設定檔(如httpd.conf)，取得ServerRoot目錄路徑\n開啟終端機，執行下列指令，將ServerRoot目錄與檔案的所屬群組設為「root」：\n#chgrp -R root (ServerRoot目錄)",
    "expected": "root",
    "check_cmd": "stat -c '%G' /etc/apache2/apache2.conf 2>/dev/null | grep -q '^root$' && echo PASS || echo FAIL",
    "remediation": "檢視Apache設定檔(如httpd.conf)，取得ServerRoot目錄路徑\n開啟終端機，執行下列指令，將ServerRoot目錄與檔案的所屬群組設為「root」：\n#chgrp -R root (ServerRoot目錄)"
  },
  {
    "id": "TWGCB-04-007-0013",
    "category": "權限與所有權",
    "name": "設定Apache目錄與檔案之others身分權限",
    "description": "這項原則設定決定是否針對Apache目錄(ServerRoot)與檔案之others身分進行權限設定\nApache目錄的權限一般設為「rwxr-xr-x(755)」，檔案權限也是相似的\nApache目錄與檔案包含Apache軟體安裝的所有目錄與檔案，惟網站目錄(/htdocs)如有內容更新需求，可以除外\nApache目錄與檔案應移除others身分之寫入權限，以防止遭未經授權人士修改網頁內容與設定檔",
    "method": "檢視Apache設定檔(如httpd.conf)，取得ServerRoot目錄路徑\n開啟終端機，執行以下指令，針對ServerRoot目錄與檔案之others身分進行權限設定：\n#chmod -R o-w (ServerRoot目錄)",
    "expected": "others身分不具寫入權限",
    "check_cmd": "stat -c '%a' /etc/apache2/apache2.conf 2>/dev/null | grep -qE '^[0-6][0-4][0-4]$' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 644 /etc/apache2/apache2.conf"
  },
  {
    "id": "TWGCB-04-007-0014",
    "category": "權限與所有權",
    "name": "限制Apache目錄與檔案之群組寫入權限",
    "description": "這項原則設定決定是否限制Apache目錄(ServerRoot)與檔案之群組寫入權限\nApache目錄的群組權限一般設為「r-x」，檔案權限也是相似的\nApache目錄與檔案包含Apache軟體安裝的所有目錄與檔案，惟網站目錄(/htdocs)如有內容更新需求，可以除外\nApache目錄與檔案應移除群組之寫入權限，以防止遭未經授權人士修改網頁內容與設定檔",
    "method": "檢視Apache設定檔(如httpd.conf)，取得ServerRoot目錄路徑\n開啟終端機，執行下列指令，移除ServerRoot目錄與檔案之群組寫入權限：\n#chmod -R g-w (ServerRoot目錄)",
    "expected": "群組不具寫入權限",
    "check_cmd": "find /etc/apache2/ -not -type l -perm /g=w 2>/dev/null | grep -q . && echo FAIL || echo PASS",
    "remediation": "檢視Apache設定檔(如httpd.conf)，取得ServerRoot目錄路徑\n開啟終端機，執行下列指令，移除ServerRoot目錄與檔案之群組寫入權限：\n#chmod -R g-w (ServerRoot目錄)"
  },
  {
    "id": "TWGCB-04-007-0015",
    "category": "權限與所有權",
    "name": "限制文件根目錄與檔案之群組寫入權限",
    "description": "這項原則設定決定是否限制文件根目錄(DocumentRoot)與檔案之群組寫入權限\nApache之文件根目錄與檔案應僅讓授權群組(例如開發或支援群組)具有寫入權限。更重要的是，用於運行Apache伺服器之群組對文件根目錄與檔案不應具有寫入權限，如此有助於降低與檔案上傳或命令執行相關的網頁應用程式漏洞之風險",
    "method": "檢視Apache設定檔(如httpd.conf)，取得文件根目錄(DocumentRoot)路徑\n確認運行Apache網頁伺服器之群組名稱(參考項次8，以apache為例)\n開啟終端機，執行下列指令，移除apache群組之寫入權限：\n#find -L (DocumentRoot目錄) -group apache -perm /g=w -print | xargs chmod g-w",
    "expected": "運行Apache網頁伺服器之群組不具有寫入權限",
    "check_cmd": "find /var/www/html/ -perm /g=w 2>/dev/null | grep -q . && echo FAIL || echo PASS",
    "remediation": "檢視Apache設定檔(如httpd.conf)，取得文件根目錄(DocumentRoot)路徑\n確認運行Apache網頁伺服器之群組名稱(參考項次8，以apache為例)\n開啟終端機，執行下列指令，移除apache群組之寫入權限：\n#find -L (DocumentRoot目錄) -group apache -perm /g=w -print | xargs chmod g-w"
  },
  {
    "id": "TWGCB-04-007-0016",
    "category": "權限與所有權",
    "name": "保護核心轉儲目錄",
    "description": "這項原則設定決定是否保護核心轉儲(Core Dump)目錄，當Apache運作異常時，可藉由檢視核心轉儲檔案，以了解異常發生原因\nCoreDumpDirectory指令用於指定Apache在建立核心轉儲檔案之前所嘗試切換的目錄，若該目錄不允許Apache使用者有寫入的權限，則核心轉儲將不會執行\n核心轉儲是記憶體的快照，可能包含不應被系統上其他帳戶存取的機敏資訊，因此，CoreDumpDirectory指令所設定之目錄，其權限應設為root帳戶所擁有，以及由運行Apache伺服器的群組所擁有，且禁止其他人存取，以保護核心轉儲檔案",
    "method": "在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，刪除CoreDumpDirectory指令，或確保所設定的Core Dump目錄符合以下要求：\nCore Dump目錄不在DocumentRoot目錄(例如/var/www/html)中\nCore Dump目錄必須設定為root帳戶以及運行Apache網頁伺服器的群組(參考項次8，以apache為例)所擁有，可藉由執行以下指令完成設定：\n#chown root:apache (Core Dump目錄)\n其他人(others)無任何存取權限，可藉由執行以下指令完成設定：\n#chmod o-rwx (Core Dump目錄)",
    "expected": "目錄所有權設為「root:運行Apache伺服器群組(例如apache)」所擁有，並移除others權限",
    "check_cmd": "grep -ri 'CoreDumpDirectory' /etc/apache2/ 2>/dev/null | grep -qiE '/var/log/apache|/tmp/core' && echo PASS || echo FAIL",
    "remediation": "在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，刪除CoreDumpDirectory指令，或確保所設定的Core Dump目錄符合以下要求：\nCore Dump目錄不在DocumentRoot目錄(例如/var/www/html)中\nCore Dump目錄必須設定為root帳戶以及運行Apache網頁伺服器的群組(參考項次8，以apache為例)所擁有，可藉由執行以下指令完成設定：\n#chown root:apache (Core Dump目錄)\n其他人(others)無任何存取權限，可藉由執行以下指令完成設定：\n#chmod o-rwx (Core Dump目錄)"
  },
  {
    "id": "TWGCB-04-007-0017",
    "category": "權限與所有權",
    "name": "保護鎖定檔案",
    "description": "這項原則設定決定是否保護鎖定檔案\n檔案鎖定機制提供檔案一種安全的更新方式，當一個程式正在對檔案進行寫入時，檔案就會進入一種暫時狀態，在這個狀態下，如果另一個程式嘗試讀這個檔案，該程式會自動停下來等待這個狀態結束，以確保檔案內容之完整性\nApache能夠針對某個資源建立一個鎖定檔案即可進行檔案鎖定，其它程式可以通過檢查這個檔案來判斷自己是否能夠被允許存取這個資源。這些鎖定檔案通常被放置在一個特定位置，並帶有一個與被控制資源相關的檔名\n鎖定檔案若存放於具有可寫入權限之目錄中，其他帳戶可藉由建立與鎖定檔案相同名稱之檔案，造成Apache伺服器無法啟動，導致無法提供服務",
    "method": "在Apache設定檔(例如httpd.conf與其他被引入的設定檔)中，檢查Mutex指令設定的鎖定檔案目錄，確保目錄符合以下要求：\n鎖定檔案目錄不在DocumentRoot目錄(例如/var/www/html)中\n鎖定檔案目錄必須設定為root帳戶以及root群組所擁有\n僅由root帳戶或最初啟動Apache的帳戶(預設為root)具有寫入權限\n鎖定檔案目錄位於本機掛載的硬碟，而不是NFS掛載的檔案系統",
    "expected": "目錄位於本機硬碟，且所有權設為「root:root」與僅由啟動Apache的帳戶(例如root)具寫入權限",
    "check_cmd": "LOCKS=$(find /var/run/apache2/ /run/apache2/ /var/lock/apache2/ -maxdepth 1 -name '*.lock' 2>/dev/null); if [ -z \"$LOCKS\" ]; then echo PASS; else echo \"$LOCKS\" | xargs -I{} stat -c '%U:%G' {} 2>/dev/null | grep -qv 'root:root' && echo FAIL || echo PASS; fi",
    "remediation": "在Apache設定檔(例如httpd.conf與其他被引入的設定檔)中，檢查Mutex指令設定的鎖定檔案目錄，確保目錄符合以下要求：\n鎖定檔案目錄不在DocumentRoot目錄(例如/var/www/html)中\n鎖定檔案目錄必須設定為root帳戶以及root群組所擁有\n僅由root帳戶或最初啟動Apache的帳戶(預設為root)具有寫入權限\n鎖定檔案目錄位於本機掛載的硬碟，而不是NFS掛載的檔案系統"
  },
  {
    "id": "TWGCB-04-007-0018",
    "category": "權限與所有權",
    "name": "保護pid檔案",
    "description": "這項原則設定決定是否保護pid檔案\nApache伺服器啟動時，會將主程式之process ID記錄在pid檔案中\npid檔案若存放於具有可寫入權限之目錄中，其他帳戶可藉由建立與pid檔案相同名稱之檔案，造成Apache伺服器無法啟動，導致無法提供服務",
    "method": "在Apache設定檔(例如httpd.conf與其他被引入的設定檔)中，檢查pidFile指令設定的pid檔案目錄，確保目錄符合以下要求：\npid檔案目錄不在DocumentRoot目錄(例如/var/www/html)中\npid檔案目錄必須設定為root帳戶以及root群組所擁有\n僅由root帳戶或最初啟動Apache之帳戶(預設為root)具有寫入權限",
    "expected": "目錄所有權設為「root:root」與僅由啟動Apache的帳戶(例如root)具寫入權限",
    "check_cmd": "PID=$(grep -ri '^PidFile' /etc/apache2/ 2>/dev/null | awk '{print $2}' | head -1); if echo \"$PID\" | grep -q '\\${'; then . /etc/apache2/envvars 2>/dev/null; PID=$(eval echo \"$PID\"); fi; [ -z \"$PID\" ] && PID=/var/run/apache2/apache2.pid; stat -c '%U:%G' \"$PID\" 2>/dev/null | grep -q 'root:root' && echo PASS || echo FAIL",
    "remediation": "在Apache設定檔(例如httpd.conf與其他被引入的設定檔)中，檢查pidFile指令設定的pid檔案目錄，確保目錄符合以下要求：\npid檔案目錄不在DocumentRoot目錄(例如/var/www/html)中\npid檔案目錄必須設定為root帳戶以及root群組所擁有\n僅由root帳戶或最初啟動Apache之帳戶(預設為root)具有寫入權限"
  },
  {
    "id": "TWGCB-04-007-0019",
    "category": "權限與所有權",
    "name": "保護ScoreBoard檔案",
    "description": "這項原則設定決定是否保護ScoreBoard檔案\nScoreBoard檔案負責記錄伺服器程序之內部資訊，以應用於程序間通訊(Inter-process communication)\n大多數Linux平台環境中，伺服器程序之內部資訊儲存在記憶體中，以提高存取效能，亦可選擇寫入ScoreBoard檔案，並透過ScoreBoardFile指令將ScoreBoard檔案存放在安全的目錄中\nScoreBoard檔案若存放於具有可寫入權限之目錄中，其他帳戶可藉由建立與ScoreBoard檔案相同名稱之檔案，造成Apache伺服器無法啟動，導致無法提供服務，亦可藉由讀取與寫入檔案來監控與破壞程序間的通訊",
    "method": "在Apache設定檔(例如httpd.conf與其他被引入的設定檔)中，檢查是否存在ScoreBoardFile指令，如果不存在則無需進行任何變更，如果存在ScoreBoardFile指令，檢查該指令設定的ScoreBoard檔案目錄，確保目錄符合以下要求：\nScoreBoard檔案目錄不在DocumentRoot目錄(例如/var/www/html)中\nScoreBoard檔案目錄必須設定為root帳戶以及root群組所擁有\n僅由root帳戶或最初啟動Apache的帳戶具有寫入權限\nScoreBoard檔案目錄位於本機掛載的硬碟，而不是NFS掛載的檔案系統",
    "expected": "目錄位於本機硬碟，且所有權設為「root:root」與僅由啟動Apache的帳戶(例如root)具寫入權限",
    "check_cmd": "grep -ri 'ScoreBoardFile\\|Mutex' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "在Apache設定檔(例如httpd.conf與其他被引入的設定檔)中，檢查是否存在ScoreBoardFile指令，如果不存在則無需進行任何變更，如果存在ScoreBoardFile指令，檢查該指令設定的ScoreBoard檔案目錄，確保目錄符合以下要求：\nScoreBoard檔案目錄不在DocumentRoot目錄(例如/var/www/html)中\nScoreBoard檔案目錄必須設定為root帳戶以及root群組所擁有\n僅由root帳戶或最初啟動Apache的帳戶具有寫入權限\nScoreBoard檔案目錄位於本機掛載的硬碟，而不是NFS掛載的檔案系統"
  },
  {
    "id": "TWGCB-04-007-0020",
    "category": "存取控制",
    "name": "拒絕存取作業系統根目錄",
    "description": "這項原則設定決定是否拒絕使用者存取作業系統根目錄\nApache的Directory指令可對目錄執行存取控制與選項設定，拒絕使用者存取作業系統根目錄，有助於防止未經授權存取，以避免伺服器藉由URL對映規則找到作業系統檔案位置，進而造成機敏資料外洩",
    "method": "在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，尋找<Directory />元素並檢查內容，移除任何Deny與Allow指令，新增Require指令並將值設定為all denied，範例如下：\n<Directory />\n . . .\n    Require all denied\n . . .\n</Directory>",
    "expected": "all denied",
    "check_cmd": "grep -r 'Require all denied' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "在 /etc/apache2/apache2.conf 加入:\n<Directory />\n  Require all denied\n</Directory>"
  },
  {
    "id": "TWGCB-04-007-0021",
    "category": "存取控制",
    "name": "禁止作業系統根目錄的設定被取代",
    "description": "這項原則設定決定作業系統根目錄的設定是否可被「.htaccess」設定取代\nApache伺服器可透過兩個方法針對目錄設定存取控制，一個是在設定檔(如httpd.conf)中針對每個目錄進行設定，另一個方法是在每個目錄下設定存取控制檔案，檔名一般命名為「.htaccess」，惟採用「.htaccess」檔案分別為每個目錄設定存取控制，不易統一控管，且容易造成伺服器組態設定被不適當取代之風險\nAllowOverride指令與AllowOverrideList指令允許使用「.htaccess」檔案來取代Apache設定檔(例如httpd.conf或其他被引入的設定檔)的設定，如身分驗證、檔案類型處理、自動生成的index索引檔、存取控制及選項等。當伺服器發現「.htaccess」檔案時，伺服器可藉由AllowOverride指令與AllowOverrideList指令的參數，得知「.htaccess」檔案中的設定是否可以取代Apache設定檔的設定\n當AllowOverride指令設定為None時，「.htaccess」就會完全被忽略，因此伺服器就不會去讀取「.htaccess」檔\n當AllowOverride指令設定為All時，在「.htaccess」檔案裏面的指令就會生效\n注意：此項設定會影響「.htaccess」檔案之功能",
    "method": "在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，尋找<Directory />元素並檢查內容，刪除找到的所有AllowOverrideList指令，並新增或修改AllowOverride指令之參數值為None，範例如下：\n<Directory />\n . . .\n    AllowOverride None\n . . .\n</Directory>",
    "expected": "None",
    "check_cmd": "grep -r 'AllowOverride None' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "在 /etc/apache2/apache2.conf 加入:\n<Directory />\n  AllowOverride None\n</Directory>"
  },
  {
    "id": "TWGCB-04-007-0022",
    "category": "存取控制",
    "name": "禁止所有目錄的設定被取代",
    "description": "這項原則設定決定所有目錄的設定是否可被「.htaccess」設定取代\nApache伺服器可透過兩個方法針對目錄設定存取控制，一個是在設定檔(如httpd.conf)中針對每個目錄進行設定，另一個方法是在每個目錄下設定存取控制檔案，檔名一般命名為「.htaccess」，惟採用「.htaccess」檔案分別為每個目錄設定存取控制，不易統一控管，且容易造成伺服器組態設定被不適當取代之風險\nAllowOverride指令與AllowOverrideList指令允許使用「.htaccess」檔案來取代Apache設定檔(例如httpd.conf或其他被引入的設定檔)的設定，如身分驗證、檔案類型處理、自動生成的index索引檔、存取控制及選項等。當伺服器發現「.htaccess」檔案時，伺服器可藉由AllowOverride指令與AllowOverrideList指令的參數，得知「.htaccess」檔案中的設定是否可以取代Apache設定檔的設定\n當AllowOverride指令設定為None時，「.htaccess」就會完全被忽略，因此伺服器就不會去讀取「.htaccess」檔\n當AllowOverride指令設定為All時，在「.htaccess」檔案裏面的指令就會生效\n注意：此項設定會影響「.htaccess」檔案之功能",
    "method": "在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，刪除找到的所有AllowOverrideList指令，尋找AllowOverride指令，將所有AllowOverride指令之參數值設定為None，範例如下：\n. . .\n     AllowOverride None\n. . .",
    "expected": "None",
    "check_cmd": "grep -r 'AllowOverride None' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，刪除找到的所有AllowOverrideList指令，尋找AllowOverride指令，將所有AllowOverride指令之參數值設定為None，範例如下：\n. . .\n     AllowOverride None\n. . ."
  },
  {
    "id": "TWGCB-04-007-0023",
    "category": "功能、內容及選項的最小化",
    "name": "限制作業系統根目錄之Options功能",
    "description": "這項原則設定決定是否在作業系統根目錄限制Options指令所能使用之功能\nOptions指令透過參數設定，可決定該目錄內能夠讓Apache進行的動作，例如：\nIndexes：如果在此目錄下找不到首頁檔案(如index.html)，就顯示整個目錄下的檔案名稱\nExecCGI：允許執行 CGI程式\nFollowSymLinks：可存取符號連結檔案\nIncludes：允許執行Server-Side Include程式\n建議將作業系統根目錄下的Options指令參數值設為None",
    "method": "在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，尋找<Directory />元素並檢查內容，新增或修改Options指令之參數值為None，範例如下：\n<Directory />\n . . .\n    Options None\n . . .\n</Directory>",
    "expected": "None",
    "check_cmd": "find /etc/apache2/ -type f -not -path '*/mods-available/*' -exec cat {} + 2>/dev/null | perl -0777 -ne 'if (/<Directory\\s+\\/>\\s*(.*?)<\\/Directory>/si) { $b=$1; print(($b =~ /Options\\s+.*[^-]Indexes/i || $b =~ /Options\\s+Indexes\\b/i) ? \"FAIL\" : \"PASS\"); } else { print \"PASS\" }'",
    "remediation": "在 /etc/apache2/apache2.conf 中將 Options Indexes 改為 Options -Indexes\n或直接: sudo sed -i 's/Options Indexes/Options -Indexes/g' /etc/apache2/apache2.conf"
  },
  {
    "id": "TWGCB-04-007-0024",
    "category": "功能、內容及選項的最小化",
    "name": "限制文件根目錄之Options功能",
    "description": "這項原則設定決定是否在文件根(DocumentRoot)目錄限制Options指令所能使用之功能\nOptions指令透過參數設定，可決定該目錄內能夠讓Apache進行的動作，例如：\nIndexes：如果在此目錄下找不到首頁檔案(如index.html)，就顯示整個目錄下的檔案名稱\nExecCGI：允許執行 CGI程式\nFollowSymLinks：可存取符號連結檔案\nIncludes：允許執行Server-Side Include程式\n建議將文件根目錄下的Options指令參數值設為None",
    "method": "在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，尋找<Directory (DocumentRoot目錄)>元素並檢查內容，新增或修改Options指令之參數值為None，範例如下：\n<Directory \"/var/www/html\">\n . . .\n    Options None\n . . .\n</Directory>",
    "expected": "None",
    "check_cmd": "apachectl configtest 2>&1 | grep -q 'Syntax OK' && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 24 項"
  },
  {
    "id": "TWGCB-04-007-0025",
    "category": "功能、內容及選項的最小化",
    "name": "最小化其他目錄的Options功能",
    "description": "這項原則設定決定是否在其他目錄中，最小化Options指令所能使用之功能\nOptions指令透過參數設定，可決定該目錄內能夠讓Apache進行的動作，例如：\nIndexes：如果在此目錄下找不到首頁檔案(如index.html)，就顯示整個目錄下的檔案名稱\nExecCGI：允許執行 CGI程式\nFollowSymLinks：可存取符號連結檔案\nIncludes：允許執行Server-Side Include程式\n建議其他目錄下的Options指令僅允許使用必要功能，若無功能需求，可將參數值設為None",
    "method": "在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，檢查所有<Directory>元素內容，新增或修改Options指令，使其不具有Includes參數",
    "expected": "刪除Includes參數",
    "check_cmd": "grep -rn 'Options.*[^-]Includes' /etc/apache2/ --exclude-dir=mods-available 2>/dev/null | awk -F: '$3 !~ /^[[:space:]]*#/' | grep -v '\\-Includes' | grep -q . && echo FAIL || echo PASS",
    "remediation": "在設定中加入: Options -Includes"
  },
  {
    "id": "TWGCB-04-007-0026",
    "category": "功能、內容及選項的最小化",
    "name": "預設HTML內容",
    "description": "這項原則設定決定是否移除預設HTML內容\nApache安裝時會提供預設HTML內容，主要功能是提供預設網站、使用者手冊或網站伺服器功能示範，但這些內容與使用者真正要架設之網站無關，且可能存在可被攻擊者利用之漏洞，建議刪除所有不需要的內容",
    "method": "步驟1：\n文件根目錄下如有預設測試網頁(index.html)或歡迎網頁，請移除。\n步驟2：\n檢查Apache設定檔(例如httpd.conf、welcome.conf、httpd-info.conf或其他被引入的設定檔)中，若包含下列內容，請於行首新增#符號以註解排除如下：\n行列內容1：\n#\n# This configuration file enables the default \"Welcome\"\n# page if there is no default index page present for\n# the root URL. To disable the Welcome page, comment\n# out all the lines below.\n#\n##<LocationMatch \"^/+$\">\n## Options -Indexes\n## ErrorDocument 403 /error/noindex.html\n##</LocationMatch>\n行列內容2：\n#\n# Allow server status reports generated by mod_status,\n# with the URL of http://servername/server-status\n# Change the \".example.com\" to match your domain to enable.\n#\n##<Location /server-status>\n## SetHandler server-status\n## Order deny,allow\n## Deny from all\n## Allow from .example.com\n##</Location>\n行列內容3：\n#\n# Allow remote server configuration reports, with the URL of\n# http://servername/server-info (requires that mod_info.c be loaded).\n# Change the \".example.com\" to match your domain to enable.\n#\n##<Location /server-info>\n## SetHandler server-info\n## Order deny,allow\n## Deny from all\n## Allow from .example.com\n##</Location>\n行列內容4：\n# This will allow remote server configuration reports, with the URL of\n# http://servername/perl-status\n# Change the \".example.com\" to match your domain to enable.\n#\n##<Location /perl-status>\n## SetHandler perl-script\n## PerlResponseHandler Apache2::Status\n## Order deny,allow\n## Deny from all\n## Allow from .example.com\n##</Location\n步驟3：\n開啟終端機，執行下列指令，移除Apache使用手冊：\n#yum erase httpd-manual",
    "expected": "移除",
    "check_cmd": "[ ! -f /var/www/html/index.html ] && echo PASS || (cat /var/www/html/index.html | grep -qi 'apache.*default\\|it works' && echo FAIL || echo PASS)",
    "remediation": "步驟1：\n文件根目錄下如有預設測試網頁(index.html)或歡迎網頁，請移除。\n步驟2：\n檢查Apache設定檔(例如httpd.conf、welcome.conf、httpd-info.conf或其他被引入的設定檔)中，若包含下列內容，請於行首新增#符號以註解排除如下：\n行列內容1：\n#\n# This configuration file enables the default \"Welcome\"\n# page if there is no default index page present for\n# the root URL. To disable the Welcome page, comment\n# out all the lines below.\n#\n##<LocationMatch \"^/+$\">\n## Options -Indexes\n## ErrorDocument 403 /error/noindex.html\n##</LocationMatch>\n行列內容2：\n#\n# Allow server status reports generated by mod_status,\n# with the URL of http://servername/server-status\n# Change the \".example.com\" to match your domain to enable.\n#\n##<Location /server-status>\n## SetHandler server-status\n## Order deny,allow\n## Deny from all\n## Allow from .example.com\n##</Location>\n行列內容3：\n#\n# Allow remote server configuration reports, with the URL of\n# http://servername/server-info (requires that mod_info.c be loaded).\n# Change the \".example.com\" to match your domain to enable.\n#\n##<Location /server-info>\n## SetHandler server-info\n## Order deny,allow\n## Deny from all\n## Allow from .example.com\n##</Location>\n行列內容4：\n# This will allow remote server configuration reports, with the URL of\n# http://servername/perl-status\n# Change the \".example.com\" to match your domain to enable.\n#\n##<Location /perl-status>\n## SetHandler perl-script\n## PerlResponseHandler Apache2::Status\n## Order deny,allow\n## Deny from all\n## Allow from .example.com\n##</Location\n步驟3：\n開啟終端機，執行下列指令，移除Apache使用手冊：\n#yum erase httpd-manual"
  },
  {
    "id": "TWGCB-04-007-0027",
    "category": "功能、內容及選項的最小化",
    "name": "預設CGI腳本(printenv)",
    "description": "這項原則設定決定是否移除預設CGI腳本printenv\nApache安裝時會提供一些預設CGI腳本，用以展示網站伺服器功能，使用者可利用printenv腳本列出所有CGI環境變數，其中包含許多伺服器組態設定與系統路徑，移除printenv腳本可避免上述資訊被揭露",
    "method": "步驟1：\n檢查Apache設定檔(例如httpd.conf或其他被引入的設定檔)，尋找Script、ScriptAlias或ScriptAliasMatch指令所指定之cgi-bin目錄路徑\n步驟2：\n如果cgi-bin目錄下有安裝printenv腳本，開啟終端機，執行下列指令進行移除：\n#rm (cgi-bin目錄)/printenv",
    "expected": "移除",
    "check_cmd": "find /usr/lib/cgi-bin/ /var/www/ -name 'printenv' 2>/dev/null | grep -q . && echo FAIL || echo PASS",
    "remediation": "步驟1：\n檢查Apache設定檔(例如httpd.conf或其他被引入的設定檔)，尋找Script、ScriptAlias或ScriptAliasMatch指令所指定之cgi-bin目錄路徑\n步驟2：\n如果cgi-bin目錄下有安裝printenv腳本，開啟終端機，執行下列指令進行移除：\n#rm (cgi-bin目錄)/printenv"
  },
  {
    "id": "TWGCB-04-007-0028",
    "category": "功能、內容及選項的最小化",
    "name": "預設CGI腳本(test-cgi)",
    "description": "這項原則設定決定是否移除預設CGI腳本test-cgi\nApache安裝時會提供一些預設CGI腳本，用以展示網站伺服器功能，使用者可利用test-cgi腳本列出所有CGI環境變數，其中包含伺服器版本資訊、組態設定及系統路徑，移除test-cgi腳本可避免上述資訊被揭露",
    "method": "步驟1：\n檢查Apache設定檔(例如httpd.conf或其他被引入的設定檔)，尋找Script、ScriptAlias或ScriptAliasMatch指令所指定之cgi-bin目錄路徑\n步驟2：\n如果cgi-bin目錄下有安裝test-cgi腳本，開啟終端機，執行下列指令進行移除：\n#rm (cgi-bin目錄)/test-cgi",
    "expected": "移除",
    "check_cmd": "find /usr/lib/cgi-bin/ /var/www/ -name 'test-cgi' 2>/dev/null | grep -q . && echo FAIL || echo PASS",
    "remediation": "步驟1：\n檢查Apache設定檔(例如httpd.conf或其他被引入的設定檔)，尋找Script、ScriptAlias或ScriptAliasMatch指令所指定之cgi-bin目錄路徑\n步驟2：\n如果cgi-bin目錄下有安裝test-cgi腳本，開啟終端機，執行下列指令進行移除：\n#rm (cgi-bin目錄)/test-cgi"
  },
  {
    "id": "TWGCB-04-007-0029",
    "category": "功能、內容及選項的最小化",
    "name": "限制HTTP請求方法",
    "description": "這項原則設定決定是否限制HTTP請求方法\n透過LimitExcept指令，可限制網頁伺服器允許使用的HTTP請求方法\nHTTP 1.1協定支援幾種很少使用且可能具有高風險的請求方法(如PUT與DELETE)，建議至多允許GET、POST及OPTIONS等HTTP請求方法，以降低資安風險\n注意：此方法不會停用HTTP TRACE請求方法",
    "method": "步驟1：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，檢查<Directory (DocumentRoot目錄)>元素內容，新增或修改LimitExcept指令，範例如下：\n<Directory \"/var/www/html\">\n . . .\n    <LimitExcept GET POST OPTIONS>\n         Require all denied\n    </LimitExcept>\n</Directory>\n步驟2：\n檢查所有其他<Directory>元素(作業系統根目錄<Directory />元素除外)，在元素中新增或修改成以下內容：\n<LimitExcept GET POST OPTIONS>\n Require all denied\n</LimitExcept>\n範例如下：\n<Directory \"/var/www/cgi-bin\">\n . . .\n    <LimitExcept GET POST OPTIONS>\n         Require all denied\n    </LimitExcept>\n</Directory>",
    "expected": "至多允許GET、POST及OPTIONS等HTTP請求方法",
    "check_cmd": "find /etc/apache2/ -type f -not -path '*/mods-available/*' -exec cat {} + 2>/dev/null | perl -0777 -ne 'my ($d)=/DocumentRoot\\s+\"?([^\"\\s]+)\"?/i; if(!$d){print \"FAIL\";exit} (my $q=$d)=~s/([\\/.])/\\\\$1/g; if(/<Directory\\s+\"?$q\"?\\s*>(.*?)<\\/Directory>/si){my $b=$1; if($b=~/<LimitExcept\\s+([^>]*)>\\s*Require all denied/si){my @m=split(/\\s+/,uc($1));my %ok=map{$_=>1}qw(GET POST OPTIONS);my $bad=grep{!$ok{$_}}@m;print $bad?\"FAIL\":\"PASS\"}else{print \"FAIL\"}}else{print \"FAIL\"}'",
    "remediation": "步驟1：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，檢查<Directory (DocumentRoot目錄)>元素內容，新增或修改LimitExcept指令，範例如下：\n<Directory \"/var/www/html\">\n . . .\n    <LimitExcept GET POST OPTIONS>\n         Require all denied\n    </LimitExcept>\n</Directory>\n步驟2：\n檢查所有其他<Directory>元素(作業系統根目錄<Directory />元素除外)，在元素中新增或修改成以下內容：\n<LimitExcept GET POST OPTIONS>\n Require all denied\n</LimitExcept>\n範例如下：\n<Directory \"/var/www/cgi-bin\">\n . . .\n    <LimitExcept GET POST OPTIONS>\n         Require all denied\n    </LimitExcept>\n</Directory>"
  },
  {
    "id": "TWGCB-04-007-0030",
    "category": "功能、內容及選項的最小化",
    "name": "HTTP TRACE請求方法",
    "description": "這項原則設定決定是否停用HTTP TRACE請求方法\nHTTP TRACE請求方法主要用於除錯，可透過TraceEnable指令決定啟用或停用HTTP TRACE請求方法\n攻擊者可利用此方法取得敏感之伺服器資訊，例如cookies或表頭中的認證資料，因此建議停用",
    "method": "在Apache設定檔(例如httpd.conf)中，於伺服器層級組態設定中新增下列指令：\nTraceEnable off\n\n註：伺服器層級組態設定是最高層級的組態設定，可控制整個Apache伺服器的運作，不嵌入在任何其他如<Directory>或<Location>的指令中",
    "expected": "off",
    "check_cmd": "grep -ri 'TraceEnable.*Off' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "在 /etc/apache2/apache2.conf 加入:\nTraceEnable Off"
  },
  {
    "id": "TWGCB-04-007-0031",
    "category": "功能、內容及選項的最小化",
    "name": "HTTP協定版本",
    "description": "這項原則設定決定可使用之HTTP協定版本\nApache的mod_rewrite或mod_security模組可用於禁止使用舊版的HTTP協定版本\nApache自1.2版起開始支援HTTP 1.1版本，HTTP 1.0(含)之前的版本建議停用，以防止攻擊者透過自動化程式、弱點掃描及探測工具，嘗試取得網頁伺服器環境資訊",
    "method": "步驟1：\n執行以下任一操作以載入mod_rewrite模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認已載入--enable-rewrite參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，檢查載入mod_rewrite模組的LoadModule指令，新增或修改成以下內容：\nLoadModule rewrite_module modules/mod_rewrite.so\n步驟2：\n在Apache設定檔(例如httpd.conf)中，於伺服器層級組態設定中新增下列指令：\nRewriteEngine On\nRewriteCond %{THE_REQUEST} !HTTP/1\\.1$\nRewriteRule .* - [F]\n步驟3：\n若Apache伺服器有架設虛擬主機(Virtual host)，預設情況下，虛擬主機不會繼承主伺服器的mod_rewrite組態設定，因此須在每個虛擬主機設定段落中增加以下指令，以繼承主伺服器設定：\nRewriteEngine On\nRewriteOptions Inherit",
    "expected": "使用HTTP 1.1(含)以上版本",
    "check_cmd": "grep -ri 'Protocols' /etc/apache2/ 2>/dev/null | grep -qiE 'h2|http/1\\.1' && echo PASS || echo FAIL",
    "remediation": "步驟1：\n執行以下任一操作以載入mod_rewrite模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認已載入--enable-rewrite參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，檢查載入mod_rewrite模組的LoadModule指令，新增或修改成以下內容：\nLoadModule rewrite_module modules/mod_rewrite.so\n步驟2：\n在Apache設定檔(例如httpd.conf)中，於伺服器層級組態設定中新增下列指令：\nRewriteEngine On\nRewriteCond %{THE_REQUEST} !HTTP/1\\.1$\nRewriteRule .* - [F]\n步驟3：\n若Apache伺服器有架設虛擬主機(Virtual host)，預設情況下，虛擬主機不會繼承主伺服器的mod_rewrite組態設定，因此須在每個虛擬主機設定段落中增加以下指令，以繼承主伺服器設定：\nRewriteEngine On\nRewriteOptions Inherit"
  },
  {
    "id": "TWGCB-04-007-0032",
    "category": "功能、內容及選項的最小化",
    "name": "「.ht*」檔案存取",
    "description": "這項原則設定決定是否禁止存取「.ht*」檔案\nFilesMatch指令可用於限制對檔名以「.ht」開頭之檔案的存取，如「.htaccess」是存取控制檔的預設名稱，「.htpasswd」與「.htgroup」是網頁密碼與群組檔案的通用名稱\n透過FilesMatch指令限制對「.ht*」檔案的存取，可防止網站使用者查看這些檔案，嘗試取得伺服器環境資訊",
    "method": "在Apache設定檔(例如httpd.conf)中，於伺服器層級組態設定中新增或修改為下列指令：\n<FilesMatch \"^\\.ht\">\n    Require all denied\n</FilesMatch>",
    "expected": "all denied",
    "check_cmd": "grep -riA2 'FilesMatch.*\\.ht' /etc/apache2/ 2>/dev/null | grep -qiE 'Require all denied|deny from all' && echo PASS || echo FAIL",
    "remediation": "在Apache設定檔(例如httpd.conf)中，於伺服器層級組態設定中新增或修改為下列指令：\n<FilesMatch \"^\\.ht\">\n    Require all denied\n</FilesMatch>"
  },
  {
    "id": "TWGCB-04-007-0033",
    "category": "功能、內容及選項的最小化",
    "name": "可使用的檔案副檔名",
    "description": "這項原則設定決定是否限制可使用的檔案副檔名\n藉由FilesMatch指令，網站管理者可使用白名單機制，限制網站伺服器可使用的檔案副檔名，以防止使用者嘗試變更副檔名，進而存取未公開瀏覽之檔案(如.bak、.config或.old等)",
    "method": "步驟1：\n開啟終端機，執行下列指令，在DocumentRoot目錄(如/var/www/html)下蒐集網頁伺服器中現有檔案副檔名清單：\n#find (DocumentRoot目錄) -type f -name '*.*' | awk -F. '{print $NF }' | sort -u\n步驟2：\n重新檢視檔案副檔名清單，並視需要進行調整\n步驟3：\n在Apache設定檔(例如httpd.conf)中，尋找<Directory (DocumentRoot目錄)>元素內容，新增下列FilesMatch指令，預設拒絕存取所有檔案：\n<FilesMatch \"^.*$\">\n    Require all denied\n</FilesMatch>\n步驟4：\n接續依據步驟2所完成之檔案副檔名清單，在步驟3的指令下方新增另一個FilesMatch指令，以允許存取清單內之副檔名類型的檔案(如css、html、js、pdf、txt、ico、jpg及png等)，範例如下：\n<FilesMatch \"^.*\\.(css|html|js|pdf|txt|ico|jpg|png)$\">\n    Require all granted\n</FilesMatch>",
    "expected": "僅允許存取清單內之副檔名",
    "check_cmd": "find /etc/apache2/ -type f -not -path '*/mods-available/*' -exec cat {} + 2>/dev/null | perl -0777 -ne '$d = /<FilesMatch\\s+\"\\^\\.\\*\\$?\">\\s*Require all denied\\s*<\\/FilesMatch>/si; $g = /<FilesMatch\\s+\"(?!\\^\\.\\*\\$?\")[^\"]+\"\\s*>\\s*Require all granted\\s*<\\/FilesMatch>/si; print(($d&&$g)?\"PASS\":\"FAIL\")'",
    "remediation": "步驟1：\n開啟終端機，執行下列指令，在DocumentRoot目錄(如/var/www/html)下蒐集網頁伺服器中現有檔案副檔名清單：\n#find (DocumentRoot目錄) -type f -name '*.*' | awk -F. '{print $NF }' | sort -u\n步驟2：\n重新檢視檔案副檔名清單，並視需要進行調整\n步驟3：\n在Apache設定檔(例如httpd.conf)中，尋找<Directory (DocumentRoot目錄)>元素內容，新增下列FilesMatch指令，預設拒絕存取所有檔案：\n<FilesMatch \"^.*$\">\n    Require all denied\n</FilesMatch>\n步驟4：\n接續依據步驟2所完成之檔案副檔名清單，在步驟3的指令下方新增另一個FilesMatch指令，以允許存取清單內之副檔名類型的檔案(如css、html、js、pdf、txt、ico、jpg及png等)，範例如下：\n<FilesMatch \"^.*\\.(css|html|js|pdf|txt|ico|jpg|png)$\">\n    Require all granted\n</FilesMatch>"
  },
  {
    "id": "TWGCB-04-007-0034",
    "category": "功能、內容及選項的最小化",
    "name": "基於IP位址的請求",
    "description": "這項原則設定決定是否拒絕基於IP位址的請求\nApache的mod_rewrite模組可用於拒絕URL中使用IP位址(而不是主機名稱)的請求\n使用者透過瀏覽器瀏覽網頁時，所送出之請求通常帶有主機名稱資訊，而惡意程式或自動化網路掃描工具為了達到自動化，使用IP位址進行存取，因此，拒絕基於IP位址的請求，有助於加強網站防禦",
    "method": "步驟1：\n執行以下任一操作以載入mod_rewrite模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認已載入--enable-rewrite參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，檢查載入mod_rewrite模組的LoadModule指令，新增或修改成以下內容：\nLoadModule rewrite_module modules/mod_rewrite.so\n步驟2：\n開啟Apache設定檔(例如httpd.conf)，在伺服器層級組態設定中新增下列指令：\nRewriteEngine On\n步驟3：\n開啟Apache設定檔(例如httpd.conf)，在伺服器層級組態設定中新增下列指令，以設定預期的主機名稱(如www.example.com)，範例如下：\nRewriteCond %{HTTP_HOST} !^www\\.example\\.com [NC]\nRewriteCond %{REQUEST_URI} !^/error [NC]\nRewriteRule ^.(.*) - [L,F]",
    "expected": "拒絕",
    "check_cmd": "apachectl configtest 2>&1 | grep -q 'Syntax OK' && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 34 項"
  },
  {
    "id": "TWGCB-04-007-0035",
    "category": "功能、內容及選項的最小化",
    "name": "限制Listen指令",
    "description": "這項原則設定決定是否限制Listen指令\nListen指令可設定Apache網頁伺服器用來監聽請求的IP位址與埠號，如果Listen指令僅指定埠號，伺服器會監聽所有的IP位址，如果同時指定IP位址與埠號，則伺服器只監聽來自此IP位址與埠號的請求",
    "method": "步驟1：\n開啟Apache設定檔(例如httpd.conf)，尋找任何沒有指定IP位址或IP位址全為零的Listen指令，範例如下：\nListen 80\nListen 0.0.0.0:80\nListen [::ffff:0.0.0.0]:80\n步驟2：\n接續依伺服器所使用之IP與埠號，修改前一步驟所找到的Listen指令，修改範例如下：\nListen 10.1.2.3:80\nListen 192.168.4.5:80\nListen [2001:db8::a00:20ff:fea7:ccea]:80\n注意：上述為伺服器同時存在IPv4與IPv6位址之範例",
    "expected": "明確指定IP位址與埠號",
    "check_cmd": "grep -ri '^Listen' /etc/apache2/ 2>/dev/null | grep -qE '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+:[0-9]+' && echo PASS || echo FAIL",
    "remediation": "步驟1：\n開啟Apache設定檔(例如httpd.conf)，尋找任何沒有指定IP位址或IP位址全為零的Listen指令，範例如下：\nListen 80\nListen 0.0.0.0:80\nListen [::ffff:0.0.0.0]:80\n步驟2：\n接續依伺服器所使用之IP與埠號，修改前一步驟所找到的Listen指令，修改範例如下：\nListen 10.1.2.3:80\nListen 192.168.4.5:80\nListen [2001:db8::a00:20ff:fea7:ccea]:80\n注意：上述為伺服器同時存在IPv4與IPv6位址之範例"
  },
  {
    "id": "TWGCB-04-007-0036",
    "category": "功能、內容及選項的最小化",
    "name": "限制網站被嵌入到frame",
    "description": "這項原則設定決定是否藉由HTTP回應標頭(header)限制網站被嵌入到frame，X-Frame-Options與Content-Security-Policy回應標頭可用來指示網頁是否能夠載入<frame>、<iframe>及<object>等元素\n透過Header指令，X-Frame-Options有3種選項：\nDENY：無論如何都不能被嵌入到frame中\nSAMEORIGIN：唯有符合同源政策(兩份網頁具備相同協定、埠號及主機名稱)時，才能被嵌入到frame中\nALLOW-FROM uri：唯有指定的URI才能嵌入到frame中\n透過Header指令，Content-Security-Policy的frame-ancestors參數有3種選項：\nnone：無論如何都不能被嵌入到frame中\nself：唯有符合同源政策(兩份網頁具備相同協定、埠號及主機名稱)時，才能被嵌入到frame中\nself uri：唯有符合同源政策與指定的URI才能嵌入到frame中\n使用iframe在正常網頁中嵌入惡意內容，誘使使用者點擊瀏覽，是常見的攻擊手法之一，透過X-Frame-Options或Content-Security-Policy回應標頭設定，可有效防護此類攻擊",
    "method": "開啟Apache設定檔(例如httpd.conf)，新增或修改Header指令為「Header always append X-Frame-Options SAMEORIGIN」、「Header always append X-Frame-Options DENY」、「Header always append Content-Security-Policy \"frame-ancestors 'self';\"」或「Header always append Content-Security-Policy \"frame-ancestors 'none';\"」",
    "expected": "Header always append X-Frame-Options SAMEORIGIN、Header always append X-Frame-Options DENY、Header always append Content-Security-Policy \"frame-ancestors 'self';\"或Header always append Content-Security-Policy \"frame-ancestors 'none';\"",
    "check_cmd": "grep -ri 'X-Frame-Options' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "sudo a2enmod headers\n在設定中加入:\nHeader always set X-Frame-Options SAMEORIGIN"
  },
  {
    "id": "TWGCB-04-007-0037",
    "category": "記錄、監控及維護作業",
    "name": "設定錯誤日誌的記錄等級",
    "description": "這項原則設定決定是否設定錯誤日誌的檔名與記錄等級\nErrorLog指令可用於設定錯誤日誌檔案名稱\nLogLevel指令可用於設定錯誤日誌的記錄等級，選項由上至下依序如下，指定某一等級(例如warn)後，將記錄從emerg到該等級之訊息(也就是包含emerg、alert、crit、error及warn)：\nemerg\nalert\ncrit\nerror\nwarn\nnotice\ninfo\ndebug\n錯誤日誌可用於早期發現潛在問題，或協助釐清資安事件發生原因，建議核心模組(core module)的記錄等級設為info(含)以下，其餘模組的記錄等級設為notice(含)以下\n請注意，錯誤日誌記錄越詳細，所需儲存空間越大",
    "method": "步驟1：\n開啟Apache設定檔(例如httpd.conf)，新增或修改LogLevel指令，將核心模組(core module)的記錄等級設為info，其餘模組的記錄等級設為notice，範例如下：\nLogLevel notice core:info\n步驟2：\n開啟Apache設定檔(例如httpd.conf)，新增或修改ErrorLog指令，指定錯誤日誌(如檔案路徑為logs/error_log)的檔名，範例如下：\nErrorLog \"logs/error_log\"\n步驟3：\n若Apache伺服器有架設虛擬主機，請仿照前一步驟，在每個虛擬主機設定段落中增加ErrorLog指令內容",
    "expected": "核心模組的記錄等級設為info(含)以下，其餘模組的記錄等級設為notice(含)以下",
    "check_cmd": "grep -ri 'LogLevel' /etc/apache2/ 2>/dev/null | grep -qiE 'warn|notice|info|debug' && echo PASS || echo FAIL",
    "remediation": "在設定中加入: LogLevel warn"
  },
  {
    "id": "TWGCB-04-007-0038",
    "category": "記錄、監控及維護作業",
    "name": "設定存取日誌格式",
    "description": "這項原則設定決定是否設定存取日誌之格式\nLogFormat指令可以設定存取日誌之格式，並為此格式指定一個名字，CustomLog指令則可以指定日誌檔案存放路徑，並指定此日誌檔案所採用之格式\n存取日誌可幫助管理者了解最常使用之資源，以及掌握是否有異常存取行為，協助釐清資安事件發生原因，共分為common、referer、agent及combined等4類，combined意指綜合其他3種日誌資訊\nLogFormat可使用之變數及其定義如下：\n%h：遠端主機名稱或IP位址\n%l：遠端登入名字(logname)\n%u：遠端使用者(如果請求已通過身分驗證)\n%t：收到請求的時間\n%r：請求的第一行\n%>s：最終狀態\n%b：請求的大小(以位元組為單位)\n%{Referer}i：HTTP參照位址標頭的變數值\n%{User-agent}i：使用者代理標頭的變數值",
    "method": "步驟1：\n開啟Apache設定檔(例如httpd.conf)，新增或修改LogFormat指令，將存取日誌格式設為combined，範例如下：\nLogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined\n步驟2：\n開啟Apache設定檔(例如httpd.conf)，新增或修改CustomLog指令，指定存取日誌(如檔案路徑為log/access_log)採用combined格式，範例如下：\nCustomLog log/access_log combined\n步驟3：\n若Apache伺服器有架設虛擬主機，請仿照前一步驟，在每個虛擬主機設定段落中增加CustomLog指令內容",
    "expected": "combined",
    "check_cmd": "grep -ri 'CustomLog' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "確認 CustomLog 指令存在:\nCustomLog \\${APACHE_LOG_DIR}/access.log combined"
  },
  {
    "id": "TWGCB-04-007-0039",
    "category": "記錄、監控及維護作業",
    "name": "日誌保留時間",
    "description": "這項原則設定決定日誌應保留之時間\nLogrotate指令可設定每隔多久對日誌進行一次輪替、保留幾個日誌檔及檔名是否加上日期資訊\n日誌資訊可幫助管理者了解是否有異常存取行為，協助釐清資安事件發生原因，為掌握攻擊者的足跡，資安事件調查往往需要查閱過去幾個月的日誌，建議日誌至少保留13週\n請注意，日誌存放越久，所需儲存空間越大，請確認放置日誌的磁碟分割區上有足夠的空間，且不在作業系統根分割區(root partition)中，以避免根分割區空間耗盡，造成作業系統運作異常",
    "method": "步驟1：\n編輯Logrotate的httpd設定檔(例如/etc/logrotate.d/httpd)，新增或修改日誌輪替設定如下：\n/var/log/httpd/*log {\n missingok\n notifempty\n sharedscripts\n postrotate\n  /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true\n endscript\n}\n步驟2：\n編輯Logrotate的httpd設定檔(例如 /etc/logrotate.d/httpd)，新增或修改設定如下，以保留13週的日誌：\n# rotate log files weekly\nweekly\n# keep 13 weeks of backlogs\nrotate 13\n步驟3：\n若Apache伺服器有架設虛擬主機，請仿照前一步驟，在每個虛擬主機設定段落中增加日誌保留時間設定內容",
    "expected": "13週(含)以上",
    "check_cmd": "ls /etc/logrotate.d/apache2 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "步驟1：\n編輯Logrotate的httpd設定檔(例如/etc/logrotate.d/httpd)，新增或修改日誌輪替設定如下：\n/var/log/httpd/*log {\n missingok\n notifempty\n sharedscripts\n postrotate\n  /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true\n endscript\n}\n步驟2：\n編輯Logrotate的httpd設定檔(例如 /etc/logrotate.d/httpd)，新增或修改設定如下，以保留13週的日誌：\n# rotate log files weekly\nweekly\n# keep 13 weeks of backlogs\nrotate 13\n步驟3：\n若Apache伺服器有架設虛擬主機，請仿照前一步驟，在每個虛擬主機設定段落中增加日誌保留時間設定內容"
  },
  {
    "id": "TWGCB-04-007-0040",
    "category": "SSL/TLS設定",
    "name": "mod_ssl模組",
    "description": "這項原則設定決定是否安裝mod_ssl模組\nmod_ssl模組是Apache實做SSL/TLS的標準模組，使得網頁伺服器在傳送資料給瀏覽器之前，會先將這些資料加密成密文，以保護資料在傳送過程中的安全性，當瀏覽器收到來自網頁伺服器的資料後，會將密文解密以讀取資料，並且可讓瀏覽器鑑別網頁伺服器的身分",
    "method": "執行以下任一操作以安裝mod_ssl模組：\n使用Source檔安裝Apache時，在編譯原始碼的階段，執行./configure指令時，確認使用「--with-ssl=」選項指定openssl路徑，以及載入「--enable-ssl」選項。如果與平台版本存在衝突，則可一併載入「--with-included-apr」選項，範例如下：\n#./configure --with-included-apr --with-ssl=(openssl路徑) --enable-ssl\n亦可使用作業系統套件方式安裝mod_ssl模組，以Red Hat Enterprise Linux為例，安裝mod_ssl模組之指令如下，請依作業系統版本進行調整：\n#yum install mod_ssl",
    "expected": "安裝",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q ssl_module && echo PASS || echo FAIL",
    "remediation": "sudo a2enmod ssl && sudo systemctl restart apache2"
  },
  {
    "id": "TWGCB-04-007-0041",
    "category": "SSL/TLS設定",
    "name": "保護伺服器之私鑰",
    "description": "這項原則設定決定是否保護伺服器之私鑰\n保護伺服器之私鑰至關重要，預設情況下，伺服器的私鑰是加密保護的，但是對其進行加密代表每次啟動伺服器時都需要密碼，可以在啟動時手動輸入或由自動化程式提供\n如果私鑰被取得，可被用以解密網頁伺服器的SSL/TLS傳輸資料，可能導致機敏資料外洩",
    "method": "步驟1：\n編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，尋找所有SSLCertificateFile指令，並針對沒有相對應之SSLCertificateKeyFile指令的SSLCertificateFile指令，將私鑰與憑證分開儲存，並新增SSLCertificateKeyFile指令指向私鑰存放位置\n步驟2：\n對於每個SSLCertificateKeyFile指令所設定的伺服器私鑰，將user與group的所有權變更為「root:root」，且權限設為「0400」",
    "expected": "將私鑰所有權設為root:root，且權限設為0400",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q ssl_module && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 41 項，設定 SSL/TLS 相關組態"
  },
  {
    "id": "TWGCB-04-007-0042",
    "category": "SSL/TLS設定",
    "name": "SSLv3、TLSv1.0及TLSv1.1協定",
    "description": "這項原則設定決定是否停用SSLv3、TLSv1.0及TLSv1.1協定\nSSLProtocol指令可指定允許mod_ssl模組使用的SSL/TLS協定\n目前已知SSLv3存在POODLE弱點，TLSv1.0與TLSv1.1協定具有安全性漏洞，且不支援較安全之新加密演算法，建議停用SSLv3、TLSv1.0及TLSv1.1協定，以降低資訊洩露之風險",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改SSLProtocol指令如下，停用SSLv3、TLSv1.0及TLSv1.1協定，確保只啟用「TLSv1.2協定」或「TLSv1.2與TLSv1.3協定」：\nSSLProtocol +TLSv1.2\n或\nSSLProtocol +TLSv1.2 +TLSv1.3",
    "expected": "停用",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q ssl_module && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 42 項，設定 SSL/TLS 相關組態"
  },
  {
    "id": "TWGCB-04-007-0043",
    "category": "SSL/TLS設定",
    "name": "SSL/TLS加密演算法",
    "description": "這項原則設定決定SSL/TLS使用之加密演算法\nSSLCipherSuite指令可用於指定伺服器在與用戶端協商時允許使用的加密演算法，SSLHonorCipherOrder指令則用於強制用戶端使用伺服器端所偏好的加密演算法，而不是用戶端所指定的加密演算法\nSSL/TLS協定支援許多加密演算法，其中亦包含已知可能遭中間人攻擊與資訊洩露的弱加密演算法，甚至無需任何加密(NULL cipher)。因此確保使用伺服器的偏好加密演算法，僅允許與用戶端協商使用強加密至關重要，可防止用戶端遭受中間人攻擊\nSSLCipherSuite指令選項說明如下：\nEXP：所有Export加密演算法\nNULL：不加密\nLOW：所有低强度加密演算法(例如：single DES)\nSSLv2：所有SSLv2加密演算法\naNULL：不進行認證\nECDHE與DHE金鑰交換演算法支援完全前向保密(Perfect Forward Secrecy)，可保護過去進行之通訊不受未來伺服器主金鑰洩露威脅，若需使用僅支援完全前向保密之SSL/TLS加密演算法，請參考下列SSLCipherSuite指令：\nSSLCipherSuite ECDHE:DHE:!NULL:!LOW:!SSLv2:!MD5:!RC4:!aNULL\n請注意：\n雖然SSLv3協定建議停用，但使用SSLCipherSuite指令時，因SSLv3與TLS共用部份加密演算法，若停用所有SSLv3加密演算法，將導致TLS也無法使用共用的加密演算法\n變更SSL/TLS加密演算法為「ECDHE:DHE:!NULL:!LOW:!SSLv2:!MD5:!RC4:!aNULL」前，請務必測試與確認網站服務與用戶端支援完全前向保密，以避免影響網站服務運作",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改SSLCipherSuite指令如下，確保不使用EXP、NULL、LOW、SSLv2、MD5、RC4及aNULL等弱加密演算法，並將SSLHonorCipherOrder設為On：\nSSLHonorCipherOrder On\nSSLCipherSuite ALL:!EXP:!NULL:!LOW:!SSLv2:!MD5:!RC4:! aNULL\n或\nSSLHonorCipherOrder On\nSSLCipherSuite ECDHE:DHE:!NULL:!LOW:!SSLv2:!MD5:!RC4:!aNULL",
    "expected": "SSLHonorCipherOrder On\nSSLCipherSuite ALL:!EXP:!NULL:!LOW:!SSLv2:!MD5:!RC4:!aNULL\n或\nSSLHonorCipherOrder On\nSSLCipherSuite ECDHE:DHE:!NULL:!LOW:!SSLv2:!MD5:!RC4:!aNULL",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q ssl_module && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 43 項，設定 SSL/TLS 相關組態"
  },
  {
    "id": "TWGCB-04-007-0044",
    "category": "SSL/TLS設定",
    "name": "SSL的不安全重新協商",
    "description": "這項原則設定決定是否停用SSL的不安全重新協商\nSSLInsecureRenegotiation指令可設定是否支援不安全的重新協商\n建議停用不安全的重新協商，以避免伺服器受到中間人重新協商攻擊",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改SSLInsecureRenegotiation指令如下：\nSSLInsecureRenegotiation off",
    "expected": "off",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q ssl_module && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 44 項，設定 SSL/TLS 相關組態"
  },
  {
    "id": "TWGCB-04-007-0045",
    "category": "SSL/TLS設定",
    "name": "SSL壓縮",
    "description": "這項原則設定決定SSL是否停用壓縮功能\nSSLCompression指令可用於控制Apache在通過HTTPS提供內容時是否使用SSL壓縮\n如果啟用SSL壓縮，則用戶端與伺服器之間的HTTPS通訊可能會遭受CRIME(Compression Ratio Info-leak Made Easy)攻擊，導致洩露機敏資料",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改SSLCompression指令如下：\nSSLCompression off",
    "expected": "off",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q ssl_module && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 45 項，設定 SSL/TLS 相關組態"
  },
  {
    "id": "TWGCB-04-007-0046",
    "category": "SSL/TLS設定",
    "name": "OCSP裝訂",
    "description": "這項原則設定決定是否啟用OCSP裝訂(Stapling)功能\nOCSP裝訂，亦稱為TLS憑證狀態請求擴展(TLS Certificate Status Request extension)，可使用SSLUseStapling與SSLStaplingCache指令設定Apache伺服器是否啟用OCSP裝訂功能\n啟用OCSP裝訂功能時，當用戶端透過瀏覽器跟Apache伺服器進行SSL連線，伺服器藉由回傳給瀏覽器一個經由憑證頒發機構簽署的OCSP請求回應，以節省瀏覽器向憑證頒發機構發送二次OCSP請求的時間，除可加快連線效率外，亦可避免用戶端連線至憑證頒發機構，進而達到保護隱私的目的",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，在伺服器層級組態設定與每個已啟用SSL的虛擬主機設定中，新增或修改SSLUseStapling指令如下：\nSSLUseStapling On\n\n請注意，啟用OCSP裝訂功能後，記得新增SSLStaplingCache指令，並設定為以下三種快取類型之一：\nSSLStaplingCache \"shmcb:logs/ssl_staple_cache(512000)\"\nSSLStaplingCache \"dbm:logs/ssl_staple_cache.db\"\nSSLStaplingCache dc:UNIX:logs/ssl_staple_socket",
    "expected": "On",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q ssl_module && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 46 項，設定 SSL/TLS 相關組態"
  },
  {
    "id": "TWGCB-04-007-0047",
    "category": "SSL/TLS設定",
    "name": "HTTP強制安全傳輸機制(HSTS)",
    "description": "這項原則設定決定是否啟用HTTP強制安全傳輸機制(HSTS)，並透過設定max-age參數，限制在此時間(秒)內，瀏覽器或代理程式僅能使用HTTPS協定連線至伺服器\n啟用HTTP強制安全傳輸機制時，伺服器可藉由HSTS標頭宣告只允許使用HTTPS通訊，而不是明文的HTTP通訊\nHTTP強制安全傳輸機制有助於保護支援HSTS功能的瀏覽器與其他代理程式免受HTTP降級攻擊，避免使用HTTP明文傳輸，造成機敏資料外洩\n在網站穩定運作後，若確認憑證與HTTPS設定不再需要變更的情況，可考慮將「max-age」值設定為31536000秒(1年)以強化保護\n若網站的子網域網站有HSTS的使用需求，請先確認所有子網域網站無HTTP的存取需求，可考慮在HSTS的Header指令行加上子網域參數「includeSubDomains」，將所有子網域網站納入保護範圍，使用「includeSubDomains」的Header指令範例為「Header always set Strict-Transport-Security \"max-age=480;includeSubDomains;preload\"」",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，在伺服器層級組態設定與每個已啟用SSL的虛擬主機設定中，新增或修改Header指令如下，並設定「max-age」值為480(秒)以上：\nHeader always set Strict-Transport-Security \"max-age=480\"",
    "expected": "啟用，且max-age設為480秒(含)以上",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q ssl_module && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 47 項，設定 SSL/TLS 相關組態"
  },
  {
    "id": "TWGCB-04-007-0048",
    "category": "防止資訊洩露",
    "name": "設定HTTP伺服器回應標頭",
    "description": "這項原則設定決定是否設定HTTP伺服器回應標頭，以控制傳送哪些資訊給用戶端\nServerTokens指令可用於控制伺服器發送給用戶端的回應標頭中，所包含的伺服器作業系統類型與安裝模組資訊\nServerTokens指令可設定之參數與範例如下：\nFull：Server: Apache/2.4.2 (Unix) PHP/4.2.2 MyMod/1.2\nProd：Server: Apache\nMajor：Server: Apache/2\nMinor：Server: Apache/2.4\nMin：Server: Apache/2.4.2\nOS：Server: Apache/2.4.2 (Unix)\n建議設為Prod (ProductOnly)，在HTTP伺服器回應標頭中僅顯示Apache，以避免暴露安裝模組與版本等詳細資訊",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改ServerTokens指令如下：\nServerTokens Prod",
    "expected": "Prod",
    "check_cmd": "grep -ri 'ServerTokens\\|ServerSignature' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 48 項"
  },
  {
    "id": "TWGCB-04-007-0049",
    "category": "防止資訊洩露",
    "name": "設定伺服器生成頁面之頁腳資訊",
    "description": "這項原則設定決定是否設定伺服器生成頁面(如錯誤頁面)之頁腳資訊\nServerSignature指令可用於控制伺服器生成頁面(如錯誤頁面)的頁腳，是否要額外顯示一些伺服器環境資訊\nServerSignature指令可設定之參數如下：\nOff：除了內定告知使用者的資訊以外，不再附加其他資訊\nOn：除了內定告知使用者的資訊以外，在該網頁加上ServerName指令所指定的伺服器名稱\nEmail：除了內定告知使用者的資訊以外，在該網頁加上 ServerAdmin後面所指定的電子郵件位址\n建議設為Off，以避免暴露系統設定資訊",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改ServerSignature指令如下：\nServerSignature Off",
    "expected": "Off",
    "check_cmd": "grep -ri 'ServerTokens\\|ServerSignature' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 49 項"
  },
  {
    "id": "TWGCB-04-007-0050",
    "category": "防止資訊洩露",
    "name": "Apache預設內容",
    "description": "這項原則設定決定是否清除Apache預設內容，以避免洩漏伺服器環境資訊\n除了移除預設Apache使用手冊與CGI腳本外，可進一步移除自動索引目錄功能所使用之預載圖示(icon)、內容或相關設定檔，以避免成為洩漏資訊的管道",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，檢查若包含以下行列內容，請於行首新增#符號以註解排除如下：\n行列內容1：\n#Fancy directory listings\n#Include conf/extra/httpd-autoindex.conf\n行列內容2：\n# We include the /icons/ alias for FancyIndexed directory listings. If\n# you do not use FancyIndexing, you may comment this out.\n#\n#Alias /icons/ \"/var/www/icons/\"\n#<Directory \"/var/www/icons\">\n#  Options Indexes MultiViews FollowSymLinks\n#  AllowOverride None\n#  Order allow,deny\n#  Allow from all\n#</Directory>",
    "expected": "移除Apache預設內容",
    "check_cmd": "grep -ri 'ServerTokens\\|ServerSignature' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 50 項"
  },
  {
    "id": "TWGCB-04-007-0051",
    "category": "防止資訊洩露",
    "name": "ETag回應標頭",
    "description": "這項原則設定決定是否設定ETag回應標頭包含哪些資訊，以避免洩漏資訊\nFileETag指令可用於建立ETag(實體標籤，entity tag)回應標頭欄位之檔案屬性。ETag值由檔案的索引節數(INode)、大小及最後修改時間(MTime)決定，應用於快取管理，以節省網路頻寬\n\tFileETag指令可設定之參數如下：\nINode：檔案的索引節數\nMTime：檔案最後修改時間\nSize：檔案大小\nAll：包含INode、MTime及Size\nNone：不包含INode、MTime及Size\n如果ETag回應標頭包含檔案的INode編號時，攻擊者可藉由獲取此資訊嘗試進行其他攻擊",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，在伺服器層級組態設定與所有的虛擬主機設定中，新增或修改FileETag指令如下：\nFileETag None",
    "expected": "None",
    "check_cmd": "grep -ri 'ServerTokens\\|ServerSignature' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 51 項"
  },
  {
    "id": "TWGCB-04-007-0052",
    "category": "緩解阻斷服務攻擊",
    "name": "連線逾時時間",
    "description": "這項原則設定決定是否設定連線逾時時間\nTimeOut指令可用於指定Apache在接收並完成一個請求的最長等待時間(以秒為單位)，如果超過指定時間伺服器會中斷連線，允許伺服器更快地釋放資源並提高回應速度，藉由提高伺服器效率，降低阻斷服務攻擊之影響",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改Timeout指令使其值為60以下(但須大於0)，範例如下：\nTimeout 60",
    "expected": "60以下，但須大於0",
    "check_cmd": "grep -riE 'Timeout|KeepAlive|LimitRequest' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 52 項"
  },
  {
    "id": "TWGCB-04-007-0053",
    "category": "緩解阻斷服務攻擊",
    "name": "HTTP持續連線",
    "description": "這項原則設定決定是否啟用HTTP持續連線功能\nKeepAlive指令可用於控制Apache是否允許用戶端在同一個TCP連線中進行多次請求，減少提供請求所需要的大量系統與網路資源，以降低阻斷服務攻擊的影響\n建議將KeepAlive指令設定為On",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改KeepAlive指令如下：\nKeepAlive On",
    "expected": "On",
    "check_cmd": "grep -riE 'Timeout|KeepAlive|LimitRequest' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 53 項"
  },
  {
    "id": "TWGCB-04-007-0054",
    "category": "緩解阻斷服務攻擊",
    "name": "HTTP持續連線所允許的請求數量",
    "description": "這項原則設定決定是否設定HTTP持續連線所允許的請求數量\n當KeepAlive指令設定為On時，可接續使用MaxKeepAliveRequests指令限制每個TCP連線所允許的請求數量，藉由允許用戶端在同一個TCP連線中進行多次請求，減少提供請求所需要的大量系統與網路資源，以降低阻斷服務攻擊的影響\n如果設定為0，代表允許無限制的請求",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改MaxKeepAliveRequests指令使其值為100以上，範例如下：\nMaxKeepAliveRequests 100",
    "expected": "100以上",
    "check_cmd": "grep -riE 'Timeout|KeepAlive|LimitRequest' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 54 項"
  },
  {
    "id": "TWGCB-04-007-0055",
    "category": "緩解阻斷服務攻擊",
    "name": "HTTP持續連線關閉前的等待後續請求時間",
    "description": "這項原則設定決定HTTP持續連線時，一直等待下一個請求多少秒數後，因沒有新請求而中斷TCP連線\nKeepAliveTimeout指令可指定Apache在啟用HTTP持續連線功能時，關閉HTTP持續連線之前，等待下一次請求的時間(秒數)\nKeepAliveTimeout指令可在啟用HTTP持續連線功能時，藉由快速釋放閒置的資源，以降低阻斷服務攻擊的影響",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改KeepAliveTimeout指令使其值為15以下(但須大於0)，範例如下：\nKeepAliveTimeout 15",
    "expected": "15以下，但須大於0",
    "check_cmd": "grep -riE 'Timeout|KeepAlive|LimitRequest' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 55 項"
  },
  {
    "id": "TWGCB-04-007-0056",
    "category": "緩解阻斷服務攻擊",
    "name": "請求標頭的逾時時間",
    "description": "這項原則設定決定是否設定請求標頭的逾時時間\nRequestReadTimeout指令可用於指定請求標頭的逾時時間，指令的參數設定包含初始逾時、最大逾時及最小傳輸速率，藉由控制請求的逾時時間與傳輸速率，避免被請求長時間占用伺服器的連線\n建議請求標頭的最大逾時設定為40秒以下，降低Slowloris攻擊的影響",
    "method": "步驟1：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，檢查載入mod_requesttimeout模組的LoadModule指令，新增或修改成以下內容：\nLoadModule reqtimeout_module modules/mod_reqtimeout.so\n步驟2：\n開啟Apache設定檔(例如httpd.conf)，新增或修改RequestReadTimeout指令，將請求標頭的最大逾時設為40以下，範例如下：\nRequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500",
    "expected": "40以下",
    "check_cmd": "grep -riE 'Timeout|KeepAlive|LimitRequest' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 56 項"
  },
  {
    "id": "TWGCB-04-007-0057",
    "category": "緩解阻斷服務攻擊",
    "name": "請求主體的逾時時間",
    "description": "這項原則設定決定是否設定請求主體的逾時時間\nRequestReadTimeout指令可用於指定請求主體的逾時時間，指令的參數設定包含初始逾時、最大逾時及最小傳輸速率，藉由控制請求的逾時時間與傳輸速率，避免被請求長時間占用伺服器的連線\n建議請求主體的最大逾時設定為20秒以下，降低Slowloris攻擊的影響",
    "method": "步驟1：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，檢查載入mod_requesttimeout模組的LoadModule指令，新增或修改成以下內容：\nLoadModule reqtimeout_module modules/mod_reqtimeout.so\n步驟2：\n開啟Apache設定檔(例如httpd.conf)，新增或修改RequestReadTimeout指令，將請求主體的最大逾時設為20以下，範例如下：\nRequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500",
    "expected": "20以下",
    "check_cmd": "grep -riE 'Timeout|KeepAlive|LimitRequest' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 57 項"
  },
  {
    "id": "TWGCB-04-007-0058",
    "category": "限制請求",
    "name": "限制請求行的大小",
    "description": "這項原則設定決定可接受之用戶端請求行的位元組數\nHTTP請求行包含HTTP方法(method)、URI與協定版本資訊，LimitRequestLine指令可限制用戶端HTTP請求行的大小\n攻擊者執行緩衝區溢位攻擊時，會試圖藉由提供比應用程式緩衝區大小更多的資料，來達到攻擊目的，透過限制請求行的大小，可降低遭受此類攻擊之風險\n注意：LimitRequestLine指令僅可用於伺服器層級組態設定，設定前請確認是否會干擾網頁應用程式的預期功能",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改LimitRequestline指令使其值為512以下(但須大於0)，範例如下：\nLimitRequestline 512",
    "expected": "512以下，但須大於0",
    "check_cmd": "grep -riE 'LimitRequestLine|LimitRequestFields|LimitRequestBody' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 58 項"
  },
  {
    "id": "TWGCB-04-007-0059",
    "category": "限制請求",
    "name": "限制請求欄位的數量",
    "description": "這項原則設定決定可接受之用戶端請求欄位的數量\nLimitRequestFields指令可用於限制HTTP請求中的欄位數，數值範圍從0至32,767，設為0代表不限制\n限制HTTP請求中的欄位數，有助於防止攻擊者藉由傳送大量欄位，進而造成CGI程式、模組或應用程式出現異常之情況\n請注意：LimitRequestFields指令僅可用於伺服器層級組態設定，設定前請確認是否會干擾網頁應用程式的預期功能",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改LimitRequestFields指令使其值為100以下(但須大於0)，範例如下：\nLimitRequestFields 100",
    "expected": "100以下，但須大於0",
    "check_cmd": "grep -riE 'LimitRequestLine|LimitRequestFields|LimitRequestBody' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 59 項"
  },
  {
    "id": "TWGCB-04-007-0060",
    "category": "限制請求",
    "name": "限制請求標頭的大小",
    "description": "這項原則設定決定可接受之請求標頭(Request header)的位元組數\nLimitRequestFieldSize指令可用於限制HTTP請求標頭的大小，設為0代表不限制\n限制請求標頭的大小，有助於防止攻擊者藉由傳送過大的請求標頭，進而造成伺服器出現異常之情況\n注意：LimitRequestFieldSize指令僅可用於伺服器層級組態設定，設定前請確認是否會干擾網頁應用程式的預期功能",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改LimitRequestFieldSize指令使其值為1024以下(但須大於0)，範例如下：\nLimitRequestFieldsize 1024",
    "expected": "1024以下，但須大於0",
    "check_cmd": "grep -riE 'LimitRequestLine|LimitRequestFields|LimitRequestBody' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 60 項"
  },
  {
    "id": "TWGCB-04-007-0061",
    "category": "限制請求",
    "name": "限制請求主體的大小",
    "description": "這項原則設定決定可接受之請求主體(Request body)的位元組數\nLimitRequestBody指令可限制請求主體中允許的位元組數，請求的大小可能差異很大，例如在上傳檔案時，檔案的大小必須符合此限制，設為0代表不限制\n限制請求主體的大小，有助於防止攻擊者藉由傳送過大的請求主體，進而造成伺服器出現異常之情況\n請注意：LimitRequestBody指令可於每個目錄或路徑位置進行設定，設定前請確認是否會干擾網頁應用程式的預期功能",
    "method": "編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，新增或修改LimitRequestBody指令使其值為102400以下(但須大於0)，範例如下：\nLimitRequestBody 102400",
    "expected": "102400以下，但須大於0",
    "check_cmd": "grep -riE 'LimitRequestLine|LimitRequestFields|LimitRequestBody' /etc/apache2/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 61 項"
  },
  {
    "id": "TWGCB-04-007-0062",
    "category": "SELinux",
    "name": "SELinux",
    "description": "這項原則設定決定是否啟用SELinux\nSELinux(安全增強Linux)是一個Linux核心安全模組，提供強制性的存取控制安全性原則，可以強制執行Linux系統中的檔案與程序規則，並根據定義的原則限制存取行為，啟用SELinux有助於提升伺服器安全性\nSELinux共有三種模式如下：\nEnforcing：強制模式，依據設定來限制檔案資源存取\nPermissive：寬容模式，不限制檔案資源存取，但仍會依據設定檢查並記錄相關訊息\nDisabled：停用模式，停用SELinux",
    "method": "步驟1：\n在SELinux設定檔(例如/etc/selinux/config)中調整SELINUX的值，使其為enforcing(須重新開機以使新設定生效)，如下所示：\nSELINUX=enforcing\n步驟2：\n如果SELinux當前模式並非enforcing，並且無法立即重新開機，則開啟終端機執行下列指令，將模式設定為強制模式：\n#setenforce 1",
    "expected": "啟用，並設為enforcing模式",
    "check_cmd": "getenforce 2>/dev/null | grep -qi enforcing && echo PASS || echo FAIL",
    "remediation": "sudo setenforce 1 && sudo sed -i 's/SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config"
  },
  {
    "id": "TWGCB-04-007-0063",
    "category": "SELinux",
    "name": "Apache程序在受限制的SELinux安全性本文中運行",
    "description": "這項原則設定決定是否在受限制的SELinux安全性區域中運行Apache程序\nSELinux可藉由制定安全性本文(Security context)，強制Apache httpd伺服器實施最小權限原則，使得httpd伺服器只能對指定的目錄、檔案及網路埠進行最小權限的存取，當Apache被攻擊時，可藉此機制將損害控制在有限範圍內\n安全性本文主要用冒號分為3個欄位：\n身分識別(Identify)：常見的身分如下：\nsystem_u：系統用戶，代表該檔案是由系統產生的\nunconfined_u：不受限的用戶，代表該檔案是由不受限的程序所產生的\n角色(Role)：透過角色欄位，可以知道這個資料是屬於程序、檔案資源或代表使用者。常見的角色有：\nobject_r：代表的是檔案或目錄等檔案資源\nsystem_r：代表的是程序或使用者\n類型(Type)：用於控制是否可以存取資源，常見的類型如下：\nhttp_port_t：限制應用程式所能夠存取的網路埠\nhttpd_sys_content_t：目錄與檔案僅有讀取權限\nhttpd_log_t：可寫入日誌資料的目錄與檔案\nhttpd_sys_script_exec_t：可執行程式或腳本的目錄與檔案\n請注意：部份作業系統環境中，Apache執行檔檔名為apache2，而不是httpd，請依環境進行調整",
    "method": "步驟1：\n開啟終端機，執行下列指令，列出httpd程序(包含httpd與apachectl)的安全性本文：\n#ls -alZ /usr/sbin/httpd /usr/sbin/httpd.* /usr/sbin/apachectl\n步驟2：\n檢視上一步驟的輸出結果，確認httpd二進制檔案具有httpd_exec_t的安全性本文，以及apachectl二進制檔案具有initrc_exec_t的安全性本文，範例如下：\n-rwxr-xr-x. root root system_u:object_r:initrc_exec_t:s0 /usr/sbin/apachectl\n-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd\n-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd.worker\n-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd.event\n步驟3：\n如果httpd與apachectl二進制檔案沒有被正確標記，須開啟終端機，執行chcon指令以重新標記，範例如下：\n#chcon -t initrc_exec_t /usr/sbin/apachectl\n#chcon -t httpd_exec_t /usr/sbin/httpd /usr/sbin/httpd.*\n步驟4：\n以chcon指令重新標記後，可再執行semanage fcontext -l指令確認是否生效：\n#semanage fcontext -l | fgrep 'apachectl'\n#semanage fcontext -l | fgrep '/usr/sbin/httpd'\n步驟5：\n若未生效，可再加入-a參數，並執行restorecon指令讓檔案恢復正確的類型：\n#semanage fcontext -a -t httpd_exec_t '/usr/sbin/httpd'\n#semanage fcontext -a -t httpd_exec_t '/usr/sbin/httpd.worker'\n#semanage fcontext -a -t httpd_exec_t '/usr/sbin/httpd.event'\n#semanage fcontext -a -t initrc_exec_t /usr/sbin/apachectl\n#restorecon -v /usr/sbin/httpd /usr/sbin/httpd.* /usr/sbin/apachectl",
    "expected": "httpd二進制檔案具有httpd_exec_t的安全性本文，以及apachectl二進制檔案具有initrc_exec_t的安全性本文",
    "check_cmd": "getenforce 2>/dev/null | grep -qi enforcing && echo PASS || echo FAIL",
    "remediation": "sudo setenforce 1 && sudo sed -i 's/SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config"
  },
  {
    "id": "TWGCB-04-007-0064",
    "category": "SELinux",
    "name": "設定httpd_t程序類型的運行模式",
    "description": "這項原則設定決定httpd_t程序類型所運行的SELinux模式\nSELinux除了可透過組態設定將整體運行模式設為寬容模式外，亦可針對個別程序類型(例如httpd_t)設定運行模式\n寬容模式下，不會限制檔案資源存取，僅會依據設定檢查並記錄相關訊息，建議取消寬容模式，並依據設定來限制資源的存取",
    "method": "步驟1：\n開啟終端機，執行下列指令，檢查httpd_t程序類型是否設為寬容模式(permissive)：\n#semodule -l | grep permissive_httpd_t\n步驟2：\n上一步驟若有輸出結果，代表httpd_t程序類型被設為寬容模式，接續執行下列指令刪除httpd_t程序類型的寬容模式設定：\n#semanage permissive -d httpd_t",
    "expected": "不使用寬容模式",
    "check_cmd": "getenforce 2>/dev/null | grep -qi enforcing && echo PASS || echo FAIL",
    "remediation": "sudo setenforce 1 && sudo sed -i 's/SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config"
  },
  {
    "id": "TWGCB-04-007-0065",
    "category": "Apache模組",
    "name": "Basic Authentication與Digest Authentication模組",
    "description": "這項原則設定決定是否啟用Basic authentication與Digest authentication模組\nBasic authentication與Digest authentication模組分別支援HTTP基本身分驗證與HTTP Digest身分驗證，用於限制僅對通過帳號密碼驗證之使用者提供存取權限\nHTTP基本身分驗證使用未加密之Base64編碼，用於傳送包含驗證憑證之請求，若被攻擊者取得可輕易解碼取得明文之帳號密碼，HTTP Digest身分驗證則將密碼儲存在伺服器上，有資料洩露風險，且與HTTP基本身分驗證一樣具有會談(Session)管理問題，伺服器無法控管用戶端建立會談之有效期限，故不建議使用HTTP基本身分驗證與HTTP Digest身分驗證\n使用動態掛載模組方式時，在LoadModule行首新增註解符號(#)，即可停用該模組",
    "method": "執行以下任一操作以停用Basic Authentication與Digest Authentication模組：\n靜態掛載模組：\n在編譯原始碼的階段，執行./configure指令時，確認--enable-modules未載入mod_auth_basic與mod_auth_digest參數\n動態掛載模組：\n在Apache設定檔(例如httpd.conf或其他被引入的設定檔)中，移除載入Basic Authentication與Digest Authentication模組的LoadModule指令，或修改成以下內容：\n##LoadModule mod_auth_basic modules/mod_auth_basic.so\n##LoadModule mod_auth_digest modules/mod_auth_digest.so",
    "expected": "停用",
    "check_cmd": "apachectl configtest 2>&1 | grep -q 'Syntax OK' && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 65 項"
  },
  {
    "id": "TWGCB-04-007-0066",
    "category": "SSL/TLS設定",
    "name": "通過HTTPS存取網站內容",
    "description": "這項原則設定決定是否僅允許通過HTTPS存取網站內容\nHTTPS支援加密協定與驗證機制，將HTTP網站重定向至HTTPS網站，可通過HTTPS存取所有網站內容，確保用戶端連線安全與網站資訊完整性\n若未使用HTTPS驗證機制，用戶端將可能遭受中間人攻擊與偽冒攻擊，被攻擊者引導至惡意網站，導致使用者收到惡意網站內容或執行惡意程式\n注意：請確認所有網站內容皆支援HTTPS，再執行重定向至HTTPS，以避免影響網站服務運作",
    "method": "將網站內容移至已啟用TLS之HTTPS網站，並編輯Apache設定檔(例如httpd.conf或其他被引入的設定檔)，在伺服器層級組態設定與所有的虛擬主機設定中，新增下列Redirect指令，以重定向至已啟用TLS之HTTPS網站(如https://www.example.com/)，範例如下：\nRedirect permanent / https://www.example.com/",
    "expected": "僅通過HTTPS存取",
    "check_cmd": "apachectl -M 2>/dev/null | grep -q ssl_module && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-04-007 說明文件第 66 項，設定 SSL/TLS 相關組態"
  }
]