Log Server(Rsyslog를 활용한 원격 로그서버)

OS의 종류를 막론하고 서버, 시스템을 관리하는 시선에서의 로그(Log)는 굉장히 중요한 파일이자 증거물이다.

 

로그는 커널, 보안관련, 서비스 등지에서 발생하는 이벤트에 대해 기록되는 것으로,

기본적으로 리눅스에서는 'rsyslog' 패키지의 데몬을 통해서

로컬(/var/log/~) 혹은 원격 로그 서버(Remote Log Serverr)에 저장하게 된다.

(FTP, DB, HTTP .. 등의 메인 서버에서 발생하는 로그의 관리방식)

 

로컬 머신에 저장되는 로그의 경우 해커가 작업을 마친 후 로그를 삭제하면

그 증거를 찾아내기 어려워지지만, 실시간으로 발생하는 로그를 

원격지의 서버로 SSH를 통하여 전송하여 통합 저장 및 관리를 한다면

보다 안전하고 효율적으로 관리할 수 있을 것이다.

 

* 실습환경 : Intel i7-1260P(AMD64)

** 네트워크 대역 : 192.168.100.0/24

*** 해당 실습에서 사용된 가상 머신 : CentOS 1(LogServer .140), CentOS 2(Client, ditto.com, .160),

Ubunser(.135)

 

 

● Rsyslog를 활용한 원격 로그서버 구축

# CentOS7 1(.140 == Remote Log Server)

# rsyslog 패키지를 설치(대부분 기본 패키지로 설치 되어있음)
sudo yum install -y rsyslog

# 기본 설정파일 백업 생성
sudo cp -arp /etc/rsyslog.conf /etc/rsyslog.conf.bak

 

# rsyslog 서버의 /etc/rsyslog.conf 파일 내용 수정

[파일 내용]
14 # Provides UP syslog reception
15 $ModLoad imudp
16 $UDPServerRun 514

18 # Provides TCP syslog reception
19 $template TemlAuth, "/var/log/%HOSTNAME%/PROGRAMNAME%. log"
20 *.*?TemlAuth
21 $ModLoad imtcp
22 $InputTCPServerRun 514

# 원격 로그 서버로 사용될 머신에서 514포트(syslog Protocol) 부분의 주석을 해제
# 19번 째 라인을 보면 새로운 템플릿을 정의한 후 원격지(클라이언트)에서 수신받는 로그의 저장 경로를 지정
# 20번 째 라인의 경우 모든상황에 대한 모든 메시지를 수신한다는 의미

[파일수정 완료 후]
sudo firewall-cmd --permanent --zone=public --add-port=514/tcp
sudo firewall-cmd --permanent --zone=public --add-port=514/udp
sudo firewall-cmd --reload

sudo systemctl restart rsyslog && sudo systemctl status rsyslog

# 방화벽 설정 적용과 수정내용 적용을 위한 재시작을 실행

 

/etc/rsyslog.conf

 

 

포트 개방 상태를 확인

 

 

▼ Centos7 2(.160, Client)

/etc/rsyslog.conf

"*.info;mail.none;cron.none@192.168.100.140(원격 로그 서버의 IP주소)"

info 레벨의 로그를 전송하는데, mail과 cron에서 발생한 이벤트에 대해서는 전송하지 않는다는 의미를 가진다.

 

 

서비스 재시작

설정파일 적용을 위해 서비스를 재시작 후 상태를 확인한다.

 

 

▼ Ubunser(.135, SSH Client)

로컬의 다른 가상머신에서 원격 접속을 시도(비밀번호 2회 오류 후 접속)

 

▼ 결과물(Report)

LogServer에서 'ditto' 호스트의 sshd.log 정보를 확인

 

LogClient에서 자신의 로그파일을 확인

몇 분 차이로 클라이언트 머신에서는 다른 이벤트가 발생하여 내용이 추가되었지만,

서버의 SSHD 관련 로그와 내용을 비교 해보았을 때, 내용이 일치하는 것을 확인할 수 있다.

동기화가 정상적으로 이루어졌다는 의미

'Linux_System' 카테고리의 다른 글

[Linux]DHCP  (0) 2023.02.10
[Linux]Squid(Proxy_Server)  (0) 2023.02.09
[Linux]Ansible  (0) 2023.02.04
[Linux]YUM_Priority  (0) 2023.01.18
[Linux]ZFS  (0) 2023.01.16

DHCP(Dynamic Host Configuration Protocol)

DHCP란 호스트들의 IP, Gataway, DNS 서버를 자동으로 할당해주는 프로토콜로,
과거 BootP(디스크가 없는 컴퓨터에게 IP 주소 및 구성정보를 자동으로 설정)의 상위버전으로 볼 수 있다.

LAN 구성도

위의 그림과 같이 조직 내부에서 지정된 범위의 IP를 자동으로 할당해주는 서버를
리눅스로 구성해보겠다.

* 실습환경 : Intel i7-1260P(AMD64)
** 네트워크 대역 : 192.168.100.0/24
*** 해당 실습에서 사용된 가상 머신 : Ubunser20.04(.145), CentOS7
(.DHCP), Windows7(.DHCP)

● DHCP 서버 구축

VMWare Edit Tab -> Virtual Network Editor

현재 실습환경은 물리적인 노드가 아닌 VMWare 안의 가상머신으로 진행되기 때문에
VMWare 메인 네트워크 어댑터를 통한 자동 IP할당 옵션을 체크해제

# DHCP 서버 구축을 위해 필요한 패키지 설치(Ubuntu Server 20.04 기준 패키지)
sudo apt install -y isc-dhcp-server

# Default 설정파일을 백업
sudo cp -arp /etc/dhcpd.conf /etc/dhcpd.conf.bak


# dhcpd.conf 파일을 수정하여 설정사항을 저장
sudo vim /etc/dhcpd.conf

[파일내용]
# A slightly different configuration for an internal subnet.
subnet 192.168.100.0 netmask 255.255.255.0 {
  range 192.168.100.210 192.168.100.215;
  option domain-name-servers 192.168.100.2;
  option domain-name "ditto.com"
  option subnet-mask 255.255.255.0;
  option routers 192.168.100.2;
  option broadcast-address 192. 168.100.255;
  default-lease-time 600;
  max-lease-time 7200;
}

# DHCP 할당 시켜줄 네트워크 대역을 정의 192.168.100.0/24
# DHCP 할당 시켜줄 네트워크의 범위를 설정 .210 ~ .215까지 할당
# DNS를 설정 192.168.100.2(Default)
# Domain Name을 설정 "ditto.com"
# 기본 대여 시간 600초, 최대 대여 시간 7200초로 설정됨


sudo iptables -I INPUT 1 -p udp -m state --state NEW --dport 67 -j ACCEPT

DHCP의 포트 번호로는 서버(67번) / 클라이언트(68번)을 사용하며
클라이언트가 IP 할당을 위해 요청을 할 수 있게끔 67번 포트를 활성화해준다.

iptables를 이용하여 INPUT 체인에 67번 포트에 관한 룰을 추가해준다.
(sudo ufw allow ~ 를 이용하여 대체할 수 있음)

sudo /etc/init.d/isc-dhcp-server start

해당 명령어를 이용하여 서비스 시작 또는 재시작이 가능하며,
보편적으로 systemctl [Option] [Service] 를 이용하여 서비스를 시작해준다.

▼ CentOS7(DHCP 클라이언트)

# 기존 Static(정적)으로 설정 되어있던 CentOS7의 네트워크 설정파일을 수정
sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33

[파일 내용]
TYPE="Ethernet"
PROXY METHOD="none"
BROUISER ONLS="no
BOOTPROTO="dhcp"			# BOOTPROTO = "dhcp" 설정
DEFROUTE "yes"
IPU4_FAILURE_FATAL = "no"
IPUGINIT-"yes"
IPU6 _AUTOCONF="yes"
IPV6 _DEFROUTE-"Jes"
IPUG FAILURE FATAL= "no"
IPU6_ADDR_GEN _MODE-"stable-privacy"
NAME-"ens33"
UUID="3c9ae2f6-bf1a-469a-8217-ca99bce784ff"
DEUICE="ens33"
ONBOOT-"ues"
#IPADDR="192.168.100.160"
#PREFTX=124*
#GATEWAY="'192.168.100.2"
#ONS1="192.168.100.2"
10052=44192.168. 190 :7.
#DNS3="8.8.8.8"				# 기존에 정적으로 설정되었던 부분은 주석처리

CentOS7

CentOS7

설정파일 수정 및 저장 후,
"sudo ifdown ens33 && sudo ifup ens33"
명령으로 네트워크 카드를 재시작해보면
DHCP 범위의 첫 번째 주소인 .210 으로 할당된 것을 확인해볼 수 있다.


▼ Windows 7(DHCP 클라이언트)

Windows 7

윈도우 탭 -> 네트워크 -> 네트워크 속성(R) 탭을 클릭하여
수동으로 지정 되어있던 IP 설정을 자동으로 변경해준다.

Windows 7

설정을 마친 후 윈도우 명령 프롬프트에서 "ipconfig" 로 네트워크 정보 확인 시
DHCP 할당 범위에 속하는 ~.211로 IP가 설정된 것을 확인할 수 있다.

▼ Ubunser(DHCP 서버)

sudo dhcp-lease-list

해당 명령어로 현재 IP주소를 부여받은 노드들의 정보를 확인해볼 수 있다.




'Linux_System' 카테고리의 다른 글

[Linux]Log_Server  (0) 2023.02.10
[Linux]Squid(Proxy_Server)  (0) 2023.02.09
[Linux]Ansible  (0) 2023.02.04
[Linux]YUM_Priority  (0) 2023.01.18
[Linux]ZFS  (0) 2023.01.16

Squid를 활용한 Proxy서버 구축

Proxy서버는 Cache서버 라고도 불리우며 네트워크 상의 각 노드들이
네트워크 서비스(외부:WAN)으로 접속하려 할 때, 각 노드들이 기존에 접속했던 정보를 쿠키(Cookie)로 보유함으로써
내부 네트워크 (내부:LAN)와외부 네트워크 서버 사이에서 연결에 대한 도움을 주는 중계기 같은 역할을 하는 서버이다.

네트워크 구성도

예를들어 위와 같은 그림의 구조를 가진 네트워크에서 1 ~3 번 노드들이
기존에 접속했었던 서버의 정보(쿠키)를 프록시 서버에 저장 해두었다가.
추후 동일한 서버로의 접속을 요청하면 외부(ex. Global DNS)로 쿼리를 하지않고,

내부의 프록시 서버가 경로를 지정해주므로 경로가 단순화 될 수 있다는 장점(트래픽 감소)이 존재하며
유해 사이트 및 접근해서는 안되는 서버를 ACL로 Permit, Deny로 통제해주는 역할을 수행한다.

많이 사용하게 되는 웹 브라우저에 프록시 서버를 지정하여 접속 제한을 하는 진행

* 실습환경 : M1 Based Mac(ARM64)
** 네트워크 대역 : 10.211.55.0/24
*** 해당 실습에서 사용된 가상 머신 : Fedora(.30= Proxy Server), Fedora(.20 = Just Node..)

● Proxy Server 구축

sudo dnf install -y squid

프록시 서버 구축을 위한 Squid 패키지를 다운로드

# 원본파일 백업
sudo cp -arp /etc/squid/squid.conf /etc/squid/squid.conf.bak

# Squid 설정파일 수정
sudo vim /etc/squid/squid.conf

[squid.conf 수정내용]
2 # Recommended minimum configuration:
5 # Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
7 # should be allowed
8 acl bad url_regex -i "/etc/squid/blocked"	### 해당부분에 룰과 참조파일 경로를 지정
9 acl localnet sc 0.0.0.1-0.255.255.255
10 acl localnet sc 10.0.0.0/8
11 acl localnet sc 100.64.0.0/10
12 acl localnet sc 169.254.0.0/16
13 #acl localnet sc 172.16.0.0/12
14 acl localnet sc 10.211.55.0/24
.
.
.
52 # Example rule allowing access from your local networks.
53 # Adapt localnet in the AL section to list your (internal IP networks
54 # from where browsing should be allowed
55 http access allow localnet !bad			### bad로 지정되지 않는 IP접속은 허가
56 http_access allow localhost

58 # And finally deny all other access to this proxy
59 http_access deny all

61 # Squid normally listens to port 3128
62 http port 3128							### Proxy 서버로 사용할 Port 번호
63 # Uncomment and adjust the following to add a disk cache directory.
64 #cache dir ufs /var/spool/squid 100 16 256

66 # Leave coredumps in the first cache dir
67 coredump_dir /var/spool/squid


/etc/squid/squid.conf
/etc/squid/sqiud.conf


# 차단될 FQDN(목적지)가 정의된 파일생성
sudo vim /etc/squid/blocked

[파일내용]
1 www.youtube.com
2 .daum.net
3 .naver.com

# 앞 부분 ~.[FQDN]을 사용하면 프로토콜과 관계 없이 도메인 전체차단의 효과
# 정규표현식의 Asterisk(*)과 유사한효과


[방화벽 설정]
sudo firewall-cmd --permanent --zone=public --add-service=squid 
sudo firewall-cmd --reload
sudo firewall-cmd --list-services

[포트확인 Open상태 확인]
sudo ss -nltp | grep LISTEN
방화벽과 포트 LISTEN 상태를 확인



● Fedora(.20 = Node)에서 프록시 서버를 지정

Firefox

웹 브라우저 우측 상단의 삼단바를 클릭하여 Setting 클릭 후,
설정 페이지로 접근

Firefox

우측의 검색창에 'proxy'를 입력 후 검색

Firefox

'Manual Proxy Configuration' 체크란에 체크 후, 앞에서 프록시 서버로 구축한
프록시 서버의 주소(10.211.55.30)와 포트번호 '3128'을 기재하여 저장

Firefox

앞에서 정의한 'blocked'에 지정 되어있지 않은 facebook 웹 사이트 접속은 정상적으로 가능

Firefox

차단 목록에 포함 되어있는 ~.naver.com 사이트 접속요청 시
'The Proxy server is refusing' 이라는 경고문과 함께
접근이 차단되는 것을 확인할 수 있다.

'Linux_System' 카테고리의 다른 글

[Linux]Log_Server  (0) 2023.02.10
[Linux]DHCP  (0) 2023.02.10
[Linux]Ansible  (0) 2023.02.04
[Linux]YUM_Priority  (0) 2023.01.18
[Linux]ZFS  (0) 2023.01.16

chroot(change root)

chroot는 '어느 지정된 디렉토리'를 루트(/) 디렉토리로 만들어주는 명령어로,

서버 시스템에 FTP, NFS .. 등의 서비스를 설정한 뒤 클라이언트들이 외부로 공개되어 있는

FTP 서버의 오픈 디렉토리로 접속하여 cd, ls 등의 커맨드를 사용하여 오픈된 디렉토리의

상위 디렉토리로 이동 및 탐색하는 것을 방지하기 위해 사용하는 중요한 설정이다.

 

요악하면 '어느 지정된 디렉토리'를 가상의 최상위(/) 디렉토리로 만들어서

원격지 시스템의 다른 경로로 유입 및 탐색을 방지해주는 역할을 하는 보안 설정이다.

 

* 해당 실습에서 사용된 네트워크 대역 : 192.168.100.0/24

** 해당 실습에서 사용된 가상 머신 : CentOS(.150), Ubuntu(.130)

*** 실습 편의를 위해 FTP 접속을 위한 유저 및 그룹을 새롭게 생성하여 진행 하였음

 

● 임의로 생성한 ftp 디렉토리 chroot 설정

sftp [FTP ServerUser]@[FTP Server IP]

 

sftp> [command]

 

sftp [FTP Server User]@[FTP Server IP OR Domain_name]
# FTP 서버로의 원격 접속을 요청
# SFTP는 FTP와는 다르게 SSH(TLS/SSL)와 동일한 방식의 인증절차를 거치게 된다.

--- FTP 접속 후 ---
pwd, ls, cd ...
# 해당하는 명령어들을 활용하여 원격지의 공유 디렉토리 뿐만 아니라
# 그 외의 디렉토리에 대한 탐색, pull, get이 가능한 부분을 확인할 수 있다.

--- 원격지에 접속한 상태 ---
!ls, !pwd, !mkdir ...
# 일반적으로 사용되는 명령어 앞에 '!'을 추가하여 사용 시
# 원격지가 아닌 나(Local) 시스템에 대한 명령어를 수행할 수 있다.

 

useradd [UserName] -d /ftp -s /sbin/nologin -> passwd [UserName]

FTP 서버 접속을 위한 새로운 사용자 'tester'의 홈 디렉토리(/ftp)로그인 쉘(/sbin/nologin) 설정을 지정하여 유저를 새롭게 생성

 

 

새로운 그룹 생성 및 유저를 해당 그룹에 추가

groupadd [GroupName]
usermod -G [GroupName] -a [UserName]
# 새로운 그룹을 추가한 뒤 새롭게 생성된 사용자를 해당 그룹에 추가한다.

groups [UserName]
# 해당 사용자가 소속되어 있는 그룹을 확인할 수 있는 명령어

 

 

cp -arp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

[/etc/ssh/sshd_config]
131 # override default of no subsystems
132 # Subsystem	sftp /usr/libexec/openssh/sftp-server <- 기존설정 주석처리
133 Subsystem	sftp internal-sftp
134 Match Group	[GroupName]
135 ChrootDirectory /secure/%u
136 ForceCommand internal-sftp

# [GroupName]에 소속 되어있는 [UserName] 사용자가 sftp로 접속했을 때
# /secure 디렉토리가 최상위(/) 디렉토리가 되어 상위 디렉토리로 이동을 불가하게 설정해줌

mkdir -p /secure/[UserName]/ftp
chown [UserName]:[GroupName]
ls -l /secure/[UserName]/ftp
# FTP 작업을 진행할 디렉토리를 새롭게 생성해준 뒤, 일반유저 작업이 가능하게끔 소유권을 수정
# 마지막으로 해당 디렉토리의 설정 값을 보기 위해 ls -l 명령어로 확인

systemctl restart sshd OR systemctl restart ssh
# 새롭게 설정된 파일들의 적용을 위해 서비스 재시작

** sshd_config 파일 수정을 위해 기본 설정 값이 저장되어 있는 파일은 사전에 백업

sftp [FTP ServerUser]@[FTP Server IP]

FTP 서버에 접속하여 'cd / && ls' 명령어를 실행했을 때, 

chroot 설정이 안된 상태와는 달리 '/secure' 디렉토리가 최상위 디렉토리로 설정되어

일반적으로 '/' 디렉토리에서 볼 수 있는 파일들이 보이지 않는 것을 확인

 

'/ftp' 상위의 '/secure' 디렉토리에 새로운 파일 및 디렉토리 생성을 실행하여도

'Permission Denied'가 발생되는 것을 볼 수 있다.

 

다시 '/ftp' 디렉토리로 진입하여 디렉토리 생성을 완료한 후

 

 

cd /secure/tester/ftp

FTP 서버 로컬에 접속하여 해당 디렉토리 확인 시 문제없이 파일이 생성되어 있는 것을 확인할 수 있다.

'System_Security' 카테고리의 다른 글

[Security]Digital_Certificate  (0) 2023.02.12
[Security]TrueCrypt  (0) 2023.02.02
[Security]SSH_Keygen  (0) 2023.02.01
[Security]HTTPS  (0) 2023.01.31
[Security]Snort  (0) 2023.01.26

Snort(Network Intrusion Prevention / Detection System)

Snort는 침입감지를 수행하는 IDS의 역할을 주로하지만, IPS의 역할을 동시에 수행하여

외부로부터의 침입여부를 빠르게 알려준다.

 

Snort는 Sniffer mode, Logger mode, IDS/IPS mode 세 가지 모드로 작동될 수 있는데,

Snort가 제대로 작동되려면 AV에서의 악성코드에 대한 데이터베이스가 있어야 하듯이

유효한 침투에 대한 rule set가 필요한데, 이러한 정보들은 /etc/snort/rules에 저장 및 새롭게 생성이 가능하다.

 

- 스니퍼 모드(Sniffer Mode) : 네트워크 패킷을 읽고 콘솔에 출력

- 패킷 로거 모드(Packet Logger Mode) : 패킷을 디스크에 기록

- 침입 탐지 모드(Intrusion Detection) : 네트워크 트래픽 모니터링, rule.conf를 참조하여 violation 판단 및 동작 수행

 

* VMWare 네트워크 : 192.168.100.0/24

** 사용된 가상 호스트 : Ubuntu(.130), BackTrack(.135), metasploitable(.136)

 

해당 실습은 snort 패키지가 사전에 설치되어 있는 BackTrack 머신에서 진행하였음

패키지 설치 시 apt, yum(epel-release) 패키지 관리자로 snort 다운로드 가능

 

 

● Sniffer Mode 실습

root@bt:~# ifconfig eth0 promisc
# eth0 네트워크 카드를 PROMISC 모드로 전환

root@bt:~# ifconfig
# 변경사항 확인

 

Promiscuous Mode(eth0)

BackTrack(.135) 머신은 모니터링을 담당할 머신이기에

모든 패킷을 수신 가능하게 만들어주는 PROMISC 모드로 전환

 

 

cp -arp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
# 해당 명령어로 recommended 구성파일을 .conf 파일로 복사해준다.

 

vim /etc/snort/snort.conf

해당 첨부 사진에는 표기되지 않았지만, 53번째 줄을 주석처리 한 후,

54번째 줄에 "var EXTERNAL NET !$HOME_NET(192.168.100.0/24가 아닌 네트워크를 의미)"를 추가한다.

이번 실습에서는 실질적으로 사용되지 않는 설정 내용이지만, 추후 외부(External) 네트워크와의 실습 진행 시 필요한 부분이다.

 

 

vim /etc/snort/snort.conf

해당 설정파일의 하단부분을 확인해보면 참조 될 *.rules 파일이 지정 되어 있는 것을 볼 수 있다. 

줄을 한 칸 추가하여 "include $RULE_PATH/ssh.rules" 를 추가해준다.

 

 

vim /etc/snort/rules/ssh.rules

 

alert tcp any any -> $HOME_NET 22 (msg:"SSH Login Detected"; sid:000001;)

# snort.conf에 추가해준 새로운 *.rules을 생성하는 과정이다.
# any(0.0.0.0) any(0.0.0.0)에서 SSH를 요청하는 트래픽 발생 시 "SSH Login Detected"라는 
# 경고문을 출력해주는 역할의 구문이다.

 

/etc/init.d/snort restart

해당 명령어로 snort를 재시작 시켜준다.

 

snort -q -A console -i eth0 -c /etc/snort/snort.conf

• -q : 패킷을  잡아냄

• -A : 경고를 콘솔로 출력해냄

• -i : 인터페이스를 지정

• -c : 적용시킬 롤 파일

 

첨부사진과 내용은 다르지만, snort 설정을 완료한 후, 다른 가상 머신에서 ubuntu(.130)머신으로 ssh 연결 요청 시

위의 명령어로 모니터링을 시작하게 되면 아래의 사진과 동일한 형식으로

Source[n] -> Destination[22] 간의 패킷을 출력해주는 것을 확인할 수 있다.

위의 사진은 ICMP 룰을 설정한 후 해당 패킷이 감지됐을 때 출력해주는 알림(Alert)

 

 

● snort로 nmap을 이용한 포트스캔 감지

nmap -v -A 192.168.100.130

metasploitable(.136) 머신에서 ubuntu(.130) 머신을 타겟으로 포트스캔을 시도

 

 

snort -q -A console -i eth0 -c /etc/snort/snort.conf

이 외에도 다양한 룰을 추가 및 활성화하여 침입감지가 가능하며,

추후에는 snort를 이용한 침입감지 후 조치를 알아보도록 하겠다.

'System_Security' 카테고리의 다른 글

[Security]Digital_Certificate  (0) 2023.02.12
[Security]TrueCrypt  (0) 2023.02.02
[Security]SSH_Keygen  (0) 2023.02.01
[Security]HTTPS  (0) 2023.01.31
[Security]chroot  (0) 2023.01.27

+ Recent posts