我已经设置了一个托管 Play 的 Web 服务器!框架应用,服务器是Amazon Linux EC2。
如果您不熟悉 Amazon Linux,默认情况下有一个 root 用户和一个具有 sudo 权限的 ec2 用户。要使用密钥以 ec2 用户身份通过 ssh 访问服务器,密码将被禁用。
我希望这个应用程序尽可能安全,但这个设置对我来说似乎不安全;如果有人能够获得 ssh 密钥,他们将拥有机器的 root 访问权限。
为了强化服务器,我添加了一个新用户“Play”。我从 Play 用户主文件夹存储并运行该应用程序。然后,我从 ec2-user 中删除了 sudo 命令,并为 root 添加了密码。
因此,现在我以没有 sudo 权限的 ec2 用户身份通过 ssh 登录,然后切换到 root/Play 用户以进行任何更改或在服务器上进行工作。
这似乎是一个相当安全的解决方案,但我想更进一步:我想将用于登录的用户 (ec2-user) 限制为仅 1 个命令:“su - ”。这就是我将使用该用户的全部目的:切换到 root。
作为参考,这些是我为此设置运行的命令:
sudo su -
添加root密码:
passwd
添加了 Play 用户:
sudo adduser Play
从 sudoers 中删除 ec2-user
cd /etc/sudoers.d
nano cloud-init
删除 ec2-user 并将文件更新为:
Play ALL= NOPASSWD: ALL
# User rules for ec2-user
Play ALL=(ALL) NOPASSWD:ALL
预先感谢您的帮助/建议!
答案1
删除对 , 之外的其他命令的访问su
不会本质上使您的系统更安全。
首先,如果您将用户分配给已知的 shell,您将无法阻止内部命令运行,除了类似rbash但 rbash 本身更宽松一些,允许用户运行一些命令。如果你能接受它,你就可以使用它。
另一个不太安全但可行的解决方案是将用户的默认 shell 定义为脚本,并且该脚本中包含su -
和命令,除了捕获或exit
等突破序列之外,没有其他任何内容。这称为强制接口。您还需要将此脚本及其完整路径放在.由于它是一个脚本,因此它具有随之而来的所有安全后果,无论是现在还是将来。ctrl-c
ctrl-z
/etc/shells
答案2
您可以做的是实施某种形式的 ACL(访问控制列表)。
我在之前的评论中提到,我认为 OP 的想法与我的想法相同,即通过让用户 SSH 作为受限帐户来添加另一层安全性。然后使用密码访问su
另一个拥有更多权限但已被删除的帐户。
如果你想限制用户的ec2-user
行为。首先确保他们不在sudoers
群组中。
默认情况下,他们仍然拥有系统中大多数文件的读取权限,但他们将无法提升编辑这些文件或读取不可读的文件的权限。
我找到了许多解决方案,包括使用 STFP 将它们限制到某个目录的ec2-user
设置。我认为chroot
该解决方案可能不是最合适的,因为您需要ec2-user
能够su
将目录从 更改/home/ec2-user
为。/home/play
我认为最好的解决方案是应用 ACL。这是限制用户可以在 shell 中执行的命令的一种方法。
它的工作原理是使用该命令setfacl
并删除文件中用户的读取和执行权限/bin
。
setfacl -m u:ec2-user:r /bin/more
-m: to add read read access to the user. u: user, can be changed to g(group) or o(other). ec2-user: the user r: give the user only read permission.
此示例将删除more
bash 文件的写入和执行权限。这不是最好的方法,因为您必须删除不希望他们使用的命令,而不是只允许他们使用su
。然而,这是我能找到的最快、最简单的方法。