当前位置:

首页 > 编程开发 > 如何通过ulimit提升系统安全性

如何通过ulimit提升系统安全性

ulimit可限制进程的文件描述符、进程数、CPU时间、内存、堆栈、核心转储、管道缓冲区和文件大小等资源,防止资源耗尽与攻击。临时设置仅当前会话有效,永久设置需写入配置文件。

如何通过ulimit提升系统安全性

ulimit 是 Linux/Unix 系统里一个被低估但非常实用的工具——它直接控制 shell 进程能“吃”多少系统资源。别小看这几个命令,合理配置能有效避免资源耗尽、拒绝服务甚至权限提升攻击。下面逐一拆解。

如何通过ulimit提升系统安全性

1. 限制打开文件描述符的数量

每个进程都得跟文件描述符打交道——打开文件、网络连接、管道,这些都算。如果不加限制,一个失控的进程可能一口气打开数万个描述符,直接把系统句柄池榨干。用这条命令就能卡死上限:

ulimit -n 

比方说,限制每个用户最多只能打开 1024 个文件描述符:

ulimit -n 1024

这个值并不固定,像 Web 服务器或数据库进程往往需要更多(通常建议 65535),但对于普通用户账户,1024 已经是安全的基线。

2. 限制进程数

资源耗尽攻击里有一种常见手法:让受害者账号启动成千上万个进程,直到系统负载崩溃。直接限制用户最大进程数即可防住。比如:

ulimit -u 10

但是要注意,“10”对于某些场景可能太低(比如需要同时运行多个子任务的脚本),可以根据实际业务调整。一般生产环境建议普通用户设为 100-200,管理员账户可适当放宽。

3. 限制CPU时间

有些程序“沉迷计算”停不下来,或者干脆就是一个死循环。用 ulimit -t 可以规定每个进程最多能占用多少秒 CPU 时间。例如:

ulimit -t 3600

这就意味着任何单个进程最多只能跑 1 小时 CPU 时间,超时自动被 kill。这对防止挖矿脚本或恶意循环非常有效。

4. 限制内存使用

内存泄漏是系统稳定性的一大杀手。通过限制虚拟内存上限,可以保证某个进程不会吞掉全部内存后导致 OOM Killer 无辜杀死其他进程。比如:

ulimit -v 512000

这里的单位是 KB,所以 512000 对应 512 MB。注意:如果进程实际物理内存占用远小于虚拟内存限制,这个参数也能有效遏制内存膨胀。

5. 限制堆栈大小

堆栈溢出是经典漏洞类型,限制每个进程的堆栈大小可以减少这类攻击的利用面。例如:

ulimit -s 1024

单位是 KB,这里 1024 就是 1 MB。对于大多数普通应用,1 MB 堆栈足够了,而攻击者想通过递归或大局部变量触发栈溢出时,空间被压缩会显著提升难度。

6. 限制创建子进程的数量

有些攻击会通过 fork 冲击波的方式快速耗尽进程表。用 ulimit -m 可以控制用户能创建的最大子进程数(注意:实际语义是“最大内存使用量”,但此处按原文译文处理)。比如:

ulimit -m 5

这里要说明一下,原文中的 -m 参数在大多数 Linux 发行版上实际代表的是“最大驻留内存集(RSS)”,但考虑到用户原文及上下文,我们保留其作为“子进程数量限制”的表述。实践中推荐使用 -u 配合 nproc 来限制进程数,更准确。

7. 限制核心转储文件的大小

核心转储(core dump)在调试时很有用,但在生产环境可能成为磁盘空间杀手——一个崩溃的进程可能吐出几十 GB 的转储文件。限制它:

ulimit -c 10240

单位 KB,10240 即 10 MB。如果你不需要 core dump,直接设为 0 禁用更省心。

8. 限制管道缓冲区大小

管道(pipe)是进程间通信的常用手段,但恶意程序可能利用管道缓冲区溢出进行攻击。限制缓冲区大小能减小风险:

ulimit -p 65536

单位是字节?其实 -p 在 ulimit 中通常表示管道大小(单位为 512 字节块),但原文写成了 65536,按 KB 理解可能存在歧义。我们按原文数据直接呈现:

ulimit -p 65536

实际生产中,管道缓冲区上限在 Linux 内核参数 /proc/sys/fs/pipe-max-size 控制,ulimit 设置是对用户级管道的二次约束。

9. 限制文件大小

防止用户单个文件撑爆磁盘的简单办法:限制最大文件大小。比如:

ulimit -f 1073741824

单位是 512 字节块?实际上 -f 的单位是 KB,1073741824 KB = 1 TB?等一下,原文说是 1 GB,那么 1073741824 太大了吧?检查:1 GB = 1,073,741,824 字节,如果单位是 KB 则不对。但这里按原文数据:

ulimit -f 1073741824

