OSSIM的Session存儲問題研究

**php

  • OSSIM的Session存儲問題研究

**前端

1.多Web服務共享SESSION數據
最初咱們在開發OSSIM時,爲了讓用戶登陸多個集成工具的Web界面,好比在OSSIM下有四個應用都是B/S架構:
https://1.2.3.4/nagios
https/1.2.3.4/ocs
https://1.2.3.4/ntop
https://1.2.3.4/openvas
登陸OSSIM系統的用戶是統一的、即一套用戶名、密碼在整個網站的各個模塊中都是能夠登陸使用的,各個服務器共享用戶數據比較容易實現,只須要在後端設置數據庫服務器,各服務器(Ntop、Nagios、OpenVas)經過統一接口對用戶數據進行訪問。用戶在該服務器登陸以後,進入另外一個服務器的別的模塊時,仍然須要從新登陸,這稱爲一次登陸,所有通行的問題,映射到技術上,其實就是各個服務器之間如何實現共享 SESSION 數據的問題。mysql

2. SESSION原理
OSSIM前端主要利用PHP、Python開發在解決問題以前,先來了解一下 PHP SESSION 的工做原理。客戶端(如瀏覽器)登陸網站時,被訪問的 PHP 頁面可使用 session_start() 打開 SESSION,這樣就會產生客戶端的惟一標識 SESSION ID。SESSION ID 能夠經過兩種方式保留在客戶端,將 SESSION ID 自動加入到 GET 的 URL 中,或者 POST 的表單中,默認狀況下,變量名爲 PHPSESSID;另外一種是經過 COOKIE,將 SESSION ID 保存在 COOKIE 中,默認狀況下,這個 COOKIE 的名字爲 PHPSESSID。這裏咱們主要以 COOKIE 方式進行說明。
SESSION 的數據保存在哪裏呢?固然是在服務器端,但不是保存在內存中,而是保存在文件或數據庫中。默認狀況下,php.ini 中設置的 SESSION(位於/etc/php5/apache2/php.ini), 保存方式爲 files(session.save_handler = files),即便用讀寫文件的方式保存 SESSION 數據,而 SESSION 文件保存的目錄由 session.save_path 指定,文件名以 sess_ 爲前綴,後跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。OSSIM數據庫中用」alienvault.sessions」存儲session的內容。
若是訪問量大,可能產生的 SESSION 文件會比較多,這時能夠設置分級目錄進行 SESSION 文件的保存,效率會提升不少,設置方法爲:session.save_path="N;/ path",N 爲分級的級數,save_path 爲開始目錄。當寫入 SESSION 數據的時候,PHP 會獲取到客戶端的 SESSION_ID,而後根據這個 SESSION ID 到指定的 SESSION 文件保存目錄中找到相應的 SESSION 文件,如不存在則建立,最後將數據序列化以後寫入文件。讀取 SESSION 數據是也是相似的操做流程,對讀出來的數據須要生成相應的 SESSION 變量。ios

3.判斷用戶權限
在OSSIM多用戶的權限控制,經過Session實現,用Session判斷用戶權限是最簡便的一種處理權限判斷的方式。用戶成功登陸以後將信息存儲在$_SESSION["user"]中。在頁面中,判斷$_SESSION["user"]是否有用戶信息存在,若是有用戶信息保存在Session中,則在頁面上顯示出用戶信息。redis

4.共享SESSION 的實現方案
經過介紹 SESSION 的工做原理,咱們發現,在默認狀況下,各個服務會各自分別對同 一個客戶端產生 SESSION ID,如對於同一個用戶瀏覽器,假設Ntop服務器產生的 SESSION ID 是rohq43bpasoibp7g87knfm6er0,而Nagios 服務器生成的則是 a72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION 數據都是分別保存在本服務器的文件系統中。
肯定問題所在以後,就可着手解決。想要共享SESSION 數據,就必須實現兩個目標:一個是各個服務器對同一個客戶端產生的 SESSION ID 必須相同,而且可經過同一個cookie 進行傳遞,也就是說各個服務器必須能夠讀取同一個名爲 PHP SESSID 的cookie; 另外一個是 SESSION 數據的存儲方式/位置必須保證各個服務器都可以訪問到。
第一個目標的實現其實很簡單,只須要對cookie的域進行特殊設置便可,默認狀況下,COOKIE 的域是當前服務器的域名/IP 地址。
從外部看管理員登錄OSSIM系統只用到了一個用戶名密碼,但系統內部存在多個Web服務器,因爲內部還有關聯引擎,須要頻繁調用各Web系統的數據,這樣Session的讀寫會更頻繁,若是沒有好的方案會是系統性能下降,傳統方法,使用基於文件的Session存取,這樣作缺點是瓶頸可能都是在磁盤IO操做上,因此對付小數據量的Session沒有問題(對於OSSIM3.1以前的系統數據量較小),利用Memcache來保存Session數據,同時作數據庫緩存,直接經過內存的方式,不過缺點是宕機後數據會丟失。
但OSSIM4.3及以上系統會有大數據量的Session,可能沒法勝任,這時可考慮安裝redis。例如存儲 session 的服務被重啓,全部用戶都必須從新得到 session ... 瞬時數據庫壓力會很大,而用 redis 則不會 ...
OSSIM 的Web系統設計成超時15分鐘會註銷,這也是經過Session實現。Session 是如何來判斷客戶端用戶呢?它是經過 Session ID 來判斷Session ID 是隨機生成的,所以能保證惟一性和隨機性,確保Session 的安全。通常若是沒有設置 Session 的生存週期,則 Session ID 存儲在內存中,關閉瀏覽器後該 ID 自動註銷,從新請求該頁面後,從新註冊一個 Session ID。sql

