목차
리눅스 보안 관리 가이드
이 문서는 리눅스 시스템의 보안을 강화하기 위한 핵심 가이드라인을 제공합니다. 서버 및 시스템 관리자가 시스템을 안전하게 유지하고 잠재적인 위협으로부터 보호하는 데 필요한 기본적인 보안 원칙과 실용적인 방법을 다룹니다. 방화벽, 프록시 설정부터 사용자 관리, 로깅, 그리고 기타 필수 보안 조치까지 포괄적인 내용을 제공하여 안정적이고 안전한 리눅스 환경을 구축할 수 있도록 돕습니다.
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 사용법
firewalld
는 iptables
의 상위 레이어에서 작동하는 동적인 방화벽 관리 도구로, 주로 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
와 같은 도구를 사용하여 시스템에 숨겨진 루트킷을 탐지합니다.파일 무결성 검사
:AIDE
나Tripwire
와 같은 도구를 사용하여 중요한 시스템 파일의 변경 여부를 모니터링합니다.
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)
리눅스 시스템 보안은 단일 조치로 완성되는 것이 아니라, 지속적인 관리와 여러 계층의 보안 조치를 통해 이루어집니다. 이 가이드에서 제시된 방화벽, 프록시, 그리고 기타 필수 보안 조치들은 리눅스 시스템을 안전하게 운영하기 위한 핵심적인 요소들입니다.
지속적인 모니터링
: 시스템 로그를 주기적으로 검토하고, 보안 도구의 경고 메시지에 주의를 기울여야 합니다.정기적인 감사
: 시스템 설정을 정기적으로 검토하고, 새로운 취약점이 없는지 확인해야 합니다.보안 교육
: 시스템 관리자 및 사용자 모두 보안 의식을 높이고 최신 보안 위협에 대한 지식을 습득해야 합니다.
안전한 시스템은 견고한 기초 위에 세워집니다. 이 가이드가 여러분의 리눅스 시스템을 더욱 안전하게 만드는 데 도움이 되기를 바랍니다.