사용자 도구

사이트 도구


wiki:it:linux:networking:security

리눅스 보안 관리 가이드

이 문서는 리눅스 시스템의 보안을 강화하기 위한 핵심 가이드라인을 제공합니다. 서버 및 시스템 관리자가 시스템을 안전하게 유지하고 잠재적인 위협으로부터 보호하는 데 필요한 기본적인 보안 원칙과 실용적인 방법을 다룹니다. 방화벽, 프록시 설정부터 사용자 관리, 로깅, 그리고 기타 필수 보안 조치까지 포괄적인 내용을 제공하여 안정적이고 안전한 리눅스 환경을 구축할 수 있도록 돕습니다.


1. 방화벽 관리 (Firewall Management)

방화벽은 외부 네트워크로부터 시스템을 보호하는 첫 번째 방어선입니다. 리눅스에서는 주로 iptables 또는 firewalld를 사용하여 방화벽을 구성합니다. 올바른 방화벽 설정은 불필요한 포트 노출을 막고, 허용된 트래픽만 시스템에 접근하도록 제한하는 데 필수적입니다.

1) iptables 기본 설정

iptables는 리눅스 커널의 netfilter 프레임워크를 제어하는 명령줄 도구입니다. 복잡하지만 매우 강력하고 유연한 방화벽 규칙을 설정할 수 있습니다.

  • 기본 정책 설정: 모든 트래픽을 기본적으로 차단하고 필요한 포트만 허용하는 '화이트리스트' 방식이 보안에 더 유리합니다.
  • 규칙 추가: 특정 포트(예: SSH 22, HTTP 80, HTTPS 443)에 대한 접근을 허용합니다.
  • 규칙 저장: 시스템 재부팅 시에도 규칙이 유지되도록 저장해야 합니다.
체인 정책 설명
INPUT DROP 외부에서 들어오는 모든 연결 거부 (필수 포트 제외)
FORWARD DROP 라우팅 기능 사용 안 할 경우
OUTPUT ACCEPT 시스템에서 나가는 모든 연결 허용

다음은 기본적인 iptables 설정 예시입니다.

# 기존 규칙 플러시 (초기 설정 시에만 사용)
# sudo iptables -F
# sudo iptables -X
# sudo iptables -Z

# 기본 정책 설정
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# 로컬 루프백 인터페이스 허용 (필수)
sudo iptables -A INPUT -i lo -j ACCEPT

# 이미 ESTABLISHED 되거나 RELATED 된 연결 허용
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SSH (22번 포트) 허용
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# HTTP (80번 포트) 허용
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# HTTPS (443번 포트) 허용
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# ICMP (Ping) 허용 (선택 사항, 네트워크 진단에 유용)
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 모든 다른 트래픽은 기본 DROP 정책에 의해 차단됨

# 규칙 저장 (데비안/우분투 계열)
# sudo apt-get install iptables-persistent
# sudo netfilter-persistent save

# 규칙 저장 (CentOS/RHEL 7+ 계열)
# sudo yum install iptables-services
# sudo systemctl enable iptables
# sudo systemctl start iptables
# sudo iptables-save > /etc/sysconfig/iptables

2) firewalld 사용법

firewalldiptables의 상위 레이어에서 작동하는 동적인 방화벽 관리 도구로, 주로 CentOS/RHEL 7+ 시스템에서 사용됩니다. '영역(zones)' 개념을 사용하여 네트워크 인터페이스나 소스 IP 주소에 따라 다른 보안 수준을 적용할 수 있습니다.

  • 영역(Zones): 'public', 'internal', 'trusted' 등 미리 정의된 영역을 통해 보안 수준을 관리합니다.
  • 서비스 및 포트: SSH, HTTP 등 미리 정의된 서비스를 허용하거나 특정 포트를 개방할 수 있습니다.
  • 런타임(Runtime) vs. 영구적(Permanent): 규칙을 즉시 적용할지, 재부팅 후에도 유지되도록 영구적으로 적용할지 선택할 수 있습니다.

다음은 firewalld 사용 예시입니다.

# firewalld 서비스 시작 및 활성화
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 현재 활성화된 영역 확인
sudo firewall-cmd --get-active-zones

# 기본 영역 확인
sudo firewall-cmd --get-default-zone

# SSH 서비스 허용 (영구적)
sudo firewall-cmd --permanent --add-service=ssh

# HTTP 포트 허용 (영구적)
sudo firewall-cmd --permanent --add-port=80/tcp

# HTTPS 포트 허용 (영구적)
sudo firewall-cmd --permanent --add-port=443/tcp

# 변경사항 적용 (reload 필요)
sudo firewall-cmd --reload

# 현재 활성화된 서비스 및 포트 확인
sudo firewall-cmd --list-all --zone=public

2. 프록시 서버 활용 (Proxy Server Utilization)

프록시 서버는 클라이언트와 서버 사이에서 중개자 역할을 수행하여 보안, 성능 및 접근 제어에 기여합니다.

