iptables 규칙 어드바이저 스크립트


9

iptables 방어 가없는 서버가 있습니다 :ACCEPT all..

이 서버에 사용자 정의 응용 프로그램이있을 수 있습니다.

엄격한 iptables 규칙 으로이 서버를 강화해야하므로 (모두 거부하고 응용 프로그램에 필요한 것만 허용해야 함) 어떤 앱이 어떤 응용 프로그램을 사용하는지 손으로 찾아야 dst/src port/protocol합니다. 그들..

질문 : 실행중인 컴퓨터에서 이러한 정보를 수집하는 데 도움이되는 스크립트가 있습니까? (로그에서?)-자동으로 iptables 규칙을 생성합니까?

마찬가지로 거기 audit2allowSELinux. 그냥 iptables!

기계가 정지 할 수 없습니다!

예 : "MAGIC"스크립트는 컴퓨터에서 일주일에 한 번씩 실행되어 정보를 수집 한 다음 일주일에 한 달 후에 사용할 수있는 iptables 규칙 파일을 생성 할 수 있습니다.

많은 사람들이이 상황에 처할 수 있습니다 (iptables에 관한 서버를 강화하는 방법). 그리고 이것을 할 수있는 스크립트 / 솔루션이 있다면 좋을 것입니다 : \


또는 모든 것을 차단하고 필요한 것만 허용하십시오. 일주일 정도 동안 tcpdump 실행에 필요한 것을 찾을 수 있습니다.
로렌스

이 기계에 어떤
정지도


1
트래픽을 모니터링하거나 열린 포트를 확인할 수 있지만 드물지만 중요한 발신 트래픽 (특별한 보안 업데이트, 드문 경우에 발송 된 메일 등)을 놓칠 수 있습니다. 들어오는 트래픽 만 필터링하려는 경우 모니터링이 옵션이 될 수 있습니다.
jofel

실행 가능한 응용 프로그램 및 노출 된 포트에서 규칙 집합을 작성하는 방법을 스크립팅 할 수 있습니다. 그러나 1) 대부분의 경우 모든 서비스가 네트워크에 노출 될 필요는 없으며 2) 네트워크에 노출하고 싶지 않은 서비스가있을 수 있기 때문에이 작업 을 실제로 원하지 않습니다. 대신, 한 번 손으로, 좋은 규칙 세트를 설정하고 거기서 시작하십시오. 안전하게 수행하는 한 가지 방법은 ESTABLISHED / RELATED 및 ACCEPT 규칙을 사용하여 규칙 세트를 작성한 다음 관련 규칙이 트래픽과 일치하는지 확인하는 것입니다. 마음에 들면 입력 정책을 삭제하도록 변경하십시오.
페드로

답변:


2

수동으로 수행

sudo ss -tuanp

또는

sudo netstat -tuanp

설명:

-t - show tcp sockets
-u - show udp sockets
-a - show all sockets
-n - show numeric, don't resolve 
-p - show process name

1

tcpdump평균 트래픽을 캡처하기 위해 1 주일 정도 컴퓨터에서 실행하십시오 . 그런 다음 나중에 wireshark를 사용하여 트래픽을 탐색하여 사용중인 포트를 확인할 수 있습니다.

이것에 대한 명령은 tcpdump -i <interface> -s 65535 -w <some-file>

그런 다음이를 사용하여 다시 매핑하여 netstat -tuanp어떤 PID / 애플리케이션이 어떤 포트를 사용하고 있는지 확인할 수 있습니다.

이론적으로 이것은 스크립팅 될 수 있습니다.


1

https://gist.github.com/jirutka/3742890 과 같은 매우 기본적인 템플릿으로 시작하여 ssh와 ping 만 허용하고 다른 것은 수동으로 추가 할 수 있습니다.

퍼블릭 인터페이스 (0.0.0.0) / tcp에서 애플리케이션 청취를위한 iptables 규칙을 생성하는 빠른 스크립트 해킹

netstat -lnpt | egrep '0.0.0.0:[0-9]+' | awk '{print $4,$7}' | \
sed -E -e 's/0.0.0.0://g' -e 's|[0-9]+/||' | \
awk '{printf ("iptables -A INPUT -p tcp --dport %5d --syn -m conntrack --ctstate NEW -m comment %s \n", $1,$2) }'

를 사용하여 iptables -I INPUT <number>특정 위치에 규칙을 주입 할 수 있습니다.iptables -nvL --line-numbers INPUT


1

불행히도 내가 본 모든 스크립트 사용은 학습 모드 또는 수동 모드에서 실행되어 모든 네트워크 사용량을 기록하고 결과를 가져와 iptables로그에서 실제 방화벽을 생성 할 수 있습니다.

가장 좋은 방법은 시스템이 제공하는 서비스를 완전히 이해하기 시작할 때 간단하고 지속적으로 다양한 부분을 계속 추가하는 것입니다. netstat호스팅하는 다양한 서비스에 어떤 포트가 사용되고 있는지, 그리고 어떤 IP 주소에 액세스하고 있는지 확인하는 등의 도구 를 사용해야합니다.

$ sudo netstat -tlpn
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:25                  0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:890                 0.0.0.0:*                   LISTEN      26149/ypbind        
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      26226/python        
tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      26221/./hpiod       
tcp        0      0 127.0.0.1:199               0.0.0.0:*                   LISTEN      26237/snmpd         
tcp        0      0 0.0.0.0:809                 0.0.0.0:*                   LISTEN      26067/rpc.statd     
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 0.0.0.0:587                 0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      26038/portmap       
tcp        0      0 0.0.0.0:35604               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      26249/sshd          
tcp        0      0 0.0.0.0:631                 0.0.0.0:*                   LISTEN      26257/cupsd         
tcp        0      0 :::22                       :::*                        LISTEN      26249/sshd          
tcp        0      0 :::631                      :::*                        LISTEN      26257/cupsd         

참고 : 위의 내용에서 TCP 연결을 수락하는 서버에서 어떤 서비스를 실행하고 있는지 확인할 수 있습니다.

SSH (포트 22) 및 HTTP (포트 80)와 같은 것들로 시작하는 것은 쉬운 일이 아닙니다. 따라서 이러한 유형의 서비스를 한꺼번에 대량으로 수행 할 것입니다. LDAP 또는 NIS와 같은 다른 서비스의 경우보다 통제 된 방식으로 이러한 서비스를 수행하여 서비스를 도입 할 때 문제가 발생하지 않도록 할 수 있습니다.

FireHOL , Firewall Builder (fwbuilder) 및 eztables 와 같은 도구 는이 프로젝트를 공격 할 때 유용 할 수 있습니다.이 iptable규칙은 수작업으로 사용자 지정 규칙 을 작성하는 데 필요한 추상화 계층을 제공 하므로 까다로울 수 있습니다.

FireHOL

FireHOL은 이해하기 쉽고 사람이 읽을 수있는 구성에서 복잡하고 안전한 상태 저장 방화벽을 구축하는 언어 (및 실행 프로그램)입니다.

transparent_squid 8080 "squid root" inface eth0

interface eth0 mylan
    policy accept

interface ppp+ internet
    server smtp accept
    server http accept
    server ftp  accept
    server ssh  accept src example.firehol.org

    client all  accept

router mylan2internet inface eth0 outface ppp+
    masquerade
    route all accept
fwbuilder

Fwbuilder는 사용자가 객체를 생성 한 다음 방화벽으로 끌어다 놓아 단일 PC 또는 PC 네트워크를위한 강력한 보안 시스템을 구축 할 수있는 고유 한 그래픽 방화벽 도구입니다. Fwbuilder는 광범위한 방화벽 (Cisco ASA / PIX, Linux iptables, FreeBSD의 ipfilter, OpenBSD의 pf 등)을 지원하므로 규칙을 여러 플랫폼에 배포 할 수 있습니다. Linux에서 Fwbuilder를 사용하는 방법을 살펴 보겠습니다. 강력한 보안 시스템으로 인해 평생 문제가 될 수 있습니다.

   ss fwbuilder

eztables

Eztables를 사용하면 iptables를 건드리지 않고도 방화벽을 빠르게 구성 할 수 있습니다. 방화벽 규칙 구문은 쉽게 읽고 적용 할 수 있도록 설계되었습니다.

다음은 전체 인터넷이 TCP 포트 80에서 웹 서버에 액세스하도록 허용하는 방법입니다.

  allow_in any $eth0 any 80/tcp

Eztables는 단순하면서도 강력하도록 설계되었습니다. 랩톱을 보호하고 싶거나 가정용 라우터를 설정하거나 회사 방화벽을 구축하려는 경우에는 문제가되지 않습니다.

Fail2Ban 사용

초보적인 iptables방화벽이 설치되어 있으면 Fail2Ban 과 같은 도구를 사용하여 방화벽을 보완 할 수 있습니다.

