시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 16/50편 (전체 016/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
Linux 방화벽의 실제 처리는 커널의 netfilter가 담당하고, iptables·nftables는 그 규칙을 넣는 도구입니다.
firewall-cmd (firewalld) ufw (Ubuntu)
↓ ↓
nftables (Rocky 9 백엔드) iptables-nft / nft (Ubuntu 22.04)
↓ ↓
┌──────── netfilter (커널) ────────┐
│ hook: prerouting/input/forward/output/postrouting │
└──────────────────────────────────┘
Rocky 9의 firewalld는 nftables를 백엔드로 쓰고, Ubuntu 22.04의 iptables 명령은 기본적으로 iptables-nft(nftables 위에서 동작하는 호환 계층)입니다. 그래서 어떤 도구로 넣었든 nft list ruleset으로 전체 실효 규칙을 볼 수 있습니다.
nft나 iptables로 직접 추가된 규칙이 존재할 수 있습니다. 공격자가 특정 IP만 허용하는 은밀한 규칙을 넣으면 firewalld 점검으로는 놓칩니다.accept인지 drop인지가 전체 노출 수준을 결정합니다.| 명령 | 용도 |
|---|---|
sudo nft list ruleset | 모든 테이블·체인·규칙 |
sudo nft list tables | 테이블 목록(inet firewalld 등) |
sudo nft -a list chain inet filter input | 규칙 handle 번호 포함 |
sudo iptables -S / sudo iptables-save | iptables 형식으로 보기 |
sudo nft monitor | 규칙 변경 실시간 관찰 |
# 1) 어떤 테이블이 있는가: firewalld가 만든 것 vs 그 외
sudo nft list tables
# table inet firewalld ← firewalld 소유
# table inet filter ← 직접 만든 테이블(있다면 출처 확인 필요)
# 2) 학습용 테이블에 로깅 규칙 예시 (테스트 VM에서만)
sudo nft add table inet lab
sudo nft add chain inet lab input '{ type filter hook input priority 10; policy accept; }'
sudo nft add rule inet lab input tcp dport 23 log prefix '"LAB-TELNET-DROP "' drop
# 3) 확인 및 정리
sudo nft -a list table inet lab
sudo nft delete table inet lab
log prefix를 붙이면 커널 로그에서 어느 규칙에 걸렸는지 바로 식별할 수 있습니다.
$ sudo nft list tables
table inet firewalld
$ sudo nft list chain inet firewalld filter_INPUT | head -5
table inet firewalld {
chain filter_INPUT {
type filter hook input priority filter + 10; policy accept;
ct state { established, related } accept
...
firewalld 환경에서는 inet firewalld 테이블만 존재하고, 규칙이 firewalld 설정과 일치하는 상태가 정상입니다.
$ sudo nft list tables
table inet firewalld
table ip nat_helper
$ sudo nft list table ip nat_helper
table ip nat_helper {
chain input {
type filter hook input priority -200; policy accept;
ip saddr 203.0.113.45 accept
}
}
nat_helper)은 정상 구성처럼 보이지만 내용은 백도어용 허용 규칙 패턴입니다. firewall-cmd --list-all에는 나타나지 않습니다.nftables 규칙 변경은 auditd NETFILTER_CFG 이벤트로 기록됩니다(가상의 예시 로그).
type=NETFILTER_CFG msg=audit(1759718400.551:1501): table=nat_helper:3 family=2 entries=1 op=nft_register_chain pid=7410 subj=unconfined_u:unconfined_r:unconfined_t:s0 comm="nft"
type=SYSCALL msg=audit(1759718400.551:1501): arch=c000003e syscall=46 success=yes ppid=7380 pid=7410 auid=1002 uid=0 comm="nft" exe="/usr/sbin/nft"
Oct 1 09:41:07 rocky9-web01 kernel: LAB-TELNET-DROP IN=ens160 OUT= SRC=192.168.56.77 DST=192.168.56.10 PROTO=TCP SPT=40122 DPT=23 SYN
| 필드 | 의미 |
|---|---|
NETFILTER_CFG | 방화벽 규칙/체인/테이블 변경 |
op=nft_register_chain | 체인 생성 (rule이면 nft_register_rule) |
comm="nft", auid=1002 | 직접 nft 명령 실행, 로그인 사용자 1002 |
firewalld가 변경하면 comm="firewalld"로 남으므로 firewalld 외 프로세스의 NETFILTER_CFG가 핵심 탐지 포인트입니다.
NETFILTER_CFG 중 comm이 firewalld/ufw가 아닌 이벤트를 우선 확인합니다.nft list tables 결과를 기준선에 포함합니다.<rule id="100230" level="10">
<if_group>audit</if_group>
<match>type=NETFILTER_CFG</match>
<regex>comm="nft"|comm="iptables|comm="ip6tables</regex>
<description>firewalld 외 도구에 의한 방화벽 규칙 변경</description>
</rule>
Wazuh audit 디코더가 해당 이벤트를 파싱하는지 wazuh-logtest로 먼저 확인하고, 필요하면 <match> 대신 <field name="audit.type">NETFILTER_CFG</field>로 조정합니다.
nft list ruleset 전체를 저장하고 firewalld 외 테이블·체인을 식별합니다.NETFILTER_CFG audit 로그, 실행 세션 기록을 보존합니다.nft delete table) 해당 IP를 차단합니다.| 구분 | 핵심 내용 |
|---|---|
| 구조 | 도구(firewalld/iptables/nft) → netfilter(커널) |
| Rocky 9 / Ubuntu 22.04 | firewalld→nftables / iptables-nft |
| 점검 핵심 | nft list ruleset로 firewalld 밖의 규칙 확인 |
| 변경 로그 | auditd NETFILTER_CFG (comm 필드) |
| 면접 포인트 | "firewall-cmd에 안 보이는 규칙이 존재할 수 있다" |
다음 편 017. Linux 서버 보안 — SELinux 상태 점검과 AVC 거부 분석 에서는 강제 접근 통제 계층인 SELinux 상태 점검과 AVC 거부 로그 분석을 다룹니다.
이전 편: 015. Linux 서버 보안 — firewalld zone 설계와 점검
📚 시리즈 전체 보기: 시스템 보안 · 취약점