본문 바로가기
일반IT/리눅스

내 서버를 지키는 보이지 않는 방화벽: 리눅스 사용자 자원 제한 (ulimit) 완벽 가이드 🛡️

by gasbugs 2025. 10. 10.

안녕하세요! 리눅스 서버를 운영하다 보면 아찔한 순간을 겪을 때가 있습니다. 사용자 한 명이 실행한 잘못된 스크립트 하나가 서버의 CPU나 메모리를 모두 차지해서 전체 시스템이 멈춰버리는 상황 말이죠. 😱 특히, 무한히 자기 자신을 복제하는 '포크 폭탄(fork bomb)' 공격은 상상만 해도 끔찍합니다.

 

이런 대재앙을 막기 위해 필요한 것이 바로 사용자 자원 제한(User Resource Limits)입니다. 특정 사용자나 그룹이 시스템 자원을 과도하게 사용하는 것을 미리 막아주는 보이지 않는 방화벽이죠. 오늘은 이 강력한 기능의 모든 것을 파헤쳐 보겠습니다!

 

 


1. 제한의 두 얼굴: 소프트 리밋 vs 하드 리밋 🚦

리눅스 자원 제한에는 두 가지 종류가 있습니다. 이 둘의 차이를 이해하는 것이 가장 중요합니다.

소프트 리밋 (Soft Limit)

이름처럼 부드러운, 일종의 '경고선' 또는 '권장 한도'입니다. 사용자는 이 제한에 도달하면 경고를 받게 되지만, 스스로 한도를 하드 리밋 범위 안에서 일시적으로 올릴 수 있습니다.

하드 리밋 (Hard Limit)

절대 넘을 수 없는 '물리적인 벽' 또는 '최대 한도'입니다. 한 번 설정되면 오직 관리자(root)만이 이 한도를 올릴 수 있으며, 일반 사용자는 절대 이 값을 초과할 수 없습니다.

💳 신용카드 비유: 소프트 리밋은 "이번 달엔 100만 원만 써야지"라고 스스로 정한 예산 목표와 같습니다. 반면, 하드 리밋은 카드사가 정해준 '총 신용 한도 500만 원'과 같아서 그 이상은 긁고 싶어도 긁을 수가 없죠.


2. 어디서 어떻게? 자원 제한 설정 파일 파헤치기 🛠️

이러한 제한은 /etc/security/limits.conf 파일이나, 더 권장되는 방식인 /etc/security/limits.d/ 디렉토리 안에 새로운 .conf 파일을 만들어 설정합니다. (예: 99-custom.conf)

 

설정 파일의 문법은 한 줄에 하나의 규칙을 정의하며, 매우 간단합니다.

# <domain>    <type>    <item>    <value>
  • <domain>: 규칙을 적용할 대상입니다.
    • username: 특정 사용자 이름 (예: john)
    • @groupname: 특정 그룹 (예: @developers)
    • *: 모든 사용자
  • <type>: 제한의 종류입니다.
    • soft: 소프트 리밋
    • hard: 하드 리밋
  • <item>: 제한할 자원의 종류입니다.
    • nproc: 최대 프로세스 개수 (Number of Processes) - '포크 폭탄' 방지에 필수!
    • fsize: 생성할 수 있는 파일의 최대 크기 (File Size) - 단위는 KB. 무한정 커지는 로그 파일 방지.
    • nofile: 열 수 있는 파일의 최대 개수 (Number of Open Files) - 웹 서버나 DB 서버에 매우 중요.
    • cpu: 최대 CPU 사용 시간 (단위: 분)
    • memlock: 메모리에 고정할 수 있는 최대 공간 (단위: KB)
  • <value>: 제한할 값입니다.

3. 실전 예제: 이렇게 사용해보세요 📋

아래는 실제 사용 예시입니다. 이 내용을 /etc/security/limits.d/99-my-limits.conf 와 같은 파일에 저장하면 됩니다.

# developers 그룹에 속한 모든 유저는 최대 100개의 프로세스를 가질 수 있다 (soft/hard 동일)
@developers    -    nproc    100

# 'jane' 유저는 최대 5GB 크기의 파일까지만 생성할 수 있다 (hard)
jane    hard    fsize    5242880 # 5 * 1024 * 1024 KB

# 'john' 유저의 오픈 파일 개수를 soft 50000, hard 60000개로 제한한다
john    soft    nofile   50000
john    hard    nofile   60000

# 모든 사용자는 CPU를 1000분 이상 사용할 수 없다
* hard    cpu      1000

4. 설정은 끝! 이제 확인해볼 시간 ✅

설정을 마친 후에는 두 가지 중요한 단계가 남아있습니다.

1. 재로그인 필수!

limits.conf 설정은 사용자가 새롭게 로그인할 때 pam_limits.so 모듈에 의해 적용됩니다. 따라서, 설정을 변경했다면 해당 사용자는 반드시 로그아웃 후 다시 로그인해야 합니다.

2. ulimit 명령어로 확인

로그인한 사용자는 ulimit 명령어를 통해 자신에게 적용된 제한을 확인할 수 있습니다.

  • 모든 제한 확인하기:
    ulimit -a
    
  • 최대 프로세스 개수 확인하기 (soft/hard):
    # Soft limit 확인 (-Su)
    ulimit -Su
    
    # Hard limit 확인 (-Hu)
    ulimit -Hu 
    
  • 최대 파일 크기 확인하기 (soft):
    # Soft limit 확인 (-Sf)
    ulimit -Sf
    

결론: 안정적인 서버를 위한 필수 습관

사용자 자원 제한은 단순히 사용자를 '통제'하기 위한 기능이 아닙니다. 예기치 못한 실수나 공격으로부터 시스템 전체를 보호하고, 모든 사용자에게 공평한 자원을 할당하여 서버의 안정성과 신뢰성을 높이는 전문가적인 시스템 관리 기술입니다.

지금 바로 여러분의 서버에 적절한 자원 제한을 설정하여, 밤잠 설치게 하는 장애로부터 자유로워지세요! 🚀


태그:

리눅스, ulimit, limits.conf, 자원관리, 시스템관리, 보안, nproc, fsize, DevOps, 서버안정성