在我们的团队中,我们有三名经验丰富的 Linux 系统管理员,他们必须管理几十台 Debian 服务器。以前我们都以 root 身份使用 SSH 公钥身份验证。但是我们讨论了该场景的最佳实践是什么,但未能就任何事情达成一致。
每个人的 SSH 公钥都放在 ~root/.ssh/authorized_keys2
- 优点:简单易用,SSH代理转发很容易,开销小
- 缺点:缺少审计(你永远不知道哪个“根”做了改变),更容易发生意外
使用个性化帐户和sudo
这样我们就可以使用 SSH 公钥使用个性化帐户登录,并使用sudo以root权限执行单个任务。此外,我们可以给自己一个允许我们查看日志文件的“adm”组。
- 优点:良好的审计,sudo防止我们太容易做愚蠢的事情
- 缺点:SSH 代理转发中断,这很麻烦,因为非 root 用户几乎无法完成任何事情
使用多个 UID 0 用户
这是一位系统管理员提出的非常独特的建议。他建议在 /etc/passwd 中创建三个用户,它们都具有 UID 0 但登录名不同。他声称这实际上并没有被禁止,并允许每个人的 UID 为 0 但仍然能够进行审计。
- 优点:SSH 代理转发有效,审计可能有效(未经测试),没有sudo麻烦
- 缺点:感觉很脏——无法在任何地方找到它作为允许方式的记录
你有什么建议?
第二种选择是最好的恕我直言。个人账户,sudo 访问。完全禁用通过 SSH 的根访问。我们有几百台服务器和六个系统管理员,这就是我们的工作方式。
代理转发到底是怎么断的?
此外,如果
sudo
在每个任务前使用它都非常麻烦,您可以调用 sudo shellsudo -s
或切换到 root shellsudo su -
关于第三个建议的策略,除了仔细阅读
useradd -o -u userXXX
@jlliagre 推荐的选项外,我不熟悉将多个用户作为同一个 uid 运行。(因此,如果您继续这样做,如果您可以更新出现的任何问题(或成功),我会很感兴趣......)我想我对第一个选项“每个人的 SSH 公钥都放入 ~root/.ssh/authorized_keys2”的第一个观察是,除非你绝对不会在任何其他系统上工作;
sudo
第二个观察是,如果您在渴望符合 HIPAA、PCI-DSS 合规性或 CAPP 和 EAL 之类的系统上工作,那么您将不得不解决 sudo 的问题,因为;
所以; 使用个性化帐户和 sudo
不幸的是,作为系统管理员,几乎所有你需要在远程机器上做的事情都需要一些提升的权限,然而令人恼火的是,当你在远程机器上时,大多数基于 SSH 的工具和实用程序都被破坏了
sudo
因此,我可以传授一些我用来解决
sudo
您提到的烦恼的技巧。第一个问题是,如果使用 root 登录被阻止,PermitRootLogin=no
或者您没有使用 ssh 密钥的 root,那么它会使 SCP 文件成为某种 PITA。问题 1:您想从远程端 scp 文件,但它们需要 root 访问权限,但是您不能直接以 root 身份登录到远程框。
无聊的解决方案:将文件复制到主目录,chown 和 scp down。
ssh userXXX@remotesystem
等sudo su -
,cp /etc/somefiles
到/home/userXXX/somefiles
,chown -R userXXX /home/userXXX/somefiles
, 使用 scp 从远程检索文件。确实很无聊。
不那么无聊的解决方案:sftp 支持该
-s sftp_server
标志,因此您可以执行以下操作(如果您在中配置了无密码 sudo/etc/sudoers
);(您也可以将此 hack-around 与 sshfs 一起使用,但我不确定是否推荐它...;-)
如果您没有无密码 sudo 权限,或者由于某些配置原因上述方法被破坏,我可以建议另一种不那么无聊的文件传输方法,以访问远程根文件。
端口转发忍者方法:
登录到远程主机,但指定远程端口 3022(可以是任何空闲的,并且不为管理员保留,即 >1024)将转发回本地的端口 22。
扎根于正常的时尚......
现在您可以从另一个方向对文件进行 scp,避免了制作文件中间副本的无聊步骤;
问题 2:SSH 代理转发:如果您加载根配置文件,例如通过指定登录 shell,SSH 代理转发所需的环境变量将
SSH_AUTH_SOCK
被重置,因此 SSH 代理转发在sudo su -
.半生不熟的答案:
任何正确加载 root shell 的东西都会正确地重置环境,但是当您同时需要 root 权限和使用 SSH 代理的能力时,您可以使用一个轻微的解决方法
这实现了一种嵌合体配置文件,实际上不应该使用它,因为它是一个讨厌的 hack,但是当您需要以 root 身份从远程主机将 SCP 文件发送到其他远程主机时很有用。
无论如何,您可以通过在 sudoers 中设置以下内容,使您的用户可以保留他们的 ENV 变量;
这使您可以像这样创建令人讨厌的混合登录环境;
正常登录;
创建一个运行
/root/.profile
和/root/.bashrc
. 但保留SSH_AUTH_SOCK
所以这个 shell 有 root 权限,和 root
$PATH
(但是一个无聊的主目录......)但是您可以使用该调用来执行需要远程 sudo root 的操作,也可以像这样访问 SSH 代理;
第三个选项看起来很理想——但你真的尝试过看看发生了什么吗?虽然您可能会在身份验证步骤中看到额外的用户名,但任何反向查找都将返回相同的值。
允许 root 直接 ssh 访问不是一个好主意,即使你的机器没有连接到互联网/使用强密码也是如此。
通常我使用“su”而不是 sudo 进行 root 访问。
我使用 (1),但我碰巧输入了
在一个倒霉的日子。如果你有几个管理员,我可以认为已经够糟糕了。
(2) 可能更工程化 - 你可以通过 sudo su - 成为成熟的 root。事故仍然是可能的。
(3) 我不会接触驳船杆。我在 Suns 上使用它,以便拥有一个非 barebone-sh root 帐户(如果我没记错的话),但它从来都不是健壮的——而且我怀疑它是否可以被审计。
果断回答2。
意味着您允许 SSH 访问作为
root
. 如果这台机器以任何方式面向公众,那将是一个糟糕的主意;当我在端口 22 上运行 SSH 时,我的 VPS 每小时都会多次尝试以 root 身份进行身份验证。我有一个基本的 IDS 设置来记录和禁止多次尝试失败的 IP,但它们不断出现。值得庆幸的是,一旦我拥有自己的帐户并配置了 sudo,我就以 root 用户身份禁用了 SSH 访问。此外,您几乎没有执行此操作的审计跟踪。在需要时提供根访问权限。是的,作为标准用户,您几乎没有任何特权,但这正是您想要的;如果一个帐户确实受到损害,您希望它的能力受到限制。您希望任何超级用户访问都需要重新输入密码。此外,可以通过用户组控制 sudo 访问权限,并根据需要将其限制为特定命令,让您更好地控制谁有权访问什么。此外,可以记录以 sudo 运行的命令,因此如果出现问题,它可以提供更好的审计跟踪。哦,不要一登录就运行“sudo su -”。那是非常糟糕的做法。
您的系统管理员的想法很糟糕。他应该感到难过。不,*nix 机器可能不会阻止您这样做,但是您的文件系统和几乎每个应用程序都希望每个用户都有一个唯一的 UID。如果你开始走这条路,我可以保证你会遇到问题。也许不是立即,但最终。例如,尽管显示友好的名称,文件和目录使用 UID 号来指定它们的所有者;如果您遇到的程序存在重复 UID 的问题,您不能稍后更改 passwd 文件中的 UID,而不必进行一些认真的手动文件系统清理。
sudo
是前进的方向。它可能会导致以 root 身份运行命令的额外麻烦,但它为您提供了一个更安全的盒子,无论是在访问还是审计方面。绝对是选项 2,但使用组为每个用户提供尽可能多的控制权,而无需使用 sudo。每个命令前面的 sudo 都会失去一半的好处,因为你总是处于危险区域。如果您使相关目录在没有 sudo 的情况下可由系统管理员写入,您会将 sudo 返回到异常,这会让每个人都感到更安全。
在过去,sudo 是不存在的。因此,拥有多个 UID 0 用户是唯一可用的选择。但它仍然不是那么好,特别是基于 UID 的日志记录来获取用户名。
如今,sudo 是唯一合适的解决方案。忘记其他任何事情。
事实证明这是允许的。BSD unices 已经拥有他们的 toor 帐户很长时间了,bashroot 用户倾向于在 csh 是标准的系统上被接受的做法(被接受的弊端;)
也许我很奇怪,但是方法(3)也是我首先想到的。优点:您会在日志中拥有每个用户的姓名,并且会知道谁以 root 身份做了什么。缺点:他们每个人都一直是 root,所以错误可能是灾难性的。
我想问一下为什么您需要所有管理员都具有 root 访问权限。您提出的所有 3 种方法都有一个明显的缺点:一旦管理员运行了一个
sudo bash -l
或sudo su -
类似的程序,您就失去了跟踪谁做了什么的能力,此后,一个错误可能是灾难性的。此外,如果可能出现不当行为,这甚至可能会变得更糟。相反,您可能想考虑采用另一种方式:
这样,martin 就可以安全地处理 postfix,如果出现错误或不当行为,您只会丢失 postfix 系统,而不是整个服务器。
相同的逻辑可以应用于任何其他子系统,例如 apache、mysql 等。
当然,这在这一点上纯粹是理论上的,可能很难建立。它看起来确实是一个更好的方法。至少对我来说。如果有人尝试这样做,请告诉我结果如何。