【.com速译】使用Osquery应用方面的基本概念是对操作系统的很多方面(进程、用户等)进行“表格化抽象”。数据存储在表中,可以使用SQL语法直接通过osqueryishell或通过osqueryd守护进程查询。本教程介绍了如何安装应用程序、运行基本查询以及使用FIM(文件完整性监控)进行Linux系统管理工作。本教程将涵盖:如何安装Osquery如何列出可用表如何从osqueryishell执行查询如何使用osqueryd守护进程监控文件完整性软件要求和使用的约定SQL概念的基本知识执行管理任务的根权限软件要求和Linux命令行约定安装我们基本上有两种方法来安装Osquery:第一种是从官网下载适合我们系统的包;第二种(通常是首选)方法是将Osquery存储库添加到分发软件源中。下面简要介绍这两种方法。图1通过包安装签名的deb和rpm包可以从Osquery官方网站(https://osquery.io/downloads/official)下载,也可以下载更通用的打包文件。我们首先选择要安装的版本,然后下载软件包。建议选择最新的可用版本(截至发稿时为4.1.2)。下载包后,我们可以使用分发包管理器进行安装。例如,要在Fedora系统上安装软件(假设软件包在当前工作目录中),我们将运行:$sudodnfinstall./osquery-4.1.2-1.linux.x86_64.rpm使用存储库,我们还可以复制添加到发行版的rpm或deb存储库。如果我们使用基于rpm的发行版,我们可以运行以下命令来完成工作:$curl-Lhttps://pkg.osquery.io/rpm/GPG|sudotee/etc/pki/rpm-gpg/RPM-GPG-KEY-osquery$sudoyum-config-manager--add-repohttps://pkg.osquery.io/rpm/osquery-s3-rpm.repo$sudoyum-config-manager--enableosquery-s3-rpm-repo$sudoyuminstallosquery通过上面的Linux命令,我们可以将用于对包进行签名的gpg公钥添加到系统中,然后添加repository。最后,我们安装Osquery包。注意,在最近的Fedora和CentOS/RHEL版本中,yum只是dnf的符号链接,所以我们调用前者时,使用的是后者。如果你运行基于Debian的发行版,你可以将deb存储库添加到软件源中,只需运行:]https://pkg.osquery.io/debdebmain'$sudoapt-getupdate$sudoapt-getinstallosquery软件包安装完成后,我们可以看看软件的基本使用方法。基本用法Osquery允许我们使用“表格抽象”监控操作系统的不同方面,使用类似于在sqlite数据库上使用的SQL语法。查询是针对表执行的,这些表抽象了操作系统的不同方面,例如进程和服务。我们可以直接使用osqueryi交互式shell运行查询,或者通过osqueryd守护进程安排查询。以下示例显示了一个列出所有可用表的查询(也可以在此处查看带有表描述的完整列表https://osquery.io/schema/4.1.2#processes):$osqueryiosquery>.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_infomap=>memory=>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_metables=>shell_history=>smart_drives=>evos_inf=>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运行osqueryi命令,我们进入一个交互式shell;从这个shell我们可以执行查询或命令这是另一个查询示例,这次列出了所有正在运行的进程的pid和名称。在进程表上执行查询(为了便于阅读,查询的输出已被截断):osquery>SELECTpid,nameFROMprocesses;+-------+------------------------------------+|pid|名称|+--------+--------------------------------+|1|systemd||10|rcu_sched||10333|kworker/u16:5-events_unbound||10336|kworker/2:0-事件||11|迁移/0||11002|kworker/u16:1-kcryptd/253:0||11165|kworker/1:1-事件||11200|kworker/1:3-事件||11227|bash||11368|osqueryi||11381|kworker/0:0-events||11395|WebContent||11437|kworker/0:2-events||11461|kworker/3:2-events_power_efficient||11508|kworker/2:2||11509|kworker/0:1-事件||11510|kworker/u16:2-kcryptd/253:0||11530|bash|[...]|+------+----------------------------------+您甚至可以使用JOIN语句对连接表执行查询,就像我们在关系数据库中那样做。在下面的例子中,我们对processes表进行查询,通过uid列joinusers表:osquery>SELECTprocesses.pid,processes.name,users.usernameFROMprocessesJOINusersONprocesses.uid=users.uid;+-------+------------------------------+------------------+|pid|名称|用户名|+--------+--------------------------------+---------------+|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|WebContent|egdoc||9298|WebContent|egdoc||9463|gvfsd-metadata|egdoc||9497|gvfsd-network|egdoc||9518|gvfsd-dnssd|egdoc|+--------+--------------------------------+-----------------+文件完整性监控(FIM)之前我们使用交互式shellosqueryi使用Osquery。要使用FIM(文件完整性监控),我们使用osqueryd守护进程。通过配置文件,我们列出了我们要监控的文件。file_events表记录涉及指定文件和目录的事件,例如属性更改。守护进程在指定的时间间隔后对表运行查询,并在发现新记录时在日志中发出通知。看一下配置示例。配置结构Osquery的主要配置文件是/etc/osquery/osquery.conf。默认情况下不存在此文件,因此我们将创建它。配置以JSON格式提供。假设我们要监控/etc下的所有文件和目录;下面显示了我们如何配置应用程序:300}},"file_paths":{"etc":["/etc/%%"],},}不妨分析一下上面的配置。首先在选项部分,我们将disable_events设置为“false”以启用文件事件。然后我们创建调度部分:在这个部分中,我们可以描述和创建各种命名的调度查询。我们在本文中创建了一个查询以从file_events表中选择所有列,这意味着它将每300秒(5分钟)执行一次。安排查询后,我们创建file_paths部分,我们在其中指定要监视的文件。在此部分中,每个键代表要监视的一组文件(Osquery术语中的类别)的名称。这里的“etc”键指的是只有一个条目/etc/%%的列表。%符号代表什么?在指定文件路径时,我们可以使用标准通配符(*)或SQL通配符(%)。如果提供单个通配符,它??将选择指定级别的所有文件和目录。如果提供双通配符,它??将递归选择所有文件和文件夹。例如,/etc/%表达式匹配/etc下一级的所有文件和文件夹,而/etc/%%递归匹配/etc下的所有文件和文件夹。如果需要,我们还可以使用配置文件中的exclude_paths部分从提供的路径中排除特定文件。在该部分中,我们只能引用file_paths部分中定义的类别(在本例中为“etc”)。我们提供了一个要排除的文件列表:"exclude_paths":{"etc":["/etc/aliases"]}例如,我们从列表中排除了/etc/aliases文件。这是最终配置的样子:{"options":{"disable_events":"false"},"schedule":{"file_events":{"query":"SELECT*FROMfile_events;","interval":20}},"file_paths":{"etc":["/etc/%%"]},"exclude_paths":{"etc":["/etc/aliases"]}}打开守护进程配置就绪,我们可以打开osqueryd守护进程:$sudosystemctlstartosqueryd要使守护进程在系统启动时自动启动,我们运行:$sudosystemctlenableosqueyd一旦守护进程运行,我们可以验证配置是否有效。举个例子,我们将修改/etc/fstab文件的权限,将它们从644更改为600:$sudochmod600/etc/fstab现在我们可以验证文件更改记录,只需读取/var/log/osquery/osqueryd.results.log文件。这是文件的最后一行:{"name":"file_events","hostIdentifier":"fingolfin","calendarTime":"MonDec3019:57:312019UTC","unixTime":1577735851,"epoch":0,“计数器”: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"},"动作":"已添加"}在上面的日志中,我们可以清楚地看到对target_path"/etc/fstab"(第23行)进行ATTRIBUTES_MODIFIED操作(第10行),/etc/fstab是"etc"类(第12行)这一点值得注意:如果我们从osqueryishell查询file_events表,我们将看不到任何行,因为osqueryd守护进程和osqueryi无法联系。结论本教程介绍了使用Osquery应用程序的基本概念,它使用表格数据抽象了操作系统的各种概念,我们可以使用SQL语法查询这些数据。我们看到了如何安装应用程序,如何使用osqueryishell执行基本查询,最后如何使用osqueryd守护进程设置文件监控。与往常一样,为了更深入地了解应用程序,建议查看项目文档:https://osquery.readthedocs.io/en/stable/。原标题:HowtomonitorfileintegrityonLinuxusingOsquery,作者:EgidioDocile
