搜尋此網誌

2016年9月8日 星期四

[工具介紹] 利用 collectd + InfluxDB + Grafana 監測系統效能

傳統上用來監測網路流量、系統效能數據的常用工具多以 RRD 為基本的技術,這類工具包含 MRTG 與 Cacti。RRD 有幾個明顯的缺點,其中一個就是資料的解析度會隨著時間的過去而降低。

例如在 Cacti 中,過去 24 小時的流量圖表是長這樣:

image

但是一周前的 24 小時的流量圖表就變成這般可怕的模樣:

image

當你不幸地需要歷史數據資料時,別說要如何進行分析了,光拿出這種圖表就需要莫大的勇氣。

在講究高清不失真的這個年代,以 RRD 為基礎的工具已經漸漸不符合我們所需。

目前比較常見用來記錄時間數據的工具,應以 ELK stack 為首。ELK stack 以 Elasticsearch 為核心,可用來分析各式各樣的資料。這個特性是它的強項,不過在某些時候卻也變成它的弱點 (過於複雜)。而我今天要介紹的 collectd + InfluxDB + Grafana,正是以處理時間數據為主,所以在製作與時間數據相關的圖表時會更為簡化。
Grafana 本身類似 ELK 的 Kibana,主要作為圖表呈現的部分。而資料來源的部分,除了 InfluxDB 之外,像是 Graphite、OpenTSDB、甚至是 Elasticsearch 也都可以支援。在此架構中,collectd 會負責收集作業系統的效能數據,並將之”餵進” InfluxDB,最後再透過 Grafana 的圖表予以呈現。

在今天的範例中,我將示範如何在 CentOS 7 中利用 collectd + InfluxDB + Grafana 建置一個呈現系統效能數據的儀表板。需特別注意的是,為了簡化範例的說明,所有的套件皆安裝在同一個系統 (IP 位址為 192.168.111.241) 下。而在實務上,這三個套件通常應分散在不同的系統上。

安裝 InfluxDB

  1. 透過官方 RPM Repo 安裝 InfluxDB 套件
  2. cat<<EOF>/etc/yum.repos.d/influxdb.repo
    [influxdb]
    name = InfluxDB Repository - RHEL $releasever
    baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
    enabled = 1
    gpgcheck = 1
    gpgkey = https://repos.influxdata.com/influxdb.key
    EOF yum install influxdb -y systemctl enable influxdb.service systemctl start influxdb.service
  3. 配置防火牆
  4. cat<<EOF>/etc/firewalld/services/influxdb.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>
      <short>InfluxDB</short>
      <description>InfluxDB is an open source time series database with no external dependencies. It's useful for recording metrics, events, and performing analytics.</description>
      <port protocol="tcp" port="8083"/>
      <port protocol="tcp" port="8086"/>
    </service>
    EOF chmod 600 /etc/firewalld/services/influxdb.xml firewall-cmd --add-service=influxdb --permanent firewall-cmd --reload
  5. 透過指令 influx 進入 influxdb 命令列模式,並輸入下列命令創建管理者帳密
  6. create user admin with password 'password' with all privileges;  
    exit
  7. 利用瀏覽器連結 influxdb 管理介面,網址是 http://192.168.111.241:8083,應可看到類似下列畫面
    0001

安裝 Grafana

  1. 透過官方 RPM Repo 安裝 Grafana 套件
  2. cat<<EOF>/etc/yum.repos.d/grafana.repo
    [grafana]
    name=grafana
    baseurl=https://packagecloud.io/grafana/stable/el/6/\$basearch
    repo_gpgcheck=1
    enabled=1
    gpgcheck=1
    gpgkey=https://packagecloud.io/gpg.key https://grafanarel.s3.amazonaws.com/RPM-GPG-KEY-grafana
    sslverify=1
    sslcacert=/etc/pki/tls/certs/ca-bundle.crt
    EOF yum install grafana –y systemctl enable grafana-server.service systemctl start grafana-server.service
  3. 配置防火牆
  4. cat<<EOF>/etc/firewalld/services/grafana.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>
      <short>Grafana</short>
      <description>Grafana provides a powerful and elegant way to create, explore, and share dashboards and data with your team and the world.</description>
      <port protocol="tcp" port="3000"/>
    </service>
    EOF chmod 600 /etc/firewalld/services/grafana.xml firewall-cmd --add-service=grafana --permanent firewall-cmd --reload

 

