From a44870ec321feca35636794a3c452262a88842c1 Mon Sep 17 00:00:00 2001 From: Lim Date: Wed, 28 Feb 2024 18:35:35 +0900 Subject: [PATCH] 2024-02-28 --- docs/sk-lim19f/2024-02-28.md | 186 +++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 docs/sk-lim19f/2024-02-28.md diff --git a/docs/sk-lim19f/2024-02-28.md b/docs/sk-lim19f/2024-02-28.md new file mode 100644 index 0000000..f567ea6 --- /dev/null +++ b/docs/sk-lim19f/2024-02-28.md @@ -0,0 +1,186 @@ +### 10.1.3 리눅스 방화벽 정책 확인 + +``` +// iptables의 설정값을 확인하는 명령은 -L (--list) 옵션을 사용 + +$ iptables -L +``` + +``` +ACCEPT all-- anywhere anywhere state RELATED, ESTABLISHED +``` + +- INPUT 체인 1번 정책 + - 첫 번째 허용 정책을 보면 RELATED, ESTABLISHED 상태인 모든 출발지에 대해 허용하도록 룰이 설정되어 있음 + - 이미 세션이 맺어져 있거나(ESTABLISHED) 연계된 세션이 있을 때, 어떤 출발지나 목적지인 패킷이더라도 허용하는 정책 + - FTP는 원시적인 프로토콜이어서 컨트롤 프로토콜과 데이터 프로토콜이 별도로 동작 + - 처음 연결된 이후 로그온, 항목 리스트 등의 실제 파일을 다운로드하기 전까지 컨트롤 프로토콜을 사용하고 실제로 데이터 다운로드 명령이 내려지면 별도로 세션을 만들어 다운로드를 시작 + - 두 개의 연결이 별도로 이루어지다보니 방화벽 입장에서는 이 두 개의 연결을 연계시키지 못하면 제대로 통신을 할 수 없음 + - RELATE state를 이용해 이 두 가지의 연결을 하나로 간두하게 됨 + +``` +ACCEPT icmp-- anywhere anywhere +``` + +- INPUT 체인 2번 정책 + - ICMP에 대한 허용 정책 + - 이 정책을 통해 ping과 같은 서비스를 사용할 수 있음 + +``` +ACCEPT tcp-- anywhere anywhere state NEW tcp dpt:ssh +``` + +- INPUT 체인 4번 정책 + - 신규 세션인 NEW state 중 목적지 서비스 포트가 SSH인 경우만 허용 + - 간단히 표현하면 외부에서 서버로 SSH(22) 접속을 허용하는 정책 + +``` +REJECT all-- anywhere anywhere reject-with icmp-host-prohibited +``` + +- INPUT 체인 5번 정책 + - 다섯 번째 정책은 위의 첫 번째부터 네 번째 정책에 매치되지 않은 패킷들을 차단하는 정책 + - INPUT 체인 자체는 기본 정책이 ACCEPT로 선언되어 있지만 이 정책 때문에 화이트리스트 기반 방화벽처럼 동작하게 됨 + - REJECT는 곧바로 폐기하는 DROP과 달리 ICMP 프로토콜을 이용해 패킷 차단 이유를 출발지에 전달 + - iptables의 기본 룰에서는 icmp-host-prohibited 메시지를 이용해 해당 패킷이 차단되었음을 알려줌 + +``` +ACCEPT all-- anywhere anywhere +``` + +- INPUT 체인 3번 정책 + - iptables -L의 내용만으로 보면 모든 출발지의 모든 트래픽에 대해 허용하므로 마치 Any Open 정책처럼 보임 + - 하지만 실제로 외부에서 들어오는 패킷은 해당 정책을 거치지 않고 최하단의 DROP 정책에서 대부분 걸러짐 + - iptables 설정확인 + +``` +$ iptables -S +``` + +- 모든 정책에 대해 허용하는 것으로 되어 있지만 실제로 해당 정책이 적용되는 인터페이스가 루프백 인터페이스(lo)임을 알 수 있음 +- 실제 정책이 어떻게 정의되어 있는지 확인하려면 -S이나 iptables 파일을 직접 확인해야 함 + +### 10.1.4 리눅스 방화벽 관리 + +- iptables에 웹 서비스가 가능하도록 http 서비스 포트를 열어주는 정책 추가 + +``` +$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT +``` + +- 정책을 추가하려면 -A나 --append 옵션을 사용 +- 옵션 뒤에는 어떤 체인에 적용할 것인지를 지정 +- 체인명 뒤에는 넣을 정책을 정의 +- 프로토콜을 지정하기 위해 -p(또는 --protocol) 옵션을 사용 +- 목적지 포트를 제어하기 위해 --dport 옵션을 사용 +- 출발지 포트는 --sport 옵션을 사용 +- 출발지나 목적지의 IP 주소를 제어하기 위해 -s(또는 --source), -d(--destination) 옵션을 사용 +- IP 주소 설정을 별도로 하지 않으면 anywhere로 적용 +- 정책에 일치하는 패킷을 어떻게 처리할 것인지를 정하는 타깃 지정은 -j 옵션 사용 +- iptables의 정책 삭제는 -A 대신 -D나 --delete 옵션을 사용 + +``` +$ iptables -D INPUT -p tcp --dport 21 -j ACCEPT +``` + +- 정책이 너무 많을 때는 -L 옵션으로 일치하는 정책이 있는지 확인하기 어려우므로 -C나 --check 옵션을 사용해 해당 정책이 있는지 확인할 수 있음 + +``` +$ iptables -C INPUT -p tcp --dport 21 -j ACCEPT +``` + +- 특정 위치에 정책을 추가하려면 정책의 줄 번호를 지정해야 함 +- 기본 정책 확인 명령어로는 방화벽 정책의 줄 번호를 확인할 수 없으므로 -L 옵션 뒤에 --line-number 옵션을 추가해 현재 정책의 줄 번호를 확인 + +``` +$ iptables -L --line-number +``` + +- 기존 tables에 추가할 때는 -A 옵션을 사용했지만 특정 위치에 정책을 추가하기 위해서는 -I나 --insert 옵션을 사용 + +``` +$ iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT +``` + +- 특정 서비스 포트에 대해 특정 IP만 허용 + +``` +$ iptables -A INPUT -i eth0 -p tcp -s 172.16.10.10/32 --dport 22 -j ACCEPT +$ iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP +``` + +- IP 주소를 범위로 지정 + +``` +$ iptables -A INPUT -p all -m iprange --src-range 192.168.0.0-192.168.255.255 -j DROP +``` + +- iptable에서 주소를 범위로 지정하는 방법 + +``` +-m iprange --src-range 시작 IP 주소-끝 IP 주소 +-m iprange --dst-range 시작 IP 주소-끝 IP 주소 +``` + +- 서비스 포트를 범위로 지정 + +``` +$ iptables -A INPUT -p tcp -m multiport --dport 3001:3010 -j DROP +``` + +- -F 옵션을 사용하면 iptables에 적용된 정책을 한꺼번에 삭제 가능 + +``` +$ iptables -F +$ iptables --flush +``` + +- -p 옵션은 각 체인의 기본 정책을 변경 + +``` +$ iptables -P INPUT DROP +$ iptables -P FOWARD DROP +$ iptables -P OUTPUT DROP +``` + +- iptables 정책 파일은 다음의 위치에 있음 + +``` +/etc/sysconfig/iptables +``` + +### 10.1.5 리눅스 방화벽 로그 확인 + +- iptables도 일반 방화벽과 마찬가지로 로그를 통해 iptables 정책에 의해 차단되거나 허용된 내용을 확인할 수 있음 +- iptables의 로그는 /var/log/messages에 남으므로 메시지 파일을 보려면 다음과 같이 로그 내용을 확인할 수 있음 + +``` +$ tail -f /var/log/messages +``` + +- 하지만 메시지 파일에는 iptables 로그 외에 다른 로그들도 포함되어 있음 +- iptables 로그만 확인하려면 다음과 같은 설정이 필요 +- rsyslog.conf 파일에 다음과 같이 추가 + +``` +kern.* /var/log/iptables.log +``` + +- rsyslog 서비스를 재시작 + +``` +$ systemctl restart rsyslog.service +``` + +- warning 수준의 로그를 남기기 위해 log-level을 4로 하고 로그를 구분하는 식별자 추가 + +``` +$ iptables -I INPUT LOG --log-level 4 --log-prefix '## ZIGI-Log ## +``` + +- --log-prefix 옵션을 사용하지 않아도 로그를 남길 수 있지만 prefix를 정해두면 로그를 구분할 수 있음 +- iptables 정책을 확인하는 -L 옵션 뒤에 -v 옵션을 사용하면 통과하는 패킷과 바이트 수를 확인할 수 있음 + +``` +$ iptables -L -v +```