bro框架-- 地理定位
原文地址:
在處理策略指令碼的時候可能需要知道一個ip地址所在的地理區位。Bro支援GeoIP庫。為了使用這個功能,您需要先安裝libGeoIP軟體,並在構建Bro之前安裝GeoLite city資料庫。
安裝libGeoIP:
在構建Bro之前需要安裝libGeoIP
FreeBSD:
sudo pkg install GeoIP
RPM/RedHat-based Linux:
sudo yum install GeoIP-devel
DEB/Debian-based Linux:
sudo apt-get install libgeoip-dev
Mac OS X:
從你喜歡的包管理系統中安裝(比如MaccPorts, Fink, Homebrew)。你所需要的包的名字可能是libgeoip, geoip, geoip-dev,這依賴於你所使用的管理系統。
GeoIPLite資料庫安裝:
下載GeoLite city binary database:
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
檔案需要重新命名並且放在GeoIP資料庫目錄下。這個目錄應該已經存在,它會根據你使用的平臺和包而變化。對於FreeBSD而言,使用/usr/local/share/GeoIP。對於linux,使用/usr/share/GeoIP或者/var/lib/GeoIP(選擇存在的那個)。
mv GeoLiteCity.dat <path_to_database_dir>/GeoIPCity.dat
注意,有一個單獨為IPv6地址準備的資料庫,想要的話你也可以裝。
測試:
在使用GeoIP功能之前,先驗證一下裝的對不對。用下面的語句試一試。
bro -e "print lookup_location(8.8.8.8);"
如果你看到類似於“Failed to open GeoIP City database”的訊息,你可以嘗試重新命名或者移動你的GeoIP city資料庫檔案(錯誤資訊會給你Bro要找的資料庫檔案的完整路徑)。
如果你看到類似於“Bro was not configured for GeoIP support”的訊息,你可以嘗試重新構建Bro並保證它連線了libGeoIP。正常情況下,如果libGeoIP正確安裝了,它會在構建Bro的時候自動找到。如果這樣不行,你可以嘗試將路徑指向libGeoIP的安裝路徑(比如 ./configure --with-geoip=<path>)。
使用方法
有一個內建的函式提供GeoIP的功能:
function lookup_location(a:addr): geo_location
函式lookup_location的返回值是record型別geo_location,它由包含了一個ip地址的國家(country),地區(region),城市(city),緯度(latitude),經度(longitude)等資訊。這些值不一定全都有,所以在取值之前先驗證是否有這個值。
例子
從Ohio州的主機來的每個ftp連線,非常容易:
event ftp_reply(c: connection, code: count, msg: string, cont_resp: bool)
{
local client = c$id$orig_h;
local loc = lookup_location(client);
if (loc?$region && loc$region == "OH" && loc$country_code == "US")
{
local city = loc?$city ? loc$city : "<unknown>";
print fmt("FTP Connection from:%s (%s,%s,%s)", client, city,
loc$region, loc$country_code);
}
}