Documentation
¶
Overview ¶
Package allowlist 为主机名与 IP 地址提供拉取白名单,供 ofd-server 使用。
服务会按调用方给的 URL 拉取待转换的文档,也会按预注册的地址投递通知。这两个 方向如果不做限制,调用方就能让服务去请求内网地址、云元数据端点或本机端口, 等于把服务变成跳板。这里把策略集中在一处,入站拉取与出站通知共用。
Index ¶
- type List
- func (l *List) AllowAddr(addr netip.Addr) error
- func (l *List) AllowResolved(addrs []netip.Addr) error
- func (l *List) AllowedHost(host string) bool
- func (l *List) Describe() string
- func (l *List) Empty() bool
- func (l *List) EverythingAllowed() bool
- func (l *List) ResolveAndCheck(host string) ([]netip.Addr, error)
- func (l *List) ResolveAndCheckContext(ctx context.Context, host string) ([]netip.Addr, error)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type List ¶
type List struct {
// contains filtered or unexported fields
}
List 是一份主机名白名单。零值不可用:不含任何条目时 EverythingAllowed 返回 false,即"默认拒绝"。
条目形如 "cdn.example.com"(精确)、"*.corp.example.com"(子域通配,仅匹配一级以上 的子域,不匹配 "corp.example.com" 本身)或 "10.20.0.0/16"(CIDR,也接受单个 IP)。
func (*List) AllowAddr ¶
AllowAddr 判断一个解析后的地址是否可访问。默认拒绝一切非公网单播地址:回环、 私有网段、链路本地(含 169.254.169.254 云元数据)、未指定、多播。
注意:这是"不得命中敏感网段"的黑名单式判断,不是"必须在公网白名单内"。白名单条目 里的 CIDR 用来在受控内网中放行特定网段(例如内部对象存储),因此 AllowedHost 为真并不能单独成为放行依据,两者要同时满足。
func (*List) AllowResolved ¶
AllowResolved 校验一组解析结果:必须全部通过 AllowAddr,且至少有一个地址可用。 只要有一个地址指向敏感网段就整体拒绝,避免"多数解析结果正常"掩盖恶意记录。
func (*List) AllowedHost ¶
AllowedHost 判断主机名是否在白名单内。CIDR 与单个 IP 条目在此不参与匹配,它们 作用于解析后的地址(见 AllowAddr)。
func (*List) EverythingAllowed ¶
EverythingAllowed 报告白名单是否处于"不限制"状态。空白名单即不限制外部访问, 服务据此在启动时给出告警并在请求时直接拒绝这类操作。
func (*List) ResolveAndCheck ¶
ResolveAndCheck 按白名单校验 host 的解析结果,返回可用的地址列表。调用方应当把 校验放在真正拨号的那一刻(自定义 net.Dialer.DialContext)执行,否则检查与连接之间 存在时间窗,攻击者可用 DNS rebinding 在窗口内把域名改指到内网。