Facebook開源的基於SQL的操作系統檢測和監控框架:osquery daemon詳解


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一致,這里不再重復。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM