如何使用Osquery在Linux上監(jiān)控文件完整性?
譯文【51CTO.com快譯】使用Osquery應(yīng)用程序方面的基本概念是對(duì)操作系統(tǒng)的許多方面(進(jìn)程和用戶(hù)等)執(zhí)行的“表格抽象”。數(shù)據(jù)存儲(chǔ)在表中,可以使用SQL語(yǔ)法、直接通過(guò)osqueryi外殼或通過(guò)osqueryd守護(hù)程序來(lái)查詢(xún)。
本教程介紹如何安裝該應(yīng)用程序、如何運(yùn)行基本查詢(xún)以及如何在Linux系統(tǒng)管理工作中使用FIM(文件完整性監(jiān)控)。
本教程將介紹:
- 如何安裝Osquery
 - 如何列出可用表
 - 如何從osqueryi外殼執(zhí)行查詢(xún)
 - 如何使用osqueryd守護(hù)程序監(jiān)控文件完整性
 
軟件需求和使用的約定
- 對(duì)SQL概念有基本知識(shí)
 - 擁有執(zhí)行管理任務(wù)的root權(quán)限
 
軟件需求和Linux命令行約定
安裝
我們基本上有兩種方法來(lái)安裝Osquery:第一種是從官方網(wǎng)站下載適合我們系統(tǒng)的軟件包;第二種(通常是優(yōu)選方法)是將Osquery存儲(chǔ)庫(kù)添加到發(fā)行版軟件源。下面簡(jiǎn)要介紹這兩種方法。
圖1
通過(guò)軟件包安裝
可以從Osquery官方網(wǎng)站(https://osquery.io/downloads/official)下載簽名的deb和rpm軟件包,或下載更通用的打包文件。我們先選擇要安裝的版本,然后下載軟件包。
建議選擇最新的可用版本(截至發(fā)稿時(shí)4.1.2)。下載軟件包后,我們可以使用發(fā)行版軟件包管理器來(lái)安裝。比如想在Fedora系統(tǒng)上安裝該軟件(假設(shè)軟件包在當(dāng)前的工作目錄中),我們將運(yùn)行:
- $ sudo dnf install ./osquery-4.1.2-1.linux.x86_64.rpm
 
使用存儲(chǔ)庫(kù)
我們還可以將rpm或deb存儲(chǔ)庫(kù)添加到發(fā)行版中。如果我們使用基于rpm的發(fā)行版,可以運(yùn)行以下命令來(lái)完成任務(wù):
- $ curl -L https://pkg.osquery.io/rpm/GPG | sudo tee
 - /etc/pki/rpm-gpg/RPM-GPG-KEY-osquery
 - $ sudo yum-config-manager --add-repo https://pkg.osquery.io/rpm/osquery-s3-rpm.repo
 - $ sudo yum-config-manager --enable osquery-s3-rpm-repo
 - $ sudo yum install osquery
 
借助上述Linux命令,我們可以將用來(lái)簽名軟件包的gpg公鑰添加到系統(tǒng)中,然后添加存儲(chǔ)庫(kù)。最后,我們安裝Osquery軟件包。注意,在近期版本的Fedora和CentOS/RHEL中,yum只是dnf的符號(hào)鏈接,所以我們調(diào)用前者時(shí),使用的卻是后者。
如果你運(yùn)行基于Debian的發(fā)行版,可以將deb存儲(chǔ)庫(kù)添加到軟件源中,只要運(yùn)行:
- $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys
 - 1484120AC4E9F8A1A577AEEE97A80C63C9D8B80B
 - $ sudo add-apt-repository 'deb [arch=amd64] https://pkg.osquery.io/deb deb main'
 - $ sudo apt-get update
 - $ sudo apt-get install osquery
 
一旦軟件包安裝完畢,我們可以看一下軟件的基本用法。
基本用法
Osquery讓我們可以監(jiān)控采用“表格抽象”的操作系統(tǒng)的不同方面,使用類(lèi)似sqlite數(shù)據(jù)庫(kù)上所用語(yǔ)法的SQL語(yǔ)法。針對(duì)表執(zhí)行查詢(xún),表對(duì)操作系統(tǒng)的不同方面(比如進(jìn)程和服務(wù))進(jìn)行抽象處理。
我們可以直接使用osqueryi交互式外殼來(lái)運(yùn)行查詢(xún),也可以通過(guò)osqueryd守護(hù)程序來(lái)安排查詢(xún)。下面這個(gè)例子顯示了列出所有可用表的查詢(xún)(還可以在此處https://osquery.io/schema/4.1.2#processes看到附有表描述的完整列表):
- $ osqueryi
 - osquery> .tables
 - => acpi_tables
 - => apt_sources
 - => arp_cache
 - => atom_packages
 - => augeas
 - => authorized_keys
 - => block_devices
 - => carbon_black_info
 - => carves
 - => chrome_extensions
 - => cpu_time
 - => cpuid
 - => crontab
 - => curl
 - => curl_certificate
 - => deb_packages
 - => device_file
 - => device_hash
 - => device_partitions
 - => disk_encryption
 - => dns_resolvers
 - => docker_container_labels
 - => docker_container_mounts
 - => docker_container_networks
 - => docker_container_ports
 - => docker_container_processes
 - => docker_container_stats
 - => docker_containers
 - => docker_image_labels
 - => docker_images
 - => docker_info
 - => docker_network_labels
 - => docker_networks
 - => docker_version
 - => docker_volume_labels
 - => docker_volumes
 - => ec2_instance_metadata
 - => ec2_instance_tags
 - => elf_dynamic
 - => elf_info
 - => elf_sections
 - => elf_segments
 - => elf_symbols
 - => etc_hosts
 - => etc_protocols
 - => etc_services
 - => file
 - => file_events
 - => firefox_addons
 - => groups
 - => hardware_events
 - => hash
 - => intel_me_info
 - => interface_addresses
 - => interface_details
 - => interface_ipv6
 - => iptables
 - => kernel_info
 - => kernel_integrity
 - => kernel_modules
 - => known_hosts
 - => last
 - => listening_ports
 - => lldp_neighbors
 - => load_average
 - => logged_in_users
 - => magic
 - => md_devices
 - => md_drives
 - => md_personalities
 - => memory_array_mapped_addresses
 - => memory_arrays
 - => memory_device_mapped_addresses
 - => memory_devices
 - => memory_error_info
 - => memory_info
 - => memory_map
 - => mounts
 - => msr
 - => npm_packages
 - => oem_strings
 - => opera_extensions
 - => os_version
 - => osquery_events
 - => osquery_extensions
 - => osquery_flags
 - => osquery_info
 - => osquery_packs
 - => osquery_registry
 - => osquery_schedule
 - => pci_devices
 - => platform_info
 - => portage_keywords
 - => portage_packages
 - => portage_use
 - => process_envs
 - => process_events
 - => process_file_events
 - => process_memory_map
 - => process_namespaces
 - => process_open_files
 - => process_open_sockets
 - => processes
 - => prometheus_metrics
 - => python_packages
 - => routes
 - => rpm_package_files
 - => rpm_packages
 - => selinux_events
 - => shadow
 - => shared_memory
 - => shell_history
 - => smart_drive_info
 - => smbios_tables
 - => socket_events
 - => ssh_configs
 - => sudoers
 - => suid_bin
 - => syslog_events
 - => system_controls
 - => system_info
 - => time
 - => ulimit_info
 - => uptime
 - => usb_devices
 - => user_events
 - => user_groups
 - => user_ssh_keys
 - => users
 - => yara
 - => yara_events
 - => yum_sources
 
運(yùn)行osqueryi命令,我們進(jìn)入交互式外殼;我們可以從該外殼執(zhí)行查詢(xún)或指令。這是查詢(xún)的另一個(gè)例子,這回列出所有運(yùn)行中進(jìn)程的pid和name。對(duì)process表執(zhí)行查詢(xún)(為便于閱讀,查詢(xún)的輸出已截短):
- osquery> SELECT pid, name FROM processes;
 - +-------+------------------------------------+
 - | pid | name |
 - +-------+------------------------------------+
 - | 1 | systemd |
 - | 10 | rcu_sched |
 - | 10333 | kworker/u16:5-events_unbound |
 - | 10336 | kworker/2:0-events |
 - | 11 | migration/0 |
 - | 11002 | kworker/u16:1-kcryptd/253:0 |
 - | 11165 | kworker/1:1-events |
 - | 11200 | kworker/1:3-events |
 - | 11227 | bash |
 - | 11368 | osqueryi |
 - | 11381 | kworker/0:0-events |
 - | 11395 | Web Content |
 - | 11437 | kworker/0:2-events |
 - | 11461 | kworker/3:2-events_power_efficient |
 - | 11508 | kworker/2:2 |
 - | 11509 | kworker/0:1-events |
 - | 11510 | kworker/u16:2-kcryptd/253:0 |
 - | 11530 | bash |
 - [...] |
 - +-------+------------------------------------+
 
甚至可以使用JOIN語(yǔ)句對(duì)連接表執(zhí)行查詢(xún),就像我們?cè)陉P(guān)系數(shù)據(jù)庫(kù)中操作那樣。在下面例子中,我們對(duì)processes表執(zhí)行查詢(xún),通過(guò)uid列與users表進(jìn)行連接:
- osquery> SELECT processes.pid, processes.name, users.username FROM processes JOIN
 - users ON processes.uid = users.uid;
 - +-------+-------------------------------+------------------+
 - | pid | name | username |
 - +-------+-------------------------------+------------------+
 - | 1 | systemd | root |
 - | 10 | rcu_sched | root |
 - | 11 | migration/0 | root |
 - | 11227 | bash | egdoc |
 - | 11368 | osqueryi | egdoc |
 - | 13 | cpuhp/0 | root |
 - | 14 | cpuhp/1 | root |
 - | 143 | kintegrityd | root |
 - | 144 | kblockd | root |
 - | 145 | blkcg_punt_bio | root |
 - | 146 | tpm_dev_wq | root |
 - | 147 | ata_sff | root |
 - [...]
 - | 9130 | Web Content | egdoc |
 - | 9298 | Web Content | egdoc |
 - | 9463 | gvfsd-metadata | egdoc |
 - | 9497 | gvfsd-network | egdoc |
 - | 9518 | gvfsd-dnssd | egdoc |
 - +-------+-------------------------------+------------------+
 
文件完整性監(jiān)控(FIM)
前面我們使用交互式外殼osqueryi來(lái)使用Osquery。想使用FIM(文件完整性監(jiān)控),我們改用osqueryd守護(hù)程序。通過(guò)配置文件,我們列出了想要監(jiān)控的文件。file_events 表中記錄了涉及指定文件和目錄的事件,比如屬性變化。守護(hù)程序在指定的時(shí)間間隔后對(duì)該表運(yùn)行查詢(xún),并在日志中通知何時(shí)發(fā)現(xiàn)新記錄。不妨看看配置示例。
配置結(jié)構(gòu)
Osquery的主配置文件是/etc/osquery/osquery.conf。該文件默認(rèn)情況下不存在,于是我們要?jiǎng)?chuàng)建它。配置以JSON格式來(lái)提供。假設(shè)我們想要監(jiān)控/etc下的所有文件和目錄;下面顯示了我們?nèi)绾闻渲迷搼?yīng)用程序:
- {
 - "options": {
 - "disable_events": "false"
 - },
 - "schedule": {
 - "file_events": {
 - "query": "SELECT * FROM file_events;",
 - "interval": 300
 - }
 - },
 - "file_paths": {
 - "etc": [
 - "/etc/%%"
 - ],
 - },
 - }
 
不妨分析上述配置。首先在options部分,我們將disable_events設(shè)為“false”,以便啟用文件事件。
之后我們創(chuàng)建schedule部分:在該部分,我們可以描述和創(chuàng)建各種命名的調(diào)度查詢(xún)。我們?cè)诒疚闹袆?chuàng)建了一個(gè)查詢(xún),以便從file_events表選擇所有列,這意味著每300秒(5分鐘)執(zhí)行一次。
安排查詢(xún)后,我們創(chuàng)建了file_paths部分,在該部分指定要監(jiān)控的文件。在該部分,每個(gè)鍵代表要監(jiān)控一組文件的名稱(chēng)(Osquery術(shù)語(yǔ)中的類(lèi)別)。這里“etc”鍵引用僅含有一個(gè)條目/etc/%%的列表。
%符號(hào)代表什么?指定文件路徑時(shí),我們可以使用標(biāo)準(zhǔn)通配符(*)或SQL通配符(%)。如果提供單通配符,它將選擇位于指定級(jí)別的所有文件和目錄。如果提供雙通配符,它將遞歸選擇所有文件和文件夾。比如說(shuō),/etc/%表達(dá)式匹配/etc下面一級(jí)的所有文件和文件夾,而/etc/%%遞歸匹配/etc下的所有文件和文件夾。
如果需要,我們還可以使用配置文件中的exclude_paths部分,從提供的路徑中排除特定文件。在該部分,我們只能引用file_paths部分中定義的類(lèi)別(本例中是“etc”)。我們提供了要排除的文件列表:
- "exclude_paths": {
 - "etc": [
 - "/etc/aliases"
 - ]
 - }
 