발췌

Fail2ban은 로그 파일 (예 : / var / log / apache / error_log)을 검사하고 악의적 인 징후를 나타내는 IP를 금지합니다 (너무 많은 암호 오류, 악용 시도 등). 일반적으로 Fail2Ban은 방화벽 규칙을 업데이트하여 IP 주소를 거부하는 데 사용됩니다. 임의의 다른 작업 (예 : 이메일 전송)도 구성 할 수 있지만 지정된 시간 동안 Fail2Ban은 다양한 서비스 (아파치, 택배, ssh 등)를위한 필터를 제공합니다.

이와 같은 도구를 사용하면 계속 강화할 때 시스템이 견뎌야하는 노출을 제한하는 데 도움이됩니다. 시스템이 강화되었다고 확신 한 후에도 보안 조치의 일부로 Fail2Ban을 계속 사용하는 것이 좋습니다.

참고 문헌


0

iptable 규칙을 사용하여 udp도 기록하는 새 연결을 기록하십시오.

iptables -I INPUT -m state --state NEW -j LOG --log-prefix "New inbound connection: "
iptables -I OUTPUT -m state --state NEW -j LOG --log-prefix "New outbound connection: "

--log-level / var / log / messages 이외의 다른 파일에 로그를 가지 도록 다른 것을 지정할 수 있습니다 (syslog 데몬을 구성해야합니다).

일부 서버는 정오, 주말, 월말 (분기, 연도)과 같은 매우주기적인 활동을 수행하므로 서버의 중요한 네트워크 활동을 놓치지 않으므로 기본 응용 프로그램 로그를 읽어야한다고 생각합니다.

서버가 중요하므로 규칙을 작성하는 데 도움이되는 멋진 스프레드 시트 (ip 소스, ip 대상, 프로토콜, 포트, 응용 프로그램)에서 서버의 네트워크 흐름 매트릭스를 만듭니다.


0

나는 이것이 스크립트가 아니며 OP의 질문에 대한 답변 이 아니라는 것을 알고 있지만 OP와 공유하고 싶은 것은 내 생각입니다.

모든 청취 포트가 있습니다.

netstat -an | egrep 'tcp .*LISTEN' | awk -F" " '{print $4}' | awk -F":" '{print $NF}'

아마도 이것은 당신이 당신 자신의 스크립트를 작성하는 데 더 가까이 갈 수 있습니다. :)


0

다음과 같이 시작할 수 있습니다.

netstat -n -l -p | egrep "^(tcp|tcp6|udp)" | grep LISTEN | sed -r 's!^(tcp|tcp6|udp)\s.*:([0-9]+).*LISTEN\s+.*/(.*)!iptables -A INPUT -p \1 --dport \2 -j ACCEPT # \3!'

그런 다음

iptables -P INPUT DROP

또는

iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

첫 번째 행은 netstat를 사용하여 청취 프로세스 및 해당 포트를 나열합니다. 그런 다음 "iptables"행을 생성하여 들어오는 각 연결을 허용합니다. 작은 sed 정규식 대체는 내 서버의 netstat 출력에 맞게 사용자 정의되었으므로 약간의 조정이 필요할 수 있습니다. 작동하면 다음과 같은 결과가 나타납니다.

iptables -A INPUT -p tcp --dport 111 -j ACCEPT # rpcbind       
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # sshd          
iptables -A INPUT -p tcp --dport 25 -j ACCEPT # master        
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # mysqld        
iptables -A INPUT -p tcp --dport 49476 -j ACCEPT # rpc.statd     
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT # postgres.bin  
iptables -A INPUT -p tcp --dport 55371 -j ACCEPT # rpc.statd

두 가지 중요한 사항 :

1)이 규칙은 DROP 또는 REJECT 줄을 끝에 두거나 일치하지 않는 패킷에 대한 기본 정책을 만들 때까지 아무런 효과없습니다 . 이 규칙 은 기본 정책이 일치하지 않는 항목을 허용하는 경우 무단 패킷을 허용 합니다.

2)이 규칙은 소스 IP 에 대해 모호합니다 . 원래 게시물에서 모든 클라이언트가 서버를 사용하도록 허용 한 다음 로그를 검사 하여 대상 포트와 함께 이동할 소스 IP 를 얻습니다 . 나는 그것을 할 수있는 도구를 모른다. 그래서이 스크립트는 사람들이 다른 포트에서 수신 대기하는 서버에서 새로운 서비스를 만드는 것을 막을 것이다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.