본문 바로가기
정보보안

정보보안6 1차시

by IT매니절 2024. 8. 31.

iptables-restore
미리 설정해둔 파일의 방화벽 룰로 설정(복구)하는 명령어
ex)
iptables-restore /경로/파일명

 

파이썬 설치

$ sudo dnf -y install python3.12

 

$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A OUTPUT -d 1.1.1.1/32 -j DROP
-A OUTPUT -d 1.1.1.2/32 -j DROP
-A OUTPUT -d 1.1.1.3/32 -j DROP

룰 간략하게 보기

 

ip 전체를 쓰고 prefix를 지정하지 않으면 자동으로 /32가 붙는다ex) -A INPUT -s 192.168.1.0/32 -j ACCEPT

 

 

tcpdump 설치 $ sudo dnf -y install tcpdump $ sudo tcpdump -i ens160 -p icmp

ens160 모니터링 시킨뒤cmd로 ping 치자 그에 대한 내용이 실시간 출력됨

 

$ sudo tcpdump -i ens160 -p icmp -n
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
14:37:27.139804 IP 192.168.100.1 > 192.168.100.10: ICMP echo request, id 1, seq 9, length 40
14:37:27.139843 IP 192.168.100.10 > 192.168.100.1: ICMP echo reply, id 1, seq 9, length 40

 

-n 옵션을 추가하면 nids가 아니라 192.168.100.10 으로 표기됨

 

차단 패킷도 확인 가능

 

 

 

포트 제어하기

$ sudo iptables -F
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -s 192.168.100.3 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -s 192.168.100.1 -j DROP
$ sudo iptables -A INPUT -j DROP                 <- (policy ACCEPT) 이므로

 

세 개의 룰 빼고 전부 드랍

 

.3 에서는 ACCEPT

.1 에서는 DROP 확인

(테스트는 lynx, 웹 브라우저 등 사용)

 

+ 어차피 허용되는 룰 빼고는 전부 차단하고 있으므로, DROP 룰은 없애도 상관없음

그렇지만 접속시도의 경로를 확인하려면 룰이 따로 있는게 나을 수 있다고 생각...

 

 

 

SSH 서비스에 접근하는 방화벽 룰 설정

 

ssh 포트 설정
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
dport 22 또는 ssh로 사용

 

$ sudo dnf -y install mod_ssl

=> 기본인증서가 포함되어 있다

$ sudo systemctl restart httpd

 

설치하면 https로 접속

 

접속하면 경고메세지가 나오지만 접속가능

( 기본인증서는 안전한 인증서가 아니므로 경고메시지가 뜬다 )

 

 

$ sudo iptables -F
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.100.1 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport ssh -s 192.168.100.3 -j DROP
$ sudo iptables -A INPUT -j DROP

 

.3에서는 ssh로 접속 불가, .1에서는 ssh로 접속 가능.

 

...

20  7641 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443

https 접속시 마찬가지로 카운트된다

 

 

 

 

mc 패키지 설치

레드햇 계열은 rpm, 데비안 계열은 dpkg 사용

$ sudo dnf -y install mc

$ mc

 

F10 눌러서 종료 가능

 

이 때 방화벽에 룰을 추가하고

 

$ sudo dnf -y remove mc

$ sudo dnf -y install mc

 

삭제후 재설치하면 막혀서 안됨

 

종료는 ctrl + c 하거나 ctrl + z 해서 kill %1로 프로세스 중단

 

$ sudo iptables -nvL
Chain INPUT (policy ACCEPT 9180 packets, 18M bytes)
 pkts bytes target     prot opt in     out     source               destination 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
  607 32792 ACCEPT     tcp  --  *      *       192.168.100.1        0.0.0.0/0            tcp dpt:22
    8  1392 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0 

 

(현재 vm웨어를 사용하고 있으므로) 호스트 os인 윈도우 쪽 192.168.100.1 패킷이 차단된 것 확인됨

 

이 때dns 서버 포트를 허용하면 패키지 설치가 가능해진다dns - 53번 tcp, udp 포트

 

$ sudo cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 168.126.63.1
nameserver 168.126.63.2

 

현재 등록된 dns 네임서버는 168.126.63.1 과 .2 이다 $ sudo iptables -A INPUT -s 168.126.63.1 -p udp --sport 53 -j ACCEPT
$ sudo iptables -A INPUT -s 168.126.63.2 -p udp --sport 53 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --sport 80  -j ACCEPT
$ sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPT
tcp와 udp 등록

 

$ sudo iptables -nvL --line
Chain INPUT (policy ACCEPT 9182 packets, 18M bytes)
num   pkts bytes target     prot opt in     out     source               destination
 - 생략 - 