設定 influxdb collectd plugin

  1. 安裝 collectd 套件
  2. yum install collectd -y
  3. 修改檔案 /etc/influxdb/influxdb.conf,將 [[collectd]] 區塊的
    enabled = false
    改為
    enabled = true
    bind-address = ":25826" # the bind address
    database = "collections" # Name of the database that will be written to
    retention-policy = ""
    batch-size = 5000 # will flush if this many points get buffered batch-pending = 10 # number of batches that may be pending in memory batch-timeout = "10s"
    read-buffer = 0 # UDP read buffer size, 0 means to use OS default typesdb = "/usr/share/collectd/types.db" #enabled = false
  4. 重新啟動服務
  5. systemctl restart influxdb.service
  6. 配置防火牆
  7. cat<<EOF>/etc/firewalld/services/collectd.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>
      <short>collectd</short>
      <description>collectd daemon for InfluxDB</description>
      <port protocol="udp" port="25826"/>
    </service>
    EOF firewall-cmd --add-service=collectd --permanent firewall-cmd --reload
  8. 透過指令 influx 進入 influxdb 命令列模式,並輸入下列命令創建資料庫與存取帳密
  9. CREATE DATABASE collections
    CREATE USER collectdrw WITH PASSWORD 'readwrite'
    GRANT ALL ON collections to collectdrw
    CREATE USER collectdread WITH PASSWORD 'readonly'
    GRANT READ ON collections TO collectdread
    exit

設定 collectd for influxdb

這個動作需在需收集效能數據的各主機上分別執行。
  1. 設定 collectd 服務所需的外掛。在此範例中我們沒有另外新增數據收集的外掛,僅增加了將資料送往 InfluxDB 的外掛。
  2. cat<<EOF>/etc/collectd.d/network.conf
    Hostname    "grafana"
    FQDNLookup  false
    LoadPlugin  network
    LoadPlugin  uptime
    <Plugin network>
      Server "192.168.111.241" "25826"
    </Plugin>
    EOF
    systemctl enable collectd.service
    systemctl start collectd.service
  3. 回到 influxdb 的管理介面,重整後在 Database 下拉式選單中應可看到多了一個名為 collections 的資料庫。
    0002
  4. 選取 collections 後,在 Query Templates 中選取 Show Measurements。
    0003
  5. 按下 Enter 後,應可看到類似下面的結果,表示 collections 中已有 cpu_value 等數據。
    0004
  6. 接著,我們輸入 SHOW TAG KEYS FROM "cpu_value" 並按下 Enter,應可看到類似下列畫面。結果顯示 cpu_value 包含四個 key,分別為 host、instance、type 以及 type_instance。
    0005
  7. 接著,我們輸入 SHOW TAG VALUES FROM "cpu_value" WITH KEY = "host" 並按下 Enter,應可看到類似下列畫面。結果顯示 host 這個 key 的內容僅包含 grafana,也就是我們目前唯一已經設定過的 collectd 服務主機名稱。
    0006
  8. 接著,我們輸入 SHOW TAG VALUES FROM "cpu_value" WITH KEY = "host" 並按下 Enter,應可看到類似下列畫面。結果顯示 InfluxDB 已確實收到來自於 collectd 服務的效能數據。
    0007

設定 Grafana Dashboard

  1. 利用瀏覽器連結 Grafana 管理介面,網址是 http://192.168.111.241:3000,應可看到類似下列畫面
    0008
  2. 使用預設帳密 admin / admin 登入系統。
  3. 點選左上角的圖示後會出現主要選單,點選 admin 後可以修改基本資訊與密碼。
    0009
  4. 同樣利用主選單的 Data Sources 選項,進入後按下右上角的 "+Add data source" 按鈕。
  5. 分別填入下列資訊,其中 Url 欄位因為我們選取 direct 的存取方式,所以不能使用預設的 http://localhost:8086,而必須指定為 http://192.168.111.241:8086。
    • Name: Collectd
    • Default: 選取與否皆可
    • Type: InfluxDB
    • Url: http://192.168.111.241:8086
    • Access:direct
    • Http Auth: 兩個選項皆不用選取
    • Database: collections
    • User: collectdread
    • Password: readonly
    • Default group by time: 保留空白
  6. 填寫完畢後按下 "Add" 按鈕。如果 Data Source 可以正常連結的話會出現類似下列的成功畫面,否則會出現錯誤訊息。
    0010
  7. 利用主選單的 Dashboards > + New 開始新增儀表板。
  8. 利用 Manage dashboard 的 Settings 功能可修改儀表板的相關設定。
    0011
  9. 在此範例中我們僅設定名稱即可,將之設定為 System Information,設定完畢後按下右上方的 X 即可回到 Dashboard 的畫面。
    0013
  10. 點選左上方的綠色區塊後會出現 ROW 功能選單,選取 Add Panel > Graph。
    0012
  11. Graph 有多個頁籤設定,其中 Metrics 可用來配置資料相關設定。首先,我們須將 Panel data source 改為 Collectd。
  12. 此時我們會發現 Metrics A 內容有所改變,點選後出現圖形化編輯選項。
    0015
  13. Grafana 的圖形化編輯功能相當方便,不過為了方便說明,所以我們透過 Toggle Edit Mode 進入直接編輯模式。
    0016
  14. 輸入下列內容
    SELECT last("value") FROM "load_shortterm" WHERE "host" = 'grafana' AND $timeFilter GROUP BY time($interval) fill(null)
    0017
  15. 透過 "+ Add query" 按鈕另外新增兩個 Metrics,內容分別為
    SELECT last("value") FROM "load_midterm" WHERE "host" = 'grafana' AND $timeFilter GROUP BY time($interval) fill(null)
    SELECT last("value") FROM "load_longterm" WHERE "host" = 'grafana' AND $timeFilter GROUP BY time($interval) fill(null)
    0018
  16. 切換至 General 頁籤,將 Panel 的標題修改為 Load。
    0019
  17. 切換到 Legend 頁籤,勾選 Min、Max、Avg 以及 Current。
    0020
  18. 設定完畢後按下右方的 X 即可回到 Dashboard 畫面,然後按下 CTRL+S 將 Dashboard 予以儲存。
  19. 之後就可以透過 Dashboard 下拉式選單快速連結至我們剛剛新增的 System Information Dashboard 了。
    0021

