Label Studio 生产环境如何启用 SSRF 保护并限制服务器端口访问?
【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio
当你把 Label Studio 开源版部署到生产环境时,有两件事需要在部署层面做掉:一是开启 SSRF(服务端请求伪造)保护,阻止服务器代表用户向本地地址或内网地址发起请求;二是收紧服务器端口,只保留 Label Studio 运行所必需的端口。本文依据 Secure Label Studio、部署文档的端口要求、Kubernetes 部署指南 和 2.10.0 版本发布说明 给出操作步骤。
准备条件
- 已安装 Label Studio(开源版),部署方式可以是 Docker Compose 或 Kubernetes(Helm 3)。
- 你的目标是生产环境而非本地开发环境。
SSRF_PROTECTION_ENABLED的设计取向是支持本地环境的用户直接访问本地数据源,因此在生产环境中应当启用它(见 security.md 中 "Enable SSRF protection for production environments" 一节)。
启用 SSRF 保护
在部署配置中将环境变量SSRF_PROTECTION_ENABLED设置为true。开启后,Label Studio 的默认行为是拦截所有落在保留地址块内的 IP(IPv4 和 IPv6 均覆盖),例如内网私有网段、回环地址等,这些拦截对象覆盖 URL 导入、文件上传等由服务器发起的出站请求。
以 Kubernetes + Helm 部署为例,install_k8s.md 的指引是:通过helm install命令的--set参数指定需要设置的环境变量。安装命令本身为:
helm install <RELEASE_NAME> heartex/label-studio -f ls-values.yaml其中<RELEASE_NAME>替换为你要使用的 Helm release 名称,ls-values.yaml是你自定义的 values 文件。按文档说明,你可以在该命令中追加--set参数传入SSRF_PROTECTION_ENABLED=true(也可以把该环境变量写入ls-values.yaml的环境变量配置中),例如:
helm install <RELEASE_NAME> heartex/label-studio -f ls-values.yaml --set SSRF_PROTECTION_ENABLED=true注意一个文档与代码之间的版本差异:security.md 和 2.10.0 发布说明 都写明该变量"默认为
false(默认关闭)",而当前仓库源码 base.py 中的定义是SSRF_PROTECTION_ENABLED = get_bool_env('SSRF_PROTECTION_ENABLED', True),即默认值已改为True。两个说法在不同版本下分别成立,因此在生产环境中不要依赖默认值,应显式设置为true。
自定义拦截的子网(可选分支)
如果你需要精确控制哪些网段被拦截,2.10.0 引入了两个与SSRF_PROTECTION_ENABLED=true配合使用的环境变量(见 2.10.0 发布说明):
USER_ADDITIONAL_BANNED_SUBNETS:指定额外的 IP 地址或 CIDR 网段,禁止服务器侧请求(例如 URL 文件上传器)访问这些地址。USE_DEFAULT_BANNED_SUBNETS:默认值为True,即保留默认的保留地址块拦截清单。如果你希望完全由自己控制被拦截的网段,可以将其设置为False,然后通过USER_ADDITIONAL_BANNED_SUBNETS列出所有需要禁止的 IP/CIDR。
文档明确提示:关闭默认子网拦截(USE_DEFAULT_BANNED_SUBNETS=False)是有风险的做法,"should only be done if you know what you're doing"。除非你的数据源确实位于保留地址段内且你理解放行后果,否则保留默认值。
限制服务器端口访问
security.md 对开源版生产部署的原文建议是:"If you're running the open source version in production, restrict access to the Label Studio server. Restrict access to the server itself by opening only the required ports on the server." 即只打开 Label Studio 所需的端口,不对外开放其他端口。
所需端口见 部署文档(includes/deploy.md) 的 "Port requirements" 一节:
- Label Studio 默认期望 8080 端口处于开放状态;
- 如果要使用其他端口,在启动 Label Studio 时指定(文档指向 Start Label Studio 相关说明)。
也就是说,端口限制的操作路径是:确认你的部署实际暴露的端口(默认 8080),然后在服务器防火墙/安全组层面只放行该端口,其余端口一律关闭。
结果验证
- 服务状态:Helm 安装后按 install_k8s.md 检查 Pod 是否正常拉起:
kubectl get pods - SSRF 拦截是否生效:2.10.0 的发布说明指出,该版本改进了错误信息,当某个操作因 SSRF 保护被阻止时,错误提示会明确说明请求是被 SSRF 保护拦截的。因此验证方式就是触发一次受保护路径上的出站请求——例如通过 URL 导入一个指向保留地址段(如
127.0.0.1或内网私有网段)的资源,观察返回的报错是否提示被 SSRF 保护阻止,而不是返回数据或挂起。 - 端口限制:在服务器之外尝试访问未放行的端口,确认只有你开放的端口(默认 8080)可达。
限制与已知变化
- SSRF 保护拦截的是服务器侧发起的请求。如果你的数据源(例如自建 S3 端点、内网模型服务)本身就位于私有网段,开启保护后这些 URL 会被拒绝,需要评估是否用
USE_DEFAULT_BANNED_SUBNETS/USER_ADDITIONAL_BANNED_SUBNETS调整,并自行承担文档中提示的风险。 - 历史上 SSRF 防护有多次修补:2.2.9 修复了添加模型和导入路径上的盲 SSRF,2.4.9/2.4.10 增强了防护健壮性,2.7.0 修复了 DNS rebinding 问题。生产环境保持版本更新同样重要。
- 端口要求的来源是部署说明文档中的 "Port requirements" 一节,默认值 8080;如果你修改了启动端口,防火墙放行规则要同步改为实际使用的端口。
【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考