1) 포워드 프록시 (Forward Proxy)

포워드 프록시는 내부 네트워크의 클라이언트가 외부 네트워크에 접근할 때 사용됩니다.

  • 용도:
    • 캐싱: 웹 콘텐츠를 캐싱하여 대역폭 사용을 줄이고 웹 페이지 로딩 속도를 향상시킵니다.
    • 접근 제어: 특정 웹사이트 접속을 차단하거나 허용하여 내부 네트워크 사용자의 인터넷 사용을 통제합니다.
    • 익명성: 클라이언트의 실제 IP 주소를 숨겨 익명성을 제공합니다.
  • 예시: Squid (웹 프록시 캐시)

2) 리버스 프록시 (Reverse Proxy)

리버스 프록시는 외부 네트워크의 클라이언트가 내부 네트워크의 서버에 접근할 때 사용됩니다.

  • 용도:
    • 로드 밸런싱: 여러 백엔드 서버로 트래픽을 분산하여 서버 부하를 줄이고 가용성을 높입니다.
    • SSL/TLS 종료: 클라이언트와의 SSL/TLS 암호화를 리버스 프록시에서 처리하여 백엔드 서버의 부하를 줄입니다.
    • 보안 강화: 백엔드 서버의 실제 IP 주소를 숨기고, 악성 트래픽을 필터링하여 웹 애플리케이션 방화벽(WAF) 역할을 수행할 수 있습니다.
    • 압축 및 캐싱: 콘텐츠를 압축하거나 캐싱하여 성능을 향상시킵니다.
  • 예시: Nginx, Apache (mod_proxy), HAProxy

3. 기타 필수 보안 조치 (Other Essential Security Measures)

방화벽 및 프록시 외에도 리눅스 시스템의 전반적인 보안을 강화하기 위한 다양한 조치들이 필요합니다.

1) 시스템 업데이트 관리

소프트웨어의 취약점은 해킹의 주요 경로입니다.

  • 정기적인 업데이트: 운영체제와 설치된 모든 소프트웨어 패키지를 최신 상태로 유지하여 알려진 보안 취약점을 패치합니다.
  • 자동 업데이트 설정 고려: 중요한 보안 패치는 자동으로 적용되도록 설정하는 것을 고려할 수 있으나, 프로덕션 환경에서는 테스트 후 수동 적용이 권장됩니다.
  • 명령어 예시:
    • 데비안/우분투: sudo apt update && sudo apt upgrade
    • CentOS/RHEL: sudo yum update 또는 sudo dnf update

2) 사용자 및 그룹 관리

계정 관리는 시스템 보안의 기본입니다.

  • 최소 권한 원칙 (Principle of Least Privilege): 각 사용자에게 필요한 최소한의 권한만 부여합니다.
  • 강력한 비밀번호 사용: 복잡하고 유추하기 어려운 비밀번호를 사용하도록 강제하고, 정기적인 변경을 권장합니다.
  • 기본 계정 보안:
    • 불필요한 계정은 삭제하거나 비활성화합니다.
    • root 계정의 직접 로그인을 제한하고, sudo를 통해 관리 작업을 수행하도록 합니다.
    • 비밀번호 실패 시 계정을 잠그는 정책을 설정합니다 (예: pam_tally2, faillock).
  • 'sudo' 활용: 특정 사용자에게만 제한된 관리 권한을 부여하여 'root' 권한 남용을 방지합니다.

3) SSH 보안 강화

SSH는 원격 접속에 사용되는 중요한 서비스이므로 특별한 보안 강화가 필요합니다.

  • 기본 포트 변경: 기본 SSH 포트(22)를 다른 임의의 포트로 변경하여 무작위 대입 공격 시도를 줄입니다.
  • 'root' 로그인 비활성화: /etc/ssh/sshd_config 파일에서 PermitRootLogin no로 설정합니다.
  • 비밀번호 인증 비활성화 및 키 기반 인증 사용: 가장 강력한 보안 조치 중 하나입니다. PasswordAuthentication no로 설정하고 SSH 키 페어를 사용합니다.
  • 'fail2ban' 사용: 무작위 대입 공격을 시도하는 IP 주소를 자동으로 차단하여 SSH 서비스의 보안을 강화합니다.
  • 허용 사용자/그룹 지정: AllowUsers 또는 AllowGroups 지시어를 사용하여 특정 사용자나 그룹만 SSH 접속을 허용합니다.
# /etc/ssh/sshd_config 파일 예시
Port 2222
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
# AllowUsers youruser
# AllowGroups ssh_users

4) 파일 시스템 권한 관리

