osqueryd
osqueryd(osquery daemon)是可以定期執行SQL查詢和記錄系統狀態改變的駐守程序。
osqueryd能夠根據配置手機歸檔查詢結果,並產生日志。
同時也可以使用系統事件的API來記錄文件、文件夾的變化,硬件事件,網絡事件等等。
osqueryd啟動默認讀取/var/osquery/osqueryd.conf配置文件。
當然也可以使用osqueryd --config_path來指定啟動時使用的配置文件。
日志
osqueryd可以以日志的方式,記錄下其工作,及執行結果。日志保存在/var/log/osquery中。
/var/log/osquery中主要有兩種日志:
- osqueryd.INFO/osqueryd.WARNING:主要記錄了osqueryd運行時的一些日志。
- osqueryd.results.log/osqueryd.snapshots.log:主要記錄了osqueryd定期執行的查詢的結果。
執行結果可以看到有results和snapshots之分。
日志的結果可以使用logstash之類的工具,通過監控對應的文件實現收集。
results
results是不僅僅執行SQL查詢,同時會保存執行的結果。在下次執行時,會進行比較。
如果結果改變,則會在osqueryd.results.log中生成一條新增的記錄。如果沒有改變,則不生成。
{
"name": "proc_num",
"hostIdentifier": "localhost.localdomain",
"calendarTime": "Fri Jul 1 03:14:31 2016 UTC",
"unixTime": "1467342871",
"decorations": {
"aluptime": "413315",
"host_uuid": "faa346a2-1b63-4279-a478-d53811043d77",
"inuptime": "413284",
"seconds": "413150",
"username": ""
},
"columns": {
"num_proc": "113"
},
"action": "added"
}
生成新的數據記錄的同時會移除先前的數據記錄,並生成一條"action":"removed"的記錄(也可以選擇不記錄。可以在schedule里配置)。
從記錄里可以看到,除了action,記錄里還有幾部分。
- name: schedule的名字,來自於schedule中的配置(下文詳述)
- hostIdentifier: host的id,可以在options中配置(下文詳述)
- calendarTime: 執行命令發生的時間
- unixTime: 執行命令發生的unix時間
- decorations: 一些附加的信息,來自於decorators中的配置(下文詳述)
- columns: 一個字典來自於schedule的查詢結果。key是sql中對應的列,value是查詢的結果值。所以這里要求schedule查詢的結果最多只能有一行。
snapshots
snapshots跟result大同小異。區別在於snapshots是對每次查詢結果均生成記錄。其樣例如下:
{
"snapshot": [{
"num_proc": "112"
}],
"action": "snapshot",
"name": "proc_num",
"hostIdentifier": "localhost.localdomain",
"calendarTime": "Thu Jun 30 18:26:40 2016 UTC",
"unixTime": "1467311200",
"decorations": {
"aluptime": "381644",
"host_uuid": "faa346a2-1b63-4279-a478-d53811043d77",
"username": ""
}
}
osqueryd.conf
osqueryd.conf是osqueryd的配置文件,json格式。下面是一個樣例。
{
"options": {
"config_plugin": "filesystem",
"logger_plugin": "filesystem",
"logger_path": "/var/log/osquery",
"log_result_events": "true",
"schedule_splay_percent": "10",
"events_expiry": "3600",
"verbose": "true",
"worker_threads": "2",
"enable_monitor": "true"
},
"schedule": {
"system_info": {
"query": "SELECT hostname, cpu_brand, physical_memory FROM system_info;",
"interval": 60
}
},
"decorators": {
"load": [
"SELECT uuid AS host_uuid FROM system_info;",
"SELECT user AS username FROM logged_in_users ORDER BY time DESC LIMIT 1;"
]
},
"packs": {
"process-monitor": "/etc/osquery/process-monitor.conf"
}
}
可以看到這里包含了options,schedule,decorators,packs幾個部分。下面分別來進行介紹。
options
options里主要包含的是osquery daemon的一些配置。這里主要介紹幾個:
- logger_path 日志路徑
- worker_threads worker的線程數(並不是越大越好,根據自己任務的多少設定)
- host_identifier 在產生result時候的hostIdentifier
更多配置的含義可以參考這里。
decorators
decorators主要用於在記錄result的時候,添加額外的信息到decorations中。
decorator分為三種,load,always,interval。
decorator的查詢結果最多只能有一行(可以為空)。
- load: 在配置加載的時候,執行一次,並記錄結果,之后在每次decorations添加的是加載時的執行結果
- always: 每次記錄result的時候執行,並在decorations中添加執行結果
- interval: 配置是一個字典。只有當匹配中對應的key時,才進行執行,並添加執行結果
如下例:
{
"decorators": {
"load": [
"SELECT version FROM osquery_info",
"SELECT uuid AS host_uuid FROM system_info"
],
"always": [
"SELECT user AS username FROM logged_in_users WHERE user <> '' ORDER BY time LIMIT 1;"
],
"interval": {
"3600": [
"SELECT total_seconds AS uptime FROM uptime;"
]
}
}
}
在加載時獲得version和host_uuid。在每次執行時臨時獲取username。當定時執行的任務時間間隔為3600是,獲取uptime。
schedule
定時執行的任務。該任務會定時去執行SQL查詢,並生成result/snapshot記錄。其配置樣例如下:
{
"schedule": {
"system_info": {
"query": "SELECT hostname, cpu_brand, physical_memory FROM system_info;",
"interval": 60,
"removed": false,
#"snapshot":true
}
}
}
schedule是一個字典。key就是每個schedule的name,value是每個schedule的配置。
比如這個system_info即是schedule的name。
在schedule的配置里
- query: 查詢的SQL語句
- interval: 查詢間隔
- removed: 是否生成removed的記錄
- snapshot: 是否是snapshot類型(默認為result)
可以到這里查看更多關於schedule配置的信息。
packs
packs可以看做是一系列schedule的集合。osquery提供了一些常用的查詢。在配置文件里,可以做如下配置:
{
"packs": {
"process-monitor": "/etc/osquery/process-monitor.conf"
}
}
packs是一個字典。key是pack的名字,value是pack文件的路徑。再來看/etc/osquery/process-monitor.conf:
{
"discovery": [
"select pid from processes where name = 'foobar';",
"select count(*) from users where username like 'www%';"
],
"queries": {
"pack_proc_num":{
"query": "select count(*) as num_proc from processes;",
"interval": 60,
"removed": false
}
}
}
discovery是用於判定是否在該host上執行queries。discovery是一個列表,包含多個SQL查詢。多個查詢結果直接是or關系。如上例,如果該host上存在一個foobar的進程或者存在以www開頭的用戶名,則執行queries。這個discovery的判斷只在配置加載時做一次判斷。
queries是一個字典。其格式和內容與schedule一致,這里不再重復。