透過幾個簡單的設定,我們就建立了一個系統負載的數據圖表。

下一步

Grafana 除了圖形類 (Graph) 的報表之外,另有提供表格式 (Table) 、單一數值  (Singlestat) 與其他種類的報表。
此外,我們的範例是針對特定的單一主機來進行配置。但是我們通常不會只有管理一台主機,此時就可以透過 Dashboard 的 Templating 機制設定一個變數用來代表主機名稱,然後將 Metrics 的條件指定為此一變數,而非原先固定的主機名稱。如此一來,Dashboard 就會提供一個所有主機名稱的下拉式選單,方便我們觀看個別主機的相關數據。

盡管如此,我們會發現自己要從無到有刻出一個合用且美觀的報表其實也不是那麼簡單的事情。幸好 Grafana  有提供儀表板匯出/匯入的功能,而且有善心人士已經將一些常見的效能數據儀表板匯出並提供下載 (清單在此)。不過在選用這些儀表板時,需特別注意的是它使用的資料來源是哪一種 (InfluxDB、Graphtie 或是其他的資料來源),以免發生牛頭不對馬嘴的狀況。

2016年9月4日 星期日

[工具介紹] 以 Apache myfixip 模組支援 Proxy Protocol

我在前一篇文章中提到,HAProxy 推出 Proxy Protocol 用以解決在代理伺服器架構下無法取得用戶端 IP 位址的困境。在這篇文章中,我將以 HAProxy 搭配 Apache + myfixip 模組,實際展示如何透過 Proxy Protocol 解決用戶端 IP 位址的問題。
本次展示的架構如下 :

其中代理伺服器使用 CentOS 7 的 HAProxy 1.5.14 套件,而 Web 服務器使用 CentOS 7 的 Apache 套件。
我們先在 Web 服務器放置內容如下的 PHP 腳本,而在 PHP 中,$_SERVER["HTTP_X_FROWARDED_FOR"] 這個變數就代表 HTTP 檔頭 X-Forwarded-For。
<?php
echo nl2br("X-Forwarded-For: " . $_SERVER["HTTP_X_FORWARDED_FOR"] . PHP_EOL);
echo nl2br("Remote Address: " . $_SERVER["REMOTE_ADDR"] . PHP_EOL);

用戶端直接連結 Web 服務器

Direct
當用戶端直接連往 Web 服務器 (192.168.10.12) 上的 PHP 腳本後,可以看到如下的輸出:
HTTP-X-Forwarded-For:
Remote Address: 192.168.10.10
在這種單純的情況下,直接使用 REMOTE_ADDR 變數即可取得用戶端的 IP 位址。

用戶端透過 HAProxy 的  HTTP 模式連往 Web 服務器

HTTP Mode
我們在 HAProxy 使用下列設定:
listen http-proxy
bind 0.0.0.0:80
mode http
option httpchk
option forwardfor
balance source
server web-1 192.168.10.12:80 weight 1 check
當用戶端透過代理伺服器 (192.168.10.11) 連往 Web 服務器 (192.168.10.12) 上的 PHP 腳本後,可以看到如下的輸出:
X-Forwarded-For: 192.168.10.10
Remote Address: 192.168.10.11
在這種情況下,儘管 REMOTE_ADDR 變數顯示為代理伺服器的 IP 位址,但是使用 HTTP_X_FROWARDED_FOR 變數依舊可取得用戶端的 IP 位址。

用戶端透過 HAProxy 的  HTTP 模式連往 Web 服務器

