安全性 — Python 文档

来自菜鸟教程
Celery/docs/latest/userguide/security
跳转至:导航、​搜索

安全

简介

虽然 Celery 的编写考虑了安全性,但它应该被视为不安全的组件。

根据您的 安全策略 ,您可以采取多种步骤来使 Celery 安装更加安全。


关注领域

经纪人

必须保护代理免受不必要的访问,尤其是在公众可以访问的情况下。 默认情况下,工作人员相信他们从代理那里获得的数据没有被篡改。 有关如何使代理连接更值得信赖的信息,请参阅 消息签名

第一道防线应该是在broker前面放置一个防火墙,只允许白名单机器访问它。

请记住,防火墙配置错误和暂时禁用防火墙在现实世界中都很常见。 可靠的安全策略包括监控防火墙设备以检测它们是否已被禁用,无论是意外还是故意。

换句话说,也不应该盲目相信防火墙。

如果您的代理支持细粒度访问控制,例如 RabbitMQ,那么您应该考虑启用此功能。 参见例如 http://www.rabbitmq.com/access-control.html。

如果您的代理后端支持,您可以使用 :setting:`broker_use_ssl` 启用端到端 SSL 加密和身份验证。


客户

在 Celery 中,“客户端”是指任何向代理发送消息的东西,例如应用任务的网络服务器。

如果可以通过客户端发送任意消息,那么让代理得到适当的保护并不重要。

[此处需要更多文字]


工人

在 worker 内部运行的任务的默认权限与 worker 本身的权限相同。 这适用于资源,例如; 内存、文件系统和设备。

此规则的一个例外是使用基于多处理的任务池时,这是当前的默认设置。 在这种情况下,任务将有权访问由于 fork() 调用而复制的任何内存,以及访问由同一工作子进程中的父任务写入的内存内容。

可以通过启动子进程中的每个任务 (fork() + execve()) 来限制对内存内容的访问。

可以通过使用 chrootjailsandboxing、虚拟机或平台或其他软件启用的其他机制来限制文件系统和设备访问.

另请注意,在工作器中执行的任何任务都将具有与运行它的机器相同的网络访问权限。 如果工作人员位于内部网络上,建议为出站流量添加防火墙规则。


序列化器

自 4.0 版以来,默认序列化程序是 JSON,但由于它仅支持有限的类型集,因此您可能需要考虑使用 pickle 进行序列化。

pickle 序列化器很方便,因为它可以序列化几乎任何 Python 对象,甚至是一些需要工作的函数,但出于同样的原因 pickle 本质上是不安全的 *,并且每当客户端不受信任或未经身份验证时,都应避免使用。

您可以通过在 :setting:`accept_content` 设置中指定接受内容类型的白名单来禁用不受信任的内容:

3.0.18 版中的新功能。


笔记

此设置首先在 3.0.18 版中得到支持。 如果您运行的是早期版本,它将被忽略,因此请确保您运行的是支持它的版本。


accept_content = ['json']

这接受序列化程序名称和内容类型的列表,因此您还可以为 json 指定内容类型:

accept_content = ['application/json']

Celery 还带有一个特殊的 auth 序列化程序,用于验证 Celery 客户端和工作人员之间的通信,确保消息来自可信来源。 使用 公钥加密 ,auth 序列化程序可以验证发件人的真实性,以启用此读取 消息签名 以获取更多信息。


消息签名

Celery 可以使用 :pypi:`cryptography` 库来使用 公钥加密 对消息进行签名,其中客户端发送的消息使用私钥签名,然后由工作人员验证使用公共证书。

最好的证书应该由官方 证书颁发机构 签名,但它们也可以是自签名的。

要启用此功能,您应该配置 :setting:`task_serializer` 设置以使用 auth 序列化器。 强制工作人员只接受签名的消息,您应该将 accept_content 设置为 ['auth']。 对于事件协议的额外签名,将 event_serializer 设置为 auth。 还需要配置用于在文件系统上定位私钥和证书的路径::setting:`security_key`:setting:`security_certificate`:setting:`security_cert_store` 分别设置。 您可以使用 :setting:`security_digest` 调整签名算法。

配置这些后,还需要调用 celery.setup_security() 函数。 请注意,这还将禁用所有不安全的序列化程序,以便工作人员不会接受内容类型不受信任的消息。

这是使用 auth 序列化程序的示例配置,私钥和证书文件位于 /etc/ssl。

app = Celery()
app.conf.update(
    security_key='/etc/ssl/private/worker.key'
    security_certificate='/etc/ssl/certs/worker.pem'
    security_cert_store='/etc/ssl/certs/*.pem',
    security_digest='sha256',
    task_serializer='auth',
    event_serializer='auth',
    accept_content=['auth']
)
app.setup_security()

笔记

虽然不允许使用相对路径,但建议对这些文件使用绝对路径。

另请注意,auth 序列化程序不会加密消息的内容,因此如果需要,必须单独启用它。


入侵检测

保护您的系统免受入侵者侵害时,最重要的部分是能够检测系统是否已被入侵。

日志

日志通常是寻找安全漏洞证据的第一个地方,但如果它们可以被篡改,它们就毫无用处。

一个好的解决方案是使用专用日志服务器设置集中日志记录。 对它的访问应该受到限制。 除了将所有日志放在一个地方之外,如果配置正确,还可以使入侵者更难篡改您的日志。

这应该很容易使用 syslog 设置(另请参阅 syslog-ngrsyslog)。 Celery 使用 logging 库,并且已经支持使用 syslog。

偏执狂的提示是使用UDP发送日志并切断日志服务器网线的传输部分:-)


绊线

Tripwire 是一个(现在是商业的)数据完整性工具,有几个开源实现,用于在文件系统中保存文件的加密哈希,以便管理员可以在更改时收到警报。 通过这种方式,当损坏已经造成并且您的系统受到威胁时,您可以准确地知道入侵者更改了哪些文件(密码文件、日志、后门、root-kits 等)。 通常,这是您能够检测到入侵的唯一方法。

一些开源实现包括:

此外,ZFS 文件系统带有可以使用的内置完整性检查。

脚注

*
https://blog.nelhage.com/2011/03/exploiting-pickle/