僅作為例子,我們從列表中排除了/etc/aliases文件。下面是最終配置的樣子:
- {
 - "options": {
 - "disable_events": "false"
 - },
 - "schedule": {
 - "file_events": {
 - "query": "SELECT * FROM file_events;",
 - "interval": 20
 - }
 - },
 - "file_paths": {
 - "etc": [
 - "/etc/%%"
 - ]
 - },
 - "exclude_paths": {
 - "etc": [
 - "/etc/aliases"
 - ]
 - }
 - }
 
開(kāi)啟守護(hù)程序
配置已到位,我們可以開(kāi)啟osqueryd守護(hù)程序:
- $ sudo systemctl start osqueryd
 
為了使守護(hù)程序在系統(tǒng)啟動(dòng)時(shí)自動(dòng)開(kāi)啟,我們要運(yùn)行:
- $ sudo systemctl enable osqueyd
 
一旦守護(hù)程序運(yùn)行,我們可以核實(shí)配置有效。僅舉個(gè)例子,我們將修改/etc/fstab文件的許可權(quán),將它們從644改為600:
- $ sudo chmod 600 /etc/fstab
 
現(xiàn)在我們可以核實(shí)文件更改以記錄下來(lái),只需閱讀/var/log/osquery/osqueryd.results.log文件。下面是該文件的最后一行:
- {
 - "name":"file_events",
 - "hostIdentifier":"fingolfin",
 - "calendarTime":"Mon Dec 30 19:57:31 2019 UTC",
 - "unixTime":1577735851,
 - "epoch":0,
 - "counter":0,
 - "logNumericsAsNumbers":false,
 - "columns": {
 - "action":"ATTRIBUTES_MODIFIED",
 - "atime":"1577735683",
 - "category":"etc",
 - "ctime":"1577735841",
 - "gid":"0",
 - "hashed":"0",
 - "inode":"262147",
 - "md5":"",
 - "mode":"0600",
 - "mtime":"1577371335",
 - "sha1":"",
 - "sha256":"",
 - "size":"742",
 - "target_path":"/etc/fstab",
 - "time":"1577735841",
 - "transaction_id":"0",
 - "uid":"0"
 - },
 - "action":"added"
 - }
 
在上述日志中,我們可以清楚地看到在target_path "/etc/fstab"(第23行)上進(jìn)行了ATTRIBUTES_MODIFIED操作(第10行),/etc/fstab是“etc”類(lèi)別(第12行)的一部分。有必要注意這點(diǎn):如果我們從osqueryi外殼查詢(xún)file_events表,由于osqueryd守護(hù)程序和osqueryi無(wú)法聯(lián)系,因此看不到任何行。
結(jié)論
本教程介紹了使用Osquery應(yīng)用程序方面的基本概念,該應(yīng)用程序使用我們可以使用SQL語(yǔ)法查詢(xún)的表格數(shù)據(jù)對(duì)操作系統(tǒng)的各個(gè)概念進(jìn)行抽象。我們看到如何安裝該應(yīng)用程序、如何使用osqueryi外殼執(zhí)行基本查詢(xún)以及最后如何使用osqueryd守護(hù)程序設(shè)置文件監(jiān)控。與往常一樣,想更深入地了解該應(yīng)用程序,建議查看項(xiàng)目文檔:https://osquery.readthedocs.io/en/stable/。
原文標(biāo)題:How to monitor file integrity on Linux using Osquery,作者:Egidio Docile
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

















 
 
 








 
 
 
 