0

我正在尝试在 Ruby中实现osquery的扩展。

我发现一些库和示例在 Java、Node 和 Python 中做同样的事情,但在 Ruby 语言中实现没有任何帮助。

根据此文档,可以使用 Thrift 生成代码:https ://osquery.readthedocs.io/en/stable/development/osquery-sdk/#thrift-api

到目前为止,我所做的步骤:

  • 使用生成的代码thrift -r --gen rb osquery.thrift
  • 创建了一个类和一些代码来连接服务器并注册扩展

这是类的代码

# include thrift-generated code
$:.push('./gen-rb')

require 'thrift'
require 'extension_manager'

socket = Thrift::UNIXSocket.new(<path_to_socket>)
transport = Thrift::FramedTransport.new(socket)
protocol = Thrift::BinaryProtocol.new(transport)
client = ExtensionManager::Client.new(protocol)

transport.open()

info = InternalExtensionInfo.new
info.name = "zzz"
info.version = "1.0"

extension = ExtensionManager::RegisterExtension_args.new
extension.info = info

client.registerExtension(extension, {'table' => {'zzz' => [{'name' => 'TEXT'}]}})

要获得,<path_to_socket>您可以使用:

> osqueryi --nodisable_extensions
osquery> select value from osquery_flags where name = 'extensions_socket';
+-----------------------------------+
| value                             |
+-----------------------------------+
| /Users/USERNAME/.osquery/shell.em |
+-----------------------------------+

当我尝试使用 获取此表osqueryi时,运行时看不到该表select * from osquery_registry;

有没有人已经实现了 osquery 扩展?我被卡住了,我不知道如何从这里开始。

4

2 回答 2

0

我发现自己通过 ruby​​ 玩弄节俭。如果我使用 BufferedTransport,它似乎可以工作:

socket = Thrift::UNIXSocket.new('/tmp/osq.sock')
transport = Thrift::BufferedTransport.new(socket)
protocol = Thrift::BinaryProtocol.new(transport)
client = ExtensionManager::Client.new(protocol)

transport.open()
client.ping()
client.query("select 1")
于 2021-07-09T23:05:58.177 回答
0

我想我没有见过任何人做 ruby​​ 扩展,但是一旦你有节俭的一面,它应该很简单。

作为一个工具,osquery 支持很多选项。所以没有单一的方法可以做到这一点。一般来说,扩展作为它们自己的进程运行,并通过该节俭套接字进行通信。

通常,它们非常简单,并且 osquery 使用适当的命令行参数直接调用扩展。这在您与接受,和的示例链接的文档中有所提及。如果你这样做,你会想看看 osquery 的和选项。(我会推荐这条路线)--interval--socket--timeout--extensions_autoload--extensions_require

不太常见的是使用--extensions_socket. 然后你的扩展可以使用它。这种方式比较常见的是扩展不能是一个简单的二进制,而是一个庞大的复杂系统。

于 2020-08-28T17:24:56.690 回答