๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/์„œ๋ฒ„ ํ™˜๊ฒฝ

[Scalp] ์Šค์นผํ”„ ์›น์„œ๋ฒ„ ๊ณต๊ฒฉ์„ฑ ๋กœ๊ทธ ์ž๋™ํ™” :: ๋งˆ์ด์ž๋ชฝ

by ๐ŸŒปโ™š 2019. 3. 12.

Scalp ์Šค์นผํ”„

Scalp๋Š” ์•„ํŒŒ์น˜ ํ†ฐ์บฃ ์›น์„œ๋ฒ„ ๋กœ๊ทธ ์ž๋™ํ™” ๋ถ„์„ ๋ชจ๋“ˆ์ด๋‹ค.
์›น์„œ๋ฒ„์˜ ์—‘์„ธ์Šค ๋กœ๊ทธ ํŒŒ์ผ ๋‚ด์šฉ์„ ์„ค์ •ํ•œ ๋ฃฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™•์ธํ•˜์—ฌ ๊ณต๊ฒฉ์„ฑ ๋กœ๊ทธ๋งŒ ๋‚จ๋„๋ก ํ•ด์ฃผ๋Š” ์ž๋™ํ™” ๋ชจ๋“ˆ์ด๋‹ค.
ํŒŒ์ด์ฌ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, ์•„ํŒŒ์น˜ ์›น์„œ๋ฒ„์˜ access ๋กœ๊ทธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.



Scalp ๋ชจ๋“ˆ ์„ค์น˜

https://code.google.com/archive/p/apache-scalp/downloads

์œ„ ๋งํฌ๋ฅผ ํ†ตํ•ด 0.4๋ฒ„์ „์„ ๋ฐ›์•„์ค€๋‹ค.



์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉํ•œ ๊ณต๊ฒฉ์„ฑ ๋กœ๊ทธ ๊ตฌ๋ณ„ ๋ฃฐํŒŒ์ผ๋„ ๋ฐ›์•„์ค€๋‹ค.

https://github.com/hyyan/apache-scalp/blob/master/default_filter.xml



Apache Tomcat Access Log

์•„ํŒŒ์น˜ ํ†ฐ์บฃ์˜ ์‹คํ–‰๋กœ๊ทธ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
1
2
3
4
5
6
7
8
9
123.45.678.123 - - [12/Mar/2019:14:26:03 +0900] "GET /test/img/introduce.jpg HTTP/1.1" 200 22366
123.45.678.123 - - [12/Mar/2019:14:26:06 +0900] "POST /test/message HTTP/1.1" 200 207
123.45.678.123 - - [12/Mar/2019:14:26:07 +0900] "POST /test/message HTTP/1.1" 200 536
123.45.678.123 - - [12/Mar/2019:14:26:09 +0900] "POST /test/message HTTP/1.1" 200 259
123.45.678.123 - - [12/Mar/2019:14:26:17 +0900] "POST /test/message HTTP/1.1" 200 324
123.45.678.123 - - [12/Mar/2019:14:26:19 +0900] "POST /test/message HTTP/1.1" 200 336
123.45.678.123 - - [12/Mar/2019:14:26:22 +0900] "POST /test/message HTTP/1.1" 200 472
123.45.678.123 - - [12/Mar/2019:14:26:24 +0900] "POST /test/message HTTP/1.1" 200 341
123.45.678.123 - - [12/Mar/2019:14:26:28 +0900] "POST /test/message HTTP/1.1" 200 231
cs


ํ•ด๋‹น ๋กœ๊ทธ์˜ ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋กœ๊ทธ๋ถ„์„์„ ํ•˜๊ฒŒ๋œ๋‹ค.



Scalp ์‹คํ–‰

Scalp๋Š” ํŒŒ์ด์ฌ ๋ชจ๋“ˆ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์ด์ฌ์ด ์„ค์น˜๋˜์–ด ์žˆ๊ณ , python ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ์‹คํ–‰ํ•ด์ค€๋‹ค.
1
python scalp-0.4.py -l ${๋กœ๊ทธ๊ฒฝ๋กœ} -f ${ํ•„ํ„ฐ๊ฒฝ๋กœ} -o ${์ถœ๋ ฅ๊ฒฝ๋กœ} --html
cs




๊ณต๊ฒฉ์„ฑ ๋กœ๊ทธ๊ฐ€ ์กด์žฌํ•˜๋ฉด htmlํŒŒ์ผ ํ˜•ํƒœ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์ค€๋‹ค.


๊ฒฐ๊ณผ ์ถœ๋ ฅ



Tmax ์›นํˆฌ๋น„ ์ œ์šฐ์Šค ์‹คํ–‰๋กœ๊ทธ ๋ฐ˜์˜

Scalp๋Š” ์•„ํŒŒ์น˜ ์›น์„œ๋ฒ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋กœ๊ทธ๋ถ„์„ํ•˜๋„๋ก ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค. ํ•„์ž๋Š” Tmax ์›นํˆฌ๋น„ ์ œ์šฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฒฉ์„ฑ ๋กœ๊ทธ๋ฅผ ๊ฐ์ง€ํ• ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์‹คํ–‰๋กœ๊ทธ ํ˜•์‹์ด ๋‹ฌ๋ผ์„œ Scalp ์‹คํ–‰์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋–จ์–ด์กŒ๋‹ค.

1
2
3
4
123.45.678.123 [01/Jan/2019:10:37:10 +0900] "GET /shell.php HTTP/1.1" 307 166 0
123.45.678.123 [01/Jan/2019:10:37:11 +0900] "GET /appserv.php HTTP/1.1" 307 166 0
123.45.678.123 [01/Jan/2019:10:37:13 +0900] "GET /scripts/setup.php HTTP/1.1" 307 166 0
123.45.678.123 [01/Jan/2019:10:37:14 +0900] "GET /phpmyadmin/scripts/setup.php HTTP/1.1" 307 166 0
cs



์•„ํŒŒ์น˜ ํ†ฐ์บฃ ์‹คํ–‰๋กœ๊ทธ์™€์˜ ์ฐจ์ด๋ฅผ ํ™•์ธํ•˜๋ฉด "- -" ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


Scalp์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์—ฌ ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ "- -"๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ถ„๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ธฐ์กด ์•„ํŒŒ์น˜ ์›น์„œ๋ฒ„ ์ •๊ทœํ‘œํ˜„์‹

1
c_reg = re.compile(r'^(.+)-(.*)\[(.+)[-|+](\d+)\] "([A-Z]+)?(.+) HTTP/\d.\d" (\d+)(\s[\d]+)?(\s"(.+)" )?(.*)$')
cs


ํ‹ฐ๋งฅ์Šค ์›นํˆฌ๋น„ ์ˆ˜์ • ์ •๊ทœํ‘œํ˜„์‹

1
c_reg = re.compile(r'^(.+)() \[(.+)[-|+](\d+)\] "([A-Z]+)?(.+) HTTP/\d.\d" (\d+)(\s[\d]+)?(\s"(.+)" )?(.*)$')
cs



batchํŒŒ์ผ ์„ค์ •

์ผ์ž๋ณ„๋กœ ์ž๋™ ์‹คํ–‰ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ๋ฐฐ์น˜ํŒŒ์ผ ์ƒ์„ฑ


properties setenv file

1
2
3
4
5
6
PYTHON=/home/test/python/python2.7.13/bin/python  #ํŒŒ์ด์ฌ ๊ฒฝ๋กœ
ACCESS=/home/test/access_log_check/bin  #SCALP ๋ชจ๋“ˆ ๊ฒฝ๋กœ
FILTER_PATH=/home/test/access_log_check/config  # ํ•„ํ„ฐ ๊ฒฝ๋กœ
LOG_PATH=/home/tmax/webtob/log/test  # ์›นํˆฌ๋น„ ๋กœ๊ทธํŒŒ์ผ ๊ฒฝ๋กœ
OUTPUT_PATH=/home/test/access_log_check/logs  # ๋ถ„์„๊ฒฐ๊ณผ ์ถœ๋ ฅ ๊ฒฝ๋กœ
DAY=30  # ํ˜„์žฌ ๋‚ ์งœ๋กœ๋ถ€ํ„ฐ ์ง€์ • ์ผ์ˆ˜๊นŒ์ง€ ๋ถ„์„ 
cs



์‹คํ–‰ batch ํŒŒ์ผ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
source /home/test/access_log_check/batch/setenv
 
if test $# -eq 0 ; then
        echo "no params"
        exit 0
fi
 
OPTION=$1
 
if test "$OPTION" = "start"
then
        for((i=0;i<$DAY;i++));do
        sudo ${PYTHON} ${ACCESS}/scalp-0.4_fix.py -l ${LOG_PATH}/"$(date -d $i'day ago' +'access.log_%m%d%Y')" -f ${FILTER_PATH}/filter.xml -o ${OUTPUT_PATH} --html
        done
 
elif test "$OPTION" != ""
then
        echo "wrong"
fi

cs


๋Œ“๊ธ€