資安
, Apache
, PHP
※相關資訊參照自技服中心:
- 106年Web應用程式安全參考指引 (V.2.0)
- 108第1次政府資通安全防護巡迴研討會 - 政府資訊作業委外安全管理
- 107第2次政府資通安全防護巡迴研討會 - 資通系統符合資安法規之安全強化說明
- 106安全資訊系統開發訓練研討會 - 資訊系統安全強化要點
※其他參照資訊
使用者的 Session 至多在 30 分鐘內未活動即自動失效。 (普、中、高)
; 在 php.ini 中做調整設定,預設值為 1440 (單位為秒)
; 預設值為 24 分鐘,若要設定為 30 分鐘,則改為 1800
session.gc_maxlifetime = 1440
使用者的 Session 應該手動登出機制,並且在登出後失效。 (普、中、高)
<?php
session_start();
// 清空 Session
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie( session_name(), time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
}
session_destory();
管理者介面限制存取來源IP。 (普、中、高)
<?php
// 取得使用者 IP,以便限制存取範圍
function getClientIP() {
/**
* 若使用者和 Web 服務中間,有 proxy server 者,
* 則應先檢查 $_SERVER['HTTP_CLIENT_IP']、$_SERVER['HTTP_X_FORWARDED_FOR']
*/
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
} else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
對使用者以最小權限方式賦予功能。 (中、高)
以較低權限的使用者去啟動軟體程序或伺服器服務。 (中、高)
建立 apache 使用者和群組。
group add -r apache
useradd apache -r -g apache -d /var/www -s /sbin/nologin
在 httpd.conf 中,設定僅有apache使用者和群組可使用。
User apache
Group apache
針對「身份鑑別失敗」、「存取資源失敗」、「重要行為」、「重要資料異動」、「功能錯誤」及「管理行為」進行日誌紀錄。 (普、中、高)
在專案內,安裝 log4php 套件。
composer require apache/log4php
在專案內建立一個 config.xml
檔案。
<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="myConsoleAppender" class="LoggerAppenderConsole" />
<appender name="myAppender" class="LoggerAppenderFile">
<layout class="LoggerLayoutPattern">
<param name="conversionPattern" value="%date{Y-m-d H:i:s,u} [%logger] %message%newline" />
</layout>
<param name="file" value="myLog.log" />
</appender>
<root>
<level value="WARN" />
<appender_ref ref="myAppender" />
</root>
</configuration>
在專案內使用 log4php 來紀錄 log 。 「參考來源」
<?php
// Import log4php
require_once __DIR__.'/vendor/autoload.php';
// Tell log4php to use our configuration file.
Logger::configure('config.xml');
// Fetch a logger, it will inherit settings from the root logger
$log = Logger::getLogger('myLogger');
// Start logging
$log->trace("My first message."); // Not logged because TRACE < WARN
$log->debug("My second message."); // Not logged because DEBUG < WARN
$log->info("My third message."); // Not logged because INFO < WARN
$log->warn("My fourth message."); // Logged because WARN >= WARN
$log->error("My fifth message."); // Logged because ERROR >= WARN
$log->fatal("My sixth message."); // Logged because FATAL >= WARN
定義log level多配合log4php,不過也可透過 trigger_error()
,即可靠php本身達成此效果。
<?php
trigger_error("Notice Message",E_USER_NOTICE);
trigger_error("Warning Message",E_USER_WARNING);
trigger_error("Error Message",E_USER_ERROR);
Log事件等級
Level | Severity | Description |
---|---|---|
FATAL | Highest | 嚴重錯誤 - 例如系統無法運作 |
ERROR | … | 錯誤訊息 - 通常是指例外發生(Exception) |
WARN | … | 警告,非嚴重的錯誤,系統仍能正常運作 |
INFO | … | 一般資訊,通常Production環境會使用 |
DEBUG | … | 偵錯,一般在Production環境不會使用 |
TRACE | Lowest | 詳細資訊,只有在Development環境使用 |
Apache Log設定等級 (政府組態 TWGCB-04-005-0037)
#預設值是warn
#LogLevel warn
LogLevel notice core:info
日誌紀錄內容包含以下項目: (普、中、高)
採用單一的日誌紀錄機制,確保輸出格式的一致性。 (普、中、高)
PHP實作範例:
<?php
// Import log4php
require_once __DIR__.'/vendor/autoload.php';
// Tell log4php to use our configuration file.
Logger::configure('config.xml');
// Fetch a logger, it will inherit settings from the root logger
$log = Logger::getLogger('myLogger');
// Who - 使用者ID
$ClientUser = $_SESSION['acc'];
// What - 系統代碼 (對應t_sso_sys)
$SysID = "D05";
// What - 執行的功能 (程式檔名或ajax.php內的動作名稱)
$FuncName = "up_grade.php";
// Where - 使用者IP
$ClientIP = getClientIP();
// How - 存取的資料表(主要含有個資的資料表或者關鍵的資料表,若沒有,以 - 字眼替代)
$DBTable = "TASTUD";
// How - 事件類型
// 身份鑑別失敗 - LF (登入失敗login faliure)
// 資源失敗 - RF (系統存取失敗resource faliure)
// 重要行為 - AC 權限新增 / AD 權限刪除 / AU 權限異動
// 重要資料異動 - C/R/U/D
// 功能錯誤 - FF
// 管理行為(如重要參數代碼表的異動) - M
$EventType = "R";
// How - 事件描述 (中文描述,使用者定義或開發者於程式流程中定義要紀錄的資訊,避免「/」字眼)
$EventDesc = "";
// How - 錯誤代碼 (開發者於程式流程中定義例外狀況的代碼)
$ErrorCode = "";
// Start logging
$log->info($CleintUser."/".$SysID."/".$FuncName."/".$ClientIP."/".$DBTable."/".$EventType."/".
$EventDesc."/".$ErrorCode);
apache的access.log應記載格式為combined (政府組態 TWGCB-04-005-0038)
CustomLog "logs/qry-ssl-all.log" combined
[補充] Apache2 前面加上 Load Balancer (F5 Big IP LTM),走得就類似 Reverse Proxy 的模式,會由 F5 將 X-Forwarded-For 轉送到 Apache。
※相關連結資訊:
apache log所記錄到的client ip會是 load balancer 的ip,而不是實際user的ip。更改httpd.conf設定如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
# 複製一行combined,把%h改成%{X-Forwarded-For}i,把combined改成proxy
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" proxy
# 原本CustomLog註解掉,新增一行設定format為proxy
#CustomLog logs/access_log combined
CustomLog logs/access_log proxy
依據稽核紀錄儲存需求,配置稽核紀錄所需容量 (普、中、高)
檢視磁碟剩餘空間和資料庫中稽核紀錄使用空間,評估配置稽核紀錄所需之儲存容量。
PHP實作指引:
<?php
// $df contains the number of bytes available on "/"
$df = disk_free_space("/");
// or on windows
$df_c = disk_free_space("C:");
Oracle Tablespace 空間查詢 (註):
SELECT a.TABLESPACE_NAME,
to_char(a.BYTES/(1024*1024),'999,999') "Size(MB)",
to_char(round((a.BYTES-b.BYTES)/(1024*1024),0),'999,999') "Used(MB)",
to_char(b.BYTES/(1024*1024),'999,999') "Avail(MB)"
FROM
(select TABLESPACE_NAME, sum(BYTES) "BYTES"
from dba_data_files
group by tablespace_name) a,
(select TABLESPACE_NAME,sum(BYTES) "BYTES"
from dba_free_space
group by tablespace_name) b
WHERE a.TABLESPACE_NAME=b.TABLESPACE_NAME;
Oracle Table 使用空間查詢 (註):
select
owner as "Schema"
, segment_name as "Object Name"
, segment_type as "Object Type"
, round(bytes/1024/1024,2) as "Object Size (Mb)"
, tablespace_name as "Tablespace"
from dba_segments
where segment_name='<table_name>'
and owner='<Table owner>';
控制措施有以下兩項:
作業系統層次,採用logrotate機制
/etc/logrotate.conf
設定,日誌至少保留13週 (政府組態 TWGCB-04-005-0039)。
# keep 13 weeks worth of backlogs
rotate 13
PHP實作指引:
<?php
// Import library
require_once __DIR__.'/vendor/autoload.php';
try {
// 做某些事
doSomething();
Logger::configure('config.xml');
$log = Logger::getLogger('myLogger');
// 寫入稽核日誌
$log->info("");
} catch(Exception $e) {
echo "Caught exception:". $e->getMessage()."\n";
$to = "收件人信箱";
$subject = "[XX系統告警] 稽核日誌失效!";
$msg = "something wrong";
$header = "From: 寄件人信箱"."\r\n";
// e-mail通知相關人員
mail($to, $subject, $msg, $header);
}
控制措施有以下兩項:(普、中、高)
實作指引:設定作業系統每日執行定時校時任務。
設定檔位置: /etc/ntp.conf
,設定 server 140.130.2.254
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 140.130.1.254
確認ntpd服務是否啟動
service ntpd status
service ntpd start
chkconfig ntpd on
systemctl status ntpd
systemctl start ntpd
systemctl enable ntpd
ntpstat指令:可以列出我們的 NTP 伺服器有跟上層連線否。由下述的輸出結果可以知道,時間有校正約 57 * 10^(-3) 秒,且每隔 1024 秒會主動去更新時間喔!
[root@wsj1 pdata]# ntpstat
synchronised to NTP server (140.130.1.254) at stratum 4
time correct to within 57 ms
polling server every 1024 s
對稽核紀錄之存取管理,僅限於有權限的使用者。(普、中、高)
運用加密機制,以保護稽核資訊。(中、高)
產生sha512雜湊值的實作範例:
<?php
require_once __DIR__.'/vendor/autoload.php';
Logger::configure('config.xml');
$log = Logger::getLogger('myLogger');
// Who - 使用者ID
$ClientUser = $_SESSION['acc'];
// What - 系統代碼 (對應t_sso_sys)
$SysID = "D05";
// What - 執行的功能 (程式檔名或ajax.php內的動作名稱)
$FuncName = "up_grade.php";
// Where - 使用者IP
$ClientIP = getClientIP();
// How - 存取的資料表(主要含有個資的資料表或者關鍵的資料表)
$DBTable = "TASTUD";
// How - 事件類型
// 身份鑑別失敗 - LF (登入失敗login faliure)
// 資源失敗 - RF (系統存取失敗resource faliure)
// 重要行為 - AC 權限新增 / AD 權限刪除 / AU 權限異動
// 重要資料異動 - C/R/U/D
// 功能錯誤 - FF
// 管理行為(如重要參數代碼表的異動) - M
$EventType = "R";
// How - 事件描述 (中文描述,使用者定義或開發者於程式流程中定義要紀錄的資訊,避免「/」字眼)
$EventDesc = "";
// How - 錯誤代碼 (開發者於程式流程中定義例外狀況的代碼)
$ErrorCode = "";
// 完整log內容
$allMsgTxt = $CleintUser."/".$SysID."/".$FuncName."/".$ClientIP."/".$DBTable."/".$EventType."/".
$EventDesc."/".$ErrorCode;
// 存成雜湊值
$enAllMsgTxt = hash('sha512', $allMsgTxt);
// Start logging
$log->info($allMsgTxt." - ".$enAllMsgTxt);
用 hash()
產生雜湊值,至於支援哪些演算法種類,可以用 hash_algos()
來查詢。
定期備份稽核紀錄到與原稽核系統不同之實體系統(如Log伺服器)。(高)
首先先編輯php.ini,設定使用syslog
error_log = syslog
接著設定syslog-ng.conf
# 將紀錄傳送至10.10.10.10的5140port
destination php { tcp("10.10.10.10" port(5140))};
log { source(src); filter(f_php); destination(php); };
確實規範使用者密碼強度(GCB密碼原則或配合ISMS規範)。 (普、中、高)
規範密碼長度為12個字元以上、包含英文大小寫、數字,以及特殊字元。
在PHP中,可以使用 preg_match()
以及正規表示式,來檢核格式正確性。
<?php
$pattern = '/(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/';
if (!(preg_match($pattern, $loginpassword))) {
echo "Password must include one uppercase letter, one lowercase letter, one number, and one special character such as $ or %.";
die;
}
使用者必須定期更換密碼,具至少不可以與前3次使用過之密碼相同。 (普、中、高)
具備帳號鎖定機制,帳號進行身分鑑別失敗達5次後,至少15分鐘內不允許該帳號及來源IP繼續嘗試登入。 (普、中、高)
身分鑑別相關資訊不以明文傳輸(採用HTTPS協定)。 (普、中、高)
身分鑑別機制,應防範自動化程式攻擊,如採用圖形驗證碼(CAPTCHA)機制。 (中、高)
密碼重設機制對使用者重新身分確認後,發送一次性及具時效性token,檢查傳回token有效性後,才允許使用者重設密碼。 (中、高)
<?php
function uniqidReal($lenght = 13) {
// uniqid gives 13 chars, but you could adjust it to your needs.
if (function_exists("random_bytes")) {
$bytes = random_bytes(ceil($lenght / 2));
} elseif (function_exists("openssl_random_pseudo_bytes")) {
$bytes = openssl_random_pseudo_bytes(ceil($lenght / 2));
} else {
throw new Exception("no cryptographically secure random function available");
}
return substr(bin2hex($bytes), 0, $lenght);
}
$token = uniqidReal($lenght = 13);
實作指引:密碼欄位應遮蔽(input屬性type設定為password)
<input type="password" name="pwd">
PHP5.5之後才支援
password_hash()
及password_verify()
,如果使用的PHP版本是更早的版本,可以改用 password_compat library
PHP提供 password_hash()
函式,可以產生有 salt 的密碼 (註)。
<?php
$options = array(
'costs' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_RANDOM)
);
echo password_hash("密碼明文", PASSWORD_BCRYPT, $options);
驗證密碼正確性用 password_verify()
(註)。
<?php
// $_POST["pwd"] ---> Is The User's Input
// $hashed_password ---> Is The Hashed Password You Can Store In Your DataBase
if(password_verify($_POST["pwd"],$hashed_password))
echo "Welcome";
else
echo "Wrong Password";
在 Laravel Hash 內儲存的密碼使用 Bcrypt 加密方式 (註)。
<?php
// 使用 Bcrypt 加密密碼
$password = Hash::make('secret');
// 對加密的密碼進行驗證
if (Hash::check('secret', $hashedPassword))
{
// The passwords match...
}
SQL Injection 防範措施 (普、中、高)
XSS (Cross-Site Scripting) 防範措施 (普、中、高)
對輸入 <input type="text">
、 <input type="hidden">
的欄位,在存入資料庫前,進行格式檢查。
cookie有一項屬性HttpOnly。這個屬性可以禁止以JavaScript讀取出cookie。藉由這個屬性可以防止XSS攻擊之一(Session ID竊取)。在php.ini中設定:
session.cookie_httponly = On
Laravel XSRF-Token 預設沒有 httponly,必須要在 app/Http/Middleware/VerifyCsrfToken.php
中,加入下面這段程式碼才會讓 httponly 生效
<?php
use Symfony\Component\HttpFoundation\Cookie;
// 在VerifyCsrfToken類別內櫎增以下屬性及方法
protected $addHttpCookie = true;
protected function addCookieToResponse($request, $response)
{
$response->headers->setCookie(
new Cookie('XSRF-TOKEN',
$request->session()->token(),
time() + 60 * 120,
'/; samesite=strict',
null,
config('session.secure'),
true)
);
return $response;
}
在呈現資料時,PHP提供 htmlspecialchars()
或 htmlentities()
來呈現使用者儲存在資料庫的文字,可以避免XSS攻擊 (如果該欄位不是允許html語法的欄位,就該過濾) (註)。
<?php
echo htmlspecialchars('<a href="">測試</a>', ENT_QUOTES);
針對允許html排版語法的欄位進行避免XSS攻擊加強改善作法:
在該欄位套用過濾語法的函式stripUnwantedTagsAndAttrs($html_str),讓使用者可以使用合格語法(不合格者濾掉),再丟存檔程序。
被動等待使用者回饋問題及狀況,Case by Case檢視使用者送出訊息是否有異常,並提出WAF例外申請。
<?php
function stripUnwantedTagsAndAttrs($html_str){
$xml = new DOMDocument();
//Suppress warnings: proper error handling is beyond scope of example
libxml_use_internal_errors(true);
//List the tags you want to allow here, NOTE you MUST allow html and body otherwise entire string will be cleared
$allowed_tags = array("html", "body", "b", "br", "em", "hr", "i", "li", "ol", "p", "s", "span", "table", "tr", "td", "u", "ul", "a");
//List the attributes you want to allow here
$allowed_attrs = array ("class", "id", "style");
if (!strlen($html_str)) {
return false;
}
if ($xml->loadHTML($html_str, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD)) {
foreach ($xml->getElementsByTagName("*") as $tag) {
if (!in_array($tag->tagName, $allowed_tags)) {
$tag->parentNode->removeChild($tag);
} else {
foreach ($tag->attributes as $attr) {
if (!in_array($attr->nodeName, $allowed_attrs)) {
$tag->removeAttribute($attr->nodeName);
}
}
}
}
}
return $xml->saveHTML();
}
跨站請求偽造(Cross-Site Request Forgery, CSRF) 防範措施 (普、中、高)
發生錯誤時,使用者頁面僅顯示簡短錯誤訊息及代碼,不包含詳細的錯誤訊息。 (普、中、高)
所有功能皆進行錯誤及例外處理,並確保將資源正確釋放。 (普、中、高)
程式的進入點之後,盡可能採用 try-catch-finally
的語法結構,捕捉可能發生的錯誤與例外狀況。
try-catch-finally
的語法結構
<?php
// PHP 5.5 以後增加 finally 區塊語法
try {
// do something
} catch(Exception $e) {
echo 'Exception:'.$e->getMessage()."\n";
}
// continue execution
echo 'Hello';
具備系統嚴重錯誤的通知機制(如:e-mail或簡訊)。 (高)
[實務補充] Ajax請求處理端,應檢核是否循正常Ajax請求管道請求服務。
<?php
/* ajaxRequest check variable */
$ajaxRequest = isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') ;
//判別是否接收ajax請求,如果不是請它走開
if(!$ajaxRequest)
{
http_response_code(403);
exit(0);
}
執行「弱點掃描」安全檢測。 (普、中、高)
執行「滲透測試」安全檢測。 (高)
「弱點掃描」v.s.「滲透測試」
比較構面 | 滲透測試(Vulnerability Scan) | 弱點掃描(Penetration Testing, PT) |
---|---|---|
執行方式 | 資安顧問手動進行 | 使用自動化工具對目標進行掃描 |
弱點種類 | 可以發現規則外或未知的潛在弱點 | 僅能根據規則發現已知弱點 |
攻擊手法 | 可依客戶需求,利用各式弱點攻擊 | 無法進一步利用弱點進行攻擊 |
誤判率 | 低 | 高 |
報告內容 | 例出詳細攻擊手法,並提供客製化的修補建議 | 僅陳列弱點報表,通常不包含修補建議 |
成本 | 高,須聘請專業顧問手動執行 | 低,有低價的商業工具或免費工具 |
作業平台定期更新並關閉不必要的服務及Port。 (普、中、高)
00-dav.conf
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_lock_module modules/mod_dav_lock.so
00-base.conf
#LoadModule status_module modules/mod_status.so
#LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule userdir_module modules/mod_userdir.so
#LoadModule info_module modules/mod_info.so
00-proxy.conf: mod_proxy.so、mod_proxy_http.so,由於引用造字會需要使用到proxy設定,故須列入GCB例外管理清單。
LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
00-lua.conf:關閉 mod_lua.so 的支援
Apache軟體基金會於12月20日釋出的HTTP Server專案最新2.4.52版,最新版本除了功能更新,最主要是修補2個漏洞包括CVE-2021-44790及CVE-2021-44224。
其中有關 CVE-2021-44790 的部分,CVSS 3.1風險值9.8,屬重大漏洞!是和mod_lua有關的漏洞,攻擊者可傳送惡意呼叫觸發mod-lua multipart解析器的緩衝溢位,本漏洞影響Apache HTTP Server 2.4.51及以前版本。
#LoadModule lua_module modules/mod_lua.so
針對系統依賴的外部元件或軟體,注意其安全漏洞通告,定期評估更新。 (普、中、高)
系統依賴的外部元件或軟體,不使用預設密碼或空的密碼。 (普、中、高)
MySQL5.6: Assigning Account Passwords
-- MySQL >= 5.7.6
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
-- MySQL <= 5.7.5
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('MyNewPass');
Windows設定檔位置: 在apache的目錄裡 conf\extra\httpd-ssl.conf
Linux設定檔位置: /etc/httpd/conf.d/ssl.conf
至少設定為TLSv1.2 (SSLv3、SSLv2、TLSv1、TLSv1.1都是在弱點掃描時被認為是弱點的項目)
SSLProtocol -all +TLSv1.2
ssl.conf 的 cipherSuite 的調校。
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
參數設定或系統設定存放處,限制存取或進行適當保護。 (高)
系統設定會集中存放在一個或少數幾個檔案(例如:config.php、.env檔、.git目錄等),而其內容無法被使用者直接存取。
搭配 .htaccess檔 的設定,排除使用者直接存取。
# Disable index view
Options -Indexes
# Hide a specific directory
<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>
RedirectMatch 404 /\.git
# Hide a specific file
<Files .env>
Order allow,deny
Deny from all
</Files>
機敏資料儲存時,採用加解密機制。 (高)
系統的漏洞修復應測試有效性及潛在影響,並律定時間週期更新。
定期確認系統漏洞修復之狀態。
發現資訊系統有被入侵跡象時,應通報機關特定人員。 (普、中、高)
監控資訊系統,以偵測攻擊及未授權之連線,並識別資訊系統之未授權使用。 (中、高)
資訊系統應採用自動化工具監控進出之通信流量,並於發現不尋常或未授權活動時針對該事件進行分析。 (高)
實作指引: