Linux 강좌 / 방화벽·계정·업데이트로 리눅스 서버 보호하기
리눅스 서버 보호는 필요한 계정과 포트만 허용하고, 관리 권한을 제한하며, 보안 업데이트와 복구 수단을 유지하는 여러 조치의 조합입니다. 원격 접속 정책을 바꿀 때는 현재 세션과 콘솔을 확보하고 새 연결이 되는지 확인한 뒤 다음 제한을 적용하세요.
원격 연결을 유지한 채 규칙을 바꿀 때는 SSH 접속 확인과 가상 콘솔 복구 준비가 선행되어야 합니다. 새 연결로 확인한 뒤에만 기존 세션을 종료하세요.
시스템 설정 실습의 기준은 Ubuntu 26.04 LTS와 Rocky Linux 9 계열의 일반 설치 VM입니다. 컨테이너·WSL·다른 릴리스에서는 서비스와 패키지 구성이 다를 수 있습니다. 가상 머신 실습 환경 만들기에서 콘솔 복구와 버전 확인을 먼저 준비하세요.
바꾸기 전에 현재 노출과 복구 경로 확인하기
id
getent group sudo
getent group wheel
sudo ss -lntup
systemctl --failed
Ubuntu는 보통 sudo 그룹, Rocky Linux는 wheel 그룹을 관리자 권한 정책에 사용하지만 실제 sudoers 설정을 확인해야 합니다. 네트워크 포트는 설치된 서비스와 실제 사용 목적을 대조합니다. 사용하지 않는 서비스는 영향을 확인한 뒤 정지·비활성화하고, 방화벽은 필요한 통신만 허용합니다. 클라우드 보안 그룹과 호스트 방화벽은 별개의 계층입니다.
가상 머신 콘솔·클라우드 직렬 콘솔 등 SSH 외의 복구 수단이 실제로 열리는지 확인합니다. 변경 전 방화벽 상태·SSH 설정·계정 정보를 기록하고 설정 파일을 백업합니다. 현재 세션이 살아 있다는 사실만으로 새 접속도 허용된다고 판단하지 마세요.
키 인증을 검증한 뒤 SSH 정책 조정하기
일반 관리자 계정에서 키 인증과 sudo가 모두 되는지 새 세션으로 확인합니다. 비밀번호 인증을 제한하려면 대상 시스템의 Include 파일·Match 구역·클라우드 초기 설정이 어떤 값을 적용하는지 먼저 확인하세요. 설정 파일에 같은 항목을 여러 번 덧붙이는 방식은 실제 적용값과 다를 수 있습니다.
sudo /usr/sbin/sshd -t
sudo /usr/sbin/sshd -T | grep -E "^(port|permitrootlogin|passwordauthentication|pubkeyauthentication) "
sshd -t는 구문·키 상태 등을 검사하고 -T는 적용 설정을 출력합니다. Match 조건이 있으면 접속 맥락을 지정하는 -C 검사도 필요합니다. 검사가 통과한 뒤 배포판의 정확한 서비스 이름으로 reload하고 새 로그인을 시험합니다. 새 접속 실패 시 유지한 세션·콘솔에서 백업 설정을 복원하고 다시 검증합니다.
Ubuntu UFW는 관리 접속 허용 후 활성화하기
아래는 SSH가 실제 TCP 22번을 쓰는 실습 서버의 예입니다. 사용자 지정 포트라면 모든 22를 실제 값으로 바꿔야 합니다. 전체 인터넷에서 SSH를 허용하는 대신 신뢰하는 관리 출발지로 제한할 수 있지만 NAT·VPN 출구 주소를 잘못 지정하면 접속이 차단됩니다. 먼저 상태를 읽고, 필요한 허용 규칙을 추가한 다음 활성화합니다.
sudo ufw status verbose
sudo ufw --dry-run allow 22/tcp
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status numbered
이 규칙은 22/tcp를 모든 출발지에 허용하므로 인터넷 공개 운영 정책의 최종안으로 간주하지 마세요. 새 터미널에서 접속을 확인한 뒤, 필요한 서비스와 출발지에 맞는 규칙으로 좁힙니다. 더 좁은 규칙을 먼저 검증한 후 넓은 규칙을 제거하고 다시 접속을 확인합니다. 삭제는 현재 numbered 목록과 원래 상태를 비교해 정확한 규칙만 대상으로 합니다.
Rocky Linux firewalld는 zone과 영구 설정을 구분하기
sudo firewall-cmd --state
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --get-default-zone
인터페이스가 실제로 속한 zone을 확인합니다. 다음의 REPLACE_WITH_ACTIVE_ZONE은 그 zone 이름으로 바꾸고, ssh 서비스 정의가 실제 SSH 포트와 맞는지 --info-service=ssh로 확인합니다. 현재 적용되는 runtime 규칙을 먼저 시험하고 같은 규칙만 permanent에 저장합니다.
zone=REPLACE_WITH_ACTIVE_ZONE
sudo firewall-cmd --info-service=ssh
sudo firewall-cmd --zone="$zone" --add-service=ssh
sudo firewall-cmd --zone="$zone" --list-all
sudo firewall-cmd --permanent --zone="$zone" --add-service=ssh
sudo firewall-cmd --permanent --zone="$zone" --list-all
runtime과 permanent는 다르며 reload하면 저장되지 않은 runtime 변경이 사라질 수 있습니다. 반대로 runtime 전체를 무조건 permanent로 복사하면 임시 허용까지 남길 수 있습니다. 되돌릴 때는 이번에 추가했고 기존에는 없던 규칙만 각 설정에서 제거합니다. 현재 관리 접속을 허용하는 규칙은 대체 접속을 검증하기 전 제거하지 않습니다.
업데이트와 SELinux도 함께 관리하기
sudo apt update
apt list --upgradable
sudo dnf check-update
getenforce
첫 블록은 Ubuntu, 둘째는 Rocky Linux 조회 예입니다. dnf check-update는 업데이트가 있으면 상태 100을 반환할 수 있으므로 일반 실행 오류와 구분합니다. 실제 설치는 백업·서비스 영향·재부팅 필요성을 검토한 뒤 수행합니다. 업데이트 뒤 버전뿐 아니라 서비스 응답과 재부팅 후 상태도 확인하세요.
Rocky Linux에서 SELinux는 파일 레이블과 프로세스 정책으로 접근을 통제합니다. 웹 서비스가 파일을 못 읽는다고 바로 비활성화하지 말고 권한·레이블·감사 로그를 확인합니다. 기본 디렉터리를 벗어난 경로는 적절한 영구 레이블 정책과 restorecon이 필요할 수 있습니다. SELinux와 방화벽은 서로 다른 종류의 제한입니다.




