网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载Sliver 仓库的vendor/tailscale.com/logtail目录内置了 Tailscale Logs Service 的完整客户端库与接口文档api.md。本文以该 API 文档为主体逐节讲解 Collection/Instance 双级数据模型、日志存储、检索与配置四类 REST 接口的请求格式与语义并结合仓库内logtail.go、config.go、buffer.go等源码实现说明 Sliver 所依赖的tsnet组件是如何在实际运行中调用这套接口的。一、日志服务总览与认证方式Tailscale Logs Service 定义了一套 REST 接口用于日志条目的配置、存储、检索与处理。HTTP 请求发送到服务的 base URLhttps://log.tailscale.com响应为 JSON 编码并使用标准 HTTP 状态码。配置类与检索类 API 的授权方式是将 secret API key 作为 HTTP Basic Auth 的 username传入。secret key 通过 base URL 下的 Web UI 生成。原文档给出的 curl 示例curl -u log_api_key: https://log.tailscale.com/collections注意 password 部分留空key 位于 username 位置。此外文档预告了未来的演进方向后续会支持通过 HTTP 头指定 MessagePack 替代 JSON 作为响应/请求格式。二、核心数据模型Collection 与 InstanceCollection以域名划分的日志分组日志被组织进collection。每个 collection 内可以包含任意数量的instance。Collection 的名字就是一个域名是对相关日志的分组。文档建议每个产品创建一个 collection使用公司域名的子域名。Collection 必须在存储任何日志之前先向 logs service 注册。Instance每台机器一个实例private/public 双 ID每个 collection 由若干 instance 构成写日志的每台机器对应一个 instance。instance 有名字和编号并持有两个 IDID定义用途private ID32 字节随机数hex 编码用于写日志唯一副本应留在发送日志的机器上理想情况下在机器本地生成生成后即可开始写日志public IDprivate ID 的 SHA-256 哈希hex 编码用于读日志和 adopt设计上可以安全地发送给同时持有 logs service API key 的服务Adoption 机制与保留策略logs service 只会短期存储日志。要启用长期保留需要用public ID API key对日志执行adoptadopt 之后日志按配置的保留期长期保留。未被 adopt的 instance 日志只临时保存用于调试场景——比如一台配置错误、用坏 ID 写日志的机器可以通过读取日志发现它。未 adopt 的日志存储有严格上限12 小时后删除。三、存储 APIPOST /c/collection-name/private-ID请求体为 JSON有两种合法形态。单条消息单条消息是一个 JSON 对象。客户端可以在对象里放入任意自定义属性唯一保留属性是logtail在logtail对象内客户端目前只能设置client_time属性格式为 RFC3339Go 参考格式2006-01-02T15:04:05.999999999Z07:00。文档预告的后续版本将支持client_time_offset客户端重置以来的纳秒数整数与client_time_reset布尔值置 true 时重置时间偏移计数器。服务端收到client_time_offset后会以第一条或 reset 那条事件被接收时的server_time为基准换算出client_time。若在logtail对象中设置了其他属性它们会被移入error字段消息会被保存并返回 4xx 状态码。批量消息批量消息是一个 JSON 数组元素为单条消息对象[ { }, { }, ... ]。若数组中某条目不是对象该内容会被转成带logtail: { error: ... }属性的消息保存并返回 4xx。其他不符合这两种格式的请求内容同样被保存进 logtail error 字段并返回 4xx。非法 collection 名返回{error: invalid collection name}加 403 状态码。客户端行为建议文档鼓励客户端尽可能快地 POST除非受电池续航限制。这既缩短了日志在查看器中可见的时间也降低了日志丢失概率流式写日志时使用 HTTP/2它更擅长维持 TLS 连接减少后续 POST 的开销。文档还预告未来版本将支持Content-Encoding: zstd的请求体压缩。四、检索 APIGET /collections —— 查询 collections 与 instances返回一个列出所有命名 collection 的 JSON 对象。调用方可通过 query 参数collection-name把结果限定到单个 collection。响应示例{ collections: { collection1.yourcompany.com: { instances: { logid.PublicID: { first-seen: timestamp, size: 4096 }, logid.PublicID: { first-seen: timestamp, size: 512000, orphan: true } } } } }其中 instance 以 public ID 为键orphan: true标记未被 adopt 的孤儿实例。GET /c/collection_name —— 查询已存储的日志可调用的 query 参数instances—— 零个或多个 instance限定结果范围time-start—— 要包含的最早日志时间以下三选一time-end—— 要包含的最新日志时间max-count—— 最大返回条数用于分页stream—— 布尔值保持响应挂起、像tail -f一样持续推送日志与time-end不兼容。两种响应模式streamfalse单个 JSON 对象形如{ logs: [ {}, {}, ... ] }header 字段在原文档中标注为 TODO。streamtrue响应先给出一个与存储格式类似的 JSON header 对象随后是逐行一个的 JSON 日志对象{...}服务端持续发送直到客户端关闭连接。五、配置 API对少量 instance 的组织配置 API 最好由受信任的人工操作者通常通过 GUI调用instance 数量多的组织则需要自动化 token 创建。POST /collections —— 创建或删除 collection调用方必须设置collection属性以及actioncreate或actiondeleteform 编码或 JSON 编码均可。字符集限制为[a-zA-Z0-9-_.]。collection 名是全局命名空间通常就是一个域名。POST /instances —— 将 instance adopt 进 collection必须发送以下属性form 或 JSON 编码collection—— 合法 FQDN[a-zA-Z0-9-_.]instances—— instance 的 public IDhex 编码。collection 名必须已被调用方所属的 group 认领。(collection-name, instance-public-ID)这一对可能已经有关联日志、也可能还没有。失败时返回 4xx/5xx 状态码和{error: what went wrong}。六、客户端侧实现仓库内 logtail 库如何对接这套 API以上接口的 Go 客户端就在仓库中可作为接口语义的逐条印证。URL 构造与写入路径config.go 定义了DefaultHost log.tailscale.com和Config结构体字段与 API 概念一一对应Collectioncollection 域名、PrivateID写入用的私有 ID、CopyPrivateID一个覆盖本日志流的超集流的私有 ID、BaseURL留空时回落到默认 host等。logtail.go 的 NewLogger 中可以直接看到文档中POST /c/collection-name/private-ID路由的客户端形态url: cfg.BaseURL /c/ cfg.Collection / cfg.PrivateID.String() urlSuffix,若设置了CopyPrivateID还会附加?copyId...查询参数把同一批日志复制到超集流中。批量数组格式与大小约束drainPending 证实了文档中批量消息是 JSON 数组的说法客户端把缓冲行拼成[开头、,分隔、]结尾的数组一次性上传。相关常量maxSize 256 10单条日志及单次上传体的上限 256KiBmaxTextSize 16 10纯文本日志的上限超出的部分会被截断并在字符串末尾追加省略标记见 appendTruncatedStringlowMemRatio 4低内存模式下上述上限除以 4倾向多次小批上传而非攒大请求避免 OOM。Buffer抽象buffer.go是一个环形缓冲TryReadLine读出日志行无数据返回 nil、关闭返回 io.EOF默认的MemoryBuffer以容量 256 的 channel 实现低内存模式为 64。logtail 保留属性的客户端侧强制文档规定logtail对象内只能出现client_time客户端库同样执行该规则。appendMetadata 会写入client_timeRFC3339Nano、proc_idConfig.IncludeProcID时为进程生成的一次性随机 ID、proc_seqIncludeProcSequence时的进程内自增序号以及出错时的error.detail/error.bad_data子字段。appendTextOrJSONLocked 则实现了客户端消息中保留logtail属性的语义若用户传入的 JSON 对象自身含有顶层logtail键库会将其剥离并改写为logtail: {error: {detail: duplicate logtail member, bad_data: ...}}——这与文档中多余 logtail 属性被移入 error 字段的服务端规则互为镜像。压缩、重试与网络感知upload 对应文档预告的Content-Encoding: zstd当Config.CompressLogs开启且响应体压缩后确有收益节省超过 64 字节扣除头部开销时会附带Content-Encoding: zstd与Orig-Content-Length头上传 zstd 帧。失败重试遵循标准语义响应非 200 时解析Retry-After头作为等待时长缺失时回退到 30~60 秒的随机退避每次上传带 45 秒超时。库还会通过 netmon/eventbus 感知网络是否可达awaitInternetUp断网时暂停上传并等待internet back up事件正好呼应文档中尽快 POST 以降低丢日志概率的建议——缓冲 唤醒机制让写操作不因网络阻塞。刷新延迟与关闭语义config.go 中defaultFlushDelay 2 * time.SecondFlushDelayFn可自定义返回 0 或负值立即上传正值则按该延迟攒批。Logger.Shutdown会阻塞式地完成剩余上传受传入 context 控制Close是它的废弃别名Disable()则可以在进程生命周期内全局停止上传。七、Sliver 中的实际落点tsnet 传输如何间接使用 logtailSliver 自身代码并未直接 importtailscale.com/logtail而是经由tailscale.com/tsnet间接触达该服务这决定了它的定位logtail 在 Sliver 中服务于tsnet/Tailscale 传输通道而不是 Sliver 自身的审计日志后者走server/log/下的本地审计与日志轮转。server/transport/tailscale.go 实现了 tsnet gRPC 监听要求环境变量TS_AUTHKEY在tsnet应用目录下创建tsnet.Server并Listen出 gRPC 端点。被依赖的 tsnet.go 在启动时构建logpolicy.Config并调用logtail.NewLoggerL749-L777集合名使用logtail.CollectionNode即tailnode.log.tailscale.io见 config.go日志写入通过logf委托给s.logtail.Logf并在退出时执行logtail.Shutdown。因此阅读 api.md 时应把握两点适用前提其一该接口是 Tailscale 官方日志服务的公有 API 规范base URL 与认证方式以文档为准其二在本仓库的语境下它是 tsnet 传输组件的遥测通道开发者若需要为 Sliver 配置 Tailscale 传输只需关注TS_AUTHKEY与 tsnet 目录logtail 的写入行为由依赖库自动完成。八、小结数据模型Collection域名全局命名空间需先注册→ Instance每台写日志的机器一个private/public 双 IDprivate ID 只留本机用于写入public ID 配合 API key 用于读取与 adopt未 adopt 的日志 12 小时后删除。存储POST /c/collection/private-ID单对象或对象数组logtail为保留属性当前仅client_time非法内容被降级为logtail.error并返回 4xx。检索GET /collections查拓扑GET /c/collection按instances/time-start加time-end/max-count/stream分页或流式拉取。配置POST /collections建/删 collectionPOST /instances完成 adopt。仓库内的 logtail.go、config.go、buffer.go 是这套接口的完整参考客户端Sliver 通过 tsnet 集成 在 tsnet 传输中实际使用它。赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐微服务容器日志paascloud-master中日志轮转配置微服务容器日志paascloud master中日志轮转配置 在分布式微服务架构中日志管理是保障系统稳定运行的关键环节。paascloud master作为后端微服务电商认证鉴权Druid连接池日志配置详解日志输出优化Druid连接池日志配置详解日志输出优化 引言 在数据库应用开发中连接池是提升性能和可靠性的关键组件。Druid德鲁伊作为阿里巴巴开源的数据库连接池不数据库后端微服务容器日志paascloud-master中Docker日志驱动配置微服务容器日志paascloud master中Docker日志驱动配置 日志架构概述 paascloud master作为Spring Cloud微服务架构后端微服务电商认证鉴权上一篇Android Debug Database混淆映射文件终极指南mapping.txt深度解析与实战应用下一篇antd Badge dot 模式详解无数字小红点的显示规则、源码实现与样式定制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考