我在本地网络上运行 clearOS 服务器(一家拥有 10 名开发人员的小公司),我们将其用作开发服务器来测试我们的工作,并在测试过程中将其展示给客户。每个开发人员都有一个唯一的用户名和密码来访问 ftp/http/smb。问题是当其中一名开发人员运行不安全的代码(假设它是 php 代码)时,例如运行无限循环!服务器完全崩溃,我无法确定谁是错误的开发人员!!如何解决?提前致谢
我的服务器信息
- clearOS 服务器
- 内存 16GB
- SSD 1TB(2 个分区)
安装的应用程序:
- proftpd,
- GitLab,
- 阿帕奇,
- 玛丽亚数据库
用户:
- 物理 root 用户和
- 10 个虚拟用户(使用 ldap) 每个用户都有一个唯一的密码
答案1
您的问题
你已经将你的主要问题陈述为
当某个开发人员运行不安全的代码(假设它是 php 代码)时,例如运行无限循环!服务器完全崩溃,我无法确定谁是犯错的开发人员!
由于开发代码随时可能崩溃或挂起,因此您实际上要处理两个不同的问题:
- 不同用户的进程不应互相干扰,不应占用所有资源、导致其他用户资源匮乏甚至导致服务器崩溃。
- 识别“执行此操作”的用户。
如果您解决了第二个问题,您仍然需要解决第一个问题;但是如果您解决了第一个问题,您就不再需要解决第二个问题,因此我在这里专注于解决第一个问题(此外,解决问题而不与人对抗坏事总是更容易并且对抗更少)。
可能的解决方案
在隔离用户操作时,您有三种主要路径可供选择:
- 进程和文件系统:最简单、最古老的分离方法是将资源分配给多用户 UNIX 系统上的每个不同的用户。
- uptime365 确实已经给出了建议
ulimit
,我只想补充一点,您必须确保您的应用程序也使用这些用户(而不是每个服务的通用守护程序用户),并且它们不想使用其他用户帐户启动进程。由于这个缺点,这种方法现在很少使用,除了在没有持续交付基础设施的情况下构建脚本等简单的事情。 - 文件系统配额在今天更有用,因为存储仍然是主要资源,并且它适用于几乎所有应用程序。
- uptime365 确实已经给出了建议
- 应用:您访问的大多数软件已经内置了用户和配额管理,但您需要单独管理/配置它。例如,数据库可以为每个用户设置配额和权限,限制他能做的事情缺点除了配置不同(可以通过脚本或应用程序统一)之外,并非所有软件都同样配备齐全。例如,GitLab 似乎仍然不支持磁盘配额。您必须评估错误原因并查看给定的功能是否适合您的情况。
- 容器和虚拟机:利用虚拟化(完全虚拟化,如 KVM 或 ESXi;或容器化,如 Solaris Zones、FreeBSD Jails、Linux LXC,或基于应用程序的虚拟化,如 Docker 等)可以为每个用户提供一个完整的虚拟系统,用户可以在其中执行任何允许的操作,但会限制其资源,以免干扰其他用户。这是最先进的隔离形式,因为每个用户基本上都有自己的机器,并且完全不会干扰(如果配置正确),因此您还可以使用不同的配置和运行时选项、不同的网络、不同的硬盘驱动器等。此解决方案的缺点是,在这三种解决方案中,它的配置和资源使用开销最高。
当然,组合总是可能的,因为这些方法在不同的层上起作用。例如,您可以使用容器,这样每个人都有自己的网络服务器,但让所有用户使用同一个数据库以节省资源(数据库访问速度比使用多个不同的数据库更快),但受数据库配额限制。
你的情况该怎么办?
如您所见,可能性有很多,并且每一种可能性都需要付出相当大的努力才能实现,因此您需要缩小范围:
- 首先分析一下您到底遇到了什么问题。查看您的流程(如果没有,请询问您的同事他们是如何工作的)并确定出现的问题(运行测试用例时磁盘空间耗尽、无限循环占用过多内存、由于未捕获的异常或糟糕的架构导致 Web 服务器崩溃等)。
- 了解了面临的问题后,请考虑如何在保持简单的情况下缓解问题。配置 10 台 PC 和配置 100 台 PC 所需的时间大致相同,因此您应该首先尝试简单的东西(大多数情况下,这已经足够了)。磁盘空间可能受用户配额限制,而无限循环以及内存过度消耗可能会被单元测试过早捕获(以本地用户身份执行,而不是在 Web 服务器上执行)。
- 如果这还不够,您可以考虑实施更大更好的解决方案,例如容器。一开始,您会浪费时间,但从长远来看,这可能会有所回报 - 当然,这取决于您的具体情况。
答案2
作为预防措施,如果您想为用户设置特定的限制,则应研究 ulimits。您可以设置进程/CPU/内存限制。
请参考此链接
另一种方法是使用外部监控工具监控系统的资源使用情况(最常见的例子:nagios/nrpe),它可以在超出资源阈值时向您发出警报。