多个 Linux 系统管理员以 root 身份工作

多个 Linux 系统管理员以 root 身份工作

我们团队中有三位经验丰富的 Linux 系统管理员,负责管理几十台 Debian 服务器。之前,我们都以 root 身份使用 SSH 公钥身份验证工作。但我们讨论了该场景的最佳做法,但未能达成一致。

每个人的 SSH 公钥都放入 ~root/.ssh/authorized_keys2

  • 优点:易于使用,SSH 代理转发工作轻松,开销小
  • 缺点:缺少审计(你永远不知道哪个“根”做了更改),更容易发生事故

使用个性化帐户和须藤

这样,我们就可以使用 SSH 公钥登录个性化账户,并使用须藤做单项任务权限。此外,我们可以给自己一个“adm”组,允许我们查看日志文件。

  • 优点:审计良好,须藤防止我们轻易做出愚蠢的事情
  • 缺点:SSH 代理转发中断,这很麻烦,因为几乎无法以非 root 用户身份进行任何操作

使用多个 UID 0 用户

这是一位系统管理员提出的非常独特的建议。他建议在 /etc/passwd 中创建三个用户,每个用户都有 UID 0,但登录名不同。他声称这实际上并不被禁止,并且允许每个人都是 UID 0,但仍然能够进行审计。

  • 优点:SSH 代理转发有效,审计可能有效(未经测试),否须藤麻烦
  • 缺点:感觉很脏 - 找不到任何地方记录它作为允许的方式

你有什么建议?

答案1

在我看来,第二个选项是最好的。个人账户,sudo 访问。完全禁用通过 SSH 的 root 访问。我们有几百台服务器和六名系统管理员,这就是我们的做法。

代理转发到底是怎么断的?

sudo另外,如果在每个任务前使用很麻烦,你可以使用以下命令调用 sudo shellsudo -s或切换到 root shell:sudo su -

答案2

关于第三种建议的策略,除了仔细阅读useradd -o -u userXXX@jlliagre 推荐的选项外,我并不熟悉以相同的 uid 运行多个用户。(因此,如果您继续这样做,我会很感兴趣您是否可以更新帖子以包含出现的任何问题(或成功)...)

我想,我对第一个选项“每个人的 SSH 公钥都放入 ~root/.ssh/authorized_keys2”的第一个观察是,除非你绝对永远不会在任何其他系统上工作;

  1. 那么至少有时,你将需要使用用户帐户和sudo

第二个观察是,如果您在追求 HIPAA、PCI-DSS 合规性的系统或 CAPP 和 EAL 之类的系统上工作,那么您将必须解决 sudo 的问题,因为;

  1. 这是一个行业标准提供非根个人用户帐户,这些帐户可以被审计,禁用,过期等,通常使用一些集中式用户数据库。

所以;使用个性化帐户和 sudo

不幸的是,作为一名系统管理员,你在远程机器上需要做的几乎每件事都需要提升权限,然而令人恼火的是,当你在sudo

因此,我可以传授一些技巧来解决sudo您提到的烦恼。第一个问题是,如果使用 root 登录被阻止PermitRootLogin=no,或者您没有使用 ssh 密钥的 root,那么 SCP 文件就会变得有点麻烦。

问题 1:您想从远程端 scp 文件,但它们需要 root 访问权限,但是您无法直接以 root 身份登录到远程框。

钻孔解决方案:将文件复制到主目录,chown,然后 scp 下来。

ssh userXXX@remotesystemsudo su -等等,使用 scp 从cp /etc/somefiles远程检索文件。/home/userXXX/somefileschown -R userXXX /home/userXXX/somefiles

确实很无聊。

更简单的解决方案:sftp 支持该-s sftp_server标志,因此您可以执行以下操作(如果您已经在中配置了无密码 sudo /etc/sudoers);

sftp  -s '/usr/bin/sudo /usr/libexec/openssh/sftp-server' \
userXXX@remotehost:/etc/resolv.conf 

(您也可以将这个 hack-around 与 sshfs 结合使用,但我不确定是否推荐这样做... ;-)

如果您没有无密码的 sudo 权限,或者由于某些配置原因上述方法无效,我可以建议一种更不那么无聊的文件传输方法来访问远程根文件。

端口转发忍者方法

登录到远程主机,但指定远程端口 3022(可以是任何免费的,并且不为管理员保留,即> 1024)要转发回本地的端口 22。

 [localuser@localmachine ~]$ ssh userXXX@remotehost -R 3022:localhost:22
Last login: Mon May 21 05:46:07 2012 from 123.123.123.123
------------------------------------------------------------------------
This is a private system; blah blah blah
------------------------------------------------------------------------

以正常方式扎根......

-bash-3.2$ sudo su -
[root@remotehost ~]# 

现在您可以从另一个方向 scp 文件,从而避免制作文件中间副本的无聊步骤;

[root@remotehost ~]#  scp -o NoHostAuthenticationForLocalhost=yes \
 -P3022 /etc/resolv.conf localuser@localhost:~
localuser@localhost's password: 
resolv.conf                                 100%  
[root@remotehost ~]#  

 

 

问题2:SSH代理转发:如果您加载根配置文件(例如通过指定登录 shell),则 SSH 代理转发所需的环境变量(例如)将SSH_AUTH_SOCK被重置,因此 SSH 代理转发在 下会“中断” sudo su -

半生不熟的答案

任何正确加载 root shell 的操作都将正确地重置环境,但是,当你需要 root 权限和使用 SSH 代理的能力时,你可以使用一种稍微变通的方法,同时

这实现了一种不应该使用的嵌合体配置文件,因为这是一个恶意的黑客行为但是当您需要以 root 身份将文件从远程主机 SCP 到其他远程主机时很有用。

无论如何,您可以通过在 sudoers 中设置以下内容来让您的用户保留他们的 ENV 变量;

 Defaults:userXXX    !env_reset

这使得您可以创建像这样的令人讨厌的混合登录环境;

正常登录;

[localuser@localmachine ~]$ ssh userXXX@remotehost 
Last login: Mon May 21 12:33:12 2012 from 123.123.123.123
------------------------------------------------------------------------
This is a private system; blah blah blah
------------------------------------------------------------------------
-bash-3.2$ env | grep SSH_AUTH
SSH_AUTH_SOCK=/tmp/ssh-qwO715/agent.1971

创建一个 bash shell,运行/root/.profile/root/.bashrc。但保留SSH_AUTH_SOCK

-bash-3.2$ sudo -E bash -l

所以这个shell具有root权限,并且是root $PATH(但是主目录被破坏了...)

bash-3.2# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t
bash-3.2# echo $PATH
/usr/kerberos/sbin:/usr/local/sbin:/usr/sbin:/sbin:/home/xtrabm/xtrabackup-manager:/usr/kerberos/bin:/opt/admin/bin:/usr/local/bin:/bin:/usr/bin:/opt/mx/bin

但是您可以使用该调用来执行需要远程 sudo root 的事情,但也需要 SSH 代理访问,如下所示;

bash-3.2# scp /root/.ssh/authorized_keys ssh-agent-user@some-other-remote-host:~
/root/.ssh/authorized_keys              100%  126     0.1KB/s   00:00    
bash-3.2# 

答案3

第三种选择看起来非常理想——但你真的尝试过看看会发生什么吗?当你可能查看身份验证步骤中的附加用户名,任何反向查找都将返回相同的值。

允许 root 直接 ssh 访问是一个坏主意,即使您的机器未连接到互联网/使用强密码。

通常我使用“su”而不是 sudo 来获得 root 访问权限。

答案4

肯定回答2。

  1. 意味着您允许以 身份进行 SSH 访问root。如果这台机器以任何方式面向公众,那么这简直是个糟糕的想法;当我在端口 22 上运行 SSH 时,我的 VPS 每小时都会多次尝试以 root 身份进行身份验证。我设置了一个基本的 IDS 来记录和禁止多次尝试失败的 IP,但它们不断出现。值得庆幸的是,我在拥有自己的帐户并配置 sudo 后立即禁用了以 root 用户身份进行的 SSH 访问。此外,您这样做几乎没有审计线索。

  2. 在需要时提供 root 访问权限。是的,作为标准用户,您几乎没有任何权限,但这几乎就是您想要的;如果帐户确实被盗用,您希望限制其权限。您希望任何超级用户访问都需要重新输入密码。此外,可以通过用户组控制 sudo 访问,并根据需要限制为特定命令,让您更好地控制谁有权访问什么。此外,可以记录以 sudo 身份运行的命令,因此如果出现问题,它可以提供更好的审计跟踪。哦,不要一登录就运行“sudo su -”。这是非常糟糕的做法。

  3. 您的系统管理员的想法很糟糕。他应该感到难过。不,*nix 机器可能不会阻止您这样做,但您的文件系统和几乎所有应用程序都希望每个用户都有一个唯一的 UID。如果您开始走这条路,我可以保证您会遇到问题。也许不是立即,但最终会遇到。例如,尽管显示了友好的名字,但文件和目录使用 UID 号来指定它们的所有者;如果您遇到一个程序在后续过程中存在重复 UID 的问题,您不能只是在密码文件中更改 UID,而不必进行一些严重的手动文件系统清理。

sudo是前进的方向。虽然以 root 身份运行命令可能会带来更多麻烦,但它为您提供了更安全的环境,无论是在访问方面还是在审计方面。

相关内容