AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 390988
Accepted
Signum
Signum
Asked: 2012-05-22 01:58:33 +0800 CST2012-05-22 01:58:33 +0800 CST 2012-05-22 01:58:33 +0800 CST

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

  • 772

在我们的团队中,我们有三名经验丰富的 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麻烦
  • 缺点:感觉很脏——无法在任何地方找到它作为允许方式的记录

你有什么建议?

linux root
  • 9 9 个回答
  • 15326 Views

9 个回答

  • Voted
  1. Best Answer
    thepearson
    2012-05-22T02:21:53+08:002012-05-22T02:21:53+08:00

    第二种选择是最好的恕我直言。个人账户,sudo 访问。完全禁用通过 SSH 的根访问。我们有几百台服务器和六个系统管理员,这就是我们的工作方式。

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

    此外,如果sudo在每个任务前使用它都非常麻烦,您可以调用 sudo shellsudo -s或切换到 root shellsudo su -

    • 64
  2. Tom
    2012-05-22T11:24:23+08:002012-05-22T11:24:23+08:00

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

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

    1. 那么至少在某些时候,您将不得不使用用户帐户和sudo

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

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

    所以; 使用个性化帐户和 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);

    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 代理的能力时,您可以使用一个轻微的解决方法

    这实现了一种嵌合体配置文件,实际上不应该使用它,因为它是一个讨厌的 hack,但是当您需要以 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
    

    创建一个运行/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# 
    
    • 9
  3. symcbean
    2012-05-22T02:16:21+08:002012-05-22T02:16:21+08:00

    第三个选项看起来很理想——但你真的尝试过看看发生了什么吗?虽然您可能会在身份验证步骤中看到额外的用户名,但任何反向查找都将返回相同的值。

    允许 root 直接 ssh 访问不是一个好主意,即使你的机器没有连接到互联网/使用强密码也是如此。

    通常我使用“su”而不是 sudo 进行 root 访问。

    • 2
  4. Alien Life Form
    2012-05-22T08:51:44+08:002012-05-22T08:51:44+08:00

    我使用 (1),但我碰巧输入了

    rm -rf / tmp *

    在一个倒霉的日子。如果你有几个管理员,我可以认为已经够糟糕了。

    (2) 可能更工程化 - 你可以通过 sudo su - 成为成熟的 root。事故仍然是可能的。

    (3) 我不会接触驳船杆。我在 Suns 上使用它,以便拥有一个非 barebone-sh root 帐户(如果我没记错的话),但它从来都不是健壮的——而且我怀疑它是否可以被审计。

    • 2
  5. Rohaq
    2012-05-22T09:29:36+08:002012-05-22T09:29:36+08:00

    果断回答2。

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

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

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

    sudo是前进的方向。它可能会导致以 root 身份运行命令的额外麻烦,但它为您提供了一个更安全的盒子,无论是在访问还是审计方面。

    • 2
  6. Julian
    2012-05-22T11:25:33+08:002012-05-22T11:25:33+08:00

    绝对是选项 2,但使用组为每个用户提供尽可能多的控制权,而无需使用 sudo。每个命令前面的 sudo 都会失去一半的好处,因为你总是处于危险区域。如果您使相关目录在没有 sudo 的情况下可由系统管理员写入,您会将 sudo 返回到异常,这会让每个人都感到更安全。

    • 1
  7. Plop
    2012-05-23T01:15:58+08:002012-05-23T01:15:58+08:00

    在过去,sudo 是不存在的。因此,拥有多个 UID 0 用户是唯一可用的选择。但它仍然不是那么好,特别是基于 UID 的日志记录来获取用户名。

    如今,sudo 是唯一合适的解决方案。忘记其他任何事情。

    • 1
  8. rackandboneman
    2012-05-22T11:24:10+08:002012-05-22T11:24:10+08:00

    事实证明这是允许的。BSD unices 已经拥有他们的 toor 帐户很长时间了,bashroot 用户倾向于在 csh 是标准的系统上被接受的做法(被接受的弊端;)

    • 0
  9. Tuncay Göncüoğlu
    2012-12-01T09:50:43+08:002012-12-01T09:50:43+08:00

    也许我很奇怪,但是方法(3)也是我首先想到的。优点:您会在日志中拥有每个用户的姓名,并且会知道谁以 root 身份做了什么。缺点:他们每个人都一直是 root,所以错误可能是灾难性的。

    我想问一下为什么您需要所有管理员都具有 root 访问权限。您提出的所有 3 种方法都有一个明显的缺点:一旦管理员运行了一个sudo bash -l或sudo su -类似的程序,您就失去了跟踪谁做了什么的能力,此后,一个错误可能是灾难性的。此外,如果可能出现不当行为,这甚至可能会变得更糟。

    相反,您可能想考虑采用另一种方式:

    • 将您的管理员用户创建为普通用户
    • 决定谁需要做什么工作(apache 管理/postfix 管理等)
    • 将用户添加到相关组中(例如将“martin”添加到“postfix”和“mail”,如果使用它则添加“amavis”等)
    • 修复权限 (chmod -R g+w postfix:postfix /etc/postfix)
    • 只给予相对的 sudo 权力:(visudo -> 让马丁使用 /etc/init.d/postfix , /usr/bin/postsuper 等)

    这样,martin 就可以安全地处理 postfix,如果出现错误或不当行为,您只会丢失 postfix 系统,而不是整个服务器。

    相同的逻辑可以应用于任何其他子系统,例如 apache、mysql 等。

    当然,这在这一点上纯粹是理论上的,可能很难建立。它看起来确实是一个更好的方法。至少对我来说。如果有人尝试这样做,请告诉我结果如何。

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve