面对恶意软件包或安装脚本的安全问题,我很困惑如何最好地使用 pip
。我不是安全专家,所以我可能会感到困惑(请多多包涵),但似乎有 4 种可能重叠的方法:
(1) 对一切使用sudo pip
这就是我现在做事的方式。我通常不需要 virtualenvs 并且喜欢让我所有的包都适用于我所有的工具所带来的便利。我也没有安装很多实验性软件包,主要是使用知名和广泛使用的软件包(matplotlib
、six
等)。
我认为这可能是一种冒险的方法,因为安装过程具有 su
权限,并且 could potentially do anything ;但是它的优 pip 是可以保护 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)“使用虚拟环境”
这个建议经常出现,但我看不出它有什么帮助。这对我来说似乎与 3 没有什么不同,因为它创建了一个我拥有的 site-packages
。
如果这些方法中的任何一种或方法的组合最适合确保 pip
不会导致暴露我的系统?我主要关心的是我的系统作为一个整体,其次才是我在 site-packages
中安装的 Python(如果需要,我可以随时重建)。
我遇到的部分问题是不知道如何权衡风险。一个示例方法,这似乎对我有限的理解有意义,就是在大多数情况下简单地执行 (1),并对我担心可能会损坏我的 site-packages
的任何包使用 virtualenv (4) >。我安装的任何东西仍然能够损坏我可以访问的任何东西,但这似乎是不可避免的,至少我无法访问的东西是安全的(除了安装过程本身)。但我无法评估它提供的保护是否值得它所带来的风险。
最佳答案
您可能想看看使用 virtualenv。引用the docs :
Virtualenv is a tool to create isolated Python environments. The basic problem being addressed is one of dependencies and versions, and indirectly permissions.
Virtualenv 将创建一个文件夹,其中包含一个独立的 python 副本、一个独立的 pip 和一个独立的站 pip 包。您认为这与选项 3 相同,因为您接受的是按表面值(value)链接的建议,而不是阅读它:
If you give yourself write privilege to the system site-packages, you're risking that any program that runs under you (not necessarily python program) can inject malicious code into the system site-packages and obtain root privilege.
问题不在于访问站 pip 包(您必须拥有站 pip 包的权限才能执行任何)。问题在于可以访问系统站 pip 包。虚拟环境的站 pip 包不会将根权限暴露给与整个系统正在使用的恶意代码相同的恶意代码。
但是,我认为对众所周知和熟悉的包使用 sudo pip
没有任何问题。归根结底,这就像安装任何其他程序,甚至是非 python 程序。如果您访问它的网站并且它看起来很诚实并且您信任它,那么没有理由不使用 sudo。
此外,pip 非常安全 - 它对 pypi 使用 https,如果你 --allow-external
它将从第三方下载包,但会 still keep checksums on pypi并比较它们。对于没有校验和的第三方,您需要显式调用 --allow-unverified
,这是唯一被认为不安全的选项。
作为个人说明,我可以补充一 pip ,我大部分时间都使用 sudo pip,但作为 WEB 开发人员,virtualenv 是一种日常工作,我也可以推荐使用它(特别是如果你看到任何粗略的东西,但你仍然想尝试一下)。
关于python - 使用 `pip` 维护 Python 包的最安全方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21068676/