如何保护仅运行应用程序进程的系统用户的安全?

如何保护仅运行应用程序进程的系统用户的安全?

我通过 adduser 命令创建了一个系统用户,用于我安装的应用程序。该用户应该运行特定于应用程序的进程等(想象一下,postgres 系统用户除了运行 postgres 相关的东西外什么都不做)

因为这个用户除了执行应用程序的命令外什么都不做,有没有办法阻止人类以这个用户的身份登录?这个用户不属于任何组(所以我不必担心 ssh 登录或其他组权限)。我读到没有主文件夹将有助于防止登录,但我需要这个用户的主文件夹,因为那是我编译/安装应用程序的地方。

除了阻止人类登录该用户帐户之外,还有其他安全问题需要考虑吗?

答案1

您应该采取两件事来防止人们像使用“真实人类用户帐户”一样使用该用户帐户。

由于没有人会以任何目的以此帐户登录,因此您应该做的第一件也是最重要的事情就是确保密码验证永远不会成功。guntbert 的精彩回答详细解释了这一点。总之,您可以运行:

sudo passwd -l user

除此之外,设置用户的登录外壳不执行任何操作并立即退出:

sudo chsh -s /bin/false user

那样:

  • 使用密码验证以外的机制以用户身份登录(例如基于密钥的身份验证获取 shell 通常会失败。但是,某些 SSH 相关功能仍有可能正常运行。

    例如,如果为用户启用了基于密钥的身份验证,则某些人仍然可以使用它来验证身份并打开 scp 或 sftp 的 SSH 连接或创建加密隧道,并且可能访问其他功能。

  • 尝试模拟登录 shell 通常会失败。但是,能够以 root 身份运行程序或拥有某种非基于密码的方式以用户身份进行身份验证的人通常仍可以运行非登录 shell,它提供与登录 shell 相同的功能。

    例如,设置user的外壳将/bin/false阻止和(除其他外)工作,su - usersudo -i -u user即使以 身份运行root但它们不会妨碍、或(其中包括)工作su usersudo -s -u usersudo -u user bash当它们运行时root

显然,禁用已经无法通过密码验证登录的用户的登录 shell,并且不已经配置基于密钥的身份验证并不能带来很大的安全效益。那么,为什么要这么做呢?因为:

  • 它可能有助于提醒用户拥有管理员权限,在以管理员身份登录(或模拟登录)之前三思而行user

  • 将用户的 shell 设置为非功能性的东西是一种方便且通常有效的方式,可以向任何阅读的人表明/etc/passwd该用户并不代表人类,也不打算以交互方式模仿。

    (在 Ubuntu 和其他现代类 Unix 系统中/etc/passwd存储帐户信息但不存储实际的密码哈希值 - 这些位于/etc/shadow/etc/passwd可以由系统上的所有或大多数人类用户(包括非管理员)查看。)

  • 如果出于任何原因为用户重新启用密码验证,则用户的登录 shell 不起作用通常会带来很大的安全益处。

答案2

你只需要帐户,以便无法输入有效的密码:

sudo passwd -l username

现在使用密码登录该帐户已被禁用,但可以通过su(从运行的进程)登录权限(例如sudo -i)或 ssh-keys(您可能没有启用)仍然可能。我不建议完全禁用该帐户,因为您需要它的程序无法运行。

/etc/shadow您可以通过使用命令sudo vipw -svipw锁定文件以防止损坏并调用您最喜欢的 CLI 编辑器)进行编辑并用 替换第一个冒号后的字符串来完成几乎相同的操作!

 mysysuser:!:15819:0:99999:7:::

如果您采用第二种方法,建议备份/etc/shadow(以防出错)。一种方法是sudo cp /etc/shadow /etc/shadow.old。新配置生效后,删除备份(sudo rm /etc/shadow.old),因为保留用户配置的额外不必要副本可能会被视为不好密码哈希值到处都是(一旦密码被更改,哈希值就会消失,因此旧的哈希值无法被破解,从而无法访问可能仍设置有旧密码的其他系统)。

相关内容