보안과 방화벽

보안과 방화벽

1. 보안 기본 원칙

최소 권한 원칙

┌─────────────────────────────────────────────────────────┐
│                    보안 계층                             │
├─────────────────────────────────────────────────────────┤
│  1. 물리적 보안 - 서버실 접근 통제                        │
│  2. 네트워크 보안 - 방화벽, VPN                          │
│  3. 호스트 보안 - OS 설정, 패치                          │
│  4. 애플리케이션 보안 - 취약점 관리                       │
│  5. 데이터 보안 - 암호화, 백업                           │
└─────────────────────────────────────────────────────────┘

기본 보안 점검 사항

  • [ ] 불필요한 서비스 비활성화
  • [ ] 기본 포트 변경 (SSH 등)
  • [ ] 강력한 비밀번호 정책
  • [ ] 정기적인 보안 업데이트
  • [ ] 로그 모니터링
  • [ ] 방화벽 설정
  • [ ] SSH 키 인증 사용

2. SSH 보안 설정

sshd_config 설정

sudo vi /etc/ssh/sshd_config

권장 설정

# 포트 변경 (기본 22 → 다른 포트)
Port 2222

# root 로그인 비활성화
PermitRootLogin no

# 비밀번호 인증 비활성화 (키 인증만)
PasswordAuthentication no

# 빈 비밀번호 비허용
PermitEmptyPasswords no

# 특정 사용자만 허용
AllowUsers ubuntu deploy

# 특정 그룹만 허용
AllowGroups sshusers

# 로그인 시도 제한
MaxAuthTries 3

# 유휴 타임아웃
ClientAliveInterval 300
ClientAliveCountMax 2

# X11 포워딩 비활성화
X11Forwarding no

# 프로토콜 2만 사용 (대부분 기본값)
Protocol 2

설정 적용

# 설정 검증
sudo sshd -t

# 서비스 재시작
sudo systemctl restart sshd

SSH 키 관리

# 키 생성 (ed25519 권장)
ssh-keygen -t ed25519 -C "your_email@example.com"

# 키 권한 설정 (필수)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys

3. 방화벽 - UFW (Ubuntu)

UFW(Uncomplicated Firewall)는 Ubuntu의 기본 방화벽입니다.

기본 명령어

# 상태 확인
sudo ufw status
sudo ufw status verbose
sudo ufw status numbered

# 활성화/비활성화
sudo ufw enable
sudo ufw disable

# 기본 정책 설정
sudo ufw default deny incoming    # 들어오는 연결 거부 (기본)
sudo ufw default allow outgoing   # 나가는 연결 허용 (기본)

규칙 추가

# 포트 허용
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443

# 포트 범위 허용
sudo ufw allow 6000:6010/tcp

# 서비스명으로 허용
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

# 특정 IP에서만 허용
sudo ufw allow from 192.168.1.100
sudo ufw allow from 192.168.1.100 to any port 22

# 서브넷 허용
sudo ufw allow from 192.168.1.0/24

# TCP/UDP 지정
sudo ufw allow 53/tcp
sudo ufw allow 53/udp

규칙 삭제

# 규칙 번호로 삭제
sudo ufw status numbered
sudo ufw delete 2

# 규칙 직접 삭제
sudo ufw delete allow 80

고급 설정

# 속도 제한 (DoS 방지)
sudo ufw limit ssh    # SSH 연결 제한 (30초에 6회)

# 로깅
sudo ufw logging on
sudo ufw logging high

# 특정 인터페이스
sudo ufw allow in on eth0 to any port 80

일반적인 서버 설정

# 기본 정책
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH (포트 변경 시 해당 포트)
sudo ufw allow 2222/tcp

# 웹 서버
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 활성화
sudo ufw enable

4. 방화벽 - firewalld (CentOS/RHEL)

firewalld는 CentOS/RHEL의 기본 방화벽입니다.

기본 명령어

# 상태 확인
sudo firewall-cmd --state
sudo systemctl status firewalld

# 활성화/비활성화
sudo systemctl start firewalld
sudo systemctl stop firewalld
sudo systemctl enable firewalld

# 설정 다시 로드
sudo firewall-cmd --reload

Zone 개념

Zone 설명
drop 모든 연결 거부
block 연결 거부 + ICMP 응답
public 공개 (기본)
external 외부 (NAT)
dmz DMZ
work 업무
home 가정
internal 내부
trusted 모든 연결 허용
# 현재 zone 확인
sudo firewall-cmd --get-default-zone

# zone 목록
sudo firewall-cmd --get-zones

# zone 변경
sudo firewall-cmd --set-default-zone=public

규칙 추가

# 서비스 허용
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent

# 포트 허용
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --add-port=3000-3010/tcp --permanent

# 특정 IP 허용
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" accept' --permanent

# 특정 IP에서 특정 포트
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept' --permanent

# 설정 적용
sudo firewall-cmd --reload

규칙 삭제

# 서비스 제거
sudo firewall-cmd --remove-service=http --permanent

# 포트 제거
sudo firewall-cmd --remove-port=8080/tcp --permanent

# 적용
sudo firewall-cmd --reload

설정 확인

# 현재 설정
sudo firewall-cmd --list-all

