What are the risks of running 'sudo pip'?
有时我会遇到一些强调在sudo下运行pip是"错误的"或"不好的"的评论或回答,但有些情况(包括我设置了一系列工具的方式)下运行EDOCX1要简单得多,甚至需要这样运行。
在sudo下运行pip有哪些风险?
请注意,这个问题与这个问题不一样,尽管它的标题没有提供关于风险的信息。这也不是一个关于如何避免使用sudo的问题,而是一个关于为什么要使用sudo的问题。
当你用sudo运行pip时,你用sudo运行setup.py。换句话说,您从Internet以根用户身份运行任意的python代码。如果有人在pypi上放置了一个恶意项目,并且您安装了它,那么您就给了攻击者对您的计算机的根访问权。在最近对pip和pypi进行一些修复之前,攻击者还可以运行中间人攻击,在您下载值得信赖的项目时注入他们的代码。
- 该威胁是否仅适用于pip期间,或其安装的任何后续运行?
- @raxacoricofallapatorius安装的代码只有在以根用户身份运行时才具有根用户权限,而不是总是这样。但它仍然是来自互联网的代码,如果它是恶意的,那么它也可能在运行时做坏事。
- 但不管我是不是在我还是在我的时候,这都是真的,对吧?一旦安装好,我们都有风险,不管它是如何到达那里的?
- @是的。
- 所以风险是在安装时(如你在回答中所说,我只是在确认),如果我能避免,我会是安全的(或至少不会暴露在安装过程中的SU损坏)。我能简单地在pip需要的地方给自己写权限,然后像我一样运行pip吗?
- @Raxacoricofallapatorius这进入了我不愿意回答的领域,不是因为我不知道(我有预感,可以给出原因),而是因为众所周知,很难预测这些看似微小的变化如何影响整体安全。此外,通过在其他地方(例如在virtualenv中)安装包,通常可以非常简单地避免sudo和这些权限问题。即使忽略所有的安全问题,这样做也可能更好、更可靠。
- @raxacoricofallapatorius依赖于确切的写权限和目录布局,我担心更复杂的恶意软件会覆盖其他更可信的代码,例如系统实用程序通常以根用户身份运行的代码。
- 我认为这可能会演变成一个后续的问题(我想我基本上已经得到了我在这里提出的问题的答案),但是为什么给予自己对site-packages和pip安装使用的其他目录的写权限与将这些内容放入具有此类权限的新文件夹有什么不同呢?这看起来像是我所期望的那样安全,不是吗?
- @raxacoricofallapatorius(…)但是为什么要给我自己对站点包(…)–sudo pip的写权限不给你对特定目录(如站点包)的写权限,而是对系统中的所有目录的写权限。
- 那么,这是否意味着给予自己对site-packages的书面许可是推荐的替代方案?在其他地方,我看到一个要安装在另一个用户下的soluiton。是否有一种不使用sudo运行pip的最佳方法?那会是最Python的。
- @不要混淆我最近的备忘录说建议的方法是建立一个虚拟环境。virtualenv将有一个属于普通用户的site-packages目录。
- 这个答案很奇怪。当然,当你使用sudo运行某个程序时,你会给它根权限;这就是sudo的全部要点,当然不是特定于pip的。
除了明显的安全风险(我认为当你安装你知道的软件时,这实际上是很低的)带来了其他的答案之外,还有另一个原因。系统附带的python是这个系统的一部分,当您想要管理系统时,您可以使用为系统维护而指定的工具,比如安装/升级/卸载软件时的package manager。当您开始使用第三方工具(本例中的PIP)修改系统的软件时,您就不能保证系统的状态。另一个原因是,sudo会给你带来一些你没有机会或者很小的机会去解决的问题。例如,请参见python中sys.executable和sys.version之间的不匹配
发行商意识到这个问题,并试图缓解它。例如,fedora—使sudo-pip安全,debian—dist包而不是站点包。
以这种方式使用pip意味着您将它信任到您允许它对您的系统做任何事情的级别。不仅是pip,而且它将从您可能不信任的源下载和执行的任何代码,这可能是恶意的。
PIP不需要所有的特权,只需要对特定文件和目录的写访问。如果您不能使用系统的包管理器,并且不想采用虚拟环境的方式,您可以创建一个对python安装目录具有写权限的特定用户,并将其用于pip。这样你就可以更好地控制PIP可以做什么,不可以做什么。你可以用sudo -u来做这个!
- 所以,我需要做的就是,例如,允许我自己向site-packages写入权限?
- @Raxacoricofallapatorius不仅仅是在那里,因为一些软件包还安装助手脚本(比如pip本身、ipython、django、pygments,…),所以您还需要访问他们自己安装的目录。
- 是和否。我不是安全专家,但我认为如果运行脚本的用户没有写权限更好。因此我建议一个独立的用户。
- @马德莫:是的,这是有道理的;但是如果没有适当的许可,这些情况很可能很容易被发现。如果这样做了,这不是最安全的方法,那么对我的系统整体来说,最糟糕的情况是,当我运行任何东西时,会发生什么,对吗?唯一的区别是我可能会像我一样破坏我的python安装(而不是必须是su才能完成),对吗?
- 我如何创建这样一个用户,仅仅是为了使用pip(不需要对系统进行其他更改,比如新的主目录等)?在那之后,我假设我只是将site-packages的所有者更改为该用户,对吗?
- 这取决于您的系统。假设使用Linux,您可以先执行groupadd python; useradd -M pipuser -g python -d /tmp; passwd -l pipuser,然后执行chgrp -R python site-packages; chmod -R g+w site-packages,最后执行sudo --user pipuser pip install ...。我不知道麦克的事。
sudo唯一"错误"的地方是它作为超级用户ala-root的作用,这意味着您可能会用错误的命令破坏安装。由于PIP是一个特定程序的包维护,您无论如何都需要这样的访问来进行更改…