Adenium Framework๋ ๋ถ์ฐ์ฒ๋ฆฌ Framework์ธ Spark ํ๊ฒฝ์์ ๋์ํ๋ Application์ ๋์ ์ ์ด ๋ฐฉ๋ฒ๊ณผ ์ ๋ ฅ Data์ ๋ถ๋ฐฐ ๋ฐ ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ์ ์ก์ ์ผ๊ด๋ ํ๋ก์ธ์ค๋ก ์ ์ด ํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณต ํฉ๋๋ค.
Normalizer๋ Adenium Framework์์์ ๋์ํ๋ Application์ผ๋ก ๋ค์ํ Sensor์ Event(Log)๋ฅผ ์ ๊ทํ ํฉ๋๋ค. Regular expression ๊ธฐ๋ฐ์ผ๋ก ๋ฒ์ฉ์ ์ธ Tokenize method ์ ์ฌ์ ์ ์๋ ์ ๊ทํ ํ๋ ๋ฐ ์ฌ์ฉ์ ์ ์ ํ๋๋ฅผ ์ง์ํฉ๋๋ค. ๋ ๋ฆฝ ์คํ ๊ตฌ์กฐ๋ก ์ค๊ณ๋์ด ๋ ๋ฆฝ ์คํ ์ดํ๋ฆฌ์ผ์ด์ ๋๋ ๋ถ์ฐ์ฒ๋ฆฌ Framework ์ธ Spark์ ๊ฐ์ ํน์ Framework์ ํ ๋ถ๋ถ์ผ๋ก ๋์ ํ ์ ์์ต๋๋ค.
Adenium Framework์ ์๋์ ๊ฐ์ด ๊ตฌ์ฑ ๋ฉ๋๋ค.
- Kafka : ์์ง ์์ ์ฒ๋ฆฌํ ์ ๋ ฅ ๋ฐ์ดํฐ๋ Kafka queue์ ์ ์ฅ ๋ฉ๋๋ค.
- Zookeeper : Framework ์ ์ด ๋ช ๋ น๊ณผ ์์ง์์ ์ฌ์ฉ๋๋ ์ค์ , ์ด์์ ๋ณด๋ฅผ ์ ์ ํฉ๋๋ค.
- Adnium framework : Adenium framework๋ Spark์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ kafka๋ก ๋ถํฐ ์ ๋ ฅ๋ ๋ฐ์ดํฐ๋ Spark stream์ ํตํด ์ฒ๋ฆฌ๋๋ฉฐ, Controller๋ฅผ ํตํด Zookeeper์ ์ ์ฅ๋ ์ ์ด ๋ช ๋ น์ ์ํ๊ณผ ์ด์ ์ ๋ณด๋ฅผ Application ์ผ๋ก Broadcast ํฉ๋๋ค.
- Adenium framework์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ Kafka ์ ์ ์ฅ๋๋ฉฐ ๋ณต์์ Framework๋ฅผ ๊ตฌ์ฑํ์ฌ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ดํ ํ ์ ์์ต๋๋ค. ํ์ดํ๋ ๋ฐ์ดํฐ๋ Framework์ Application์ ๊ตฌํํ์ฌ Hadoop, ES, TCP, HTTP ์ ์ก ๋ฑ์ ํ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ํ ์ ์์ต๋๋ค.
๋ถ์ฐ์ฒ๋ฆฌ๊ณผ์ ์์ ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ๊ฐ ์ฌ๋ฐฐ์น๋๋ ๊ฒ์ shuffling์ด๋ผ ํ๋๋ฐ, shuffling์ ์ต์ํํ๋ ๊ฒ์ ๋ถ์ฐ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํ ์ ์ ๋๋ค. Adenium์ Stream ๋ฐ์ดํฐ๋ Kafka Queue์ ์ ์ฅ๋์ด ๊ฐ ๋ชจ๋๊ฐ ์ ๋ฌ๋๋ Kafka Queue์ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ฐฐ์นํ ๊ฒ์ธ๊ฐ๊ฐ Shuffling์ ์ต์ํํ๋ ๋ฐ์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
Kafka๋ ํ๋์ ๊ฐ๋ ์ ์ธ Queue๋ฅผ Topic์ด๋ผ๋ ๋จ์๋ก ๊ด๋ฆฌํ๋ฉฐ, ๊ฐ Topic์ Partition( 0... n )์ด๋ผ๊ณ ํ๋ ๋ถ์ฐ์ฒ๋ฆฌ๋จ์๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ์ด๋ค Data๋ฅผ ์ด๋ค Partition์ ๋ฐฐ์น(์ ์ฌ ๋ด์ง Ingest, allocate..)ํ ๊ฒ์ธ๊ฐ๋ฅผ ์ ํ๋ ์ญํ ์ ํ๋ ๋ชจ๋์ Partitioner ๋ผ๊ณ ํ๋ฉฐ Partitioner๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ, Kafka๋ Default Partitioner๋ก Partition์ ์ ํฉ๋๋ค.
Adenium์ Shuffling์ ์ต์๋ก ํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก๋ Framework์์ Partition ์ ๊ฐ์ ์ง์ ํ๊ณ ์์ต๋๋ค. ์ด ๋์์ ์ฌ์ฉ ํ๊ฒฝ์ ๋ฐ๋ผ ๊ฐ์ ์ง์ ๊ณผ, Random ๋ถ๋ฐฐ๋ฅผ ์ ํ ์ ์ผ๋ก ์ ์ฉ ํ ์ ์์ต๋๋ค. ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฐํ๋ ๋ณ๋์ Producer๊ฐ Partitioning๊ธฐ๋ฅ์ ์ ๊ณต ํ ๊ฒฝ์ฐ partition์ ๊ฐ์ ์ง์ ๊ธฐ๋ฅ์ ์ ๊ฑฐ ํ์ฌ์ผ ํฉ๋๋ค.
Partitioning์ Topic์ partition ๊ฐฏ์์ ์ํฅ์ ๋ฐ์ผ๋ฉฐ ๋์ผํ partition key๋ฅผ ๊ฐ์ง ์ ๋ ฅ ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ 3๊ฐ์ partition์ ๋ถ๋ฐฐ ๋ฉ๋๋ค. ์ฒ๋ฆฌ๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ Topic์ ์ ์ฅ ํ ๊ฒฝ์ฐ์๋ ์ฒ์ ๋ถ๋ฐฐ๋ Partition์ ์ ์ง ํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ค๋ฅธ Framework๋ก ํ์ดํ ํ ๊ฒฝ์ฐ์๋ ๋์ผํ Partition์ ์ ์ง ํ ์ ์์ต๋๋ค.
Adenium Framework๋ Runtime ์ ๊ด๋ฆฌ์์ Engine๊ฐ์ Interactiveํ Interface๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ด๋ฆฌ์๋ Spark application์ด ๋์ํ๋ ๋์ค command๋ฅผ ์ ์กํ์ฌ Framework์ ๋์์ ์ ์ด ํ ์ ์์ต๋๋ค.
๊ด๋ฆฌ์์ Framework ์ฌ์ด์ Message Channel์ Zookeeper์ Kafka๋ฅผ ์ฌ์ฉ ํฉ๋๋ค. Kafka์ ํน์ Topic์ command๋ฅผ ์ ์กํ๋ ๋ฐฉ๋ฒ๊ณผ Zookeeper ํน์ Znode์ ๊ฐ์ ๋ณ๊ฒฝํ์ฌ command๋ฅผ ์ ์กํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. Framework ๋ด์ Controller๋ ์ ๋ ฅ๋ command๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์ง์ ๋ ๋์์ ์ํ ํ๊ฑฐ๋, ์ฐธ์กฐ Data๋ฅผ Application์ Broadcast ํฉ๋๋ค.
Zookeeper znode์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ผ๋ก ๋ช ๋ น์ ์ ๋ฌํ ๊ฒฝ์ฐ ์์ง์ ๋ช ๋ น์ ์ฝ์ด๊ฐ ํ ํด๋น node๊ฐ์ ์ญ์ ํฉ๋๋ค. node์ ๊ฐ์ด ์ญ์ ๋ ๊ฒฝ์ฐ controller๊ฐ command๋ฅผ ์์ ํ ๊ฒ์ ๋๋ค. ์ ์ด๋ช ๋ น์ด ์ ๋ฌ๋๊ณ ์ง์ ๋ ๋ช ๋ น์ ์ ์ ๋์ ์ฌ๋ถ๋ Spark application log๋ฅผ ํตํด ํ์ธ ํ ์ ์์ต๋๋ค.
Controller๋ ์ ๋ ฅ๋ Command๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ์ฌ Framework์ ๋ฉ์ธ Thread์ ๋ถ๋ฆฌ๋ ๋ณ๋์ Thread๋ฅผ ์์ฑํ๋ฉฐ ์์ฑ๋ Thread๋ ์ผ๋ฐฉํฅ Queue๋ก ๊ต์ ํฉ๋๋ค. ์์ฑ๋ Thread๋ zookeeper๋ kafka์ ๋์ฐฉํ command๋ฅผ ํด์ํ์ฌ ์ง์ ๋ ๋์์ ์ํ ํฉ๋๋ค.
- ์์ง ๊ธฐ๋์์ Command listening์ ์ํ ๋ณ๋ Thread ์์
- (๋ณ๋ Thread๋) Zookeeper ๋๋ Kafka๋ก ๋์ฐฉํ command ๋ฉ์์ง๊ฐ ์์ ๊ฒฝ์ฐ, ์ด๋ฅผ ํด์ํ์ฌ ํ์ํ ์ฐธ์กฐ์ ๋ณด ๋ฅผ ๋ค์ ์ฝ์ด์ค๋ ๋ฑ์ ๋์์ ์ํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Frame work๋ด์ Queue์ push
- (๋ฉ์ธ Thread๋) micro-batch ๋ง๋ค Queue์ ์๋ก ๋์ฐฉํ Message๊ฐ ์๋ ์ง ํ์ธํ๊ณ , Message๊ฐ ์์ ๊ฒฝ์ฐ, ํ์์ Worker์ Broadcast๋ฅผ ์ํ
- Worker๋ Broadcast๋ object๋ฅผ ์ฌ์ฉํ์ฌ processing์ ์งํ
- Command listening์ ์ํ Thread๋ฅผ ๋ณ๋๋ก ๊ฒฉ๋ฆฌ ํจ์ผ๋ก์จ DB, Zookeeper Node ๋ฑ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ์ฒ๋ฆฌ ์๊ฐ์ด ์ง์ฐ๋ ๊ฒฝ์ฐ Main Thread์ ์ค๋จ ์์ด ๋ฐ์ดํฐ๋ฅผ Initialize ํ ์ ์์ต๋๋ค.
- Work์ Broadcast ๋๋ ๋ฐ์ดํฐ๋ฅผ Message Queue๋ฅผ ํตํด ๊ณต์ ํจ์ผ๋ก์จ Broadcast ๋๋ ๋ฐ์ดํฐ์ immutable์ ๋ณด์ฅ ํ ์ ์์ต๋๋ค.
์ ์ด ๋ช ๋ น์ ์ฌ๋ฌ ๋ช ๋ น์ด๋ฅผ ๋ฌถ์ด ์ ์ก ํ ์ ์๋ค.
-command1 value1 value2 -command2 value3 value4
[Adenium Normalizer์ ์ ์ด ๋ช ๋ น์ Normalizer ์ ์ด ๋ช ๋ น ์ฐธ์กฐ]
-load:[ํญ๋ชฉ] | ํญ๋ชฉ์ ํด๋นํ๋ ์ ๋ณด๋ฅผ DataSource(DB)๋ก ๋ถํฐ ๋ก๋ํ์ฌ Zookeeper์ ์ ์ฅ |
---|---|
-clean:[ํญ๋ชฉ] | ํญ๋ชฉ์ ํด๋นํ๋ ์ ๋ณด๋ฅผ Zookeeper์์ ์ญ์ |
-update:[ํญ๋ชฉ] | ํญ๋ชฉ์ ํด๋นํ๋ ์ ๋ณด๋ฅผ Zookeeper๋ก ๋ถํฐ ๋ก๋ํ์ฌ Broadcast |
Adenium Framework๋ ์ฅ์ ๋๋ ํน์ ์์ ์ Data ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ณต๊ตฌ ๊ธฐ๋ฅ์ ์ ๊ณต ํฉ๋๋ค. Adenium Framework๋ ๋งค ๋ฐฐ์น๋ง๋ค ์ฒ๋ฆฌํ Topic์ Partition๋ณ๋ก Offset rage๋ฅผ ์ง์ ๋ Zookeeper node์ ์ ์ฅํฉ๋๋ค. ๋ณต๊ตฌ ๊ธฐ๋ฅ์ Kafka Topic์ Partition๋ณ๋ก ์ง์ ๋ offset ๋ฒ์ ๋ถํฐ Data๋ฅผ ์ฌ ์ฒ๋ฆฌ ํฉ๋๋ค.
๋ง์ฝ ์ ์ฅ๋ offset ์ ๋ณด๊ฐ ์๊ฑฐ๋ ํด๋น offsets๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค์ผ ์ ์๋ ๊ฒฝ์ฐ ํ์ฌ offset(์ต์ข offset)๋ถํฐ ์ฒ๋ฆฌ ๋ฉ๋๋ค.
๋ณต๊ตฌ๊ธฐ๋ฅ์ Framework ์์ ์ -kf:restore ์ต์ ์ ์ฌ์ฉํ์ฌ ํ์ฑํ ํ ์ ์์ต๋๋ค.
kafka Topic ๋ฐ Partition์ด ๋ณ๊ฒฝ๋์ง ์์์ผ ํ๋ฉฐ, ๋ณต๊ตฌ์ ์ต์ข batch์์ ์ฒ๋ฆฌํ๋ ์ด๋ฒคํธ๋ ์ค๋ณต์ฒ๋ฆฌ ๋ ์ ์์ต๋๋ค.
Adenium์ ๊ฐ์ข ์ค์ ๊ณผ ์ด์์ ๋ณด๋ฅผ Zookeeper๋ฅผ ํตํด ๊ด๋ฆฌ ํฉ๋๋ค. ์ด์ ์ ๋ณด๊ฐ 512 Kb ์ด๊ณผ ํ ๊ฒฝ์ฐ ์ํ์คํ Sub node ( 0, 1, 2 ... )๋ฅผ ์์ฑํ๋ฉฐ 512 Kb ๋จ์๋ก ๋๋์ด ์ ์ฅํฉ๋๋ค. Zookeeper znode ๊ตฌ์ฑ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ชจ๋ ๋ ธ๋๋ ์๋ฌธ์์ ๋จ์ด ์ฌ์ด๋ "_" ๊ตฌ๋ถ์๋ฅผ ์ฌ์ฉํ ๋ ธ๋ ์ด๋ฆ์ ๊ฐ์ต๋๋ค.
* VersionRoot : Framework ๋ฒ์
* |-- app
* | |-- watch : application ๋ณ ํ์ ๋
ธ๋์์ command ์ฑ๋๋ก ์ฌ์ฉ
* | | |-- [application name] : Submit ์ ์ง์ ํ Application ๋ช
์ผ๋ก ์๋ ์์ฑ
* | |-- offsets : application ๋ณ kafka offset๋ฅผ ์ ์ฅ
* | |-- common
* | | |-- var_fields : ์ ๊ทํ ํ๋ ์ ์
* | |-- normalizer : ์ ๊ทํ ์์ง์์ ์ฌ์ฉ๋๋ ์ด์ ์ ๋ณด
* | | |-- parser_log : ์ ๊ทํ ์์ง์ log on/off ์ํ ์ ๋ณด
* | | |-- parser_ref : ์ ๊ทํ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ
* | | | |-- geo_ip_range : ๊ตญ๊ฐ Ip
* | | | |-- company_ip_range : ์ฅ๋น ์์ ์ฃผ IP ๋์ญ
* | | | |-- signatures : Signatuares
* | | | |-- agents : Agents
* | | | |-- tokenize_rules : Tokenize rule
* | | | |-- arrange_rules : Regex captuare order To Field Rule
* | | | |-- replace_fields : ์ ๊ทํ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ ๊ท ์น
* | | | |-- company_ips : ์ฅ๋น ์์ ์ฃผ IP
Adenium์ ์ด๋ฒคํธ๋ ํด์๋ ํ๋๋ค์ ์กฐํฉ์ด๋ฉฐ, ํด์๋ ํ๋์ ์งํฉ์ ์ ๊ทํ๋ ์ด๋ฒคํธ๋ผ๊ณ ์ ์ ํฉ๋๋ค.
์ ๊ทํ ๋ ์ด๋ฒคํธ๋ฅผ ๋ถ๋ฅ ํ๋ ๊ท์น ๊ณผ ๋ถ๋ฅ ๋ ํญ๋ชฉ์ด ์ด๋ค ํ๋์ ํด๋นํ๋ ์ง๋ฅผ ํ์ ํ๋ ๊ท์น ( Arrange๊ท์น)์ ๋ฐ๋ผ 1์ฐจ ํด์ ๋์ด์ง๋๋ค. 1์ฐจ ํด์๋ ํ๋๋ก ๋ถํฐ ์๋ ค์ง ์ผ๋ฐ ๊ท์น์ ๋ฐ๋ผ ํ์๋ ์ผ๋ฐํ์์ ๋ณด (ex: ํน์ IP์ ์์๊ตญ๊ฐ)์ ๊ด๋ฆฌ์ ๋ณด์ ๋ฐ๋ผ ํ์๋ ์ฐธ์กฐํ์์ ๋ณด (ex: ํ์ฌ์ ๋ฑ๋ก๋ IP๋ฒ์์ ๋ฐ๋ผ ํ์ฌ ๋ด๋ถ IP์ธ์ง ํ์ ), ๊ทธ๋ฆฌ๊ณ ์ ์ฌ์ ๋ณด๊ฐ ์นํ์ด ํ์ํ ๋ ์ด๋ป๊ฒ ์นํํ ์ง ์ ํ๋ ์นํ์ ๋ณด ๋ฅผ ํตํด ํด์๋ ํ, Folding๊ณผ์ ์ ํตํด Merge๋์ด ์๋ฃ ๋ฉ๋๋ค.
Adenium ํ๋๋ ํ๋๋ฅผ ์๋ณํ๋ ๊ณ ์ ID + Key name , Value๋ก ๊ตฌ์ฑ ๋ฉ๋๋ค. 1 ~ 49 ๋ฒ์ Adenium์์ ์ ์ ํ ์์ฝ ํ๋ ID ์ ๋๋ค. ํ๋์ ํ์ฅ ์ Adnium์์ ์์ฝ๋ ๊ณ ์ ID์ Key name์ ์ฌ์ฉ ํ ์ ์์ต๋๋ค. ์ ๊ทํ ์์ง์์๋ ๋ชจ๋ Field๋ฅผ ๊ณ ์ ID๋ก ์ฒ๋ฆฌ ํฉ๋๋ค. ํ๋์ Key name์ key - value ์ ์ฅ ๋ฐฉ์( json )์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ง์ ๋ฉ๋๋ค.
Adenium์ ์ ๊ทํ ์ด๋ฒคํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Field ID + TAB + Value๋ก ์ ์ฅ ๋ฉ๋๋ค. ๋ง์ฝ Json ๊ณผ ๊ฐ์ Key - value ํํ๋ก ์ ์ฅ ํ๊ฑฐ๋, ์ ์ก์ด ํ์ํ ๊ฒฝ์ฐ Field ID์ ๋งคํ๋๋ Key name ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ์ ์ฅ ํ ์ ์์ต๋๋ค.
๊ตฌ๋ถ | ๋ด์ฉ |
---|---|
์์ฝํ๋ | ํด๋น ํ๋๊ฐ ์ด๋ค ์๋ฏธ์ธ์ง ๋ฏธ๋ฆฌ ์์ฝ๋์ด ์๋ ํ๋ |
์ฌ์ฉ์ ์ ์ํ๋ (UDF) | ์ฌ์ฉ์๊ฐ ์ค์ ์ผ๋ก ์ ์ํ ํ๋. ์ฌ์ฉ์์ ์ํ๋๋ฅผ ํน์ ์ด๋ฒคํธ์ ์ ๊ทํ ๊ณผ์ ์์ ์ถ์ถํ๋ ค๋ฉด, ํน์ Token์ด ์ด๋ค UDF-ID์ ํด๋นํ๋ ์ง๋ฅผ Arrange์ค์ ์ผ๋ก ์ง์ ํ๋ค. |
์๋ณธํ๋ | ์๋ณธ ์ด๋ฒคํธ์์ ์ถ์ถํ ๊ทธ๋๋ก ์ฌ์ฉ๋๋ ํ๋ |
ํ์ํ๋ | ์๋ณธ ์ด๋ฒคํธ์์ ์ถ์ถํ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ์์ฑํ๋ ํ๋ ex) IP๋ฅผ ์ด์ฉํ ๊ตญ๊ฐ๋ช ํ๋ |
์นํํ๋ | ํน์ ํ ์กฐ๊ฑด์ ํด๋นํ ๊ฒฝ์ฐ, ์ง์ ํ ๊ฐ์ผ๋ก ์นํํ๋ ์นํ ํ๋ |
Adneium ํ๋๋ ๋ค์๊ณผ ๊ฐ์ 4๊ฐ์ง Format์ผ๋ก ๊ตฌ๋ถ๋๋ค.
Type | format |
---|---|
Type String | String format |
TypeNumeric | Numeric format |
TypeDateString | Date String format |
TypeDateMills | Date Mills(Long Integer) format |
ID | Key name | ๋ด์ฉ | ๊ตฌ๋ถ |
---|---|---|---|
1 | CATEGORY1 | ๋ ๋ถ๋ฅ | ํ์ |
2 | CATEGORY2 | ์ค ๋ถ๋ฅ | ํ์ |
3 | CATEGORY3 | ์ ๋ถ๋ฅ | ํ์ |
4 | SIGNATURE | Sensor ๋ณ ์ ์๋ ์ด๋ฒคํธ Signature | ํ์ |
5 | SEVERITY | ์ฌ๊ฐ๋ | ์๋ณธ |
6 | COUNT | ๊ณต๊ฒฉ ์นด์ดํธ | ์๋ณธ |
7 | REPEATCOUNT | ๊ณต๊ฒฉ ๋ฐ๋ณต ์นด์ดํธ | ์๋ณธ |
8 | SRCIP | ๊ณต๊ฒฉ์ง IP Address | ์๋ณธ |
9 | SRCPORT | ๊ณต๊ฒฉ์ง PORT | ์๋ณธ |
10 | SRCMAC | ๊ณต๊ฒฉ์ง MAC Address | ์๋ณธ |
11 | SRCCOUNTRY | ๊ณต๊ฒฉ์ง ๊ตญ๊ฐ์ฝ๋ | ํ์ |
12 | DESTIP | ๋ชฉ์ ์ง IP | ์๋ณธ |
13 | DESTPORT | ๋ชฉ์ ์ง PORT | ์๋ณธ |
14 | DESTMAC | ๋ชฉ์ ์ง MAC Address | ์๋ณธ |
15 | DESTCOUNTRY | ๋ชฉ์ ์ง ๊ตญ๊ฐ์ฝ๋ | ํ์ |
16 | SRCDIRECTION | ๊ณต๊ฒฉ์ง ํ์ง ๋ฐฉํฅ | ํ์ |
17 | DESTDIRECTION | ๋ชฉ์ ์ง ํ์ง ๋ฐฉํฅ | ํ์ |
18 | URL | URL | ์๋ณธ |
19 | URI | URI | ์๋ณธ |
20 | URIPARAMS | URI Parameter | ์๋ณธ |
21 | HEADER | HTTP Header | ์๋ณธ |
22 | PROTOCOL | ํ๋กํ ์ฝ | ์๋ณธ |
23 | PAYLOAD | Payload | ์๋ณธ |
24 | CODE | Sensor ์ ์ํ ์ฝ๋ | ์๋ณธ |
25 | RCVDBYTES | ์์ Bytes ์นด์ดํธ | ์๋ณธ |
26 | SENTBYTES | ์ ์ก Bytes ์นด์ดํธ | ์๋ณธ |
27 | MESSAGEID | ๋ฉ์์ง ID | ์๋ณธ |
28 | SRCZONE | SRC Zone | ์๋ณธ |
29 | DESTZONE | DEST Zone | ์๋ณธ |
30 | SERVICE | Service | ์๋ณธ |
31 | DURATION | Duration | ์๋ณธ |
32 | ACLNM | ACL Name | ์๋ณธ |
33 | ACTION | Allow/Deny, IPS Action | ํ์ |
34 | RAWDATA | Raw Data | ์๋ณธ |
35 | SENDER | ๋ฐ์ ์ | ์๋ณธ |
36 | ATTACHMENT | ์ฒจ๋ถ ํ์ผ๋ช | ์๋ณธ |
37 | START ATTACK TIME | ๊ณต๊ฒฉ ์์ ์๊ฐ | ์๋ณธ |
38 | END ATTACK TIME | ๊ณต๊ฒฉ ์ข ๋ฃ ์๊ฐ | ์๋ณธ |
39 | LOGTIME | ๋ก๊ทธ ์์ง ์๊ฐ | ์๋ณธ |
40 | SYSLOGTIME | Syslog ๋ฐ์ ์๊ฐ | ์๋ณธ |
41 | SYSLOGHOST | System์ด ๋ฐ์์ํจ Syslog Host | ์๋ณธ |
42 | AGENTID | Agent ID | ํ์ |
43 | AGENTIP | Agent IP | ํ์ |
44 | COMPANYID | ์์ ์(๊ณ ๊ฐ์ฌ) ID | ํ์ |
45 | COMPANYNM | ์์ ์ ๋ช | ํ์ |
46 | COMPANYGROUPID | ์์ ์ ๊ทธ๋ฃน ID | ํ์ |
47 | DEVICETYPE | Sensor Type | ํ์ |
48 | DEVICEMODEL | Sensor Model ๋ช | ํ์ |
49 | VENDOR | Sensor Vendor name | ํ์ |
Adenium Normalizer ๋ Adenium framework๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ ์ด๋ฒคํธ ์ ๊ทํ Engine ์ด๋ฉฐ Framework + Parser๋ก ๊ตฌ์ฑ ๋ฉ๋๋ค.
Adenium Normalizer๋ Adenium framework์ ๊ตฌ์ฑ์ ๋ฐ๋ผ ๊ธฐ๋ณธ ์ ์ถ๋ ฅ ์์ค๋ก Kafka Queue๋ฅผ ์ฌ์ฉ ํ๋ฉฐ ์ ๊ทํ๋ฅผ ์ํ ๊ธฐ์ค ์ ๋ณด๋ Zookeeper๋ก ๋ถํฐ ๋ก๋ ๋ฉ๋๋ค. ์ ๊ทํ๊ฐ ์คํจ ํ ๋ก๊ทธ๋ ๋ณ๋์ Kafka Topic์ ์ ์ฅํ์ฌ ๊ด๋ฆฌ ํ ์ ์์ต๋๋ค.
Parser๋ Regular expression ๊ธฐ๋ฐ์ผ๋ก ๋ฒ์ฉ์ ์ธ Tokenize method ๋ฅผ ์ง์ํ๋ฉฐ Adenium framework์ Field ์ ์๋ฅผ ๋ฐ๋ฆ ๋๋ค. Parser๋ ๋ ๋ฆฝ ์คํ ๊ตฌ์กฐ๋ก ์ค๊ณ๋์ด ๋ ๋ฆฝ ์คํ ์ดํ๋ฆฌ์ผ์ด์ ๋๋ ํน์ Framework์ ํ ๋ถ๋ถ์ผ๋ก ๋์ ํ ์ ์์ต๋๋ค.
-
Syslog format ํํ์ Event ๋ฅผ ์ ๋ ฅ ๋ฐ์ Regular expression์ผ๋ก Tokenize ํ ์ ๊ทํ ํ๋ค.
-
Parser๋ Tokenize์ ํ์ํ Regular expression๊ณผ ์ ๊ทํ ์์ ์ ํ์ํ ์ฐธ์กฐ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋ค.
-
Parser์ Default ์ /์ถ๋ ฅ ์์ค๋ Std In/Out์ด๋ฉฐ ์ฌ์ฉ ํ๊ฒฝ์ ๋ง๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค. ( ex : data base, file, stream, kafka ..)
-
Parser๋ JVM 8.0 ์ด์์ด ์ค์น๋ ๋ชจ๋ ํ๊ฒฝ์์ ๋์ ํ๋ฉฐ, ๋ ๋ฆฝ๋ ํ๋ก์ธ์ค ๋๋ Spark์ ๊ฐ์ ๋ถ์ฐ์ฒ๋ฆฌ ํ๋ ์์ํฌ ์์์ ๋์ ๊ฐ๋ฅํ๋ค.
-
Parser์ ์คํ ๊ณผ์
์ ๊ทํ ๋์ Event๋ Syslog format์ body ํํ๋ก ์ ๋ฌ๋๋ค. ์ ์ก ํ๋กํ ์ฝ์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌ ์ค๊ณ ๋์ด ์์ด ํ์ ์ ๋ณ๋์ ํ๋กํ ์ฝ ์ฒ๋ฆฌ Layer์ ์ถ๊ฐ ํ์ฌ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
๊ตฌ๋ถ | ๋ด์ฉ | |
---|---|---|
Header | Priority | ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ Facility์ ์ฐ์ ์์ ์ ๋ณด |
DateTime | ์ด๋ฒคํธ ๋ฐ์์๊ฐ | |
Hostname | ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ System์ Host ์ ๋ณด | |
Body | ์ด๋ฒคํธ ๋ด์ฉ ( ์ ๊ทํ ๋์ ) |
์ฐธ์กฐ ๋ฐ์ดํฐ๋ ์ ๊ทํ ์์ ์ ์ํ ์ ๊ท์ ๊ณผ ๋ถ๊ฐ ์ ๋ณด์ด๋ฉฐ Sensor ๋ณ ์ ์ฉ ํ ์ฐธ์กฐ ๋ฐ์ดํฐ๋ Host name ์ ๊ธฐ์ค์ผ๋ก ํ๋ณํ๋ฉฐ ๊ฐ ํญ๋ชฉ์ TAB์ผ๋ก ๊ตฌ๋ถํ๋ค. ๊ธฐ๋ณธ ๊ตฌ๋ถ๋ฌธ์๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
Agent๋ ํน์ ํ "Sensor + ์์ ์ ์ ๋ณด"๋ฅผ ํฌํจํ ๊ฐ๋ ์ด๋ค. ์ฆ, ๊ฐ์ ์ฅ๋น(Sensor)๋ผ๊ณ ํ๋๋ผ๋ ๋ค๋ฅธ ์์ ์๊ฐ ์์ ํ ๊ฒฝ์ฐ ๋ค๋ฅธ Agent๋ก ๋ณธ๋ค.
๊ตฌ๋ถ | Type | ๋ด์ฉ |
---|---|---|
agentIp | String | ip ๋๋ Host name [syslog header : host] |
agentId | Long | Agent๋ฅผ ์๋ณํ๋ ๊ณ ์ ID |
companyId | Long | Agent Owner์ ID |
companyName | String | Owner ๋ช |
companyGroupId | Long | Owner ๊ทธ๋ฃน ID |
sensorId | Long | Agent์ ๋ฑ๋ก๋ Sensor model ID |
sensor | String | Sensor model ๋ช |
sensorType | String | Sensor model Type [ FW, WAF, DDOS, IPS, IDS ... ] |
vendorId | Long | Sensor ์ ์กฐ์ฌ ID |
vendorName | String | ์ ์กฐ์ฌ ๋ช |
active | Boolean | Agent ์ฌ์ฉ ์ ๋ฌด |
Data sample
192.168.0.1 1234 2425 SUNLEAF 77 68257 WebFront1 WF 26 PIOLINK Y
Sensor ๋ณ Syslog body ๋ฅผ Tokenization ํ๊ธฐ ์ํ Regular expression
๊ตฌ๋ถ | Type | ๋ด์ฉ |
---|---|---|
id | Int | Rule์ ์๋ณํ๊ธฐ ์ํ ID |
sensorId | Long | ์ฐ๊ฒฐ๋ Sensor ID |
sensorType | String | ์ฐ๊ฒฐ๋ Sensor Type |
regEx | Regex |
Data sample
100 68257 WF src\_ip=\"(.+?)\".+src\_port=\"(.+?)\".+dest\_ip=\"(.+?)\"
Tokenization ๊ฒฐ๊ณผ์ Normalization Field๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํ ๊ท์น
๊ตฌ๋ถ | Type | ๋ด์ฉ |
---|---|---|
tokenizeRuleId | Int | Tokenize Rule ID |
captureOrder | Int | Regex match group sequence |
fieldId | Int | ์ ๊ทํ Field ID |
Data sample
100 1 8
Agent๊ฐ ์ค์น๋ ์์ ์ IP์ ๋ณด, ์ ๊ทํ ๋ ๊ฒฐ๊ณผ์ Agent๋ฅผ ์ต์ข ํ์ ํ๊ธฐ ์ํ ์ ๋ณด๋ก ํ์ฉ ๋๋ค.
๊ตฌ๋ถ | Type | ๋ด์ฉ |
---|---|---|
companyId | Long | Agent ์์ ์ฃผ์ ID |
publicIp | String | Agent์์ ์ฃผ ์ ๊ณต์ธ IP |
privateIp | String | Agent ์์ ์ฃผ ์ ์ฌ์ค IP |
Data sample
2425 192.168.0.1 -
Company ip ์ ๋ณด์ ํจ๊ป Agent๋ฅผ ์ต์ข ํ์ ํ๊ธฐ ์ํ ๋ณด์กฐ ์ ๋ณด๋ก ํ์ฉ ๋๋ค.
๊ตฌ๋ถ | Type | ๋ด์ฉ |
---|---|---|
companyId | Long | Agent ์์ ์ฃผ์ ID |
sip | String | ๋์ญ์ ์์ Ip |
eip | String | ๋์ญ์ ์ข ๋ฃ Ip |
Data sample
2425 192.168.0.1 192.168.1.254
์ ๊ทํ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ์ฑํ๋ ํ๋ ์ ์
๊ตฌ๋ถ | Type | ๋ด์ฉ |
---|---|---|
id | Int | Field id |
fieldName | String | Feild name |
Data sample
4 Signature
์ ๊ทํ ํ ๊ฒฐ๊ณผ ๋ด์ฉ์ ๋ณ๊ฒฝ์ด ํ์ํ Field๋ฅผ ์ ์
๊ตฌ๋ถ | Type | ๋ด์ฉ |
---|---|---|
fieldId | String | ๋ณ๊ฒฝ ๋์Field Id |
Int | outstr | ๋ณ๊ฒฝ ๋์ ๋ฌธ์์ด |
instr | String | ๋ณ๊ฒฝ ํ ๋ฌธ์์ด |
vendor | Long | ๋ณ๊ฒฝ ๋์ ์กฐ๊ฑด์ด ๋๋ Vendor id |
Data sample
4 110600275 ์์คํ
ํด๋ ์ ๊ทผ ์ทจ์ฝ์ 26
Vendor ๋ณ Sensor Signature ์ ๋ฒ์ฃผ ์ ์
๊ตฌ๋ถ | Type | ๋ด์ฉ |
---|---|---|
vendorId | Long | Vendor id |
signature | String | Signature |
category1 | String | ๊ตฌ๋ถ 1 |
category2 | String | ๊ตฌ๋ถ 2 |
category3 | String | ๊ตฌ๋ถ 3 |
category4 | String | ๊ตฌ๋ถ 4 |
Data sample
26 ์์คํ
์ ๊ทผ ์ทจ์ฝ์ Security Exploit Overflow\_Buffers Web\_Application\_Vulnerability
๊ตญ๊ฐ๋ณ IP ๋ฒ์
๊ตฌ๋ถ | Type | ๋ด์ฉ |
---|---|---|
nationCdoe | String | ๊ตญ๊ฐ ์ฝ๋ |
startIp_dec | Long | Decimal format start Ip |
endIp_dec | Long | Decimal format end Ip |
Data sample
AU 16777216 16777471
Event ์ ํ์ฑ ๊ณผ ์ ๊ทํ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
์ด๋ฒคํธ ๋ด์ฉ์ ์ ๊ทํ ํ๊ธฐ ์ํด, ์ด๋ค ๊ท์น์ ์ ์ฉํ ๊ฒ์ธ์ง ํ๋ณ์ด ํ์ํ๋ค. ์ ์ฉํ ๊ท์น ํ๋ณ์ ์ํด host name ํ๋์ ๊ฐ์ ์ ์กํ๋กํ ์ฝ( Syslog) ํค๋์์ ์ถ์ถํ๋ค.
host name์ ์ฐธ์กฐ ์ ๋ณด [Agent] ์ agentIp ํ๋์ ๋์ ๋๋ฉฐ Event ์ ์ ์ฉํ ์ ๊ทํ ๊ท์น์ ์ ํํ๋ ๊ธฐ์ค์ด ๋๋ค. ํ๋ณด Agent๋ก ํํํ ์ด์ ๋ ํ๋์ Hostname์ ๊ณต์ ํ๋ ๋ณต์์ Agent๊ฐ ์กด์ฌ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- Multiple-Regular Expression ๊ณผ Tokenize
ํ๋ณด Agent ์ SensorId์ ํด๋น ํ๋ ๋ชจ๋ ์ ๊ท์์ Tokeniz Rules ์์ ์ ํํ์ฌ ์ ์ฉ ํ๋ค. ๋์ผํ Sensor์์ ๋ฐ์ํ Event๋ค ์ด๋ผ๊ณ ํ๋๋ผ๋, ๊ฐ๊ธฐ ๋ค๋ฅธ Regular expression์ผ๋ก Tokenize ๋ ์ ์๊ณ , host name์ ๊ณต์ ํ๋ ๊ฒฝ์ฐ ๋ณต์์ ํ๋ณด Agent์ ์ฐ๊ฒฐ๋ sensor์ ์ข ๋ฅ๊ฐ ๋ค๋ฅผ ์ ์์ด Multiple-Regular Expression ์ ์ง์ํ๋ค.
Multiple-Regular Expression ์ ํ ๋ฐ ์ฃผ์ ๊ฐ์ ์ฅ๋น์์ ๋ฐ์ํ Event๋ผ๊ณ ํ๋๋ผ๋, sensor version, sensor ์ค์ ๊ฐ์ ์ํด ์ ์ก๋๋ Event Format์ด ๋ค๋ฅผ ์ ์์ผ๋ฉฐ, host name ์ ๊ณต์ ํ๋ ๊ฒฝ์ฐ (๊ณต์ ์ฅ๋น, ๊ณต์ ์กด) ๋ฑ๋ก๋ Sensor์ ์ข ๋ฅ๊ฐ ๋ณต์๊ฐ ๋ ์ ์๋ค. ๋ฐ๋ผ์ Parser๋ ์ ํ๋ ์ ๊ท์์ ์์ฐจ์ ์ผ๋ก ์ ์ฉํด ๋ณด๊ณ , ๊ทธ์ค ๋จผ์ ์ฑ๊ณตํ ๊ท์น์ผ๋ก Tokenize๊ฐ ๋๋ค๊ณ ๋ณธ๋ค. ๋๋ฌธ์ ์์ฐจ ์ ์ฉ๋๋ ์ ๊ทํํ์์ด ํน์ ํ ์ด๋ฒคํธ์ ๋ํด ๋ชจ๋ ์ฑ๊ณต์ ์ผ๋ก Tokenize๋์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค. ํนํ, .* ์ ๊ฐ์ด ๋ชจ๋ ์ด๋ฒคํธ์ ์ฑ๊ณต๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ท์น์ ์ ์ฉ ์์์ ๋ฐ๋ผ side-effect๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๋ค.
-
Arrange Result
Tokenize๊ฐ ์ฑ๊ณตํ ๊ฒฝ์ฐ, Tokenize ๋ ๊ฒฐ๊ณผ๋ฅผ [Arrange] ๊ท์น์ ์ด์ฉํ์ฌ ์ด๋ค Token์ด ์ด๋ค ํ๋์ ํด๋นํ๋ ์ง List of Tuple ( field ID => String) ํํ์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ค.
๊ณต์ ์ฅ๋น, ๊ณต์ ์กด ์ ๋ณต์์ Sensor๊ฐ ํ๋์ ์ฅ๋น๋ฅผ ๊ณต์ ํ์ฌ ๋ก๊ทธ๋ฅผ ์ ์ก ํ๋ ๊ฒฝ์ฐ, ๋ฑ๋ก๋ 1๊ฐ์ Agent๋ก ๋ณต์์ Sensor ์ด๋ฒคํธ๊ฐ ์ ์ ๋๋ค. ๋ณต์์ Sensor๋ ๊ฐ๊ฐ์ ์์ ์ฃผ๊ฐ ๋ค๋ฅผ ์ ์์ด Event์ ์ ์์ ์ฃผ๋ฅผ ํ๋ณ ํ์ฌ์ผ ํ๋ค.
- Company Ip ๋น๊ต
์ ๊ทํ ์ดํ agent ip ํ๋๋ฅผ ๋ฑ๋ก๋ Company IP์ ๋น๊ตํ์ฌ ๋งค์นญ๋ ํด๋น Company๋ก ๊ฒฐ์ ํ๋ค.
-
Company Ip Range๋ก ๋น๊ต
1์ ๊ณผ์ ์์ Company IP๋ก ํ๋ณํ์ง ๋ชป ํ์์ ๊ฒฝ์ฐ ์ ๊ทํ ํ๋์ SrcIP, DestIP ํ๋๋ฅผ Compant Ip Range์ ๋น๊ตํ์ฌ ๋งค์นญ๋ Company๋ก ๊ฒฐ์ ํ๋ค.
-
Company๋ฅผ ๊ฒฐ์ ํ์ง ๋ชป ํ์์ ๊ฒฝ์ฐ
์๋ฅผ ๋ค์ด Company IP ํ ์ด๋ธ์ ๊ด๋ฆฌ ์ด์๋ก, IP Range๊ฐ ๊ฒน์น ๊ฒฝ์ฐ, ๋๋ ๋์ผํ Sensor ์ ๋ณด๋ฅผ ๊ฐ์ง ๋ณต์์ Agent๊ฐ ๋ฐ๊ฒฌ ๋์์ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ์ต๊ทผ์ ๋ฑ๋ก๋ Agent๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฅ๋น์ ์์ ์ฃผ๋ฅผ ๊ฒฐ์ ํ๋ค.
ํ์ฑ ๊ณผ์ ์ด ์๋ฃ๋๋ฉด Tokenize ๊ฒฐ๊ณผ๋ก ์ ๊ทํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ค. ์ ๊ทํ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ์ฑํ๋ ํ๋๋ ์ ๊ทํ Library๊ฐ ์ด๋ค ์๋ฏธ์ ํ๋์ธ์ง๋ฅผ ์๊ณ ์๋ ์ง ์ฌ๋ถ์ ๋ฐ๋ผ โ์์ฝํ๋โ์ โ์ฌ์ฉ์ ์ ์ ํ๋โ๋ก ๊ตฌ๋ถ๋๋ฉฐ, ์ด๋ฒคํธ์์ ์ถ์ถ๋ ํ๋**(์๋ณธํ๋)์ ์ด๋ฒคํธ์์ ์ถ์ถํ ์ ๋ณด๋ฅผ ์ฐธ์กฐ๋ก ์์ฑํ ์ ๋ณดํ๋(ํ์ํ๋)**, ์๋ณธ ๋๋ ํ์ํ๋๊ฐ ํน์ ํ ์กฐ๊ฑด์ ํด๋นํ ๊ฒฝ์ฐ, ์นํํ๋ **(์นํํ๋)**๋ก ๊ตฌ๋ถ๋๋ค.
-
ํ๋์ ๊ตฌ๋ถ
Field ์ผ๋ฐ ์ฐธ์กฐ
-
ํ๋์ ์นํ
์ ๊ทํ ๋ ํ๋๊ฐ ์นํ ํ๋ ์ ๋ณด์ ์ ์๋ ํน์ ์กฐ๊ฑด (ํ๋ ID, ํน์ Vendor )์ ๋ง์กฑ ํ ๊ฒฝ์ฐ Tokenize ๋ ๋ฌธ์์ด์ ์ง์ ๋ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๋ค ( instr => outstr )
-
์ ๊ทํ ๊ฒฐ๊ณผ ์์ฑ
์นํ ๊ณผ์ ์ด ์๋ฃ๋ ์ ์ฒด ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ทํ ๊ฒฐ๊ณผ๋ก ์์ฑํ๋ค
-
์ฌ์ ์ ์๋ ํ๋
Field ์ผ๋ฐ ์ฐธ์กฐ
Regular Expression ๊ธฐ๋ฐ ์ ๊ทํ ๋ชจ๋์ ์ค์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฏ๋ก, ์ค์ ๊ฐ์ ๋ณ๊ฒฝ์ ๋ฐ๋ผ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ ๊ทํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ๋๋ค. Library ์ฌ์ฉํ๊ฒฝ์์ ์ํ๋ (๋๋ ๊ธฐ๋ํ์ง ์์) ์ ๊ทํ ๊ฒฐ๊ณผ๊ฐ ์ด๋ค ๊ณผ์ ์ ํตํด ๋์ค๊ฒ ๋ ๊ฒ์ธ์ง ๋จ๊ณ๋ณ๋ก ์ถ์ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ ๊ทํ Library๋ ์ ๊ทํ ๊ณผ์ ์ ๊ธฐ๋ก์ ์์ฐจ์ ์ผ๋ก ๊ธฐ๋กํ ๋ก๊ทธ๋ฅผ ์ค์ ์ ๋ฐ๋ผ on/off ํ ์ ์๋ค. Logging Option์ enableํ ๊ฒฝ์ฐ, ์ ๊ทํ ๊ณผ์ ์ ๊ธฐ๋ก์ ์์ฐจ์ ์ผ๋ก ํฌํจํ๋ List of String์ ์ ๊ทํ์ ๊ฒฐ๊ณผ์ ํจ๊ป ๋ฐํํ๋ค.
Normalizer๋ Spark standalone ๋ชจ๋๋ก ๋์ํ๋ฉฐ Spark submit ๋ช ๋ น์ ํตํด ์คํ ๊ฐ๋ฅ ํฉ๋๋ค.
spark-submit --master [SPARK_MASTER_NODE] --deploy-mode client --supervise --class com.adenium.app.logNormalizer.LogNormalizer \
--driver-java-options "-Dlog4j.configuration=file:log4j.properties -Ddm.logging.name=Normalizer -Ddm.logging.path=logs" \
--jars [DEPENDENCY_LIB_PATH] \
--conf "spark.streaming.blockInterval=100ms" \
--conf "spark.locality.wait=100ms" \
--conf "spark.executor.logs.rolling.strategy=size" \
--conf "spark.executor.logs.rolling.maxSize=100000" \
--conf "spark.executor.logs.rolling.maxRetainedFiles=5" \
--conf "spark.streaming.backpressure.enabled=true" \
--conf "spark.streaming.kafka.maxRatePerPartition=4305" \
--conf "spark.executor.heartbeatInterval=20" \
--total-executor-cores [TOTAL_EXECUTOR_CORES] --executor-memory [EXECUTOR_MEMORY] \
--driver-memory [DRIVER_MEMORY] --name Normalizer [ADENIUM_NORMALIZER_PATH] \
-sp:master [SPARK_MASTER_NODE] \
-sp:app Normalizer \
-zk:conn [ZK_CONN] \
-sp:duration [SP_DURATION] \
-kf:broker [KAFKA_BROKERS] \
-kf:topic [IN_TOPIC] \
-kf:out_topic [OUT_TOPIC] \
-kf:err_topic [ERR_TOPIC] \
-kf:ctrl [CTRL_TOPIC] \
-kf:save \
-kf:restore
-
Spark submit ์ต์ : stand alone ๋ชจ๋๋ก ๋์ํ๋ ๊ธฐ๋ณธ submit ์ต์ ์ ๋ฐ๋ฆ ๋๋ค.
์ต์ ์ค๋ช --master [SPARK_MASTER_NODE] Spark master node Host --jars [DEPENDENCY_LIB_PATH] Dependenct libs path --total-executor-cores [TOTAL_EXECUTOR_CORES] executor์ ํ ๋น ํ ์ฝ์ด ์ --executor-memory [EXECUTOR_MEMORY] executor์ ํ ๋น ํ ๋ฉ๋ชจ๋ฆฌ --driver-memory [DRIVER_MEMORY] driver์ ํ ๋น ํ ๋ฉ๋ชจ๋ฆฌ --name Normalizer [ADENIUM_NORMALIZER_PATH] Adenium Normalizer bin path -
Adnium Normalizer ์ต์
์ต์ ์ค๋ช format -sp:master [SPARK_MASTER_NODE] Spark master node Host spark://localhost:7077 -sp:app Normalizer Application name Normalizer -zk:conn [ZK_CONN] Zookeeper Host spark://localhost:7077 -sp:duration [SP_DURATION] micro-batch duration ( Sec ) 4 -kf:broker [KAFKA_BROKERS] kafka broker list localhost:9092, host1:9092 -kf:topic [IN_TOPIC] ์๋ณธ ๋ก๊ทธ ์ ์ ํ ํฝ rawlog_Topic -kf:out_topic [OUT_TOPIC] ์ ๊ทํ ๋ก๊ทธ ์ ์ฅ ํ ํฝ normalized_Topic -kf:err_topic [ERR_TOPIC] ์คํจ ๋ก๊ทธ ์ ์ฅ ํ ํฝ fail_topic -kf:ctrl [CTRL_TOPIC] ์ ์ด๋ช ๋ น ์์ ํ ํฝ ctrl_topic -kf:save ์ต์ข ์คํ์ ์ ์ฅ ์ฌ๋ถ ๊ฐ ์์ด ์ ์ธ๋ง -kf:restore ๋ณต๊ตฌ ๋ชจ๋ ๊ฐ ์์ด ์ ์ธ๋ง
Adenium Normalizer๋ parser logging ์ต์ ์ ํ์ฑํ ํ์ฌ ์ด๋ฒคํธ๊ฐ ์ ๊ทํ ๋๋ ๊ณผ์ ์ ํ์ธ ํ ์ ์์ต๋๋ค. logging ์ต์ ์ Run time์ command ๋ฉ์ธ์ง๋ฅผ ํตํด ์ ๋ฌ ํ ์ ์์ต๋๋ค.
-
์ต์ ์ ๋ฌ๋ฐฉ๋ฒ
State ์ ๋ณด (์ค์ , ์ด์์ ๋ณด)์ ๊ธฐ์ ๋ znode path ์ค parser_log ๋ ธ๋์ ๋ค์ command๋ฅผ ์ ๋ ฅ ํฉ๋๋ค.
-logon
-
Framework์ ๋ค๋ฅธ ์ ์ด ๋ช ๋ น๊ณผ ๋ฌ๋ฆฌ -logon ๋ช ๋ น์ Engine์ด ์์ ์ ๊ฐ์ ์ญ์ ํ์ง ์์ต๋๋ค.
-
๋ก๊ทธ์ ํ์ธ์ Spark executor ์ work ๋ก๊ทธ๋ฅผ ํตํด ํ์ธ ํ ์ ์์ต๋๋ค. log ์ค๋ช ์ "Logging์ ํตํ ์ ๊ทํ ๊ณผ์ ํ์ธ" ๋ถ๋ถ์ ์ฐธ๊ณ ํ์ญ์์ค
๋์ํ๊ฒฝ
Java SE Runtime Environment 8
Build script
pom.xml
Maven ๋น๋
- Normalizer Framework
mvn -clean package -P Normalizer // with out dependencies.
mvn -clean install -P Normalizer // with dependencies.
- Parser Tester
mvn -clean package -P Parser // with out dependencies.
mvn -clean install -P Parser // with dependencies.
Library dependencies
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<!-- Apach Spark -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka_2.11</artifactId>
<version>1.6.3</version>
</dependency>
<!-- Apach Kafka -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>0.8.2.1</version>
</dependency>
<!-- Apach Curator -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>2.5.0</version>
</dependency>
<!-- Apach Zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5</version>
<type>pom</type>
</dependency>
<!-- Log4J -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
์ ๊ทํ ๊ณผ์ ์ ํ ์คํธ ํ ์ ์๋ ๋ณ๋์ Tool์ ์ ๊ณตํ๋ค. Test tool์ console ํ๊ฒฝ์์ ๋์ ๊ฐ๋ฅํ Utility์ด๋ฉฐ ๋จ๋ ์คํ ๊ฐ๋ฅํ Jar ํจํค์ง๋ก ์ ๊ณต๋๋ค. ์ ๊ทํ ๊ณผ์ ์ ํ์ํ ์ฐธ์กฐ ๋ฐ์ดํฐ๋ ํ์ผ๋ก ์ ๊ณต๋๋ฉฐ, ๋ก๊ทธ๋ Std-In์ผ๋ก ์ ๋ ฅ ๋ฐ์ผ๋ฉฐ ์ ๊ทํ ๊ฒฐ๊ณผ๋ Std-Out์ผ๋ก ์ถ๋ ฅ ๋๋ค.
Test tool์ ๋์ ๊ณผ์
๊ฐ๊ฐ์ ์ฐธ์กฐ ์ ๋ณด ํ์ผ์ Tab์ผ๋ก ๊ตฌ๋ถ๋ text ํ์ผ์ด๋ฉฐ 1 ํ์ ํญ๋ชฉ์ Header ์ด๋ค. ํ์ผ์ ์ธ์ฝ๋ฉ ์ UTF-8 ํ์ ์ด๋ค. ์ํ๋ก๊ทธ๋ ํ๋์ ๋ผ์ธ์ด ํ๋์ ๋ก๊ทธ์ด๋ฉฐ ํ์ผ์ ์ธ์ฝ๋ฉ ์ UTF-8 ํ์ ์ด๋ค.
Samples : ํ ์คํธ์ฉ ์ํ Event log
RefData : ์ ๊ทํ ์ฐธ์กฐ ๋ฐ์ดํฐ
- agentInfo.ref : Agent ์ ๋ณด
- arrangeRules.ref : Tokenize ๊ฒฐ๊ณผ๋ฅผ Normalization Field๋ก ๋ณ๊ฒฝํ๋ ๊ท์น
- companyIpRange.ref : ์์ ์ฃผ์ IP ๋ฒ์
- companyServerIp.ref : ์์ ์ฃผ์ IP ์ ๋ณด
- fields.ref : ์ ๊ทํ ํ๋
- geoIpRange.ref : ๊ตญ๊ฐ IP Band
- replaceFields.ref : ๋ณ๊ฒฝ ํ๋
- signatures.ref : Sensor Signature
- tokenizeRules.ref : ์ ๊ท์
ํ ์คํธ ํ๋ก๊ทธ๋จ์ ์คํ ์ โ|โ (ํ์ดํ) ๋ฅผ ์ด์ฉํ์ฌ Event ๋ก๊ทธ๋ฅผ ์ ๋ฌํ๊ฑฐ๋, ํ๋ก๊ทธ๋จ ์คํ ํ Console์์ ์ง์ ์ ๋ ฅ์ด ๊ฐ๋ฅํ๋ค.
-path [ File path ] : ์ง์ ํ ๊ฒฝ๋ก์์ ์ฐธ์กฐ ์ ๋ณด๋ฅผ ๋ก๋ ํ๋ค. Default : ../resources
-logon : ๋ณ๋์ ์ต์ ๊ฐ ์์ด ์ต์ ๋ง ์ ์ธํ์ฌ ๋ก๊ทธ ๊ธฐ๋ฅ์ ํ์ฑํ ํ๋ค. โlogon ์ต์ ์ ์ ๋ ฅํ์ง ์์ผ๋ฉด ๋ก๊ทธ๋ ์ถ๋ ฅํ์ง ์๋๋ค.
-
Run
์คํ ํ Event ๋ก๊ทธ๋ฅผ ์ ๋ ฅ ํ๊ฑฐ๋, ์คํ ์ "|"๋ฅผ ํตํด Event ๋ก๊ทธ๋ฅผ ์ ๋ฌ ํ ์ ์๋ค.
> java -jar AdeniumParser.jar -path Resource\RefData
> cat sample.log | java -jar AdeniumParser.jar -path Resource\RefData
-
๋ก๊ทธ ์ ๋ ฅ
Event ๋ก๊ทธ ์์ด ์คํ ํ์์ ๊ฒฝ์ฐ, Command์ ๋ก๊ทธ๋ฅผ ์ ๋ ฅํ๋ฉด ์ ๊ทํ๋ฅผ ์์ํ๋ค.
> java -jar AdeniumParser.jar -path Resource\RefData Ref Files From : Resource\RefData\ <44>Aug 7 17:49:53 192.169.0.1 (warning) kernel: [WEBFRONT/0x00726001] Violated SQL Injection - the form field isn't allowed. (log_id="2085090068",app_name="07_purunetedu",app_id="7",src_if="waf",src_ip="116.46.237.195",src_port="52453",dest_ip="211.169.244.10",dest_port="80",forwarded_for="",hos t="www.purunetedu.com",url="/mystudyroom/questionbank/classlistAjax.prn",sig_warning="Middle",url_param="",block="no",evidence_id="1910044145",owasp="A1",field="subjCd",sigid="110600275",data="0-0-0")
-
์ ๊ทํ
์ ๊ทํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ด adenium Header ์ดํ Tab ์ผ๋ก ๊ตฌ๋ถ๋ key, value ํํ๋ก ์ถ๋ ฅ ๋๋ค.
adenium 17 OUT 16 OUT 15 KR 11 KR 40 7 Aug 17:49:53 41 211.169.244.2 6 1 7 1 47 WF 48 WebFront K2400 49 PIOLINK 42 12346776 46 77 44 2425 45 SUNLEAF 4 ์์คํ ํด๋ ์ ๊ทผ ์ทจ์ฝ์ 8 116.46.237.195 18 www.purunetedu.com 12 211.169.244.10 13 80 9 52453 33 no
-
์ข ๋ฃ
Black line ์ ๋ ฅ ๋๋ q, quit, bye, exit ์ ๋ ฅ
-
Logging
-logon ์ต์ ์ ์ ์ํ๋ฉด ์ ๊ทํ ๊ณผ์ ์ ๋ก๊ทธ๋ฅผ ํ์ธ ํ ์ ์๋ค.
> java -jar AdeniumParser.jar -path Resource\RefData -logon
[ State ] ========== parser.execute : success ? true fields log[ Syslog: RFC3164 ] Header3164(44,Aug,7,17:49:53,211.169.244.2) [ SOCDeviceTypeHint ] 211.169.244.2 [ filterAgents ] host ( normal : 211.169.244.2 ) [ lookupDeviceRules ] ( type, name) = (1234568257,WF) [ tryTokenizeRules ] (WF,1234568257) in (WF,1234568257) [ findArrangeRule ] 100 [ arrangeResult ] : (1,8,Some(116.46.237.195)) [ arrangeResult ] : (2,9,Some(52453)) [ arrangeResult ] : (3,12,Some(211.169.244.10)) [ arrangeResult ] : (4,13,Some(80)) [ arrangeResult ] : (5,18,Some(www.purunetedu.com)) [ arrangeResult ] : (6,33,Some(no)) [ arrangeResult ] : (7,4,Some(110600275)) [ decideAgent ] agent = (2425,SUNLEAF,PIOLINK) + makeField: (Some(action),no) + makeField: (Some(srcPort),52453) + makeField: (Some(destPort),80) + makeField: (Some(destIp),211.169.244.10) + makeField: (Some(url),www.purunetedu.com) + makeField: (Some(srcIp),116.46.237.195) + makeField: (Some(signature),110600275) + makeField: (Some(companyNm),SUNLEAF) + makeField: (Some(companyId),2425) + makeField: (Some(companyGroupId),77) + makeField: (Some(AgentId),12346776) + makeField: (Some(vendor),PIOLINK) + makeField: (Some(deviceModel),WebFront K2400) + makeField: (Some(deviceType),WF) + makeField: (Some(RepeatCount),1) + makeField: (Some(count),1) + makeField: (Some(SyslogHost),211.169.244.2) + makeField: (Some(SyslogTime),7 Aug 17:49:53) makeField: Some(srcCountry) makeField: Some(destCountry) makeField: Some(srcDirection) makeField: Some(destDirection) + makeField: (Some(signature),์์คํ ํด๋ ์ ๊ทผ ์ทจ์ฝ์ ) added: (destDirection,Some(OUT)) added: (srcDirection,Some(OUT)) added: (destCountry,Some(KR)) added: (srcCountry,Some(KR)) added: (SyslogTime,Some(7 Aug 17:49:53)) added: (SyslogHost,Some(211.169.244.2)) added: (count,Some(1)) added: (RepeatCount,Some(1)) added: (deviceType,Some(WF)) added: (deviceModel,Some(WebFront K2400)) added: (vendor,Some(PIOLINK)) added: (AgentId,Some(12346776)) added: (companyGroupId,Some(77)) added: (companyId,Some(2425)) added: (companyNm,Some(SUNLEAF)) changed: (signature,Some(์์คํ ํด๋ ์ ๊ทผ ์ทจ์ฝ์ )) added: (signature,Some(110600275)) added: (srcIp,Some(116.46.237.195)) added: (url,Some(www.purunetedu.com)) added: (destIp,Some(211.169.244.10)) added: (destPort,Some(80)) added: (srcPort,Some(52453)) added: (action,Some(no)) ==========
Log Message
- [ State ] : ์ ๊ทํ ์ฑ๊ณต / ์คํจ
- [ SocDeviceTypeHint ] : Syslog header์ hostname
- [ filterAgents ] : hostname์ผ๋ก ๋ฑ๋ก๋ Agent์ ๊ฒ์ ๊ฒฐ๊ณผ
- [ lookcupDeviceRules ] : Tokenize์ ์ ์ฉ ํ ์ ๊ท์ ID ์ Sensor type
- [ tryTokenizeRules ] : Tokenize์ ์ ์ฉํ ์ ๊ท์
- [ findArrangeRules ] : Tokenize ๊ฒฐ๊ณผ๋ฅผ ์ ๊ทํ ํ๋๋ก Mapping ํ๋ ๊ท์น์ ID
- [arrangeResult ] : Mapping ๊ฒฐ๊ณผ < token order, ์ ๊ทํ ํ๋ id, value>
- [decideAgent ] : ์ต์ข ๊ฒฐ์ ๋ ์์ ์ฃผ์ Agent ์ ๋ณด
- + makeField : ๋ณ๊ฒฝ ํ๋๊ฐ ์ ์ฉ ๋๊ธฐ ์ ์์ฑ๋ ์ ๊ทํ ํ๋
- added : ๋ณ๊ฒฝ๋์ง ์์ ํ๋
- change : ๋ณ๊ฒฝ๋ ํ๋
- ์ด๋ฒคํธ(Event) : ์ผ๋ฐ์ ์ผ๋ก, ํน์ ์๊ฐ์ ๋ฐ์ํ ์ฌ๊ฑด ๋ด์ง ์ํ์ ๋ณํ๋ฅผ ์๋ฏธํ๋๋ฐ, ์ ์ ์ โ์๊ฐโ์ ๋ณด๋ฅผ ํ์์ ์ผ๋ก ํฌํจํ๋ ํน์ง์ด ์๋ค. ์ด๋ค ์ฌ๊ฑด์ ๊ธฐ๋ก์ ์๋ฏธํ๋ log (์๊ฐ ์ ๋ณด์ ํ์ฐ์ฑ์ ์ํ๋จ)์ ์ ์ฌํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉด, ๋ณธ ๋ฌธ์์์์ ์ด๋ฒคํธ(event)์ ๋ก๊ทธ(log)๋ ์๋ฏธ์ ํผ๋์ด ์์ ๊ฒฝ์ฐ ํผ์ฉํ์ฌ ์ฌ์ฉํ๋ค. ๋จ, ํ๋ก๊ทธ๋จ/๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์์ ๊ธฐ๋กํ๋ ๊ฒฝ์ฐ๋ log(๋ด์ง logging)๋ก ํํํ๋ ์ฃผ์ํ๊ธฐ ๋ฐ๋๋ค
- ํ์(Parser) : ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์์ด์ ์๋ฏธ์๋ ํ ํฐ(token)์ผ๋ก ๋ถํดํ๊ณ ์ด๋ค๋ก ์ด๋ฃจ์ด์ง ํ์ค ํธ๋ฆฌ(parse tree)๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ๋งํ๋ค.
- ์ ๊ทํ(Normalization ) : ์ด๋ค ๋์์ ์ผ์ ํ ๊ท์น์ด๋ ๊ธฐ์ค์ ๋ฐ๋ฅด๋ โ์ ๊ท์ ์ธโ ์ํ๋ก ๋ฐ๊พธ๊ฑฐ๋, ๋น์ ์์ ์ธ ๋์์ ์ ์์ ์ผ๋ก ๋๋๋ฆฌ๋ ๊ณผ์ ์ ๋งํ๋๋ฐ, ๋ณธ ๋ฌธ์์์ ์ ๊ทํ๋ Parsing ๊ณผ์ ๊ณผ Parse tree์ ํด์๊ณผ์ ์ ์๋ฏธํ๋๋ฐ, ์๋ฏธ์ ํผ๋์ด ์์ ๊ฒฝ์ฐ Parsing๊ณผ Normalization์ ํผ์ฉํ์ฌ ์ฌ์ฉํ๋๋ก ํ๋ค.
- Sensor : ์ด๋ฒคํธ๋ฅผ ๋ง๋ค์ด๋ธ S/W ๋๋ ์ฅ์น
- Agent : ์ผ๋ฐ์ ์ผ๋ก๋ ์ฌ์ฉ์์ ๊ฐ์ ์์ด ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ณด๋ฅผ ๋ชจ์ผ๊ฑฐ๋ ๋๋ ์ผ๋ถ ๋ค๋ฅธ ์๋น์ค๋ฅผ ์ํํ๋ ํ๋ก๊ทธ๋จ์ ์๋ฏธํ๋ ๋ฐ, ๋ณธ ๋ฌธ์์์ Agent๋ ์ผ๋ฐ์ ์ธ ์๋ฏธ์ ๋ค๋ฅด๊ฒ ์ฌ์ฉ๋๋ ์ฃผ์ํ๊ธฐ ๋ฐ๋๋ค. ๋ณธ ๋ฌธ์์์ Agent๋ โํน์ ํ Sensor + ์์ ์ ์ ๋ณดโ๋ฅผ ํฌํจํ ๊ฐ๋ ์ด๋ค. ์ฆ, ๊ฐ์ ์ฅ๋น(Sensor)๋ผ๊ณ ํ๋๋ผ๋ ๋ค๋ฅธ ์์ ์๊ฐ ์์ ํ ๊ฒฝ์ฐ ๋ค๋ฅธ Agent๋ก ๋ณธ๋ค.