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