# 서비스 목록
sudo firewall-cmd --list-services

# 포트 목록
sudo firewall-cmd --list-ports

5. SELinux (CentOS/RHEL)

상태 확인

# 현재 상태
getenforce
sestatus

모드

모드 설명
Enforcing 정책 적용 (기본)
Permissive 로그만 기록
Disabled 비활성화

모드 변경

# 임시 변경 (재부팅 시 복원)
sudo setenforce 0    # Permissive
sudo setenforce 1    # Enforcing

# 영구 변경
sudo vi /etc/selinux/config
# SELINUX=enforcing → SELINUX=permissive

SELinux 문제 해결

# 거부 로그 확인
sudo ausearch -m avc -ts recent

# 문제 분석 (audit2why 필요)
sudo ausearch -m avc | audit2why

# 포트 허용 예시
sudo semanage port -a -t http_port_t -p tcp 8080

6. AppArmor (Ubuntu)

상태 확인

# 상태
sudo aa-status

# 프로파일 목록
ls /etc/apparmor.d/

모드

# 프로파일 enforce 모드
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx

# 프로파일 complain 모드 (로그만)
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx

# 프로파일 비활성화
sudo aa-disable /etc/apparmor.d/usr.sbin.nginx

7. Fail2ban

fail2ban은 로그를 모니터링하여 악의적인 시도를 차단합니다.

설치

# Ubuntu
sudo apt install fail2ban

# CentOS
sudo dnf install fail2ban

기본 설정

# 설정 파일 복사
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local

설정 예시

[DEFAULT]
# 차단 시간 (초)
bantime = 3600

# 감시 시간 (초)
findtime = 600

# 최대 실패 횟수
maxretry = 5

# 이메일 알림
destemail = admin@example.com
action = %(action_mwl)s

[sshd]
enabled = true
port = ssh,2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400

관리 명령어

# 시작/중지
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# 상태 확인
sudo fail2ban-client status
sudo fail2ban-client status sshd

# 차단된 IP 확인
sudo fail2ban-client status sshd | grep "Banned IP"

# IP 차단 해제
sudo fail2ban-client set sshd unbanip 192.168.1.100

# IP 수동 차단
sudo fail2ban-client set sshd banip 192.168.1.100

8. 보안 업데이트

Ubuntu/Debian

# 업데이트 확인
sudo apt update
apt list --upgradable

# 보안 업데이트만
sudo apt upgrade -y

# 자동 업데이트 설정
sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades

CentOS/RHEL

# 업데이트 확인
sudo dnf check-update

# 보안 업데이트만
sudo dnf upgrade --security

# 자동 업데이트 설정
sudo dnf install dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

9. 보안 점검 체크리스트

사용자 점검

# 비밀번호 없는 계정
sudo awk -F: '($2 == "") {print $1}' /etc/shadow

# UID 0 계정 (root 외)
awk -F: '($3 == 0) {print $1}' /etc/passwd

# 최근 로그인 실패
sudo lastb | head -20

# sudo 권한 사용자
grep -Po '^sudo.+:\K.*$' /etc/group

서비스 점검

# 실행 중인 서비스
systemctl list-units --type=service --state=running

# 열린 포트
ss -tuln

# 불필요한 서비스 확인
systemctl list-unit-files --type=service | grep enabled

파일 권한 점검

# world-writable 파일
find / -type f -perm -002 2>/dev/null

# SUID 파일
find / -perm -4000 2>/dev/null

# SGID 파일
find / -perm -2000 2>/dev/null

# 소유자 없는 파일
find / -nouser -o -nogroup 2>/dev/null

10. 실습 예제

실습 1: SSH 보안 강화

# 현재 설정 백업
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 설정 변경 (예: root 로그인 비활성화)
sudo sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

# 설정 검증
sudo sshd -t

# 재시작
sudo systemctl restart sshd

실습 2: 방화벽 설정 (Ubuntu)

# 현재 상태
sudo ufw status

# 기본 정책
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH 허용
sudo ufw allow ssh

# 활성화
sudo ufw enable

# 확인
sudo ufw status verbose

실습 3: 방화벽 설정 (CentOS)

# 현재 상태
sudo firewall-cmd --list-all

# SSH 허용
sudo firewall-cmd --add-service=ssh --permanent

# 적용
sudo firewall-cmd --reload

# 확인
sudo firewall-cmd --list-services

실습 4: fail2ban 설정

# 설치
sudo apt install fail2ban    # Ubuntu
# sudo dnf install fail2ban  # CentOS

# 기본 설정
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# 상태 확인
sudo fail2ban-client status sshd

실습 5: 보안 점검

# 열린 포트 확인
ss -tuln

# 로그인 실패 기록
sudo lastb | head -10

# 보안 업데이트 확인
apt list --upgradable 2>/dev/null | grep -i security

# SUID 파일 확인
find /usr/bin -perm -4000 2>/dev/null

축하합니다!

Linux 학습 자료를 모두 완료했습니다. 이제 다음 단계로:

  • 실제 서버에서 실습
  • Docker 컨테이너 활용: Docker/
  • 데이터베이스 운영: PostgreSQL/
  • 자동화 스크립트 작성 연습
to navigate between lessons