游戏服务器托管和安全

游戏服务器托管和安全

我正在为我的一个爱好项目开发一个小型控制面板,它应该设置游戏服务器。但我对安全性有一些担忧,希望得到一些意见。

我的第一个想法是让控制面板“远程”(与网络前端交互)以用户身份运行,并且在设置游戏服务器时,它们都将进入其主文件夹的子目录中,如下所示:

/home/paneluser/servers/server1/
/home/paneluser/servers/server2/
/home/paneluser/servers/server3/

但是,由于用户可以通过 FTP 访问这些子目录,他们将能够上传恶意代码(即更改可执行文件),以便他们可以轻松访问其他服务器的文件,例如删除文件。

我的第二个想法是作为它自己的用户(root?)运行控制面板“远程”,然后为每个服务器创建单独的用户并以适当的用户身份启动它们。

我的第三个想法是在第一个基础上进行扩展,并在某种沙箱中运行所有服务器,其中可执行文件无法访问外部文件。但从技术上讲,我不知道这将如何完成,或者是否可能。

所以我想知道最好的方法是什么。或者还有另一种更好的方法吗?

答案1

我的第二个想法是作为自己的用户(root?)运行控制面板“远程”,然后为每个服务器创建单独的用户并以适当的用户身份启动它们。

这不是最好的解决方案,但为了您学习的利益,我无论如何都会批评它。我很快就会找到最好的解决方案,但这很重要。

跟着我重复一遍:如果可以的话,永远不要以 root 身份运行面向网络的服务(在这种情况下你帮助它,因为您可以控制应用程序)。

实现此目的的正确方法是使用一个以 root 身份启动的守护程序,但将权限授予非特权用户。您可以让该守护进程在放弃特权之前生成第二个守护进程,并且非特权守护进程将与特权守护进程进行通信。然后,特权守护进程将代表非特权守护进程执行操作。

跟着我重复一遍:除非特权守护进程执行验证,否则这种特权分离是没有用的。这意味着您不能让特权守护进程盲目地接受来自非特权守护进程的命令。它必须确保该命令是正确且有意义的。如果您不进行验证,那么您已经引入了困惑的副手问题脆弱性。编写此类安全代码时,请假设您的面向 Web 的服务将受到损害。我听到你在说什么 - “那永远不会发生”。是的,它会。安全就是限制损害。您也可能会从阅读中受益计算机安全中的六个最愚蠢的想法

我的第三个想法是扩展第一个想法,并在某种沙箱中运行所有服务器,其中可执行文件无法访问外部文件。但从技术上讲,我不知道这将如何完成,或者是否可能。

A+:这是实现此类 Web 应用程序安全性的(部分)正确方法。实现这一点的方法是在一个chroot监狱

答案2

我会建议。每个游戏服务器都以其自己的用户身份运行。

/home/user1/游戏 /home/user2/游戏

然后,为了启动和停止游戏服务器,您只需要您的网络服务器以该用户(user1 或 user2)的身份执行命令。

在真实用户的支持下,SFTP 很容易设置。

就我个人而言,我会为每个用户运行一个守护进程,监听 fifo 或 tmp 文件上的命令,然后以用户身份运行它们。然后让 Web 前端写入该文件。

守护进程应该只侦听执行游戏或终止游戏的特定命令,例如“停止”和“开始”。这样,您的分离就可以保持原样,但您可以运行作为管理员/开发设置的命令。

相关内容