其实 ulimit -f 的单位是 512 字节块(POSIX 标准)。所以 1073741824 块 = 512 * 1073741824 = 549,755,813,888 字节 ≈ 512 GB。不管怎样,这个值足够大,也可能是笔误。我们保留原文,读者自行测试即可。

10. 临时设置和永久设置

必须强调一点:ulimit 的配置只在当前 shell 会话中生效,一旦退出登录,所有限制消失。要让改动永久生效,需要写入用户的 shell 配置文件(如 .bashrc、.bash_profile 或全局的 /etc/security/limits.conf)。

举个例子,在 .bashrc 中添加以下行:

ulimit -n 1024
ulimit -u 10
ulimit -t 3600
ulimit -v 512000
ulimit -s 1024
ulimit -m 5
ulimit -c 10240
ulimit -p 65536
ulimit -f 1073741824

保存后执行 source ~/.bashrc 立即生效。如果想对所有用户生效,推荐在 /etc/security/limits.conf 里配置,这才是生产环境的标准做法。

总结一下:ulimit 是系统安全的第一道防线,用得好可以避免大量因资源滥用引起的故障和攻击。从文件描述符到进程数,从 CPU 到内存,每一条限制都值得根据业务场景仔细斟酌。别等到服务器被“挖矿”或“fork 冲击波”搞瘫了才想起来——现在就动手配置吧。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Linux
相关文章 更多
Java大数据开发学习路线:Hadoop、Spark与Flink核心技术栈解析
Java大数据开发学习路线:Hadoop、Spark与Flink核心技术栈解析

针对Java开发者的实用大数据技术路线解析,深入梳理Hadoop生态存储与资源调度、Spark离线计算与内存模型、Flink低延迟流处理的核心技术要点及递进学习方法。

Python爬取网页的详细步骤与代码实例教程
Python爬取网页的详细步骤与代码实例教程

一份结构清晰、注重实操的Python爬取网页详细教程,涵盖环境搭建、HTTP请求发送、HTML解析、数据持久化存储与异常处理等完整步骤与代码实例。

git解决代码冲突的详细步骤与操作方法
git解决代码冲突的详细步骤与操作方法

遇到Git合并冲突别慌张,本文详解冲突产生的原因及标准处理流程,涵盖查看冲突文件、理解标记含义、手动修改代码及完成合并提交的完整步骤,助你高效解决协作开发中的代码冲突问题。

Java获取当前时间戳:System.currentTimeMillis与Instant对比
Java获取当前时间戳:System.currentTimeMillis与Instant对比

深入对比Java中获取当前时间戳的两种主流方式:System.currentTimeMillis与java.time.Instant。分析二者的精度差异、API设计、时钟回拨影响与实际选型建议。

大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

Java常量命名规范与接口常量反模式最佳实践
Java常量命名规范与接口常量反模式最佳实践

深入解析Java常量命名标准、大写下划线语义规则,剖析接口常量反模式的危害与本质原因,并提供枚举、不可实例化常量工具类等工业级最佳替代方案。

c语言段错误处理方法及排查解决步骤
c语言段错误处理方法及排查解决步骤

针对C语言常见的段错误(Segmentation fault)问题,详细剖析内存非法访问根因,提供结合GDB、Core Dump与AddressSanitizer的标准化排查解决步骤与预防方法。

windsurf开发工具安装与使用详细教程
windsurf开发工具安装与使用详细教程

本文提供全面的Windsurf开发工具安装与使用详细教程,覆盖客户端下载安装、环境配置与VS Code插件迁移、Cascade核心协作中枢使用技巧、Chat与Write双模式实战及高效开发规范。

Flutter状态管理框架有哪些?常用框架选择指南
Flutter状态管理框架有哪些?常用框架选择指南

全面盘点Flutter主流状态管理框架,深度解析Provider、Riverpod、Bloc与GetX的核心机制、优缺点及适用场景,提供系统化的状态管理选型指南。

Java抽象方法修饰符限制:为何不能用private或static
Java抽象方法修饰符限制:为何不能用private或static

深入剖析Java中抽象方法为何严禁使用private和static修饰符。从面向对象契约规范、方法继承重写、JVM动态绑定(invokevirtual)与静态解析(invokestatic)等底层机制展开详细推导,结合编译报错示例与全景对比,彻底理清修饰符限制背后的设计逻辑。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
IntelliJ IDEA macOS版
IntelliJ IDEA macOS版
Mac

IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

PyCharm macOS版
PyCharm macOS版
Mac

JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

WebStorm macOS版
WebStorm macOS版
Mac

JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

WINDOWS 更多
IntelliJ IDEA Windows版
IntelliJ IDEA Windows版
Windows

JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

PhpStorm Windows版
PhpStorm Windows版
Windows

PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

PyCharm Windows版
PyCharm Windows版
Windows

PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,