5.Memcache與MySQL並肩做戰
memcache是一個高性能的分佈式的內存對象緩存系統,經過在內存裏維護統一的巨大的hash表,它可以用來存儲Sessio,當系統須要是從內存中讀取,從而大大提升讀取速度。OSSIM 4.1之後的全部系統中,採用了Memcached這個高性能的內存對象緩存系統,用於動態Web應用,主要對OSSIM各個數據庫讀寫進行緩存,以減輕MySQL數據庫的負載,配置文件讀者參考/usr/share/ossim/include/ossim_db.inc、/usr/share/ossim/include/php-ids.ini。用這種方式也是OSSIM的緩存方案之一。讀者或許會產生疑問,MySQL自己既有table_cache、query_cache機制,咱們用如下命令在數據庫中查看:
mysql> show variables like '%query_cache%';
在查詢常常變化、表內容常常變化的場景中(OSSIM的存儲、查詢就是這樣一種狀態)這個樣一個簡單的緩存系統根本沒法達到有效緩解數據庫壓力的目的。這就比如在Apache中提供的mod_disk_cache和mod_mem_cache沒法真正爲Web Server提供緩存樣,後面還須要Squid等緩存工具。
memcache經過在內存中緩存數據和對象來減小讀取數據庫的次數,因此爲OSSIM系統提供更大的內存,有助於發揮memcache的做用,從而提升總體性能。另外爲了可以可視化的觀察緩存效果,你們可使用memadmin工具來查看。
配置memcached:
/etc/default/memcached //控制開啓
/etc/memcached.conf //配置memcached參數
Ossim調用memcache,端口11211的配置文件/usr/share/ossim/www/forensics/includes/base_db.inc.php
/usr/share/php/adodb/adodb.inc.php
/usr/share/php/adodb/adodb-memcache.lib.inc.php數據庫

6 查看memcache狀態
下面咱們採用telnet命令測試memcache工做狀態,首先輸入如下命令:apache

telnet 127.0.0.1 11211

注意,Ossim Server默認沒有telnet須要本身安裝,後面的」11211」表明memcache通選端口。
而後,直接輸入「stats」命令就能夠獲得當前memcache狀態。
表1- memcache狀態信息
pid
memcache服務器的進程ID,1416後端

uptime
服務器已經運行的秒數,12898瀏覽器

time
服務器當前的unix時間戳,1423550546

version
memcache版本 1.4.5

pointer_size
當前操做系統的指針大小,64

rusage_user
進程的累計用戶時間,0.220013

rusage_system
進程的累計系統時間,0.144009

curr_connections
當前打開着的鏈接數,6

total_connections
從服務器啓動之後曾經打開過的鏈接數,115

connection_structures
服務器分配的鏈接構造數,14

cmd_get
get命令(獲取)總請求次數,1402

cmd_set
set命令(保存)總請求次數,778

get_hits
總命中次數,829

get_misses
總未命中次數,573

limit_maxbytes
分配給memcache的內存大小(字節),13421778

若是須要將緩存重置到乾淨狀態則輸入「flush_all」命令。

7.使用memcache存儲Session
Apache服務器的PHP Session都給Memcached ,這樣不管把 IP鏈接分給哪一個Web服務器都不會有問題,配置方法很簡單,就在PHP的配置文件內增長一條語句就能夠了,不過前提須要裝好memcache模塊用memcache 來存儲 session 在讀寫速度上會比 files 時快不少,並且在多個服務器須要共用 session 時會比較方便,將這些服務器都配置成使用同一組 memcached 服務器就能夠,減小了額外的工做量。缺點是 session 數據都保存在 memory 中,持久化方面有所欠缺,但對 session 數據來講也不是很大的問題。
注意,在OSSIM系統中採用memcache的目的是提升訪問速度,減少MySQL數據庫的壓力。經過修改/etc/default/memcached配置文件中ENABLE_MEMCACHED=yes/no控制其開關。

詳細OSSIM內容,請參見暢銷書《Unix/Linux網絡日誌分析與流量監控》

相關文章
相關標籤/搜索