Section 01. 네트워크 모니터링 툴
침입탐지시스템 (IDS : Intrusion Detection System)
- 시스템에 대한 원치 않은 조작을 탐지
- 설치 위치와 목적에 따라 호스트 기반과 네트워크 기반의 침입탐지시스템으로 나뉨
[+] 호스트 기반 ( HIDS : Host-based IDS )
- 컴퓨터 시스템의 내부를 감시하고 분석하는 데 중점을 둠
- 개인의 워크스테이션, 서버에 설치될 수 있으며, 컴퓨터 자체를 제한
- 운영체제에 설치된 사용자 계정에 따라 어떤 사용자가 어떠한 접근을 시도하고 작업을 했는지에 대한 기록을 남기고 추적
- 네트워크에 대한 침입탐지는 불가능하며, 스스로가 공격 대상이 될때만 침입을 탐지하는 방식
- 트로이목마, 논리폭탄, 백도어 탐지
( ex) Tripwire )
[+] 네트워크 기반 ( NIDS : Network-based IDS )
- 네트워크를 통해 전송되는 패킷 정보 수집 및 분석하여 침입을 탐지하는 시스템
- 감지기를 사용하며, 무차별모드(Promiscuos mode)에서 동작하는 네트워크 인터페이스에 설치되어있음
- IP 주소를 소유하지 않아 직접적인 해커 공격은 거의 완벽하게 방어 가능
- 설치 위치에 따라 감시 대상 네트워크 범위 조절 가능, 별도 서버를 스위치에 연결
- 공격당한 시스템의 공격에 대한 결과는 알 수 없으며, 암호화된 내용 탐지 불가
( ex) Snort )
[+] 침입방지시스템 (IPS : Intrusion Preventing System)
- 공격탐지를 뛰어넘어 탐지된 공격에 대한 웹 연결 등을 적극적으로 막아주는 솔루션
- 침입탐지 기능을 수행하는 모듈이 패킷을 일일히 검사하여 해당 패턴을 분석한 후, 정상적인 패킷이 아니면 방화벽 기능을 가진 모듈로 차단
- 일반적으로 IPS는 방화벽 내부에 설치 ( 방화벽과 연동하여 공격을 탐지할 수 있기 때문 )
추가적으로
종합적인 보안관리 시스템인 통합 보안관리 ESM(Enterprise Security Management),
위협관리 도구들을 묶어놓은 통합 위협관리 UTM(Unified Threat Management)
네트워크상의 노드 추가 등을 관리하는 접근관리 NAC(Network Access Control)
네트워크 모니터링 도구들
이제 외부에서의 침입을 모니터링해서 로그하거나 통보하는 도구들을 알아보자. 이런 전문적인 모니터링 도구들 중에는 단순한 모니터링뿐만 아니라 네트워크 트래픽 감시와 네트워크나 호스트로 들어오는 패킷을 분석해서 일반적이지 않거나(출발지나 목적지 IP 주소가 없거나, 자신에게 되보내지는 IP_주소, 너무 길거나 짧은 패킷, 목적지 등의 포트가 없거나, 변형된 헤더, 사설 IP를 사용하는 패킷 등), 악성 코드 데이터베이스에서 발견되는 패턴과 유사한 형태(변종 포함)의 패킷을 걸러 내거나 침입자의 작업을 유추해주기도 한다.
[+]snort 설정 및 실습 (IDS/IPS의 고전)
- Snort는 침입감지를 수행하는 IDS를 주로 하지만 IPS 역할도 할 수 있다.
- Snort는 sniffer mode, logger mode, 그리고 IDS/IPS mode로 작동될 수 있는데 Snort가 제대로 작동되려면
AV에서의 악성코드에 대한 데이터베이스가 있어야 하듯이 유효한 침투에 대한 룰세트(Signature based) 데이터베이스가
잘 유지되어야 하므로 rule.conf 파일 설정이 중요하다.
[+] 실습
- ls /etc/snort/snort.conf
> any를 192.168.100.0/24으로 설정하여 홈네트워크 설정
> var EXTERNAL_NET !$HOME 주석을 풀어 줍니다.
-830번 째 줄 rule에서 설정 많은 룰이 설정되어 있는데 ssh 룰을 추가하려면 적용할 수 있다.
- icmp룰 확인 (샘플)
> cat -n /etc/snort/rules/icmp.rules
- 29번째 줄부터 룰이 설정되어 있는데, 경고를 보내주게 되어 있다.
- 메세지와 시드는 필수로 설정이 되어 있어야 한다.(alert,sid)
[+] rules 추가하기
- ssh(생성)nano /etc/snort/rules/ssh.rules
- alert tcp any any -> $HOME_NET 22 (msg : "SSH Login Attempt" ; sid:000001;)
> 어느 네트워크 상에 누구라도 내부 네트워크 22번 포트에 접속한다면, 해당 메세지를 출력하여 경고한다.
- cat >> /etc/snort/rules/icmp.rules (ip 확인하기 추가)
alert icmp any any -> $ HOME_NET any (msg : "ICMP TEST detected" ; sid:000002;)
-cat >> /etc/snort/rules/scan.rules (포트 스캐닝nmap)
alert tcp any any -> $HOME_NET any (msg : "PORT SCNNING detected" ; sid:000003;)
- snort 재시작
> /etc/init.d/snort restart
snort -q -A console -i eth0 -c /etc/snort.conf
> 경고를 콘솔로 보여라 배너를 보이지마라
[+] fail2ban
- IPS(침입예방)사용되는데 서버 서비스를 실행중인 서버에 fail2ban을 설치해서 외부에서의 의심스런 침투를 미리 막아서 보안 강화 도구
- fail2ban-client는 fail2ban-server의 jail 설정 등을 확인시키는 콘솔 명령어로써 일반적인 서버-클라이언트 개념과 무관하므로
주의한다.
- fail2ban의 jail 설정에 따라 서버머신의 로그파일을 모니터링해서 서버에 의심스런 호스트 접근을 감지해서 해당
IP를 추려서 차단해준다. SNORT가 IDS 도구라면 FAIL2BAN은 IPS 도구인데 서버나 방화벽에 설정해서 사용하는 로그기반 도구이다.
- 설정은 /etc/fail2ban/fail2ban.conf 파일에서 해줄 수 있지만 기본설정을 그대로 놔두고 사용해도 문제는 없다.
의심스런 행동이 몇 번 탐지되면 어떤 액션을 취해야할지 이 파일에서 '필터.액션' 구문으로 jail을 정의해준다.
[+] 실습
- centos에서 fail2ban 설치
> dnf -y install epel-release
> dnf -y install fail2ban
- fail2ban설정
> cat -n /etc/failban/jail.conf
- /etc/fail2ban에서
>fail2ban.conf, jail.conf 메인 설정 파일
- nano /etc/fail2ban.conf
> 경고 레벨이 INFO로 낮게 설정되어 있으며, WARNING으로 설정하여, 낮게되어 있는 설정을 높일 수도 있다.
- nano /etc/fail2ban/jail.conf ==> 주석으로 관리하며 필요할 경우 주석 해제
> (보안상)cp -arp /etc/fail2ban/jail.conf /etc/fail2ban/jail.con.bak으로 파일 백업 후 작업 진행
- 옵션 중
> bantime = 60 : bantime도 1분으로 설정
> findtime = 60 : findtime를 1분으로 설정
> maxretry = 3 : 3번 실패시 기록
> backend =on : 로그 파일 저장 유무
> 관리자 메일을 입력하여 받을 수 있도록 설정
enabled = true로 설정한다.
- 서비스시작 : service fail2ban start
- fail2ban-client set sshd addignoreip [IP]
- fail2ban-client status : 규제가 적용되어 있는지 확인
- fail2ban-client status sshd : 설정 확인
[+] 위반사항 확인
- kail에서 접속을 3번 실패했을 때(이상 행동), Centos에서 확인
추가적으로 탐지 되었을 때, 관리자 메일로 확인할 수도 있다.
[+] suricata
- single-thread인 Snort의 진보된 multi-thread 버전으로 어느 정도의 RAM과 CPU만 있는 머신이라면 웬만한 규모의 네트워크에서 IDS/IPS 역할을 잘 수행한다.
- suricata.yaml 파일의 Detect-engine에서 low, medium, high, 그리고 사용자정의 보안레벨을 설정할 수 있다.
- Suricata는 설정된 룰로 침투여부를 판단하는데 snorts의 룰과 호환
[+] denyHosts
- fail2ban과 비슷한 IPS로 사용
- 차이점은 TCPwrapper의 /etc/host/deny과 연동(화이트 기법)
- DOS (원격에서 여러 IP로 무차별 연결을 시도)공격을 막는 기법
- 다운로드 :
wget http://sourceforge.net/projects/denyhosts/files/denyhosts/2.6/DenyHosts-2.6.tar.gz --no-check-certificate
etc/hosts.deny 연동 확인
- cp -arp daemon-control-dist daemon-control
- cd /etc/init.d/ ls
- ln -s /usr/share/denyhosts/daemon-control demyhosts && ls
- ls /etc/ | grep hosts*
- nano /etc/hosts.deny 파일 설정
> ALL : ALL
>> 모든 서비스 모든 호스트에서 거부하게 된다.
> nano /etc/hosts/allow 에서
>> ALL : 127.0.0.1
>> ALL : 192.168.100.129 (ubuntn IP)
※ TCP_wrapper에서는 allow파일을 먼저 확인하여 허용할 것을 체크한 뒤 deny파일을 추가로 본다.
즉, 실습에서 deny설정에서는 ALL(서비스): ALL(호스트) 한 상태이고 allow에서는 ubuntu를 호용한 상태이기 때문에
allow에서 허용한 것들을 제외하고는 모두 거부되게 된다.
라우터에 설정하는 ACL(Access Control List)나 iptables 맨 끝에는 암묵적으로 aeny any any의 설정이 들어 있다
예를 들어서 /etc/hosts.allow 파일에
httpd : ALL
sshd : 192.168.111.100(host)
sendmail : ALL EXCEPT 192.168.100.100(host)
mysqld : 192.168.111.*(network)
식으로 해서 허용할 것만 넣으면 된다.
- nano -c /usr/share/denyhosts/denyhosts.cfg에서
- cat /var/log/denyhosts
- tail -f /var/log/secure로 보면
- kail에서 ssh로 centos로 접속을 시도하면 아래와 같이 막혀있는 것을 확인할 수 있다.
- 추가족으로 log 기록을 centos에서 확인 할 수 있다.
IDS/IPS/NAC로 사용되는 - OSSEC(Open Source SECurity)
OSSEC도 강력한 IDS/IPS 도구인데 그래픽 모드로 다양하게 설정해서 네트워크상의 노드들의 활동을 볼 수 있다. 보통 HID(Host Intrusion Detection)과 NID(Network Intrusion Detection)으로 사용되고 Ubuntu 20.04에서 실행하면 잘된다.
=>참고로 Ubuntu 20.04에서는 콘솔에서 settings를 입력한 뒤, network에서 IP_주소 등을 주고, display로 가서 해상도를 조절하고, apt -y install net-tools 해서 ifconfig 도구를 설치한 뒤, apt update 해주고, ifconfig 해본 뒤, exit 하고, firefox http://www.naver.com 해서 확인하면 네트워크 설정이 잘 된 것이다.
[+] 모드시큐리티(ModSecurity)란?
- modsecurity는 공개웹방화벽이며 오픈소스 프로그램
- 아파치서버를 기반으로 동작
- GNU GPL을 따르는 공개버전이 있고 방화벽을 개발한 회사에서 만든 상용버전 존재
※ 보안, 바이러스 판단
> Signature Detection(서명 기반 진단 / 정의 기반 진단)
>> 백신이라고 불리우는 안티바이러스에서 악성코드 내의 특별한 코드를 찾아내 진단하는 방식
> behavior based (행위기반)
[+] 실습
- 설치 uBuntu
> apt -y install apache2 php mysql-server mysql-client php-mysql
> apt -y install libxml2 libxml2-dev libxml2-utils libaprutil1 libaprutil1-dev
> apt -y install libapache2-mod-security2
- MYSQL에 연결할 수 있도록 login.php파일 생성
<?php
$user = $_POST['username'];
$pass = $_POST['password'];
$conn = mysqli_connect("localhost", "root", "rootoor", "testt");
$result = mysqli_query($conn, "SELECT * FROM `userss` WHERE username='$user' AND password='$pass'"); # 여기서 `userss`에서 `는 ~ 아래의 `[grace]이다.
$rows = mysqli_affected_rows($conn);
if (mysqli_num_rows($result) == 0) # 사용자명과 패스워드가 테이블에 없으면
echo "No, You ain't allowed";
else
echo "OK, You're allowed";
?>
-> 입력값을 전달받는 페이지 생성 (main.html)
<html>
<form method=POST action="login.php">
# 이 프로그램이 실행되면 login.php로입력값을 전달한다.
Username: <input type="text" name="username"/><br>
Password: <input type="password" name="password"/><br>
#input type=text로 하면 입력 패스워드가 평문장으로 보임
<input type=submit value="Login">
</form>
</html>
- SQLi 실습
$result = mysqli_query($conn, "SELECT * FROM `userss` WHERE username='$user' AND password='$pass'")
쿼리문을 보면 식별과 인증이 같이 이루어지는 형태이다.(AND)
'username 입력후 '#으로 주석처리하여, 로그인하는 방법, 논리함수를 사용(AND,OR)하여 쿼리문을 참값을 만들어 로그인이 가능하다.
예를 들어
username : abcd
password : A' OR 'A'='A
으로 입력한다면 로그인이 가능하다.
- 대응 방안
> 화이트 기반으로 SQLi rules로 룰을 정의하여 대응이 가능하다.
https://github.com/SEC642/modsec/tree/master/rules
'소소한 IT이야기 > 클라우드' 카테고리의 다른 글
[Linux_18] 네트워크 모니터링 (2) | 2023.01.26 |
---|---|
[Linux] CentOS 9 Stream (0) | 2023.01.25 |
[Linux] adduser vs useradd (1) | 2023.01.24 |