若要管理好網路,勢必需要大量的參考資訊,其中較常用的莫過於Syslog,但各家設備商的格式並不相同,因此需要有能夠整合各家設備Syslog的系統並自由調整格式,以應付不同的需求。為此本文將示範安裝及使用Graylog,實際建立新模板,以符合實際要求。
網管人員在管理網路時,需要大量的參考資訊,除了由網管軟體主動至設備抓取所需資訊外,常見的被動資料來源,包含了Syslog、SNMP Trap、NetFlow、流量圖等資訊,其中較常用且易用的莫過於Syslog。但Syslog的格式往往隨設備商不同而有所差異,因此在維運時需要能整合各家設備之Syslog的系統,並且可以自由調整格式,以應付各式各樣的需求。在本文中,將介紹開源的Graylog,並示範如何安裝及使用,且實際建立一個新模板,以符合管理者的需求。
實作環境介紹
目前市面上的Log收集分析軟體很多,各家業者也各自有搭配的相關軟硬體可茲使用,但這些收集分析軟體往往需要另行購買硬體或支付費用,因此可自行定義過濾器、產出報表,並且不須額外支付費用的開源軟體,是很好的選擇,本文介紹的Graylog更是其中的翹楚,它操作容易、介面美觀、功能強大,因此這裡特別撰文介紹之。
安裝環境說明
本次實作所使用的作業系統為Ubuntu Server 20.04.3,須另外安裝的軟體可參考系統架構圖,如圖1所示,包含了MongoDB、Elasticsearch。MongoDB的版本是4.0,Elasticsearch的版本為7.10.2,而Graylog的版本是4.2.4。
圖1為Graylog的架構圖,從圖中可以看出Graylog扮演的角色,它必須收集來自設備或應用程式的Log並轉存至MongoDB,並藉由Elasticsearch提供搜尋功能,最後透過瀏覽器(Browser)的介面提供使用者查詢及使用。
圖2則是Graylog的封包流程圖,在此圖中可以看出其元件及資料處理的流程,在Source送出Message之後,Graylog會先由Inputs做接受,Inputs裡面可以有許多Input,針對原始訊息做不同的處理。接著,把處理後的訊息丟給Filter Chain處理,接著Extractor Filter會把訊息拆解後,對應到個別的欄位(Static Filed Filter),再套用到Steam Matched Filter,以便在GUI畫面中展示。
同時,它也會把整理好的Steam編碼存入MongoDB。Message會加上Stream的ID後,傳遞給Output Router處理。最後,再看使用者是要查看所有訊息(在Search頁面,預設輸出所有訊息),或者是只查看自行的輸出。
安裝設定Graylog相關套件
Graylog的官方網站有詳細的說明,只要參考執行即可。之後若更新,請遵照網站說明進行調整,官網說明網頁為「https://docs.graylog.org/docs/operating-system-packages」,其中提供了許多Linux Distribution的範例。本例使用的是Ubuntu,因此請點選Ubuntu的連結,並依照連結進行安裝。
在登入設備的CLI後,先使用apt更新所有套件並進行升版:
sudo apt-get update && sudo apt-get upgrade
接著安裝apt-transport-https,讓apt可以透過https進行安裝。
也一併安裝openjdk套件(在此選擇使用11版,請依自身需求自行調整)、UUID函式庫的執行環境,以及隨機密碼生成器PWGEN:
sudo apt-get install apt-transport-https openjdk-11-jre-headless uuid-runtime pwgen
安裝MongoDB
接著安裝MongoDB,先新增它的GPG Key:
sudo apt-key adv --keyserver hkp:// keyserver.ubuntu.com:80 --recv 9DA3162 0334BD75D9DCB49F368818C72E52529D4
新增完成後,接著將之加入apt的Source List:
echo "deb [ arch=amd64 ] https://repo.mongodb. org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list. d/mongodb-org-4.0.list
最後,同樣使用apt更新套清名單並進行安裝:
sudo apt-get update sudo apt-get install -y mongodb-org
安裝完成後,設定mongodb於開機時就自動啟動:
sudo systemctl daemon-reload sudo systemctl enable mongod.service sudo systemctl restart mongod.service sudo systemctl --type=service --state =active | grep mongod
最後,確認一下目前mongodb是否已正常運作:
ss -an | grep mongo
若可以看到包含sock的輸出,代表mongodb正常運作中:
u_str LISTEN 0 128 /tmp/mongodb-27017.sock 71037 *0
安裝Elasticsearch
接著安裝Elasticsearch,同樣地,新增其GPG Key並透過apt進行安裝。先下載GPG Key,並命名為myKey:
wget -q https://artifacts.elastic.co/GPG- KEY-elasticsearch -O myKey
接著,使用apt-gey指令新增myKey:
sudo apt-key add myKey
並且,將elasticsearch的資訊新增至apt的Source List:
echo "deb https://artifacts. elastic.co/packages/oss-7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/ elastic-7.x.list
最後,更新apt的軟體清單並安裝elasticsearch:
sudo apt-get update && sudo apt-get install elasticsearch-oss
同樣地,將elasticsearch設定為開機後就啟用:
sudo systemctl daemon-reload sudo systemctl enable elasticsearch. service sudo systemctl restart elasticsearch. service sudo systemctl --type=service --state=active | grep elasticsearch
啟動之後,可以使用「ps ax | grep elasticsearch」來確認elasticsearch是否已在執行中。
安裝Graylog Server
在安裝Graylog Server之前,必須提供GPG key以及更新apt所需使用的sources.list。因此,先下載最新的Graylog Repository套件:
wget https://packages.graylog2.org/repo/ packages/graylog-4.2-repository_latest.deb
接著,安裝此套件:
sudo dpkg -i graylog-4.2-repository_latest.deb
最後,更新apt的軟體清單,並下載安裝graylog-server及相關套件:
sudo apt-get update sudo apt-get install graylog-server graylog-enterprise-plugins graylog- integrations-plugins graylog- enterprise-integrations-plugins
然後,編輯設定檔「/etc/graylog/server/server.conf」,要在password_secret及root_password_sha2的部分,新增其對應的密碼。首先,必須產生密碼。
這裡使用以下指令產生sha2的密碼,它會要求輸入密碼,請牢記這一組密碼,這是待會登入管理介面時使用的密碼。接著它會產生sha2的編碼,將之複製:
echo -n "Enter Password: " && head -1
接著,開啟「/etc/graylog/server/server.conf」,把剛複製的sha2編碼貼在「root_password_sha2 =」的後方,並且存檔。
之後要設定API密碼,使用「pwgen -N 1 -s 96」指令隨機產生一組密碼,將之複製後開啟「/etc/graylog/server/server.conf」,找到「password_secret =」,將之貼在其後。最後,找到「http_bind_address =」將之修改為自己的IP和Port,例如「http_bind_address = 0.0.0.0:9000」,並且存檔。之所以設定為0.0.0.0,是因為目前的伺服器有兩張網路卡,一張對外,一張對內。若只有一張網卡可設定為192.168.22.129:9000,請依自己的狀況調整。
最後,必須設定正確的時區,以便於後續的管理及觀察。同樣編輯server.conf,找到root_timezone,將其前方的#號刪除,於其後方加上Asia/Taipei,並且儲存檔案,這裡的timezone務必與伺服器本身的設定相符。
終於到了最後一個步驟了,將設定Graylog於開機後啟動,並將之執行:
sudo systemctl daemon-reload sudo systemctl enable graylog-server. service sudo systemctl start graylog-server.service sudo systemctl --type=service --state=active | grep graylog
同樣地,也可以使用「ss -an | grep 9000」指令,以確認Graylog是否在9000 Port等待連線。
Graylog基本操作介紹
使用瀏覽器開啟「192.168.22.129:9000」(請代換為自己的IP),帳號預設為admin,密碼是剛用以建立sha2 hash的密碼,如圖3所示。
接著,以實際案例來示範如何接收Fortigate UTM的syslog,但這邊要說明的是,Fortigate的產品隨著版本不同,其syslog的格式會有些許不同。因此,如果使用的是網路上提供的範例時,須確認其配合的版本。其他廠商的產品部分,也有相同的情形,所以使用時務必先進行確認。
先點選紅色的告警圖示(圖4上方第一排紅底白字,數字為2的按鈕),可以看出,目前沒有任何running input。在Graylog,input代表用來接收告警的接受器,因此需要先建立input。
點選上面選單System,再點選下拉式選單的inputs,此時選單會變成System/Inputs,可以看到目前沒有任何的Inputs。點選「Select input」,查看目前有哪些內建的Inputs。在此先做簡單的測試,確認設備的syslog能丟到Graylog,而且Graylog能顯示這些記錄。找到「Raw/Plaintext UDP」,並點選「Launch new input」,如圖5所示。
在Title的部分,輸入Plaintext Test。另外,在Port部分使用預設的5555,待會兒將設定設備使用UDP 5555傳送syslog,最後點選下方的〔Save〕按鈕,如圖6所示。
設定完成後,回到Graylog Server的CLI,執行「ss -anu | grep 5555」,以確認UDP 5555 Port是否已在待命接受連結(可比較執行前後的輸出)。另外,由於這裡未使用root權限執行Graylog,因此Port的部分只能使用1024以上的數字,在測試的時候須多加留意。
接著回到設備端,進行設備的相關設定。這裡使用的是Fortigate的設備,由於原先已有Syslog Server的設定,因此設定第二台Syslog Server(syslogd2),將之enable設定Port 5555,並指定Server IP和source-ip。另外,Fortigate設備早期的版本僅能使用預設的UDP Protocol,所以在設定Graylog時也使用對應的UDP Protocol設定,設定結果如圖7所示。
然後,使用diagnose packet指令確認有送出syslog,並確認Server IP正確,結果如圖8所示,其輸出符合原先預期。
最後回到Graylog的GUI介面,確認有沒有收到syslog。先點選「System」,再點選其中的「Inputs」。目前只有一個input,觀察其最右方的「Throughput/Metrics」的輸出結果,如圖9所示,可以發現「1 minute average rate」目前每秒有2個msg,在Network IO部分也有收到526.8KiB的資料,因此能夠確認已經收到來自設備的syslog。
緊接著點選上方主選單的「Search」,就可以看到目前收到的資料。要注意的是,目前尚未對這些訊息做相關處理,因此沒有辦法對原始訊息做有效的分類及管理,拆解原始訊息的功能在Graylog稱為extractor,使用者可以自行撰寫extractor,用以做訊息的parser,或者匯入及使用別人寫好的extractor來message拆解其內容。Search的輸出結果如圖10所示,已有初步的查詢功能。綠色的搜尋按鈕後方可輸入字串,搜尋其相關內容。
點擊圖10下方藍色的文字,可以查看message的內容,如圖11所示。在此可以觀察到,目前只有拆分出message、source及timestamp三種欄位。可以根據欄位做出各種報表,但目前只有三個欄位,因此能做出的報表極為有限。
匯入並使用Code Pack
接下來,示範如何使用別人提供的Code Pack,來提供extractor及其他模組的功能。先點選上方「System」,再點選「Content Packs」,可以開啟Content Packs的頁面,右邊綠色的是「Upload」,可以上傳別人寫好的Content Packs json檔。若點選「Create a Content Pack」,可自行建立Content Pack,在建立過程中可以直接從網路上讀取別人寫好的json檔,Content Pack管理頁面如圖12所示。
在此點選「the Graylog Marketplace」,瀏覽器會自動開啟「https://marketplace.graylog.org/」頁面,接著點選「Content Pack」,這是由網友所撰寫各式各樣的Content Pack,其中包含Inputs、Outputs、extractor、Indices、stream、dashboards這些模組,每個Content Pack包含的模組不同,可以自由挑選使用。
可以逐頁搜尋需要的套件,亦可使用上方搜尋功能。在此輸入「fortigate」,並點選搜尋圖示,如圖13所示。
由於Fortigate產品的syslog格式可能會隨著版本不同而有所差異,因此當使用別人的Content Pack時,務必認明其適用的版本(也可以自行調整或建立input的extractor來對應其格式)。此外,有些網友也會提供自己撰寫的Content Pack於GitHub網站上,若需要可上去尋找。
這裡測試的是FortiOS 5.6版本,在嘗試幾個檔案後,大部分的Content Pack無法安裝,而Fortigate 6.x Content Pack for graylog3可安裝但無法正常使用(僅能短暫使用,可能是因為適用的Forti OS不同,其syslog格式有些許差異的關係)。
最後,選擇使用在設定上比較麻煩,但可以穩定運作的Fortigate CEF Logs。查看其在GitHub上的說明,作者表示適用於FortiOS 7.0.3的格式,但在FortiOS 6.4也應該能正常運作。在沒有其他更好的選擇下,先下載測試。在搜尋頁面中找到Fortigate CEF Logs,將之點選,它會展開於原先的頁面,接著點選「Download from Github」,如圖14所示。它會開啟在原頁面,將之下載備用。
在此要提醒一下,有一些Content Pack在下載時會出現「404: Not Found」的錯誤訊息,其原因是作者未將檔名命名為Graylog規定的content_pack.json,可以點選「View on Github」,在它的目錄中找到副檔名為.json的檔案,再將之下載備用,或者複製其連結,在手工打造Content Pack或extractor時,再行匯入使用。
一般的content大多包含了inputs、streams及dashboards。通常inputs裡面就會包含我們需要的extractor。在extractors中,可以看出它使用哪些方法來做欄位的切割及內容的判讀。但這個Content Pack比較特別,它只有dashboard、search及stream,這代表需要自己建立input(資料來源)或者使用既有的input進行修改。試過幾次後發現,操作上沒有太困難的地方,所以不用太過擔心。
先將之前建立測試用的Input刪除,點選「System」裡面的「Inputs」,找到先前建立的「Plaintext Test」,再點選「Stop Input」,接著點選「More actions」,會展開選單,之後點選「Delete input」,如圖15所示。Graylog會再次詢問是否刪除,點選確定,將之刪除。
要將這個json檔上傳至Graylog,回到「System/Inputs」,再選擇「Content Packs」,然後選擇「Upload」,如圖16所示。
點選「選擇檔案」,並選擇剛下載的content_pack.json,最後點選「Upload」,如圖17所示。
接著,安裝剛上傳的Fortigate CEF Logs - Content Pack。將畫面拉到最下方,找到Fortigate CEF Logs - Content Pack,並點選「Install」,如圖18所示。
觀察「Entity list」可以看出會建立dashboard、input及steam的entity,然後點選「Install」進行安裝,操作畫面如圖19所示。
再來要設定Fortigate,可依照Fortigate CEF Logs在GitHub上的說明網頁執行相關設定。首先修改Graylog的設定檔,回到Graylog Server的CLI介面,編輯「/etc/graylog/server/server.conf」,找到allow_leading_wildcard_searches及allow_highlighting,將之設定為true,並重啟Garylog daemon:
sudo systemctl restart graylog-server. service
再來要建立index,index的目的是在message遭到input分割後,讓stream定義讀取時的欄位。回到GUI,點選「System」,再點選「Indices」(Indices指是index的複數)。接著點選右上角的「Create index set」,如圖20所示。
在Title及Description部分,皆輸入Fortigate CEF Logs,Index prefix部分則輸入fortigate_cef,最後拉到頁面最下方點選「Save」。再回到Inputs頁面,建立一個新的input。找到「CEF UDP」,並點選「Launch new input」,如圖21所示。Title的部分請輸入Fortigate CEF Logs,以茲識別。
緊接著,對Fortigate設備進行調整,進入Fortigate的CLI介面,修改其Log的格式。本次範例如下,把format設定為cef,其餘設定照舊即可:
config log syslogd2 setting set status enable set server "aaa.bbb.com.tw" set port 5555 set format cef end
接著回到Graylog的Search頁面,可以看到產生許多新的柱狀圖。點選其下方的All Messages中任一個message。部分截錄如圖22所示,再往下拉還有幾十個欄位,可以看出原始訊息已經被切割成各種欄位並賦予其資料。
再回到「Steams」,這裡除了預設的All messages、All system events及Processing and Indexing Failures,也可以看到Code Pack自行安裝的Fortigate CEF Logs,可以點選它,查看專屬的訊息,若有其他輸入,亦可點選「All messages」查看其他訊息,如圖23所示。
最後點選「Dashboards」,查看相關報表。點選「Dashboards」後,在下方有許多Fortigate CEF Logs自行定義報表,而點選「Fortigate - IPS Alerts」,可以看到Fortigate CEF Logs設計的圖表,如圖24所示,它仿照一些常見的網管軟體已經把常見的資安報表製作成圖表,供管理者自行查閱。
結語
Graylog的操作難度不高,擴充性很強,不妨花一些時間研究自行調校,以滿足工作上的需求。另外限於篇幅,如何自訂extractor、設定alert,匯出report,有機會的話再進行相關的介紹。
<本文作者:丁光立,在ISP工作多年。對於Cisco設備較熟悉,除此之外也研究Linux,這幾年慢慢把觸角伸到資安的領域,並會在自己的blog(http://tiserle.blogspot.com/)分享一些實務上的經驗和測試心得。>