我是 Linux 新手(如果重要的话,是 Ubuntu)。我公司的一台机器上有多个 sudo 用户。情况如下:
每个人都想要 sudo 用户权限,因为他们声称在工作期间需要安装 python 包(他们是 AI 工程师)
每个用户都将私人 rsa 密钥保存在他们的主文件夹中,以便快速拉取/推送到 github。
因此,从理论上讲,如果 sudo 用户不法,他可以获取所有人的私钥,并强加给他们,然后提取他无权获得的源代码。我该如何防止这种情况发生?
谢谢
答案1
我没有直接回答你的问题,因为你描述的是一个XY问题. 这是你的根本,实际的问题:
每个人都想要 sudo 用户权限,因为他们声称在工作期间需要安装 python 包
问题是这样的:没有人需要使用sudo
来安装 Python 包。事实上,我们极力不建议这样做。特别是如果有多个用户使用同一个系统,您无法阻止任何人干扰其他人可能需要的系统级软件包。如果存在版本冲突、某些软件包发生重大更改等情况怎么办?
解决方案 1 — 用户级安装
真正的解决方案是使用 Python 包的用户级安装。也就是说,不要这样做,而是这样sudo pip install …
做:
pip install --user pandas
这会将包安装到相应用户的主目录中,并且保留系统包库。
sudo
我再怎么强调也不为过:使用with不会带来任何好处pip
。
解决方案 2——Pipenv 或 Poetry
更好的解决方案是使用pipenv
或者poetry
,它为包创建一个虚拟环境。
不同项目的软件包和版本甚至可以有所不同——如果您需要一个软件包在一段时间内保持在给定的版本,这一点尤其重要(例如,pandas
因更改其 API 而臭名昭著;scipy
不久前发生了一些重大变化,...)。
我本来会推荐 Pipenv,但截至 2020 年,维护已经相当缺乏,而且很长时间没有发布任何版本了。
要使用 Poetry,只需在每个用户级别安装它:
pip install --user poetry
然后为当前项目初始化一个新环境:
cd /path/to/project
poetry install pandas
这将创建一个新的 Poetry 配置文件,指定当前项目的要求。运行poetry
以了解更多信息或阅读文档。
解决方案 3 —pyenv
最好的办法是让用户安装自己的 Python 版本。你可以使用pyenv
创建整个 Python 发行版的用户级安装。这样,用户可以使用其 Pipenv 项目初始化时使用的任何 Python 版本,例如,暂时停留在 3.7 版本,直到他们想要升级到 3.8 版本。
如果您不想通过执行系统级的 Python 小升级(必要时)来破坏每个人的软件包,那么这个功能就特别有用。
底线:如果不需要,不要给普通用户 sudo 访问权限。让他们使用自己的用户空间来安装 Python 和/或 Python 包。
警告:某些 Python 包可能需要特定的库才能成功构建。您无法真正避免在系统级别安装这些库,但在这种罕见情况下,管理员可能愿意安装sudo apt install …
所需的任何库。
答案2
推测 Python 开发人员是使用远程方式连接到这台机器,ssh
而不是直接在控制台上登录。
在这种情况下,他们的私钥不应该正是出于这个原因,他们根本不需要在共享计算机上。相反,他们应该ssh-agent
在本地计算机上运行并使用ssh -A
(或ForwardAgent yes
在中为该主机设置~/.ssh/config
)连接到共享计算机,并仅在本地计算机上保留私钥。使用ssh-agent
和代理转发将导致远程(共享)计算机安全地将身份验证请求(例如来自 github 的请求)转发回ssh-agent
用户本地计算机上的,在那里将执行 RSA 身份验证,而无需将用户的私钥泄露给除本地计算机之外的任何主机。
(如果本地计算机运行的是 Windows 而不是 linux/unix 版本,那么 Windows ssh 客户端仍应以某种方式提供 ssh 代理转发,但我不知道如何访问它。请查看您的文档以了解详细信息。)
答案3
解决方案是授予 Python 开发人员仅 sudo 实际需要的命令的权限。允许的命令完全指定,包括参数,并且可以使用通配符。
以下是 Unix Stackexchange 帖子中的回答
如何远程执行 ssh 命令,无需密码即可执行 sudo 命令。
您可以告诉 sudo 跳过某些命令的密码。
例如
/etc/sudoers
archemar ALL = (www-data) NOPASSWD: /bin/rm -rf /var/www/log/upload.*
这让我可以使用
sudo -u www-data /bin/rm -rf /var/www/log/upload.*
如同 archemar 一样,无需密码。
注意
sudo -u www-data rm -rf /var/www/log/upload.*
不起作用(会要求输入密码),因为
rm
与 不同/bin/rm
。确保
/etc/sudoers
使用visudo
命令进行编辑。一旦您达到高级水平,您可能希望拥有自己的
sudo
文件/etc/sudoers.d
。