面对有关恶意软件包或安装脚本的安全问题,我对如何最好地使用pip感到困惑.我不是一个安全专家,所以我可能只是感到困惑(忍受我),但似乎有4种可能重叠的方法:
(1)使用sudo pip处理所有事情
这就是我现在做的事情.我通常不需要virtualenvs,并且喜欢让我的所有包都适用于我的所有工具.我也没有安装很多实验包,几乎坚持着名的和广泛使用的(matplotlib,六等).
我认为这可能是一种冒险的方法,因为安装过程具有su权限,而could potentially do anything;但它的优点是可以保护site-packages目录免受安装后以非su运行的任何东西(不仅仅是包)的后续恶作剧.
这种方法也无法完全避免,因为有些软件包(pip本身)需要它来引导任何Python安装.
(2)创建一个pip用户并赋予它对site-packages的所有权
这将限制pip可以做的seem to have the advantage:它可以做的就是安装到site-packages.但是我不确定副作用,或者它是否会起作用(例如,当pip需要将东西放在其他位置时).更现实的变体是以这种方式进行设置,并在它工作时使用pip作为“pip-user”,而当它不工作时使用su.
(3)给自己拥有网站包的所有权
我收集了this is a very had idea,但我不确定为什么.这意味着我运行的任何代码都可以篡改站点包;但这意味着恶意安装脚本只会损坏我可能会损坏自己的东西.
(4)“使用virtualenv”
这个建议出现了很多,但我看不出它有多大帮助.它似乎与我没有什么不同,因为它创建了我拥有的网站包.
如果这些方法中的任何一种或方法的组合最适合确保pip不会导致我的系统暴露?我关心的主要是我的系统整体,其次是我在站点包中的Python安装(如果需要,我可以随时重建).
我遇到的部分问题是,不知道如何权衡风险.一个示例方法,似乎对我有限的理解是有意义的,只是在大多数情况下做(1),并使用virtualenv(4)任何我担心可能会损坏我的网站包的包.我安装的任何东西仍然可以破坏我有权访问的任何东西,但这似乎是不可避免的,至少我无法访问的东西是安全的(除了在安装过程中本身).但我无法评估这种保护是否值得冒这个风险.
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和一个独立的站点包.您认为这与选项3相同,因为您正在接受以面值链接而不是读取它的建议:
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.
问题不在于访问站点包(您必须拥有站点包的特权才能执行任何操作).问题在于可以访问系统站点包.虚拟环境的站点包不会将根权限泄露给与整个系统正在使用的恶意代码相同的恶意代码.
但是,我认为将sudo pip用于众所周知且熟悉的软件包没有任何问题.在一天结束时,它就像安装任何其他程序,甚至非python.如果你去它的网站,它看起来很诚实,你相信它,没有理由不sudo.
此外,pip是非常安全的 – 它使用https进行pypi,如果你使用–allow-external,它将从第三方下载软件包,但是会在still keep checksums on pypi下进行比较.对于没有校验和的第三方,您需要显式调用–allow-unverified,这是唯一被认为不安全的选项.
作为个人笔记,我可以补充一点,我大多数时候都使用sudo pip,但作为一个WEB开发人员,virtualenv是一种日常用品,我也可以推荐使用它(特别是如果你看到任何粗略的东西)但你仍然想尝试一下).