TCP Mode
我們將 HAProxy 的設定修改成如下:
listen http-proxy
bind 0.0.0.0:80
mode tcp
balance source
server web-1 192.168.10.12:80 weight 1 check
當用戶端透過代理伺服器 (192.168.10.11) 連往 Web 服務器 (192.168.10.12) 上的 PHP 腳本後,可以看到如下的輸出:
X-Forwarded-For:
Remote Address: 192.168.10.11
在這種情況下,不存在 HTTP_X_FROWARDED_FOR 變數,而 REMOTE_ADDR 顯示的也是代理伺服器 IP 位址。也就是程式無法正確獲得用戶端 IP 位址。

用戶端透過支援 Proxy Protocol 的設定連往 Web 服務器

Proxy Protocol
因為 HAProxy 本身就內建支援 Proxy Protocol,所以不需安裝額外的套件,只要把設定修改成如下即可:
listen http-proxy
bind 0.0.0.0:80
mode tcp
balance source
server web-1 192.168.10.12:80 weight 1 check send-proxy
至於 Apache 的部分,因為 Apache 目前尚未內建 Proxy Protocol 的支援,所以我們需要安裝另外的模組。在此,我以 myfixip 模組為例,相關步驟如下:
yum install git gcc httpd-devel
cd /tmp
git clone https://github.com/ggrandes/apache24-modules.git
cd apache24-modules
apxs –i –c mod_myfixip.c
新增檔案 /etc/httpd/conf.modules.d/00-myfixip.conf,內容如下
LoadModule myfixip_module modules/mod_myfixip.so
<IfModule mod_myfixip.c>
   RewriteIPResetHeader off
   RewriteIPAllow 192.168.10.0/24 127.0.0.1
</IfModule>
systemctl restart httpd
需特別注意的是因為 Proxy Protocol 會改變代理伺服器與 Web 服務器之間的溝通方式,所以需要兩邊同時啟用,否則將無法正常運作,甚至可能導致無法存取服務。
當用戶端再次透過代理伺服器 (192.168.10.11) 連往 Web 服務器 (192.168.10.12) 上的 PHP 腳本後,可以看到如下的輸出:
X-Forwarded-For:
Remote Address: 192.168.10.10
在這種情況下,即使經過代理伺服器的作用,但是 REMOTE_ADDR 變數依舊可以正確地顯示出用戶端的 IP 位址。

透過 myfixip 模組,可以讓 Apache 支援 Proxy Protocol,有效地取得用戶端 IP 位址。
除了 HAProxy 之外,如果你使用了 AWS ELB 的 TCP 或 SSL 模式,透過 myfixip 擴充 Apache 使其支援 Proxy Protocol 也同樣會有很大的助益。比較麻煩的是,目前 AWS 的管理介面並不支援 Proxy Protocol 的設定,而必須使用命令列模式控制 Proxy Protocol 的開啟或關閉。有需要的讀者可參考官方文件。

[教戰手則] 狡詐的用戶端真實 IP 位址

vuze_how_to_configure_envelope在 TCP/IP 網路的世界裡,盡管 IP 位址本身有很多的問題,但是用戶端的 IP 位址對許多安全機制來說依舊是一個很基本且重要的資訊。舉例來說,利用用戶端的 IP 位址當做存取控制的依據,就是常見的第一道安全門檻。除此之外,各式各樣的系統日誌,也幾乎都包含用戶端的 IP 位址來當作用戶端的身分紀錄。尤其對像是 HTTP 這類網路服務而言,用戶端的 IP 位址往往更是最主要的身分代表。
誠如 DEVCORE 在 “如何正確的取得使用者 IP?” 這篇文章中所提到,因為所有用戶端的資訊都是不可靠的,再加上眾多代理伺服器從中攪局,所以如何”正確的”取得用戶端 IP 位址這個看似再簡單不過的問題卻變得相當複雜,甚至無法在所有的情況下都能順利完成目的。
我在此先直接引用自該文章的結論
”那我們該怎麼處理呢?我的建議是記錄所有相關的 header 欄位存入資料庫,包含「REMOTE_ADDR」「X-Forwarded-For」等等,真正有犯罪事件發生時,就可以調出所有完整的 IP 資訊進行人工判斷,找出真正的 IP。當然從 header 存入的數值也可能會遭到攻擊者竄改插入特殊字元嘗試 SQL Injection,因此存入值必須先經過過濾,或者使用 Prepared Statement 進行存放。
可以參考的 HTTP Header(依照可能存放真實 IP 的順序)
  • HTTP_CLIENT_IP
  • HTTP_X_FORWARDED_FOR
  • HTTP_X_FORWARDED
  • HTTP_X_CLUSTER_CLIENT_IP
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED
  • REMOTE_ADDR (真實 IP 或是 Proxy IP)
  • HTTP_VIA (參考經過的 Proxy)”
