TISDK 接口说明

1.概述

TISDK为各产品提供访问威胁情报云端平台的内嵌接口,能够缓存IOC请求和威胁情报,避免重复请求。SDK以异步方式工作,当威胁情报更新时,通过回调接口传递结果。

2.文件说明

文件名 描述
\64\libpretisdk.so 64 位 Linux 系统动态加载 so 文件(详见 7.进程 Fork 支持)
\64\libtisdk.so 64 位 Linux 系统 so 文件
\64\tisdk.dll 64 位 Win 系统 dll 文件
\64\tisdk.lib 64 位 Win 系统 lib 文件
\32\libpretisdk.so 32 位 Linux 系统动态加载 so 文件(详见 7.进程 Fork 支持)
\32\libtisdk.so 32 位 Linux 系统 so 文件
\32\tisdk.dll 32 位 Win 系统 dll 文件
\32\tisdk.lib 32 位 Win 系统 lib 文件
\test\linux* linux 系统测试程序和代码(64 位)
\test\win* win 系统测试程序和代码(64 位)
domain_ioc.zip 测试用的域名 IOC
filehash.list.zip 测试用的文件 IOC(文件 hash)
tisdk_c.h C 接口头文件
tisdkcfg.json 测试用的配置项

3.C接口

3.1. 初始化 SDK

int ti_init(TI_CALLBACK callback, int truncate);

使用其他接口前调用 ti_init。

callback:传入回调函数指针。当 IOC 更新时,SDK 调用回调函数。

truncate:非 0 值时,清除所有本地缓存的 IOC 记录。

返回值:返回 0 表示成功,<0 表示失败。

itypedef void(*TI_CALLBACK)(const char *json, const char *ctx);

回调函数原型。用于接收 IOC 更新信息。

json:云端返回的威胁情报,JSON 格式。

ctx:查询 IOC 和上传文件操作传入的上下文。

3.2. 身份认证

int ti_login(const char *user, const char *passwd, int rememberMe,
const void *customKey, size_t key_size,
const void *customExtInfo, size_t info_size);

查询 IOC 和上传文件之前,需进行身份认证。

user, passwd:用户名,密码。云端提供。

rememberMe:认证信息保持时间,>0 表示长期有效,具体时间取决于云端。每次使用时 SDK 都需要进行认证。

customKey, key_size:产品相关的 Key 和大小(字节数)。此参数是必须的参数。

customExtInfo, info_size:自定义扩展信息和大小(字节数)。可用于区分不同主机生成的情报。

3.3. 查询 IOC

int ti_query(const char *iocs, const char *ctx);

向云端查询 IOC 信息。如果缓存中存在该情报,则不再请求云端,并尽快通过 Callback 返回信息。

iocs:一个或多个IOC,以逗号分隔。IOC 数量不能超过云端单次查询的限制,目前为1000个。合并查询比每次查询一个效率更高。

ctx:附加的操作上下文。SDK将复制 ctx,并在Callback时传入。注意,如果查询过程出现错误,Callback不会发生,ctx将被丢弃。

3.4. 上传文件

int ti_upload(const char *file_path, int analyze, const char *ctx);

将文件上传到云端等待分析。如果文件 hash 对应的分析结果已经存在,则不再上传云端,并尽快通过 Callback 返回信息。

file_path:文件全路径。

analyze:0 基本分析, 1 深度分析。

ctx:附加的操作上下文。SDK复制 ctx,并在 Callback 时传入。注意,如果上传过程出现错误,Callback不会发生,ctx将被丢弃。

3.5. 获得历史数据页面 URL

int ti_get_url(char *url, size_t *url_size);

登陆操作之后,可通过该接口得到一个 URL,页面展示认证用户相关的历史数据。 调用者可将页面内嵌入产品中。

url:url 缓冲区指针,返回页面的 url。

url_size:输入 url 缓冲区大小,返回 url 实际大小(字节数),不含字符串结尾\0 字 符 。 如果缓存长度不足 ,

返回需要的长度,同时接口返回错误值 TI_ERR_BUF_SIZE。

3.6. 退出 SDK

void ti_term();

停用前清理 SDK。由于操作都是异步进行,如果在查询 IOC 和上传文件操作之后立刻调用本接口,

可能导致之前临近的操作被放弃。

4.Java 接口

/**
* 初始化 SDK
* @param caller 回调对象
* @param truncate 是否清除本地查询记录缓存
* @param configFilePath 配置文件路径
* @return
* @throws ParameterException
*/
public static Result tiInit(ITiCallBacker caller, Integer truncate, String configFilePath) throws
ParameterException;
/**
* 登录平台
* @param user 登录信息
* @return
* @throws ParameterException
*/
public static Result tiLogin(LoginUser user) throws ParameterException;
/**
* 查询 ioc
* @param ioc 批量 ioc
* @param ctx 上下文,对应于回调对象中回调函数的上下文
* @return
* @throws ParameterException
*/
public static Result tiQuery(String ioc, String ctx) throws ParameterException;
/**
* 上传文件
* @param filePath 文件路径
* @param analyze 分析类型 0/1
* @param ctx 上下文
* @return* @throws ParameterException
*/
public static Result tiUpload(String filePath, Integer analyze, String ctx) throws ParameterException;
/**
* 清除 SDK
*/
public static void tiTerm();
/**
* 获取内嵌页面的地址(可内嵌入产品)
* @return
*/
public static String tiGetUrl();

5.多线程支持

SDK 的接口支持多线程调用。

6.多进程支持

SDK 被多个进程同时使用时,第一个进程内的 SDK 将开启基于 socket 的 RPC 服务,其他进程 SDK 作为 RPC 客户端。所有操作通过 RPC 排队到服务端,由服务端统一处理。

RPC 服务进程称为主进程。有几点需要注意的地方:

(1)只有主进程才会进行回调,即使查询请求发生在另一个进程也是如此。

(2)当主进程退出后,剩下的进程会“竞争”成为主进程。只有一个进程能最终“竞争”成功。

(3)如果调用 ti_init 时传递的 callback 指针为空值,则该进程不会成为主进程。此特性可用于控制哪个进程允许成为主进程。

7.进程 Fork 支持

在 Linux 系统上,如果使用 SDK 的进程是 Fork 生成的,必须使用 dlopen 动态加载 libtisdk.so, 不能静态链接。一旦动态加载 SDK 后,不能再 Fork 子进程。

为了方便使用,由 libpretisdk.so 提供一组转发接口,接口内部自动加载 libtisdk.so。有进程 Fork 需要的产品可使用 libpretisdk.so 代替 libtisdk.so。

目前转发接口只有 C 接口,没有 Java 接口。

8.工作模式

(1)缓存模式:默认配置下,SDK 工作在缓存模式。该模式下查询 IOC 和上传文件操作首先缓存到自带的数据库中,定时向云端发出请求,订阅 IOC 更新。该模式适合长期运行的产品。

(2)直接模式:该模式下 SDK 不缓存操作到数据库,直接向云端发起查询(但操作依然是异步的)。SDK 不订阅 IOC 更新,不会调用 Callback。要获取情报可通过 ti_get_url 返回的页面。该模式适合临时运行的工具箱类产品。详见配置项 WorkingMode 。

(3)离线模式:待开发。

9.配置项

SDK 初始化时从当前目录下的 tisdkcfg.json 文件读取配置。除了工作模式,其他配置项基本上无需特别设置,采用默认配置即可。可配置的选项包括如下表。

字段名 默认值 含义
StorageDir "./Storage" 保存数据库的目录路径
BackendURI "http://api.web saas.cn/ti" 云端 Web 接口的 URI
WorkingMode "Cache” 工作模式。取值为”Direct”时,SDK 工作在直接模式,否则工作在缓存模式
RunGCAndSyncInterval 60 对SDK和数据库执行垃圾回收和同步的时间间隔(单位秒)
DebugOutput false 是否输出调试信息
ConsoleOutput false 是否通过控制台输出调试信息
LogFileOutput false 是否通过日志文件输出调试信息(日志保存在 StorageDir 中)
RPCServerPort 20402 RPC 服务端口号
RPCConnLimit 100 RPC 客户端限制数量,等于限制了同时使用 SDK 的进程数量
RPCServerKeepAliveInterv al 10000 RPC 服务保持存活的轮询时间(单位毫秒),用于定时创建 RPC 服务
RPCClientDialTimeout 1000 RPC 客户端连接超时时间(单位毫秒)
RPCClientDialInterval 3000 RPC 客户端连接重试间隔时间(单位毫秒)
LoadIocQueryInterval 3000 从数据库中获得等待推送 IOC 的重试间隔时间(单位毫秒),应根据设备产生 IOC 的频率和数量确定时间
LoadIocQueryLimit 800 每次从数据库获得 IOC 的最大数量,不能大于云端一次查询能接受的 IOC 数量(目前是1000 个)
BatchQueryIocInterval 0 向云端推送 IOC 的两次请求间的最小时间间隔(单位毫秒),如果值为 0 则不等待
LoadUploadFileInterval 3000 从数据库中获得等待上传文件的重试间隔时间(单位毫秒),应根据设备上传文件的频率和数量确定时间
UploadFileInterval 0 上传文件请求之间的最小时间间隔(单位毫秒),如果值为 0 则不等待
UpdateIocInterval 1000 向云端订阅 IOC 更新的间隔时间(单位毫秒)
UpdateIocLimit 100 每次拉取 IOC 更新的最大条目
QueryIocChanSize 2000 用于排队 IOC 查询的管道容量,如果查询量非常大,应增大该值
UploadFileChanSize 500 用于排队上传文件的管道容量
QueryIocChanTimeout 2000 当 IOC 查询管道装满,指定超时时间(单位毫秒),以尽快返回错误给调用者
UploadFileChanTimeout 2000 当上传文件管道装满,指定超时时间(单位毫秒),以尽快返回错误给调用者
IgnoreEmptyFile true 上传文件是否忽略空文件
UploadFileSizeLimit 1010241024 限制上传文件的大小(单位字节),太大的文件上传和计算 hash 太慢,会导致拒绝服务
QueryIocTTL 60 数据库中等待推送的 IOC 记录的生存时间 (单位分钟)
UploadFileTTL 60 数据库中等待上传文件记录的生存时间(单位分钟)
QueryIocCtxTTL 60*12 数据库中等待更新 IOC 记录的生存时间(单位分钟)
UploadFileCtxTTL 60*72 数据库中等待文件分析结果记录的生存时间(单位分钟)
BackendLoginTimeout 5000 向云端请求登陆的超时时间(单位毫秒)
BackendPushIocTimeout 5000 向云端推送 IOC 的超时时间(单位毫秒)
BackendUploadFileTimeout 5000 向云端上传文件的超时时间(单位毫秒)
BackendUpdateIocTimeout 5000 向云端订阅 IOC 更新的超时时间(单位毫秒)
TestConfig 测试专用配置
UserName 无默认值 如果指定,则覆盖 ti_login 的同名参数值
Password 无默认值 如果指定,则覆盖 ti_login 的同名参数值
RememberMe 无默认值 如果指定,则覆盖 ti_login 的同名参数值
CustomKey 无默认值 如果指定,则覆盖 ti_login 的同名参数值
CustomExtInfo 无默认值 如果指定,则覆盖 ti_login 的同名参数值
DeviceID 无默认值 覆盖 SDK 自动生成的设备 ID
Token 无默认值 覆盖云端返回的 Token
BackendURI 无默认值 覆盖配置的和默认的 BackendURI 值

10.测试程序

以 linux 为例,test/linux 目录下,执行命令: ./titest 10 从 domain_ioc.list 读取10个 IOC 提交查询。等一段时间,输出查询结果。由于云端对同一个设备的查询同样 IOC,只返回一次结果。

7 天内重复查询不会再次返回结果。因此测试时,可以修改配置文件 tisdkcfg.json,将 TestConfig 里的 DeviceID 改成其他任意值。以便云端认为这是不同的设备。