파일 및 디렉터리 권한을 올바르게 설정하는 것은 데이터 무결성과 시스템 보안에 중요합니다.

  • 'chmod', 'chown', 'umask' 이해: 파일 및 디렉터리 소유권과 권한을 정확하게 설정합니다.
  • SUID/SGID/Sticky Bit 사용 주의: 이 특별한 권한들은 보안 취약점을 유발할 수 있으므로 신중하게 사용하고 정기적으로 검토합니다.
  • 불필요한 쓰기 권한 제거: 특히 웹 서버의 문서 루트 등 중요한 디렉터리에는 불필요한 쓰기 권한을 부여하지 않습니다.

5) 로깅 및 감사

시스템 로그는 보안 사고 발생 시 원인을 분석하고 침입 흔적을 추적하는 데 필수적입니다.

  • 'syslog'/'rsyslog'/'journalctl: 시스템 로그를 중앙 집중적으로 관리하고, 중요한 이벤트에 대한 알림을 설정합니다.
  • 'auditd: 시스템 호출, 파일 접근 등 상세한 감사 기록을 남겨 보안 관점에서 중요한 활동을 추적합니다.
  • 로그 로테이션: 로그 파일이 너무 커지는 것을 방지하고 효율적으로 관리하기 위해 로그 로테이션을 설정합니다.
  • 정기적인 로그 검토: 비정상적인 활동이나 오류 메시지를 식별하기 위해 로그를 주기적으로 검토합니다.

6) 악성코드 방지

리눅스 시스템도 악성코드로부터 완전히 자유롭지 않습니다.

  • 바이러스/악성코드 스캐너: ClamAV와 같은 도구를 사용하여 시스템 내 악성코드 유무를 주기적으로 검사합니다.
  • 루트킷 탐지: chkrootkit이나 rkhunter와 같은 도구를 사용하여 시스템에 숨겨진 루트킷을 탐지합니다.
  • 파일 무결성 검사: AIDETripwire와 같은 도구를 사용하여 중요한 시스템 파일의 변경 여부를 모니터링합니다.

7) 백업 및 복구 전략

어떤 보안 조치도 100% 완벽하지 않습니다. 재해 발생 시 데이터를 보호하고 시스템을 복구하기 위한 백업 전략은 필수입니다.

  • 정기적인 백업: 시스템 설정 파일, 중요 데이터, 데이터베이스 등을 정기적으로 백업합니다.
  • 백업 데이터 암호화: 백업 데이터가 외부에 노출될 경우를 대비하여 암호화합니다.
  • 복구 테스트: 백업된 데이터가 실제로 복구 가능한지 주기적으로 테스트하여 백업 전략의 유효성을 확인합니다.
  • 오프사이트 백업: 물리적인 재해에 대비하여 백업 데이터를 별도의 안전한 장소에 보관합니다.

8) SELinux/AppArmor 활용

SELinux (Security-Enhanced Linux)와 AppArmor는 리눅스 커널의 강제적 접근 제어(MAC: Mandatory Access Control) 보안 모듈입니다.

  • 강제적 접근 제어: 기존의 DAC(Discretionary Access Control)를 넘어, 시스템 전체의 보안 정책에 따라 프로세스와 파일의 상호작용을 제어합니다. 즉, 'root' 권한을 가진 프로세스도 정책에 위배되면 특정 작업 수행이 거부될 수 있습니다.
  • 활성화 및 모드:
    • Enforcing: 정책을 엄격하게 적용하고 위반 시 작업을 거부합니다.
    • Permissive: 정책 위반 시 경고만 기록하고 작업은 허용합니다 (정책 개발 및 테스트 시 유용).
    • Disabled: SELinux/AppArmor를 비활성화합니다.
  • 정책 학습 및 적용: 초기에는 복잡하게 느껴질 수 있으나, 학습 모드나 감사 로그를 통해 정책을 학습하고 시스템 환경에 맞게 조정해야 합니다.
  • 배포판별 차이: SELinux는 주로 CentOS/RHEL 계열에서, AppArmor는 Ubuntu/Debian 계열에서 사용됩니다.

4. 결론 (Conclusion)

리눅스 시스템 보안은 단일 조치로 완성되는 것이 아니라, 지속적인 관리와 여러 계층의 보안 조치를 통해 이루어집니다. 이 가이드에서 제시된 방화벽, 프록시, 그리고 기타 필수 보안 조치들은 리눅스 시스템을 안전하게 운영하기 위한 핵심적인 요소들입니다.

  • 지속적인 모니터링: 시스템 로그를 주기적으로 검토하고, 보안 도구의 경고 메시지에 주의를 기울여야 합니다.
  • 정기적인 감사: 시스템 설정을 정기적으로 검토하고, 새로운 취약점이 없는지 확인해야 합니다.
  • 보안 교육: 시스템 관리자 및 사용자 모두 보안 의식을 높이고 최신 보안 위협에 대한 지식을 습득해야 합니다.

안전한 시스템은 견고한 기초 위에 세워집니다. 이 가이드가 여러분의 리눅스 시스템을 더욱 안전하게 만드는 데 도움이 되기를 바랍니다.

wiki/it/linux/networking/security.txt · 마지막으로 수정됨: 저자 syjang0803

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki