SecurityOnion: 다양한 보안기능이 담겨있는 통합 솔루션
2.x 버전은 현 pc상황에 적합하지 않기 때문에 16.x 버전으로 사용
install 설치 후
/etc/nsm/securityonion.conf에서 53번 라인에 local_nids_rule_tuning을 yes로 변경하면 nids 가능 위에 hids부분도 yes로 바꾸면 hids 가능
/etc/nsm/rules/local.rules에 룰 추가하고 sudo rule-update로 룰 업데이트
sudo so-status : so의 툴들의 상태 확인
sguil을 실행해서 패킷들에 우클릭하면 f8은 고려해도 하지 않아도 되는 패킷으로 삭제해주고, 카테고리로 분류하는 것이있고, 관리자한테 보고하기위해서 f9를 누르면 옆에 escalated events로 옮겨짐
카테고리로서,
F1 - 허용되지 않은 관리자 접근
F2 - 허용되지 않은 사용자 접근
F3 - 허용하지 않은 접근 시도
F4 - 성공한 서비스 거부 공격
F5 - 보안 취약점을 이용한 공격(정책 위반)
F6 - 포트 스캔/조사/염탐
F7 - 바이러스 감염
F8 - 불필요한 이벤트(N/A로 처리)
F9 - 판단하기 어려운 경우 상위 관리자 전달
NAC(Network Access Control): 네트워크 접근 제어 - PacketFense, openNAC 등
L2 layer에서 접근 제어 DA, AAA에서 인증(내부에서 인터넷 연결 시 인증을 실시 실패시 인터넷 연결 거부)
SIEM(Security Information and Event Management): 통합 보안 관제 툴 - Wazuh
여태까지 배운 것 총 망라한 문제를 풀어보기로 하였다.
처음에 openVPN은 gns3가 외부로 네트워크 통신이 안되는 상태기 때문에, virtualBox에 pfsense를 구동시켜서 static ip로 주고 openVPN Server를 구축해본다.
static으로 ip 할당 시 에러사항이 많기 때문에, dhcp를 사용하기로 했다.
System -> Authorities에서 CA를 생성해준다.
그리고 Certificates에서 Server용 인증서를 생성해준다.
그리고 System -> User Manager -> Users 에서 user의 계정과 인증서를 만들어준다.
Package Manager에서 openVPN 검색 후 install
VPN -> openVPN 에서 wizards 수행 후
Client Export에서 다운
Window OS이기 때문에 window용으로 다운받는다.
tunnel의 ip 주소대역대를 10.10.10.0/24로 주었기 때문에, 10.10.10.2가 할당된 모습이다.
두번째로, HSRP(Hot Standby Redundancy Protocol)을 이용해서 cisco 장비를 load balancing하는 기법을 적용해 볼건데,
가상의 게이트웨이 주소를 만들어두고, 게이트웨이 주소를 가상으로 할당해준다.
가상 게이트웨이 주소를 192.168.4.200으로 할당해두고, 실제로 게이트웨이 주소에 가상 게이트웨이 주소를 할당하였다.
바로 결과를 보고 과정을 살펴볼건데, 결과로 첫번째 192.168.6.1 즉 두 라우터를 지나서 건너편의 라우터의 바깥쪽 인터페이스에 핑을 보낸건데, traceroute로 살펴보면 192.168.4.254 -> 192.168.5.254 즉 오른쪽 Active 라우터로 패킷이 이동한 것을 알 수 있고, 밑에는 의도적으로 Active 라우터를 shutdown 시켜서 장애를 발생시켰을 때의 패킷의 이동 경로인데, 좌측 standby가 Acitve상태가 되서 왼쪽으로 패킷이 이동한 것을 알 수 있다.
먼저 standby와 active 라우터를 결정해두고, 가상 게이트웨이 주소를 설정해둔다.
필자는 왼쪽 라우터를 standby, 오른쪽 라우터를 Active, 가상 게이트웨이 주소를 192.168.4.200으로 지정해두었다.
왼쪽 라우터부터 설정하는 법을 보자면, 왼쪽 라우터의 게이트웨이가 되어야할 인터페이스에 접속 후,
standby [group id] ip [가상 게이트웨이 주소] -> standby [group id] preempt (라우터가 standby에서 active가 됐을 때, 다시 장애가 복구되면 standby로 되돌아가는 설정 반대의 시나리오도 마찬가지) -> standby [group id] priority [default 100]
standby 10 ip 192.168.4.200
standby 10 preempt
standby 10 priority [default 100]
그리고 위에는 왼쪽 라우터에 인터페이스가 두개인데 지금 설정한 곳에서 반대쪽 인터페이스에도 장애가 발생할 수 있기 때문에, 그쪽의 설정을 해주어서 경로설정이 원활하게 만들어줄 수 있는데, standby [group id] track [반대쪽 인터페이스 이름] (필자는 f1/0이 됨) 하면 그쪽의 인터페이스가 고장나도 설정에 따라서 경로가 수정된다.
경로가 수정되는 기준은 priority 값인데, 장애가 발생시 priority 값이 10 줄어들게 되는데, 그래서 active의 priority 값을 105로 두고, standby를 100으로 두면 active가 장애가 발생 시 95로 감소하므로, standby가 active 상태가 된다.
이 사진은 active로 지정해둔 즉 오른쪽 라우터를 설정 스크린샷이다.
다음으로 Firewall Rule을 살펴보면
1.Firefox3 - inside : http, telnet 접속
2.Webterm2 - dmz : telnet 접속
3.PC1 -> webterm1: ping 가능
4.webterm1 - R1 : http, telnet 가능
5.webterm2 -> PC1: ping 가능
1번부터 순서대로 살펴보면
Firefox3에서 CiscoASAv의 inside interface에 http, telnet 접속이 가능하게 하기 위해선
Asav장비에서 http server enable과 http [허용할 ip 대역] [zone 이름] 그리고
telnet [허용할 ip 대역] [zone 이름]을 설정해두면 되는데, 위의 그림으로 적용시켜보면
http server enable -> http 192.168.7.200 255.255.255.255 inside -> telnet 192.168.7.200 255.255.255.255 inside
이런식으로 conf에서 적용시키면 된다. 추가로 asav에는 passwd 명령어로 패스워드를 설정해주어야 원격접속이 가능하다.
http server enable
http 192.168.7.200 255.255.255.255 inside
telnet 192.168.7.200 255.255.255.255 inside
잘 접속이 되는 것을 확인할 수 있다.
2번을 보면 Webterm2 - dmz : telnet 접속인데,
마찬가지로 telnet 192.168.16.100 255.255.255.255 dmz 하면 된다.
telnet 192.168.16.100 255.255.255.255 dmz
세번째로 PC1-> webterm1: ping 가능인데, 위 gns3의 ASAv장비의 방화벽들은 icmp echo와 reply에 대해서 상태추적을 하지 않기 때문에 따로 echo와 echo-reply의 ACL 정책을 따로 생각해서 설정해주어야 한다.
Asav장비의 zone들의 값이 큰 곳에서 작은 곳으로 패킷이 이동시 통과되기 때문에, inside는 100 dmz는 50 outside는 0으로 두었는 위의 예제로 보면 outside 인터페이스에 pc1에서 webterm1로의 핑 패킷의 echo-reply만 통과해서 pc1으로 도달할 수 있게 해준다면 ping 통신이 가능해진다.
즉 access-list out-in(정책이름) extended permit icmp host 192.168.4.100 host 192.168.7.100 echo-reply
access-group out-in in int outside를 적용시키면
access-list out-in extended permit icmp host 192.168.4.100 host 192.168.7.100 echo-reply
access-group out-in in int outside
핑 통신이 가능해진다.
네번째로 webterm1 -> R1 : http, telnet 가능인데,
icmp의 핑을 제외한 나머지는 상태추적이 가능하기 때문에 http와 telnet에 대한 패킷이 잘 접근하게 acl을 적용한다면 된다.
필자는 access-list out-in extended permit tcp host 192.168.4.100 host 192.168.8.254 eq www와 access-list out-in extended permit tcp host 192.168.4.100 host 192.168.8.254 eq telnet을 적용시켜줬다.
access-list out-in extended permit tcp host 192.168.4.100 host 192.168.8.254 eq www
access-list out-in extended permit tcp host 192.168.4.100 host 192.168.8.254 eq telnet
마지막으로 webterm2 -> PC1: ping 가능인데,
dmz는 security-level이 50이고, inside는 100이기 때문에 ping의 echo접근이 차단되지만 echo가 도달한다면 reply는 정상적으로 목적지로 도달할 것이다.
access-list dmz-in extended permit icmp host 192.168.16.100 host 192.168.7.100 echo
인제 우측의 NIDS/HIDS를 구축해볼건데, virtualBox에서 ubuntu와 rocky를 설치하고,
먼저 snort먼저 구축해보겠다.
apt install build-essential libpcap-dev libpcre3-dev libnet1-dev zlib1g-dev luajit hwloc libdumbnet-dev bison flex liblzma-dev openssl libssl-dev pkg-config libhwloc-dev cmake cpputest libsqlite3-dev uuid-dev libcmocka-dev libnetfilter-queue-dev libmnl-dev autotools-dev libluajit-5.1-dev libunwind-dev libfl-dev -y
기본적인 컴파일에 필요한 라이브러리와 스노트에 필요한 라이브러리를 다운한다.
apt install -y git
apt clone https://github.com/snort3/libdaq.git
#libdaq를 다운하고 libdaq 경로에서 bootstap을 실행하고, configure로 설정파일을 실행
./bootstrap
./configure
#make파일 실행 및 make install
make
make install
# gperftools 설치 (성능, 메모리 관리하는 utility)
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.13/gperftools-2.13.tar.gz
# 압축 해제
tar xzf gperftools-2.13.tar.gz
# gperftools 설치
./configure
make
make install
# snort3 설치
# 다시 gperf와 libdaq다운받은 위치에서
wget https://github.com/snort3/snort3/archive/refs/heads/master.zip
apt install unzip
unzip master.zip
#snort3-master 경로로 이동
cd snort3-master/
./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
#혹시 lib가 부족하다면 추가로 apt install로 설치함.
cd build
make
make install
#에러 없는지 확인
snort -c /usr/local/etc/snort/snort.lua
# interface 무작위 모드 설정
ip link set dev enp0s3 promisc on
# ethtool 설치
apt install -y ethtool
# ethtool 설정
ethtool -K enp0s3 gro off lro off
ethtool -k enp0s3
# snort3-nic.service 파일 생성
touch /etc/systemd/system/snort3-nic.service
# service 파일 작성
vi /etc/systemd/system/snort3-nic.service
[Unit]
Description=Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/ip link set dev enp0s3 promisc on
ExecStart=/usr/sbin/ethtool -K enp0s3 gro off lro off
TimeoutStartSec=0
RemainAfterExit=yes
[Install]
WantedBy=default.target
# 전체적인 프로그램 리로드
systemctl daemon-reload
# snort3 실행
systemctl start snort3-nic
# snort3 enable
/usr/local/etc# systemctl enable snort3-nic
vi /usr/local/etc/snort/snort.lua
# 24 번줄의 $HOME_NET을 사용하는 네트워크 주소로 변경
# 193 번줄에 rules = [[include (룰 경로)]] 추가
variables = default_variables,
rules = [[
include /usr/local/etc/snort/rules/local.rules
]]
# 추가적인 필터링이 필요시 snort.lua 파일 수정
#local rule 파일 생성
touch /usr/local/etc/snort/rules/local.rules
alert icmp 192.168.16.42/32 any -> 192.168.16.54/32 any (msg:"Ping To Ubuntu Detected"; itype:8; sid:3000001; rev:1;)
alert tcp 192.168.16.42/32 any -> 192.168.16.54/32 80 (msg:"HTTP Connect Detected"; sid:3000002; rev:1;)
alert icmp 192.168.16.54/32 any -> 192.168.16.42/32 any (msg:"Ping To Rocky Detected"; itype:8; sid:3000003; rev:1;)
alert tcp 192.168.16.55/32 any -> 192.168.16.54/32 80 (msg:"/etc/passwd command injection Detected"; content:"/etc/passwd", nocase; sid:3000004; rev:1;)
alert tcp any any -> 192.168.16.42/32 any (msg:"Rand Source Attack DDoS Attack Detected"; detection_filter:track by_dst, count 10000, seconds 1; sid:3000005; rev:1;)
alert tcp any any -> 192.168.16.54/32 any (msg:"SYN Flag Scanning Detected"; flags:S; sid:3000006; rev:1;)
alert icmp any any -> 192.168.16.42/32 any (msg:"Rand Source Attack DDoS Attack Detected"; detection_filter:track by_dst, count 10000, seconds 1; sid:3000007; rev:1;)
alert udp any any -> 192.168.16.42/32 any (msg:"Rand Source Attack DDoS Attack Detected"; detection_filter:track by_dst, count 10000, seconds 1; sid:3000008; rev:1;)
위 예제에 필요한 snort Rule을 작성해보았다. snort 단일로는 rand source attack을 잘 감지하지 못하기 때문에, 추가적인 NSM이 요구가 될 것 같다.
#탐지 실행 명령어
snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/snort/rules/local.rules -i enp0s3 -A alert_fast -s 65535 -k none
다른 룰들도 잘 감지되고 있는데, snort.lua에서 event_filter를 사용하면 위에처럼 log가 flooding되는 현상을 제어가능하다.
다음으로 rocky에서 suricata를 이용해 IDS를 구축해볼건데,
dnf update -y
dnf upgrade -y
#epel-release 저장소에서 suricata 다운 가능
dnf install -y epel-release
dnf install -y suricata
#환경설정파일
vi /etc/suricata/suricata.yaml
#17번줄 HOMENET 설정 하고
#622번줄 인터페이스 실제 인터페이스로 변경
#옵션에 인터페이스 실제 인터페이스로 변경
vi /etc/sysconfig/suricata
# 서비스 start / enable 동시
systemctl enable --now suricata
# 룰 제공받는 소스 정보
suricata-update list-sources
suricata-update enable-source et/open
suricata-update
# 서비스 재시작
systemctl restart suricata
# 룰 경로(반드시 룰은 이경로에있어야함)
/etc/suricata/rules
# 로컬 룰 생성
vi /etc/suricata/rules/local.rules
# 환경설정에 룰 적용
# 2187~9번 라인 룰 추가
vi /etc/suricata/suricata.yaml
/etc/suricata/rules/local.rules
# suricata가 정상 작동가능한지 테스트
suricata -T -c /etc/suricata/suricata.yaml -v
# 로그를 실시간으로 확인해보기
tail - f var/log/suricata/suricata.log
alert icmp 192.168.16.42/32 any -> 192.168.16.54/32 any (msg:"Ping To Ubuntu Detected"; itype:8; sid:3000001; rev:1;)
alert tcp 192.168.16.42/32 any -> 192.168.16.54/32 80 (msg:"HTTP Connect Detected"; sid:3000002; rev:1;)
alert icmp 192.168.16.54/32 any -> 192.168.16.42/32 any (msg:"Ping To Rocky Detected"; itype:8; sid:3000003; rev:1;)
alert tcp 192.168.16.55/32 any -> 192.168.16.54/32 80 (msg:"/etc/passwd command injection Detected"; content:"/etc/passwd"; nocase; sid:3000004; rev:1;)
alert tcp any any -> 192.168.16.42/32 any (msg:"Rand Source Attack DDoS Attack Detected"; detection_filter:track by_dst, count 10000, seconds 1; sid:3000005; rev:1;)
alert tcp any any -> 192.168.16.54/32 any (msg:"SYN Flag Scanning Detected"; flags:S; sid:3000006; rev:1;)
alert icmp any any -> 192.168.16.42/32 any (msg:"Rand Source Attack DDoS Attack Detected"; detection_filter:track by_dst, count 10000, seconds 1; sid:3000007; rev:1;)
alert udp any any -> 192.168.16.42/32 any (msg:"Rand Source Attack DDoS Attack Detected"; detection_filter:track by_dst, count 10000, seconds 1; sid:3000008; rev:1;)
사용할 룰들이고, 로그를 살펴볼 때, 로그가 너무 많이뜬다면 event_filter를 해보면 된다. suricata에는 /etc/suricata/threshold.conf에 있다.
마찬가지로 잘 되는 것을 확인 가능하다.
인제 ossec을 ubuntu에 설치해보겠다.
[ Server 설치 명령어 순서 ] - Ubuntu
1. apt install -y build-essential make zlib1g-dev libpcre2-dev libevent-dev libssl-dev libz-dev libsqlite3-dev
2. (curl / wget) wget -q -O - https://updates.atomicorp.com/installers/atomic | bash
3. apt update -y
4. apt install -y ossec-hids-server
5. ls /var/ossec = 설치 경로 , etc/ossec.conf = 환경설정파일 , bin = 실행파일디렉토리
6. vi /var/ossec/etc/ossec.conf -> 5번라인 yes -> no 변경 , 117번라인 밑에 <allowed-ips>192.168.16.0/24</allowed-ips> 추가
/var/ossec/bin/mange_agents를 실행해서 agent 만들고 키를 추출해서 agent들에게 할당하면 됨.
[ Server 명령어 ]
/var/ossec/bin/mange_agents , ossec-control(시작,종료,재시작,상태보기)
/var/ossec/bin/ossec-control status - 상태보기
/var/ossec/bin/manage_agents - 서버에서 에이전트 추가 -> A -> E(연결키생성)
/var/ossec/bin/ossec-control start - 서버 실행
/var/ossec/logs/alerts/alerts.log - 동작 로그 기록
구동이 되는 것을 확인할 수 있다.
1. apt install -y build-essential make zlib1g-dev libpcre2-dev libevent-dev libssl-dev libz-dev libsqlite3-dev
2. (curl / wget) wget -q -O - https://updates.atomicorp.com/installers/atomic | bash
3. apt update -y
4. apt install -y ossec-hids-agent
5. vi /var/ossec/etc/ossec.conf -> 5번줄 Server IP 변경(실제동작장비)
6. /var/ossec/bin/manage_agents -> i -> Server 에서 키값 복사해서 붙여넣기
클라이언트쪽은 위의 과정을 따라가면 된다.
마지막으로 zabbix를 구동시켜 보면 되는데,
rocky 환경에서 실행해야 하므로
Download and install Zabbix
Talk to experts Benefit from expert advice and best practices for all Zabbix-related matters Get technical advice Get instant access to a team of Zabbix experts for guaranteed professional support 24x7 Obtain knowledge Focused, comprehensive training for a
www.zabbix.com
zabbix 홈페이지에서 필요한 환경으로 설치과정을 살펴본다.
dnf -y update
dnf -y upgrade
dnf install -y epel-release
dnf install -y vim
vi /etc/yum.repos.d/epel.repo
# 맨 밑에 excludepkgs=zabbix* 추가
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm
dnf clean all
# 되면 그대로 적용 안되면 dnf --disablerepo=epel install ... 로 적용
dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent2
dnf install httpd php php-fpm mariadb-server -y
systemctl enable --now mariadb
# 보안 설정
mysql_secure_installation
mysql -uroot -p
# mariadb 접속 후
create database my_zabbix_db character set UTF8 collate utf8_bin;
create user 'zabbix_user'@'localhost' identified by '1234';
grant all privileges on my_zabbix_db.* to 'zabbix_user'@'localhost' with grant option;
flush privileges;
sudo zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix_user -p'1234' my_zabbix_db
sudo vi /etc/zabbix/zabbix_server.conf
#107번 db이름 database 이름으로 변경
#123번 유저이름으로 변경
#132번 db password 적용되있으면 적용
sudo vi /etc/zabbix/zabbix_agent2.conf
#82번,135번,146번
firewall-cmd --permanent --add-service=zabbix-server
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
systemctl restart zabbix-server zabbix-agent2 httpd php-fpm
systemctl enable zabbix-server zabbix-agent2 httpd php-fpm
id: Admin, passwd: zabbix
server 구축을 성공하였고, client를 설정해주면 된다.
window환경은 zabbix를 다운 후에 서버 ip로 설정해주고 하면되고,
linux환경은 ubuntu로 진행해보았는데,
apt upgrade ,apt update
자빅스 저장소 다운
sudo wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1+ubuntu24.04_all.deb
dpkg -i zabbix하고 탭눌러보면 대충 나옴
sudo apt install -y zabbix-agent2
apt update
sudo vi /etc/zabbix/zabbix_agent2.conf
82번,135번,146번 서버 ip로 변경
sudo apt install -y firewalld
10050, 80, 3306번 포트
sudo firewall-cmd --permanent --add-port=10050/tcp
sudo firewall-cmd --reload
sudo systemctl start zabbix-agent2
sudo systemctl enable--now zabbix-agent2
하면 된다.