使用`pip`维护Python包最安全的方法是什么?

时间:2014-01-11 22:25:44

标签: python security virtualenv pip

面对有关恶意软件包或安装脚本的安全问题,我对如何最好地使用pip感到困惑。我不是一个安全专家,所以我可能会感到困惑(忍受我),但似乎有4种可能重叠的方法:

(1)将sudo pip用于所有内容

这就是我现在做的事情。我通常不需要virtualenvs,并且喜欢让我的所有包都适用于我的所有工具。我也没有安装很多实验包,非常适合众所周知且广泛使用的实验包(matplotlibsix等)。

我认为这可能是一种冒险的方法,因为安装过程具有su权限,could potentially do anything;但它的优势在于保护site-packages目录不会被安装后运行为非su的任何东西(不仅仅是包)所致。

这种方法也无法完全避免,因为有些软件包(pip本身)需要它来引导任何Python安装。

(2)创建pip用户并授予其site-packages 所有权

这会seem to have the advantage限制pip可以执行的操作:它所能做的只是安装到site-packages。但是我不确定副作用,或者它是否会起作用(例如,pip需要将其他东西放在其他位置)。更现实的变体是以这种方式进行设置,并在其工作时使用pip作为“pip-user”,而在不工作时使用su

(3)授予自己site-packages

的所有权

我收集this is a very had idea,但我不确定为什么。这意味着我运行的任何代码都可以篡改site-packages;但这意味着恶意安装脚本只会损害我自己可能损坏的东西。

(4)“使用virtualenv”

这个建议出现了很多,但我不知道它有多大帮助。对我来说似乎没有什么不同,因为它创建了我拥有的site-packages

如果这些方法中的任何一种或方法组合最适合确保pip不会导致我的系统暴露?我关心的主要是整个系统,只是我在site-packages安装我的Python(如果需要,我可以随时重建)。


我遇到的部分问题是,不知道如何权衡风险。一个示例方法,似乎对我有限的理解是有意义的,只是在大多数情况下做(1),并使用virtualenv(4)任何我担心可能会损坏我的site-packages的包。我安装的任何东西仍然可以破坏我有权访问的任何东西,但这似乎是不可避免的,至少我无法访问的东西是安全的(除了在安装过程中本身)。但是我无法评估这种保护是否值得冒这个风险。

1 个答案:

答案 0 :(得分:3)

你可能想看看使用virtualenv。引用the docs

  

Virtualenv是一个创建独立Python环境的工具。基本问题   被解决的是依赖关系和版本之一,并且是间接的   权限。

Virtualenv将创建一个包含python的隔离副本的文件夹,一个孤立的pip和一个隔离的站点包。您认为这与选项3相同,因为您正在接受以面值链接的建议,而不是阅读它:

  

如果您给自己写入系统站点包的权限,   你冒着在你之下运行的任何程序的风险(不一定   python程序)可以将恶意代码注入系统   site-packages并获得root权限。

问题不在于访问网站包(您必须拥有网站包的特权才能任何)。问题在于可以访问 system site-packages 。虚拟环境的站点包不会将根权限泄露给与整个系统正在使用的恶意代码相同的恶意代码。

但是,我认为将sudo pip用于众所周知且熟悉的软件包并没有错。在一天结束时,它就像安装任何其他程序,甚至非python。如果你去它的网站,它看起来很诚实,你相信它,没有理由不sudo。

此外,pip非常安全 - 它使用https作为pypi,如果你--allow-external它会从第三方下载包,但会still keep checksums on pypi并进行比较。对于没有校验和的第三方,您需要明确调用--allow-unverified,这是唯一被认为不安全的选项。

作为个人注释,我可以补充一点,我大多数时候都使用sudo pip,但作为一个WEB开发人员,virtualenv是一种日常用品,我也可以推荐使用它(特别是如果你看到任何粗略的东西,但你仍然想尝试一下。)