而今天我要分享的是另一種情境,那就是當你的代理伺服器因為太有個性,除了 REMOTE_ADDR 之外其他檔頭 (Header) 都不願意送出呢 (嚴格來說,REMOTE_ADDR 其實根本也不是 HTTP 檔頭) ?在實務上,當你使用 HAProxy 的 TCP Mode 時,它就是這麼有個性。
基本上,HAProxy 有兩種運作模式,一種稱之為 HTTP 模式。在 HTTP 模式下,可以對用戶端送來的檔頭做判斷與處理,當然也包含檔頭的新增與內容修改。而在 TCP 模式下,這些功能都無法獲得。或許有讀者會質疑運作在 TCP 模式下的 HAProxy 是否還算是一個代理伺服器?這種定義的問題,我並不想在此討論,而就實務的情況來看,這種情況就是真實存在的。
既然 TCP 模式比之  HTTP 模式就像被閹割般的無能,那為什麼我們還會需要使用 TCP 模式呢?常見的情況有二,一個是因為 SSL/TLS 加密的因素。如果你的網站支援 SSL/TLS 加密,那麼使用 HAProxy 後你有兩種選擇,一種是把 SSL/TLS 加解密交給 HAProxy,這種情況又稱之為 SSL Termination (請參考下圖)。SSL Termination 常用於 SSL 加速,另外也可能是為了 IDS/IDP/DLP 這類需要分析封包內容的安全機制而必須先將 SSL/TLS 連線予以解密。
SSL Termination
但是因為 HAProxy 本身也是軟體形式,所以對於 SSL 加速沒有甚麼幫助,甚至有可能反而造成效能的瓶頸,所以第二種選擇就是把 SSL/TLS 加解密維持在原有的地方,例如 Web Server 本身。在這種情境下,因為所有經過 HAProxy 的封包內容都已經經過加密,所以 HAProxy 僅能透過 TCP 模式與後端 Web Server 溝通,而無法使用 HTTP 模式。
另外一個因素則是如果你需要代理的服務不是 HTTP,而是其他的網路服務 (像是 MySQL),當然就不能使用 HTTP 模式,而必需使用 TCP 模式。
而不幸的是,不管是在 HTTP 模式或 TCP 模式之下,都是由代理伺服器代替用戶端傳送封包,所以 REMOTE_ADDR 皆會顯示為代理伺服器的 IP 位址。還好在 HTTP 模式下,HAProxy 會加上 X-Forwarded-For 這個檔頭,所以我們還是有機會取得用戶端的真實 IP 位址。但是在 TCP 模式下,HARroxy 無法新增任何檔頭,也讓我們失去獲得用戶端真實 IP 位址的機會。
那麼我不用 HAProxy 不就沒事了?當然不是。即使是其他的 HTTP 代理伺服器,只要考慮到 SSL/TLS 加解密,就都有類似的問題。舉例來說,現在很熱門的 AWS ELB 在某些模式時也會有跟 HAProxy TCP 模式一樣的情形。
有鑑於此,HAProxy 特別訂出了所謂的 Proxy Protocol。只要是支援 Proxy Protocol 的代理伺服器與網路服務相互搭配,透過適當的設定就可以取得用戶端的 IP 位址。當然,這個用戶端 IP 位址,不一定是真實的用戶端 IP 位址,不過通常至少是連往代理伺服器的 IP 位址,而不是全部變成代理伺服器的 IP 位址。除了 HAProxy 本身的支援外,許多代理服務器或服務也都內建或透過外接模組的方式,提供此一功能的支援。詳細清單可參考這裡。
在下一篇文章中,我將使用 HAProxy + Apache 的 myfixip 模組當作範例,實際展示 Proxy Protocol 的運作。
相關連結:

2015年4月22日 星期三

[資安觀念] 有備就無患?

在筆者接手過的系統中,備份機制是一個常見但是卻也常常做的不足的事情。在討論何謂足夠的備份機制之前,我們先來看看一個更基本的問題,那就是備份對現代化資訊系統的必要性。 
隨著 IT/IS 技術的不斷進步,高可用性 (HA) 的系統已經是基本的配置。除此之外,災難復原 (DR) 更是考慮到了實體的安全,當主要系統的所在地無法正常運作時,可以在最短的時間內於第二個地點恢復服務。甚至,有了號稱可以提供 100% uptime 的雲端系統,備份豈不多餘?
答案絕對是否定的。 正所謂天有不測風雲,設計再精良的系統,都無法保證絕對不會受到損害,而備份就是資訊可用性的最後一道重要防線:

  1. 相較於 HA / DR 的技術,備份技術擁有選擇性多、成熟度高、費用便宜等好處。其中選擇性多可以避免發生被單一廠商吃死的狀況。
  2. 即使是號稱 100% uptime 的雲端系統,也無法確保真的不會出問題。雲端系統的架構可能比(大部分的)私有架構更為成熟,但是絕對不會一躍變成神一般的等級。
  3. 有些問題非 HA / DR 技術可解決,其中之一正是豬一般的隊友。如果你曾經看過 delete from members (SQL command) 或 rm -rf / (SHELL command) 的 Live Show,你就絕不會懷疑備份的重要性。此時,備份 (加上 transaction log) 就可以避免你直接升天。
  4. 備份除了可以保全資料,在不得已 (沒預算) 的情況下還可以用來解決需要長期保留資料的問題 (如日誌)。儘管如此,如果在預算許可的情況下,後者還是應該選擇專門用於封存 (Archiving) 的技術。
既然備份依舊是 IT/IS 不可避免的項目,那麼回到一開始的話題,何謂不足的備份機制?常見的情況包含:
  1. 備份的目標不完整。舉例來說,公司有三台資料庫主機,卻只有備份到其中兩台。或是明明主機內有五個資料庫,卻只備份到其中三個。這個問題發生的原因通常是沒有落實相關作業的 SOP 或變更管理。
  2. 備份的項目不完整。跟前述有點類似,但是主要是指有些該備份的東西卻完全沒有備份。舉例來說,像是使用者上傳的檔案、系統的設定檔等,可能都忘了加入備份機制。這類問題發生的原因通常在於沒有做好系統分析或數位資產分類。
  3. 備份沒有進行相關的檢查工作。舉例來說,確認壓縮檔可以正常解壓,又或者資料庫的備份檔可以確實地予以還原。這部份可以透過自動化的程序簡化檢查工作。
  4. 備份資料防護不足。既然備份的資料多為公司重要的數位資產,那麼做好保護以避免不相關人士的存取 (甚至竄改) 就顯得相當重要。簡單來說,備份資料的安全防護至少應等同於線上資料的安全防護,甚至是擁有更高等級的防護機制。
  5. 備份資料的存放點不足。我看過最誇張的例子就是將僅有的備份放在同一台主機的同一個分割區內。備份就是為了避免當突發狀況發生時遭受資料遺失的風險,把備份資料放在同一個分割區不就宣告只要硬碟一壞就整個 GG 了嗎?
    硬碟會不會壞?你買硬碟時廠商都清清楚楚地標示了保固期跟 MTBF,所以硬碟壞掉根本就是可預期會發生的災難。你會說我用 RAID 啊,一顆硬碟壞掉沒問題的啦,那 RAID 卡就不會故障並把資料搞亂嗎?相信我,我還真遇過。
針對上述第五點,比較嚴謹的作法可參考所謂的 3-2-1 備份法則 (3-2-1 backup rule):
  1. 每一筆資料至少擁有三個分身 (Have at least three copies of your data)
  2. 至少使用兩種以上的儲存媒介 (Store the copies on two different media)
  3. 保留其中一個分身於異地 (Keep one backup copy offsite)
把僅有的備份資料放在同一個分割區,明顯違反了 3-2-1 備份法則的所有規則。據此,我們可以考慮將主要的備份資料放在同一個機房內的網路硬碟,而次要的備份資料則放在異地。如果主要資料的所在地為辦公室,可以考慮利用雲端硬碟儲存次要的備份資料。但是如果主要的備份資料所在地為 IDC,那麼辦公室或雲端硬碟就可以擇一以用來存放次要的備份資料。透過幾個簡單的規則,下次就算發生機房失火這種極度恐怖的災難,你也可以全身而退了。


2014年2月14日 星期五

[從電影看資安] 凡瀏覽過必留下痕跡 - 超急情聖

在電影超急情聖 (Don Jon) 中,男主角 Joseph Gordon-Levitt 飾演的唐冏平日沒啥興趣,就是跟三兩好友到夜店對女生品頭論足,並各自帶著”戰利品”回去享用一番。雖然看似令許多男生羨慕不已,不過唐冏這位老兄更大的興趣竟然是上色情網站享受 DIY 的快感。
就在一次夜店行動中,唐冏遇到了由 Scarlett Johansson 所飾演芭芭拉。唐冏視芭芭拉為天菜,當然不可能放過。雖然兩人交談甚歡,但是仍舊功虧一簣,逼的唐冏只好利用人肉搜索的方式找到芭芭拉的 Facebook 帳號。
兩人交往後,唐冏不改上色情網站的嗜好,甚至當場被芭芭拉抓包。為了手上的這隻鳥,唐冏只好宣示從此放棄網路上的這片大好森林。只不過江山易改,本性難移。雖然唐冏與芭芭拉進展順利,但是唐冏卻依舊偷偷持續上色情網站滿足生理所需,直到有一天…

DIY 帶給唐冏天堂般的樂趣
vlcsnap-2014-02-11-21h00m45s38
到夜店對女生品頭論足也是一定要的啦
vlcsnap-2014-02-11-21h01m14s81
慘了,遇到"舊情人"vlcsnap-2014-02-11-21h01m35s28
甩了舊情人,馬上就發現天菜
vlcsnap-2014-02-11-21h03m59s194
被天菜打槍,只好退而求其次
vlcsnap-2014-02-11-21h05m00s45
得不到的最令人懷念
vlcsnap-2014-02-11-21h06m05s177
人肉搜索
vlcsnap-2014-02-11-21h06m33s187
可以一起看電影
vlcsnap-2014-02-11-21h06m49s71
可以在電影院熱吻
vlcsnap-2014-02-11-21h07m06s20
但是就是不能上床
vlcsnap-2014-02-11-21h08m14s142
就算上床也只能用"正常的姿勢"
vlcsnap-2014-02-11-21h10m57s18
只好看 A 片解解悶,沒想到卻被當場抓包
vlcsnap-2014-02-11-21h11m11s171
唐冏扯謊後兩人感情進展神速
vlcsnap-2014-02-12-12h07m07s100
46個?
vlcsnap-2014-02-11-21h12m26s104
唐冏該不會真不知道有瀏覽記錄這種東西吧?
vlcsnap-2014-02-11-21h12m42s27
年輕真好?
vlcsnap-2014-02-11-21h12m50s132
這下真的冏了 vlcsnap-2014-02-11-21h13m57s21
不過就是看 A 片嘛
vlcsnap-2014-02-11-21h15m48s124
心情鬱悶到只能上色情網站尋求慰藉vlcsnap-2014-02-11-21h16m16s137
芭芭拉因為瀏覽器的瀏覽記錄而發現唐冏一直欺騙她,不但持續上色情網站,甚至可說是不眠不休,因此憤而離開唐冏。
利用瀏覽器上網,對使用電腦的人來說,可是說是再自然不過的事。而瀏覽器為了提供使用者更方便的使用經驗,也加入了許多聰明的機制。像是瀏覽記錄、網頁快取、Cookie、輸入欄位 (包含密碼) 等各式記錄,都可以大幅提昇使用經驗。不過這些資料,卻也可能包含了個人的私密資料 (如上色情網站的記錄)。這些資料一旦被揭露後,輕則尷尬收場,嚴重時身分被盜用也是有可能的。如果使用的是自己的私人電腦,對此倒也不用太過緊張。不過如果使用的是其他人的電腦、甚至是公共電腦,這可就是個大問題了。
對此,各個瀏覽器都有提供所謂的清除記錄功能,可以將上述資料分別加以清除。不過在使用時因為要手動執行,所以並不是很方便。比較方便的作法,可以使用如 Chrome 瀏覽器的”無痕式視窗”。透過無痕式視窗,我們就可以放心的使用其他人的電腦或公共電腦,而不用擔心留下任何記錄。不過儘管如此,還是應該避免在這些電腦使用很重要的網路服務 (如網路銀行)。因為無痕式視窗雖然可以避免留下記錄,但是卻無法避免後門程式竊取你所輸入的資料,所以還是有可能會有帳號被盜的可能性,可是千萬輕忽不得。

2014年2月11日 星期二

[從電影看資安] 小小的 USB 隨身碟,大大的資安問題 - 決勝機密

在電影決勝機密 (Paranoia) 中,男主角亞當卡西迪 (由 Liam Hemsworth 飾演) 任職於兩大電信公司之一的懷特電信。亞當出身藍領家庭,為了過更好的生活在公司中力求表現。雖然帶領的團隊有不錯的產品,但是在一次的簡報會議中得罪了大老闆,只好整組人打包到夜店尋歡回家吃自己。不過夜店尋歡就算了,亞當竟然還把帳算到前公司的頭上。大老闆尼可拉斯懷特對此相當不爽,威脅他必須到敵對公司艾康電信去當商業間諜,竊取最新產品的資訊。亞當被逼的別無選擇,只能默然接受。面試過程相當順利,還遇到了在夜店發生一夜情的女主角艾瑪詹寧斯 (由 Amber Heard 飾演),原來她正是艾康電信的大將啊。
為了順利取得機密,亞當不但要拍新老闆賈克高達的馬屁,還得繼續陪女主角上床。就在一次翻雲覆雨後,亞當趁艾瑪洗澡時,順利從艾瑪的電腦中找到新產品的資料,並複製到 USB 隨身碟當中。亞當交差後,尼可拉斯懷特認為取得的資料還不夠,亞當只好規劃再一次的動作 - 侵入艾康研發中心竊取新產品的原型機。亞當成功利用竊取到的女主角指紋進入研發中心的管制區域,不過卻發現原來整件事是新老闆賈克高達的詭計,為的就是引誘尼可拉斯懷特犯罪,以便惡意收購懷特電信。深受無妄之災的亞當,利用原本被打槍的技術,順利取得對話記錄並指引 FBI 前往三人秘密會談的地點,讓兩個老闆一起到牢裡圍爐吃鱉。