3      398 18096 ACCEPT     tcp  --  *      *       192.168.100.1        0.0.0.0/0            tcp dpt:22
4       16  2148 ACCEPT     udp  --  *      *       168.126.63.1         0.0.0.0/0            udp spt:53 /* KT DNS Response Traffic */
5        0     0 ACCEPT     udp  --  *      *       168.126.63.2         0.0.0.0/0            udp spt:53 /* KT DNS Response Traffic */
6        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:80 /* HTTP Traffic */
7     7693   15M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:443 /* HTTPS Traffic */
8        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

 

mc 패키지 설치 후 패킷 허용, 차단 현황 확인 가능

kt dns와 https가 사용되었다

 

 

 

iptables-services 패키지를 사용해 부팅시 자동으로 등록되게 할 수 있다
발전 : iptables > firewalld > nftables

 

nftables 참고 ( https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/8/html/securing_networks/getting-started-with-nftables_securing-networks#getting-started-with-nftables_securing-networks )

 

iptables-save > 방화벽_정책_파일명

현재 방화벽 룰을 파일명으로 저장한다

 

# iptables-save test

저장 후 reboot하면 룰이 전부 리셋되어 있는데

# iptables-restore test

 

# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
   12   864 ACCEPT     tcp  --  *      *       192.168.100.1        0.0.0.0/0            tcp dpt:22
    0     0 ACCEPT     udp  --  *      *       168.126.63.1         0.0.0.0/0            udp spt:53 /* KT DNS Response Traffic */
    0     0 ACCEPT     udp  --  *      *       168.126.63.2         0.0.0.0/0            udp spt:53 /* KT DNS Response Traffic */
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:80 /* HTTP Traffic */
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:443 /* HTTPS Traffic */
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0   

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination 

Chain OUTPUT (policy ACCEPT 7 packets, 1144 bytes)
 pkts bytes target     prot opt in     out     source               destination 

 

test 파일을 통해 룰이 복구되었다

 

 

+

cat 사용법을 grep으로 필터링하려는데

# cat --help | grep -n
사용법: grep [옵션]... 패턴 [파일]...
Try 'grep --help' for more information.

에러남

 

# cat --help | grep -- -n
  -b, --number-nonblank    number nonempty output lines, overrides -n
  -n, --number             number all output lines
  -v, --show-nonprinting   ^ 와 M- 표기법을 사용합니다 (LFD와 TAB 제외)

이 때는 -- 를 추가하여, -n을 옵션으로 취급하지 않고 필터링할 단어로 취급하여 필터링 할 수 있다

 

 

 

sudo iptables-save > /etc/sysconfig/iptables 로 방화벽 룰 저장

sudo vi /etc/sysconfig/iptables
(#은 주석을 의미하고
*는 테이블명을 의미하고
: 후에는 해당 테이블에 들어있는 체인명과 정책, [] 안에는 수신된 패킷수와 바이트수가 표기된다
COMMIT은 테이블의 끝을 의미한다)

# Generated by iptables-save v1.8.5 on Sat Aug 31 16:47:58 2024
*security
:INPUT ACCEPT [123:8600]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [77:12952]
COMMIT
# Completed on Sat Aug 31 16:47:58 2024
# Generated by iptables-save v1.8.5 on Sat Aug 31 16:47:58 2024
*raw
:PREROUTING ACCEPT [123:8600]
:OUTPUT ACCEPT [77:12952]
COMMIT
# Completed on Sat Aug 31 16:47:58 2024
# Generated by iptables-save v1.8.5 on Sat Aug 31 16:47:58 2024
*mangle
:PREROUTING ACCEPT [123:8600]
:INPUT ACCEPT [123:8600]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [77:12952]
:POSTROUTING ACCEPT [77:12952]
COMMIT
# Completed on Sat Aug 31 16:47:58 2024
# Generated by iptables-save v1.8.5 on Sat Aug 31 16:47:58 2024
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -d 192.168.100.10/32 -i ens160 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.11.10:80
-A PREROUTING -d 192.168.100.10/32 -i ens160 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.10.11.10:443
-A PREROUTING -d 192.168.100.11/32 -i ens160 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.11.11:80
-A PREROUTING -d 192.168.100.11/32 -i ens160 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.10.11.11:443
-A POSTROUTING -s 10.10.11.10/32 -o ens160 -j SNAT --to-source 192.168.100.10
-A POSTROUTING -s 10.10.11.11/32 -o ens160 -j SNAT --to-source 192.168.100.11
COMMIT
# Completed on Sat Aug 31 16:47:58 2024
# Generated by iptables-save v1.8.5 on Sat Aug 31 16:47:58 2024
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [77:12952]
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -s 192.168.100.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 168.126.63.1/32 -p udp -m udp --sport 53 -m comment --comment "KT DNS Response Traffic" -j ACCEPT
-A INPUT -s 168.126.63.2/32 -p udp -m udp --sport 53 -m comment --comment "KT DNS Response Traffic" -j ACCEPT
-A INPUT -p tcp -m tcp --sport 80 -m comment --comment "HTTP Traffic" -j ACCEPT
-A INPUT -p tcp -m tcp --sport 443 -m comment --comment "HTTPS Traffic" -j ACCEPT
-A INPUT -j DROP
COMMIT
# Completed on Sat Aug 31 16:47:58 2024

 

 

ping으로 자기자신에게 쳐보면 기본적으로 막혀있는데

/etc/sysconfig/iptables 파일을 수정해서 루프백을 허용한다

-A INPUT -i lo -j ACCEPT

 

# iptables-restore /etc/sysconfig/iptables

restore로 저장한 후


# ping 192.168.100.6
PING 192.168.100.6 (192.168.100.6) 56(84) bytes of data.
64 bytes from 192.168.100.6: icmp_seq=1 ttl=64 time=0.022 ms
64 bytes from 192.168.100.6: icmp_seq=2 ttl=64 time=0.082 ms

ping을 자기자신에게 쳐보면 정상적으로 작동

 

# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination 
    4   336 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0 

 

 

iptables의 상태 모듈
방화벽 규칙을 만들 때 패킷 연결 상태를 기반으로 트래픽을 필터링 할 수 있는 기능을 제공
/usr/lib64/xtables

$ sudo mv /usr/lib64/xtables/libxt_comment.so .
$ sudo iptables -A INPUT -p icmp -j ACCEPT -m comment --comment 'ICMP 룰'
iptables v1.8.5 (nf_tables): Couldn't load match `comment':No such file or directory
Try `iptables -h' or 'iptables --help' for more information.

=> 코멘트 모듈 파일을 옮겨버리자 코멘트가 들어간 룰이 등록되지 않는다

 

 

상태 추적 모듈

-m state --state NEW : 새로운 연결
-m state --state ESTABLISHED : 기존에 연결된 상태
-m state --state RELATED : FTP 연결할때
-m state --state INVALID : 깨진 패킷

 

$ sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

$ sudo iptables -nvL
Chain INPUT (policy ACCEPT 1004 packets, 79845 bytes)
 pkts bytes target     prot opt in     out     source               destination 
    1    52 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW

ssh로 접속을 시도하자 매칭됨

처음 접속시에만 매칭이 되고 그 이후 명령어를 사용하면 집계되지 않는다

( -m state --state NEW 가 없으면 명령어를 사용할때마다 집계된다 )

 

로그를 남기려면

-j LOG 로 쓰면 되는데

--log-prefix "접두사" : 접두사를 설정할 수 있다

--log-level 숫자 : 로그레벨을 남길 수 있다

--log-ip-options : ip 패킷 헤더의 옵션을 로그에 기록
--log-tcp-sequence : tcp 시퀀스 번호 기록
--log-tcp-options : tcp 패킷 헤더의 옵션을 로그에 기록

 

이러한 다양한 옵션이 있음

 

$ sudo iptables -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination 
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID LOG flags 0 level 4 prefix "INVALID PACKET: "
   36  2480 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 state NEW
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 state NEW
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0  

 

1    52 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW
=> ssh로 접속시도시 NEW 에 매칭됨

 

 

웹콘솔https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/8/html-single/managing_systems_using_the_rhel_8_web_console/index
https://docs.rockylinux.org/

 

$ sudo systemctl start cockpit.socket
$ sudo netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      810/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      810/sshd
tcp6       0      0 :::9090                 :::*                    LISTEN      1/systemd

 

웹브라우저에 뜬 화면

 

보안상 문제가 있을 수 있으므로 반드시 iptables 등 방화벽 등록 필요

 

sudo iptables -A INPUT -m state --state NEW -p tcp --dport 22 -s 192.168.100.1 -j ACCEPT

=> 호스트 os에서만 접속가능하도록 설정

 

sudo iptables -A INPUT -i lo -j ACCEPT

sudo iptables -A INPUT -j DROP

 

호스트 OS가 아닌 다른 곳에서 접속 시도시 접속되지 않는다

 

 

 

'정보보안' 카테고리의 다른 글

정보보안6 3차시  (0) 2024.09.07
정보보안6 2차시  (0) 2024.09.01
정보보안5 8차시  (0) 2024.08.25
정보보안5 7차시  (0) 2024.08.24
정보보안5 6차시  (0) 2024.08.18