我编写了一个服务器(Ubuntu 14.04 LTS 服务器) -客户端-java 程序。
使用此程序,我可以将文本从我的 android 智能手机发送到我的服务器,并将其保存到receivedData文件中。
该程序在一个用户下运行,默认情况下,该用户没有分配 shell,也没有访问敏感数据或程序的权限。
我能想到的唯一安全问题是由于大量receivedData没有大小检查的 GB文件而导致内存不足。或者,当然是 DoS 攻击,但我认为我的服务器没有那么重要......
该程序仅用于学习目的,任何客户/黑客都不得使用(当然;)),但您现在永远不会..
那么,谁能告诉我是否可以直接创建receivedData文件大小有限的文件。在它达到文件大小的那一刻,它应该拒绝receivedData阻止它导致 OOM。
如果没有,我将需要将其实现到 Java 程序中...
mur*_*uru 16
有两种方法可以做到这一点:
ulimitshell 实用程序,或使用setrlimit系统调用(ulimit依次调用)。ulimit/setrlimitRLIMIT_FSIZE
The maximum size of files that the process may create. Attempts
to extend a file beyond this limit result in delivery of a
SIGXFSZ signal. By default, this signal terminates a process,
but a process can catch this signal instead, in which case the
relevant system call (e.g., write(2), truncate(2)) fails with
the error EFBIG.
Run Code Online (Sandbox Code Playgroud)
我不确定如何setrlimit从 Java调用该函数,但是这个 U&L 问题可能会有所帮助。或者,将 Java 服务器包装在脚本中:
RLIMIT_FSIZE
The maximum size of files that the process may create. Attempts
to extend a file beyond this limit result in delivery of a
SIGXFSZ signal. By default, this signal terminates a process,
but a process can catch this signal instead, in which case the
relevant system call (e.g., write(2), truncate(2)) fails with
the error EFBIG.
Run Code Online (Sandbox Code Playgroud)
我假设一个 ext4 文件系统,我不确定其他人。首先,我们需要在文件系统上启用配额。编辑/etc/fstab,并添加usrquota到相应分区的挂载选项。/例如,如果我们为 执行此操作,则最终条目将类似于:
UUID=... / ext4 errors=remount-ro,usrquota 0 1
Run Code Online (Sandbox Code Playgroud)
然后重启后启用它:
sudo quotaon /
Run Code Online (Sandbox Code Playgroud)
我假设您的服务器以不同的用户身份运行(例如restricted_user)。如果没有,如果您不希望您的正常流程受到影响,请创建一个。
然后做:
sudo edquota restricted_user
Run Code Online (Sandbox Code Playgroud)
这将打开一个编辑器。
Disk quotas for user restricted_user (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sdd1 1087940 943718 1048576 9956 0 0
Run Code Online (Sandbox Code Playgroud)
将软限制和硬限制设置为适当的值(它们是 1024 字节的块,因此将您的限制除以 1024)。保存并退出。
那么用户将无法在该文件系统上使用超过1G的总量,计算他们拥有的所有文件。
当然,您仍然应该检查服务器程序中的大小。
更新:
muru 的答案非常适合文件大小,我在这里提供了一个解决方案,即如何调整目录本身的大小,而不仅仅是一个文件。
没有直接的东西,因为文件系统将文件夹作为文件文件处理,它的限制是整个文件系统本身。
因此,作为解决问题的方法,您可以创建一个虚拟文件系统并将其安装在特定(空)目录上。
创建要挂载的虚拟文件系统的挂载点(~/test for me)
mkdir ~/test
Run Code Online (Sandbox Code Playgroud)
创建一个充满 /dev/zero 的文件,足够大到你想为虚拟文件系统保留的最大大小(我在这里做 1MB)
dd if=/dev/zero of=test.img bs=1024 count=0 seek=1024
Run Code Online (Sandbox Code Playgroud)
使用 ext4 文件系统格式化此文件
mke2fs test.img
Run Code Online (Sandbox Code Playgroud)
在您创建的目录中挂载新格式化的磁盘空间作为挂载点
mount -o loop test.img ~/test
Run Code Online (Sandbox Code Playgroud)
然后使用这个目录