男主角亞當是一個手機應用高手
vlcsnap-2014-02-04-22h43m33s10
健保好,沒有健保只好哭到飽
vlcsnap-2014-02-04-22h43m54s233
要升級就看這一次了
vlcsnap-2014-02-04-22h44m08s133
直接被大老闆打槍,冏
vlcsnap-2014-02-04-22h44m23s30
為什麼老外離職都只要一個紙箱就可以清完家當?
vlcsnap-2014-02-04-22h44m48s12
自動定位美女模式
vlcsnap-2014-02-04-22h45m14s37
不是應該聊聊昨晚的表現嗎?
vlcsnap-2014-02-04-22h45m26s159
表現可想而知
vlcsnap-2014-02-04-22h45m39s36
上個夜店竟然要 16000 美金!
vlcsnap-2014-02-04-22h46m07s50
當老闆就是懂得把握機會
vlcsnap-2014-02-04-22h47m50s61
快把這個笨小子推出去
vlcsnap-2014-02-04-22h47m58s134
面試裝上身
vlcsnap-2014-02-04-22h48m50s152
世界真是小小小
vlcsnap-2014-02-04-22h49m06s49
還好我已經先在夜店打好關係了
vlcsnap-2014-02-04-22h49m20s200
這種話還需要用問句嗎?
vlcsnap-2014-02-04-22h51m33s191
…
vlcsnap-2014-02-04-22h52m33s74
我絕不是在偷看女主角洗澡
vlcsnap-2014-02-04-22h52m46s206
目錄已經被鎖定
vlcsnap-2014-02-04-22h53m08s113
不怕,因為…
vlcsnap-2014-02-04-22h53m17s5
密碼就藏在包包裡!
vlcsnap-2014-02-04-22h53m39s226
WiFi 密碼也都幫你傳便便
vlcsnap-2014-02-04-22h54m00s146
既然有 USB 隨身碟,連 WiFi 是連心酸的嗎?
vlcsnap-2014-02-04-22h54m35s0
為什麼我老是找不到重要的檔案在哪裡?
vlcsnap-2014-02-04-22h54m45s106
雖然有些事情慢點好,但是不包含 USB 隨身碟的速度
vlcsnap-2014-02-04-22h55m32s72
還好動作夠快,順利取得資料
vlcsnap-2014-02-04-22h55m45s203
USB 隨身碟是一個偉大的發明,帶給我們方便的生活。不過 USB 隨身碟帶來的資安風險,卻也是讓人頭痛不已。USB 隨身碟的問題有兩個面向,一個是往內,另外一個則是往外的。所謂的往內,就是一些惡意的後門程式透過 USB 隨身碟進入電腦,甚至因而擴散到其他的電腦設備。而往外則是不應該外流的資料透過 USB 隨身碟洩漏出去。兩者相較,前者算是比較單純的問題,而後者則複雜許多。原因在於外流的資料包含兩種情況,一種是無意的,另外一種則是有心。一旦這兩種情況混在一起,就會產生方便性與安全性考量的衝突。電影中,男主角利用 USB 隨身碟帶走了女主角電腦中的機密資料就屬於有心的資料外流意外。雖然女主角有針對目錄進行鎖定,但是把密碼跟電腦一起放在包包裡,就跟把 ATM 提款機密碼寫在提款卡上面的行為一樣智障。
針對 USB 隨身碟的資安問題,一般常見的簡單手法包含限制 USB 使用、限制可連線的 USB 設備等。不過這些手法通常只有開跟關的選擇,應用上的限制較多,比較完整的方案則屬於資料外洩防護 (DLP) 與加密 (DRM) 兩種類型。簡單來說,DLP 著重在資料流出前的保護,而 DRM 則在流出後的保護。流出後的保護?沒錯,因為前面說到資料的流出可能是無心的 (例如 USB 隨身碟遺失),甚至是必要的 (如透過 USB 隨身碟把檔案交給第三方),而 DRM 可以確保這類狀況不會危害到資料的安全。在技術上,DLP 與 DRM 並不是二選一的問題。不過在實務應用與經濟考量上,DLP 與 DRM 通常不會一起導入,甚至一同運作時會互相影響。至於要選哪個,就看企業自己的評估與考量了。

About