2023. 10. 3. 03:13ใSystem ์์ ์ค/DevOps
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ Elastic Stack ๊ตฌ์ถ
๐ฝ ๊ฐ์
๐ฆ ์๊ฐ
์ด๋ฒ์๋ Linux Server๋ค์ ๋ํ ์์ ๋ชจ๋ํฐ๋ง์ ์ค์ํ๊ณ , ๋๋ถ์ด ๋ก๊ทธ ๋ถ์๋ ํ ์ ์๋ Elastic Stack(ELK)๋ฅผ ๊ตฌ์ถํด ๋ณด๋ ค๊ณ ํด์.
ELK๋ Elasticsearch, Logstash, Kibana๋ผ๋ ์คํ ์์ค ํ๋ก์ ํธ๋ค์ ํ๋๋ก ๋ญ์ณ ์๊ธ์๋ง ๋ด ๊ฒ์ด์์.
Elasticsearch๋ ๊ฒ์ ๋ถ์ ์์ง์ด๊ณ , Logstash๋ ์ฌ๋ฌ ์์ค์์ ๋์์ Data๋ฅผ ์์งํ์ฌ ๋ณํํ ๋ค Elasticsearch์ ๊ฐ์ stash๋ก ์ ์กํ๋ Server Side Data Pipeline์ด์์. Kibana๋ ์ฌ์ฉ์๊ฐ Elasticsearch์์ Chart์ Grahp๋ฅผ ์ด์ฉํ์ฌ Data๋ฅผ ์๊ฐํํ ์ ์๊ฒ ํด ์ฃผ๋ ๋๊ตฌ์์.
Elastic Stack์ Elatic Stack์ด ๋ฐ์ ํ ๋๊ตฌ์์.
์ต์ด ์ด ํ๋ก์ ํธ๋ Elasticsearch์์ ์ํฅ์ ๋ฐ์๋ค๊ณ ํด์.
JSON ๊ธฐ๋ฐ์ ๋ถ์ฐ ์คํ ์์ค RESTFul ๊ฒ์์์ง์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ํ์ฅ ๊ฐ๋ฅํ๊ณ , ์ ์ฐํ๋ฉฐ, ๊ฒ์ ๋ถ์ผ์์๋ ์ฌ์ฉ์์๊ฒ ๋ง์ ์ธ๊ธฐ๊ฐ ์๋ ๋๊ตฌ์ด์ฃ .
์ฌ๊ธฐ์ ๋๋ถ์ด Logstash์ Kibana๋ฅผ ๋ญ์ณ ํ๋์ ์๋น์ค๊ฐ ๋์๋๋ฐ, ์ฌ์ฉ์ ๋ก๊ทธ๋ฅผ ์ํด Elasticsearch๋ฅผ ์ฌ์ฉํ๊ณ , ์ด๊ฒ์ ์๊ฐํ ํ๊ณ ์ถ๋ค๋ ์๊ตฌ์์ ์์ํ์ด์.
๊ทธ๋์ ๊ฐ๋ ฅํ ์์ง ํ์ดํ๋ผ์ธ์ธ Logstash์ ์ ์ฐํ ์๊ฐํ ๋๊ตฌ Kibana๊ฐ ๋์
๋์๋ค๊ณ ํฉ๋๋ค.
๋ํ, ELK์ Beat๋ผ๋ ๊ฒ์ด ์ถ๊ฐ ๋์๋๋ฐ, ์ด๋ ์ฌ์ฉ์๋ค์ด File์ ์ถ์ ํ๊ณ ์ถ๋ค๋ ์๊ตฌ๋ฅผ ํ๊ณ , ์ด๋ฅผ ์ถฉ์กฑ ์ํค๊ธฐ ์ํด ELK Stack์ ๊ฒฝ๋ ๋จ์ผ ๋ชฉ์ ๋ฐ์ดํฐ ์์ง๊ธฐ ์ ํ์ธ Beat๋ฅผ ํ์ ์์ผฐ๋ค๊ณ ํด์.
๊ฒฐ๊ตญ ELK๋ ์ด๋ฌํ ๋ด์ฉ์ Log ๋ฐ Data ๋ถ์ ๋๊ตฌ์์.
1) ElasticSearch
- ElasticSearch๋ Lucene ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋ ๊ฒ์ ์์ง์ผ๋ก, Logstash๋ฅผ ํตํด ์์ ๋ Data๋ฅผ ์ ์ฅ์์ ์ ์ฅํ๋ ์ญํ .
- Web Interface์ Schema๊ฐ ํ์์๋ JSON ๋ฌธ์๋ฅผ ๊ฐ์ถ multitenant-capable full-text search ์์ง ์ ๊ณต.
- Data๋ฅผ ์ค์ฌ๋ถ์ ์ ์ฅํ์ฌ ์์๋๋ ํญ๋ชฉ์ ๊ฒ์ํ๊ณ , ์์์น ๋ชปํ ํญ๋ชฉ์ ๋ฐํ๋ด๋ ๊ธฐ๋ฅ.
- ์ ํ, ๋น์ ํ, ์์น์ ๋ณด, Metric ๋ฑ ์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ค์ํ ์ ํ์ ๊ฒ์์ ์ํํ๊ณ , ๊ฒฐํฉ.
- 9200 Port.
2) Logstash
- ์คํ์์ค ์๋ฒ ์ธก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ผ๋ก ๋ค์ํ ์์ค์์ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ,
๋ณํํ์ฌ stash ๋ณด๊ด์๋ก ์ ๋ฌ.
- ์์งํ Log ์ ์ ๋ฐ ์ง์ ๋์ ElasticSearch์ Indexingํ์ฌ ์ ๋ฌํ๋ ์ญํ .
- Port 5044.
3) Kibana
- Data ์๊ฐ์ ์ผ๋ก ํ์, ์ค์๊ฐ ๋ถ์ ๊ธฐ๋ฅ.
- ์๊ฐํ ๋ด๋น HTML + Javascript ์์ง.
- Port 5601
4) Beat
- Server์ Agent๋ก ์ค์นํ์ฌ ๋ค์ํ ์ ํ์ Data๋ฅผ ElasticSearch ๋๋ Logstash์ ์ ์กํ๋ ์คํ ์์ค ๋ฐ์ดํฐ
๋ฐ์ก์.
ELK Stack์ ELK์ Beat๊ฐ ์ถ๊ฐ๋์ด ELK Stack์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ ์์ด์.
1) Filebeat
- File ์ ๋ฌ ์ญํ (์ผ๋ฐ์ ์ผ๋ก Log, .json Type์ File).
2) Auditbeat
- Logstash ๋๋ Elastic Search๋ก Log๋ฅผ ๋ณด๋ด๊ธฐ ์ ์ Linux Audit Framwork Data๋ฅผ ์์งํ๊ณ , File ๋ฌด๊ฒฐ์ฑ Monitoring ์ญํ .
3) Metricbeat
- Logstash, Elastic Search๋ก ์ง์ ์ ์ก๋๊ธฐ ์ ์ CPU, Memory ์ฌ์ฉ๋, ๋ถํ ๋ฑ์ System๊ณผ Service์์ Metric ์์งํ๊ณ , Network Data์ Process Data๋ก๋ถํฐ ๊ธฐํ Data ํต๊ณ ์์ง.
4) Packetbeat
- HTTP, DNS, Flows, DHCPv4, MySQL, TLS ๋ฑ Application ๋ฐ ํ์ Leve Protocol, Data Base ๋ฐ Key Storage์ Network Protocol ์ปฌ๋ ์
์ง์. ์์ฌ์ค๋ฌ์ด Network ์ ๊ทผ ์๋ณ ๊ธฐ๋ฅ
5) Heartbeat: Service ์ด์ฉ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋จํ๊ธฐ ์ํ์ฌ ์ฌ์ฉ.
6) Winlogbeat: Windows Event Log ๊ด๋ฆฌ
์ต์ Major Release ELK Stack 8.0์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ ๋์์ด์.
โ System Index ๋ณดํธ ๊ฐํ
โ ์๋ก์ด K-Nearest Neighbor(KNN) API
โ ๋ณด์ ๊ธฐ๋ฅ ๊ธฐ๋ณธ ํ์ฑํ(HTTPS ๋ฐ ์ธ์ฆ)
โ 7.x REST API ํธํ
์ค์นํ๊ธฐ ์ ์ ์ฃผ๋์ฐ๊ฐ ์ค๋นํ ์ค๋น๋ฌผ์ ์๋์ ๊ฐ์์.
์ฃผ๋์ฐ๋ Docker๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๊ฐ ๋ ๊ฐ์ VM ์ฐ๋ถํฌ ์๋ฒ์ Elastic Search์ Kibana, Logstash๋ฅผ ์ค์นํด ๋ณผ๊ฒ์.
๐ฝ ELK Stack
๐ฆ ์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ฑ - Elastic Search
์ต์ด Docker(๋์ปค) ๋ช
๋ น์ด๋ฅผ ์ด์ฉํ์ฌ Elastic Search Container๋ฅผ ๊ธฐ๋ ์์ผ ์ค๊ฑด๋ฐ, Shell Script(์ ์คํฌ๋ฆฝํธ)๋ฅผ ๋ง๋ค์ด ์์
ํด ๋ณผ๊ฒ์.
#!/bin/bash
/docker/dockerManagement/docker-compose/elasticSearch/dockerRunShell.sh
docker exec -it junyss-elasticSearch bin/elasticsearch-plugin install analysis-nori
์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ธฐ๋ํด ์ฃผ๋ฉด dockerRunShell ์ด๋ผ๋ ์ ์คํฌ๋ฆฝํธ๊ฐ ๊ธฐ๋ ๋ ๊ฑฐ๊ณ , ๊ทธ๋ฐ ๋ค ๋์ปค ์ปจํ
์ด๋๊ฐ ์์ฑ๋๋ฉด
๊ทธ ์ปจํ
์ด๋ ๋ด๋ถ์ nori๋ฅผ ์ค์นํ ์ ์๋๋ก ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ์ฃผ์์ด์.
docker run -d \
--name junyss-elasticSearch \
--hostname junyss-elasticSearch \
-p 9200:9200 \
-p 9300:9300 \
-p 50000:50000 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
-e bootstrap.memory_lock=true \
-e "xpack.security.enabled=true" \
-it -m 1GB \
--restart=unless-stopped \
docker.elastic.co/elasticsearch/elasticsearch:8.10.2
์์ ๊ฐ์ด Elastic Search 8.10.2 ์ปจํ
์ด๋๋ฅผ ์ค์นํ ์ ์๋๋ก ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ์ฃผ์์ด์.
ํด๋น ์ ์คํฌ๋ฆฝํธ์ chmod +x ๋ช
๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์คํ ๊ถํ์ ์ฃผ์ด์ผ ํด์.
๊ทธ๋ฐ ๋ค elasticDockerRun.sh๋ฅผ ์คํํ๋ฉด Elastic Search๊ฐ ์ค์น๋ ๊ฑฐ์์.
๊ทธ๋ฐ ๋ค ํด๋น ์ปจํ
์ด๋์ ์ ์ํ์ฌ ์๋ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ค๋๋ค.
./bin/elasticsearch-setup-passwords interactive
๊ทธ๋ฌ๋ฉด Elastic Search ๋ด์์ ์ฌ์ฉ๋๋ ๊ณ์ ์ ๋ํ ์ด๊ธฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํ ์ ์์ด์.
๐ฆ ์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ฑ - Kibana
docker run -d \
--name junyss-kibana \
--hostname junyss-kibana \
-p 5601:5601 \
-e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
-it -m 1GB \
--restart=unless-stopped \
-v /docker/dirMapping/kibana/config:/usr/share/kibana/config \
docker.elastic.co/kibana/kibana:8.10.2
์ต์ด ์์ ๊ฐ์ด ๋ช
๋ น์ด๋ฅผ ์ด์ฉํ์ฌ kibana Container(์ปจํ
์ด๋)๋ฅผ ๊ธฐ๋ํด ์ฃผ๋๋ฐ,
Shell Script๋ฅผ ๋ง๋ค์ด์ ๊ด๋ฆฌํ๊ณ ์ ์์ ๊ฐ์ด ๋ง๋ค์ด ์ฃผ์์ด์.
์ ๋ช
๋ น์ด๋ฅผ ํตํด ์ปจํ
์ด๋๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๊ธฐ๋ ์ํค๊ณ , Elasticsearch Java Option์ ํตํด ์ต์ ๋ฐ ์ต๋ Heap Memory Size๋ฅผ ๊ฐ๊ฐ 1GB๋ก ์ค์ ํด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ , -m Option์ ํตํด Container Memory Limit์ 1GB๋ก ์ค์ ํด ์ฃผ์์ด์.
์์ ๊ฐ์ด Container ๋ด๋ถ ๋๋ ํฐ๋ฆฌ์ Host ๋๋ ํฐ๋ฆฌ ๋งคํ ์ ๋ค์ด๊ฐ kibana.yml์ ์ค๋นํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค ํค๋ฐ๋ ๋์ปค๋ฅผ ๊ธฐ๋ ์ํค๋ Shell Script์ ์คํ ๊ถํ์ ์ฃผ๊ณ , ๊ธฐ๋ ์ํค๋ฉด ๊ธฐ๋์ด ๋๋ต๋๋ค.
๐ฆ ์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ฑ - Logstash
Logstash ์ญ์ ๋ช
๋ น์ด๋ก ์ปจํ
์ด๋๋ฅผ ๊ธฐ๋ ์ํฌ๊ฑด๋ฐ, ๋ณด๋ค ํธ๋ฆฌํ ๊ด๋ฆฌ๋ฅผ ์ํด Shell Script๋ก ๋ง๋ค์ด ์ฃผ์์ด์.
ํค๋ฐ๋์ ๋ค๋ฅธ ์ ์ LS_JAVA_OPTS ๋ถ๋ถ์ธ๋ฐ, ํ๊ฒฝ ๋ณ์ ์ค์ ๋ถ๋ถ์ผ๋ก Logstash์ Java Option์ ์ค์ ํ์ฌ ์ต์ ๋ฐ ์ต๋ Heap Memory ํฌ๊ธฐ๋ฅผ ๊ฐ๊ฐ 256MB๋ก ์ค์ ํ๊ณ , ๋ณ๋ ฌ Thread ์๋ฅผ 1๋ก ์ค์ ํด ์ค ๋ถ๋ถ์ด์์.
๊ทธ๋ฆฌ๊ณ , ์ปจํ
์ด๋ Memory Limit์ 256MB๋ก ์ ํํด ์ฃผ์์ด์.
root@junyss-mng-service-ctn-host config(swift)# cat jvm.options
## JVM configuration
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms1g
-Xmx1g
################################################################
## Expert settings
################################################################
##
## All settings below this section are considered
## expert settings. Don't tamper with them unless
## you understand what you are doing
##
################################################################
## GC configuration
11-13:-XX:+UseConcMarkSweepGC
11-13:-XX:CMSInitiatingOccupancyFraction=75
11-13:-XX:+UseCMSInitiatingOccupancyOnly
## Locale
# Set the locale language
#-Duser.language=ko
# Set the locale country
#-Duser.country=KO
# Set the locale variant, if any
#-Duser.variant=
## basic
# set the I/O temp directory
#-Djava.io.tmpdir=$HOME
# set to headless, just in case
-Djava.awt.headless=true
# ensure UTF-8 encoding by default (e.g. filenames)
-Dfile.encoding=UTF-8
# use our provided JNA always versus the system one
#-Djna.nosys=true
# Turn on JRuby invokedynamic
-Djruby.compile.invokedynamic=true
## heap dumps
# generate a heap dump when an allocation from the Java heap fails
# heap dumps are created in the working directory of the JVM
-XX:+HeapDumpOnOutOfMemoryError
# specify an alternative path for heap dumps
# ensure the directory exists and has sufficient space
#-XX:HeapDumpPath=${LOGSTASH_HOME}/heapdump.hprof
## GC logging
#-Xlog:gc*,gc+age=trace,safepoint:file=@loggc@:utctime,pid,tags:filecount=32,filesize=64m
# log GC status to a file with time stamps
# ensure the directory exists
#-Xloggc:${LS_GC_LOG_FILE}
# Entropy source for randomness
-Djava.security.egd=file:/dev/urandom
# Copy the logging context from parent threads to children
root@junyss-mng-service-ctn-host config(swift)# cat log4j2.file.properties
status = error
name = LogstashPropertiesConfig
appender.console.type = Console
appender.console.name = plain_console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c]%notEmpty{[%X{pipeline.id}]}%notEmpty{[%X{plugin.id}]} %m%n
appender.json_console.type = Console
appender.json_console.name = json_console
appender.json_console.layout.type = JSONLayout
appender.json_console.layout.compact = true
appender.json_console.layout.eventEol = true
appender.rolling.type = RollingFile
appender.rolling.name = plain_rolling
appender.rolling.fileName = ${sys:ls.logs}/logstash-plain.log
appender.rolling.filePattern = ${sys:ls.logs}/logstash-plain-%d{yyyy-MM-dd}-%i.log.gz
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c]%notEmpty{[%X{pipeline.id}]}%notEmpty{[%X{plugin.id}]} %m%n
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size = 100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 30
appender.rolling.avoid_pipelined_filter.type = PipelineRoutingFilter
appender.json_rolling.type = RollingFile
appender.json_rolling.name = json_rolling
appender.json_rolling.fileName = ${sys:ls.logs}/logstash-json.log
appender.json_rolling.filePattern = ${sys:ls.logs}/logstash-json-%d{yyyy-MM-dd}-%i.log.gz
appender.json_rolling.policies.type = Policies
appender.json_rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.json_rolling.policies.time.interval = 1
appender.json_rolling.policies.time.modulate = true
appender.json_rolling.layout.type = JSONLayout
appender.json_rolling.layout.compact = true
appender.json_rolling.layout.eventEol = true
appender.json_rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.json_rolling.policies.size.size = 100MB
appender.json_rolling.strategy.type = DefaultRolloverStrategy
appender.json_rolling.strategy.max = 30
appender.json_rolling.avoid_pipelined_filter.type = PipelineRoutingFilter
appender.routing.type = PipelineRouting
appender.routing.name = pipeline_routing_appender
appender.routing.pipeline.type = RollingFile
appender.routing.pipeline.name = appender-${ctx:pipeline.id}
appender.routing.pipeline.fileName = ${sys:ls.logs}/pipeline_${ctx:pipeline.id}.log
appender.routing.pipeline.filePattern = ${sys:ls.logs}/pipeline_${ctx:pipeline.id}.%i.log.gz
appender.routing.pipeline.layout.type = PatternLayout
appender.routing.pipeline.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %m%n
appender.routing.pipeline.policy.type = SizeBasedTriggeringPolicy
appender.routing.pipeline.policy.size = 100MB
appender.routing.pipeline.strategy.type = DefaultRolloverStrategy
appender.routing.pipeline.strategy.max = 30
rootLogger.level = ${sys:ls.log.level}
rootLogger.appenderRef.console.ref = ${sys:ls.log.format}_console
rootLogger.appenderRef.rolling.ref = ${sys:ls.log.format}_rolling
rootLogger.appenderRef.routing.ref = pipeline_routing_appender
# Slowlog
appender.console_slowlog.type = Console
appender.console_slowlog.name = plain_console_slowlog
appender.console_slowlog.layout.type = PatternLayout
appender.console_slowlog.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %m%n
appender.json_console_slowlog.type = Console
appender.json_console_slowlog.name = json_console_slowlog
appender.json_console_slowlog.layout.type = JSONLayout
appender.json_console_slowlog.layout.compact = true
appender.json_console_slowlog.layout.eventEol = true
appender.rolling_slowlog.type = RollingFile
appender.rolling_slowlog.name = plain_rolling_slowlog
appender.rolling_slowlog.fileName = ${sys:ls.logs}/logstash-slowlog-plain.log
appender.rolling_slowlog.filePattern = ${sys:ls.logs}/logstash-slowlog-plain-%d{yyyy-MM-dd}-%i.log.gz
appender.rolling_slowlog.policies.type = Policies
appender.rolling_slowlog.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling_slowlog.policies.time.interval = 1
appender.rolling_slowlog.policies.time.modulate = true
appender.rolling_slowlog.layout.type = PatternLayout
appender.rolling_slowlog.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %m%n
appender.rolling_slowlog.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling_slowlog.policies.size.size = 100MB
appender.rolling_slowlog.strategy.type = DefaultRolloverStrategy
appender.rolling_slowlog.strategy.max = 30
appender.json_rolling_slowlog.type = RollingFile
appender.json_rolling_slowlog.name = json_rolling_slowlog
appender.json_rolling_slowlog.fileName = ${sys:ls.logs}/logstash-slowlog-json.log
appender.json_rolling_slowlog.filePattern = ${sys:ls.logs}/logstash-slowlog-json-%d{yyyy-MM-dd}-%i.log.gz
appender.json_rolling_slowlog.policies.type = Policies
appender.json_rolling_slowlog.policies.time.type = TimeBasedTriggeringPolicy
appender.json_rolling_slowlog.policies.time.interval = 1
appender.json_rolling_slowlog.policies.time.modulate = true
appender.json_rolling_slowlog.layout.type = JSONLayout
appender.json_rolling_slowlog.layout.compact = true
appender.json_rolling_slowlog.layout.eventEol = true
appender.json_rolling_slowlog.policies.size.type = SizeBasedTriggeringPolicy
appender.json_rolling_slowlog.policies.size.size = 100MB
appender.json_rolling_slowlog.strategy.type = DefaultRolloverStrategy
appender.json_rolling_slowlog.strategy.max = 30
logger.slowlog.name = slowlog
logger.slowlog.level = trace
logger.slowlog.appenderRef.console_slowlog.ref = ${sys:ls.log.format}_console_slowlog
logger.slowlog.appenderRef.rolling_slowlog.ref = ${sys:ls.log.format}_rolling_slowlog
logger.slowlog.additivity = false
logger.licensereader.name = logstash.licensechecker.licensereader
logger.licensereader.level = error
# Silence http-client by default
logger.apache_http_client.name = org.apache.http
logger.apache_http_client.level = fatal
# Deprecation log
appender.deprecation_rolling.type = RollingFile
appender.deprecation_rolling.name = deprecation_plain_rolling
appender.deprecation_rolling.fileName = ${sys:ls.logs}/logstash-deprecation.log
appender.deprecation_rolling.filePattern = ${sys:ls.logs}/logstash-deprecation-%d{yyyy-MM-dd}-%i.log.gz
appender.deprecation_rolling.policies.type = Policies
appender.deprecation_rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.deprecation_rolling.policies.time.interval = 1
appender.deprecation_rolling.policies.time.modulate = true
appender.deprecation_rolling.layout.type = PatternLayout
appender.deprecation_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c]%notEmpty{[%X{pipeline.id}]}%notEmpty{[%X{plugin.id}]} %m%n
appender.deprecation_rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.deprecation_rolling.policies.size.size = 100MB
appender.deprecation_rolling.strategy.type = DefaultRolloverStrategy
appender.deprecation_rolling.strategy.max = 30
logger.deprecation.name = org.logstash.deprecation, deprecation
logger.deprecation.level = WARN
logger.deprecation.appenderRef.deprecation_rolling.ref = deprecation_plain_rolling
logger.deprecation.additivity = false
logger.deprecation_root.name = deprecation
logger.deprecation_root.level = WARN
logger.deprecation_root.appenderRef.deprecation_rolling.ref = deprecation_plain_rolling
logger.deprecation_root.additivity = false
root@junyss-mng-service-ctn-host config(swift)# cat log4j2.properties
status = error
name = LogstashPropertiesConfig
appender.console.type = Console
appender.console.name = plain_console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c]%notEmpty{[%X{pipeline.id}]}%notEmpty{[%X{plugin.id}]} %m%n
appender.json_console.type = Console
appender.json_console.name = json_console
appender.json_console.layout.type = JSONLayout
appender.json_console.layout.compact = true
appender.json_console.layout.eventEol = true
rootLogger.level = ${sys:ls.log.level}
rootLogger.appenderRef.console.ref = ${sys:ls.log.format}_console
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://{Elastic Search IP}:9200" ]
## X-Pack security credentials
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: PASSWORD
# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
# https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
- pipeline.id: main
path.config: "/usr/share/logstash/pipeline"
root@junyss-mng-service-ctn-host config(swift)# cat startup.options
################################################################################
# These settings are ONLY used by $LS_HOME/bin/system-install to create a custom
# startup script for Logstash and is not used by Logstash itself. It should
# automagically use the init system (systemd, upstart, sysv, etc.) that your
# Linux distribution uses.
#
# After changing anything here, you need to re-run $LS_HOME/bin/system-install
# as root to push the changes to the init script.
################################################################################
# Override Java location
#JAVACMD=/usr/bin/java
# Set a home directory
LS_HOME=/usr/share/logstash
# logstash settings directory, the path which contains logstash.yml
LS_SETTINGS_DIR=/etc/logstash
# Arguments to pass to logstash
LS_OPTS="--path.settings ${LS_SETTINGS_DIR}"
# Arguments to pass to java
LS_JAVA_OPTS=""
# pidfiles aren't used the same way for upstart and systemd; this is for sysv users.
LS_PIDFILE=/var/run/logstash.pid
# user and group id to be invoked as
LS_USER=logstash
LS_GROUP=logstash
# Enable GC logging by uncommenting the appropriate lines in the GC logging
# section in jvm.options
LS_GC_LOG_FILE=/var/log/logstash/gc.log
# Open file limit
LS_OPEN_FILES=16384
# Nice level
LS_NICE=19
# Change these to have the init script named and described differently
# This is useful when running multiple instances of Logstash on the same
# physical box or vm
SERVICE_NAME="logstash"
SERVICE_DESCRIPTION="logstash"
# If you need to run a command or script before launching Logstash, put it
# between the lines beginning with `read` and `EOM`, and uncomment those lines.
###
## read -r -d '' PRESTART << EOM
## EOM
์์ ๊ฐ์ด Logstash ๊ด๋ จ ๊ตฌ์ฑ ํ์ผ๋ค์ ๋ฏธ๋ฆฌ ์์ฑํด์ ๋ฃ์ด๋๊ณ ,
์ปจํ
์ด๋์ ๋๋ ํฐ๋ฆฌ ๋งคํ์ ํตํด ์ ๋ฌ ๋ ์ ์๋๋ก ์ค์ ํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค ์ปจํ
์ด๋ ๊ธฐ๋ ๋ช
๋ น์ด๊ฐ ๋ค์ด์๋ Script์ ์คํ ๊ถํ์ ์ฃผ๊ณ , ์คํํ๊ฒ ๋๋ฉด ์ปจํ
์ด๋๊ฐ ์์ฑ๋ ๊ฑฐ์์.
๐ฝ ์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ฑ - Agent(beat)
wget -O - https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor -o /etc/apt/keyrings/elasticsearch-keyring.gpg
์ต์ด ๊ฐ beat(๋นํธ)๋ฅผ ๋ด๋ ค๋ฐ๊ธฐ ์ํด์๋ ์์ ๊ฐ์ด gpg Key๋ฅผ ๋ด๋ ค ๋ฐ์ ์ฃผ์ด์ผ ํด์.
1. wget -O - https://artifacts.elastic.co/GPG-KEY-elasticsearch
- wget: ์น์์ ํ์ผ ๋ด๋ ค ๋ฐ์ ๋ ์ฌ์ฉํ๋ ๋ช
๋ น์ด. Elastci.co ์น ์ฌ์ดํธ์์ GPG-KEY_elasticsearch File
๋ด๋ ค ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ.
- -O -: ๋ด๋ ค ๋ฐ๊ธฐํ Data๋ฅผ ํ์ค ์ถ๋ ฅ(STDOUT)์ผ๋ก ์ถ๋ ฅํ๋๋ก ์ง์. ์ฆ, ๋ด๋ ค๋ฐ๊ธฐํ Data๋ฅผ ํ๋ฉด์ ์ถ๋ ฅ.
- " : Pipe ๊ธฐํธ๋ฅผ ํตํด ์ด์ ๋ช
๋ น์ด์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ช
๋ น์ด์ ์
๋ ฅ์ผ๋ก ๋ณด๋ด๊ธฐ ์ํด ์ฌ์ฉ.
2. gpg --dearmor -o /etc/apt/keyrings/elasticsearch-keyring.gpg
- gpg: GNU Privacy Guard(GPG) ์คํ ์ ์ฌ์ฉ. GPG๋ ์ํธํ์ ๋์งํธ ์๋ช
๋ค๋ฃฐ ๋ ์ฌ์ฉ.
- --dearmor: GPG ํค๋ฅผ Decodingํ์ฌ Binary ํ์์์ ASCII ํ์์ผ๋ก ๋ณํํ๊ธฐ ์ํด ์ฌ์ฉ.
- -o /etc/apt/keyrings/elasticsearch-keyring.gpg: Decoding๋ GPG ํค๋ฅผ /etc/apt/keyrings ๋๋ ํฐ๋ฆฌ์
elasticsearch-keyring.gpg File๋ก ์ ์ฅํ๋๋ก ์ง์. ์ด Directory ์ File์ APT Package ๊ด๋ฆฌ์์์ ์ฌ์ฉ๋๋
GPG ํค ์ ์ฅ ์ ์ฌ์ฉ.
์ ๋ช ๋ น์ด๋ Elastic.co์ GPG ํค๋ฅผ ๋ด๋ ค ๋ฐ์ System(์์คํ )์ APT Package(ํจํค์ง) ๊ด๋ฆฌ์์์ ์ฌ์ฉํ ์ ์๋๋ก GPG ํ์์์ ASCII ํ์์ผ๋ก ๋ณํํ๊ณ , /etc/apt/keyrings/ Directory(๋๋ ํฐ๋ฆฌ)์ elasticsearch-keyring.gpg File(ํ์ผ)๋ก ์ ์ฅํ๊ฒ ํ๊ธฐ ์ํ ๋ช ๋ น์ด์์. ์ด๋ฅผ ํตํด ElastciSearch์ ๊ด๋ จ๋ ํจํค์ง๋ฅผ ์์ ํ๊ฒ ์ค์นํ๊ณ , ์ ๋ฐ์ดํธํ ์ ์์ด์.
echo "deb [signed-by=/etc/apt/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-8.x.list
์ ๋ช
๋ น์ด๋ APT ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ํตํด ElasticSearch์ ํจํค์ง๋ฅผ ์ค์นํ๊ฑฐ๋,
์
๋ฐ์ดํธํ๊ธฐ ์ํ APT ์ ์ฅ์ ์ถ๊ฐ ๋ช
๋ น์ด์์.
1. echo "deb [signed-by=/etc/apt/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main"
- echo: ์ธ์๋ก ์ ๋ฌ๋ ๋ฌธ์์ด ํ์ค ์ถ๋ ฅ. ElasticSearch ํจํค์ง ์ ์ฅ์์ ๋ํ APT Source ๋ชฉ๋ก ์ ์๋ฅผ ์ํด ์ฌ์ฉ.
- deb: Debian ํจํค์ง ํ์ ํํ.
- [signed-by=/etc/apt/keyrings/elasticsearch-keyring.gpg]: GPG ํค๊ฐ
/etc/apt/keyrings/elasticsearch-keyring.gpg ํ์ผ๋ก ์๋ช
๋์์์ ํํ. ์ด๊ฒ์ GPG ํค์ ์ ํจ์ฑ์ ๊ฒ์ฆํ์ฌ
ํจํค์ง์ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ.
- https://artifacts.elastic.co/packages/8.x/apt: ElasticSearch ํจํค์ง ์ ์ฅ์์ URL.
- stable: ElasticSearch ํจํค์ง ์์ ๋ฒ์ ํํ.
- main: ์ ์ฅ์์์ ์ฌ์ฉํ Main Component ํํ.
2. tee /etc/apt/sources.list.d/elastic-8.x.list
- tee: ํ์ค ์
๋ ฅ์์ ์ฝ์ Data๋ฅผ ํ์ผ์ ์ธ ๋ ์ฌ์ฉ.
- /etc/apt/sources.list.d/elastic-8.x.list: ์์์ ์ ์ํ ElasticSearch ํจํค์ง ์ ์ฅ์ ์ ๋ณด๋ฅผ ํด๋น ํ์ผ์ ์ฐ๋๋ก
์ง์. ์ด ํ์ผ์ APT ํจํค์ง ๊ด๋ฆฌ์์๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ Source ๋ชฉ๋ก ์ค ํ๋๋ก ์ธ์๋๋ฉฐ, ์ด ์ ์ฅ์์์ ํจํค์ง ์ค์น ๋ฐ
์
๋ฐ์ดํธ.
์ ๋ช ๋ น์ด๋ ElastciSearch ํจํค์ง ์ ์ฅ์๋ฅผ APT ํจํค์ง ๊ด๋ฆฌ์์ ์ถ๊ฐํ๊ณ , ํด๋น ์ ์ฅ์์์ ์ ๊ณตํ๋ ํจํค์ง๋ฅผ ์์คํ ์ ์ค์น ๋ฐ ์ ๋ฐ์ดํธ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ช ๋ น์ด์์.
๊ทธ๋ฐ ๋ค ์์ ๊ฐ์ด ํจํค์ง๋ฅผ ์ต์ ํ ํ์ฌ ์ฃผ์์ด์.
๐ฆ filebeat
์์ ๊ฐ์ด ๊ฐ beat๋ค์ ๋จผ์ ์ค์นํด ์ค๋๋ค.
28๋ฒ์งธ ์ค์ enabled ๋ถ๋ถ์ true๋ก ๋ฐ๊ฟ์ค๋๋ค.
Paths ๋ถ๋ถ์๋ Logging ํ๊ณ ์ ํ๋ Log File์ ์์น๋ฅผ ๋ช
์ํด ์ฃผ๋ฉด ๋ผ์.
setup.kibana:
# Kibana Host
# Scheme and port can be left out and will be set to the default (http and 5601)
# In case you specify and additional path, the scheme is required: http://localhost:5601/path
# IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
host: "192.168.20.253:5601"
115๋ฒ์งธ ์ค์ Kibana์ IP์ฃผ์๋ฅผ ์ ์ด์ฃผ๊ณ , Kibana์ Port ๋ฒํธ๋ฅผ ๋ช
์ํด ์ค๋๋ค.
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.20.254:9200"]
# Protocol - either `http` (default) or `https`.
protocol: "http"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
username: "elastic"
password: "changeme"
142๋ฒ์งธ ์ค์ Elastic Search IP์ Port ๋ฒํธ๋ฅผ ์ ์ด์ฃผ๊ณ , ํต์ ์ ์ฌ์ฉ๋๋ Protocol์ 145๋ฒ์งธ ์ค์ ์์ฑํด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ , 149~150๋ฒ์งธ์๋ Elastic Search ๊ณ์ ์ ์
๋ ฅํด ์ค๋๋ค.
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/filebeat
name: filebeat
keepfiles: 7
permissions: 0640
filebeat์ ๋ํ Log๋ฅผ ๋จ๊ธฐ๊ธฐ ์ํด ์์ ๊ฐ์ด ์์ฑํด ์ฃผ์์ด์.
์ฃผ๋๋ Elastic Search์ Kibana, Logstash๊ฐ ๋ค๋ฅธ ์๋ฒ์ ๋ฐ๋ก ์ค์น ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ์ฃผ์์ด์.
์ ๋ช
๋ น์ด๋ filebeat๋ฅผ ์ค์ ํ๊ณ , ์คํํ๋ ๋ช
๋ น์ด๋ก Elastic Search์ Kibana์์ ํตํฉ์ ์ค์ ํ๋๋ฐ,
์ฌ์ฉํ๋ ๋ช
๋ น์ด์์.
1. filebeat setup
- setup: filebeat ์ด๊ธฐ ์ค์ ๊ตฌ์ฑ ๋ฐ ํ์ํ ์์ ์์ฑ.
- -e: ๋ช
๋ น์ด๋ฅผ ์คํํ ๋, Logging์ ํ์ฑํํ๊ณ , filebeat Log ํ์๋ฅผ ์ํด ์ฌ์ฉ.
2. -E output.logstash.enabled=false:
- -E: filebeat ์ค์ ์ง์ ์ ์ํด ์ฌ์ฉ. output.logstash.enabled=false๋ฅผ ํตํด Logstash๋ฅผ ํตํ ์ถ๋ ฅ์ ๋นํ์ฑํํ๊ณ ,
Logstash๋ก ๋ฐ์ดํฐ ์ ์ก ๋ฐฉ์ง. ์ฆ, ๋ฐ์ดํฐ๋ฅผ Logstash๋ฅผ ๊ฑฐ์น์ง ์๊ณ , ๋ฐ๋ก Elastic Search์ ์ ์ฅ.
3. -E output.elasticsearch.hosts=['Elastic Search IP':'Elastic Search Port']: Elastic Search๋ก์ ์ถ๋ ฅ ์ง์ .
4. -E setup.kibana.host=Kibana IP:Kibana Port: Kibana Host ์ง์ ํ์ฌ filebeat๋ฅผ Kibana์ ์ฐ๋
๋ง์ฝ ๋ชจ๋ ๊ฐ์ ์๋ฒ์ ์ค์น ๋์ด ์๋ค๋ฉด ์๋ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ๋ผ์.
filebeat setup -e # -e : debug mode
์ ๋ช
๋ น์ด๋ฅผ ํตํด filebeat๋ฅผ ๋ถํ
์ ์๋์ผ๋ก ์๋น์ค๋๊ฒ ์๋น์ค์ ๋ฑ๋กํด ์ฃผ๊ณ , ๋ฐ๋ก Daemon(๋ฐ๋ชฌ)์ ๊ธฐ๋ ์์ผ ์ฃผ์์ด์.
์์ ๊ฐ์ด Kibana์ ์ ์ํ์ฌ ์ผ์ชฝ Navigator์์ Analytics์ Discover๋ฅผ ๋ค์ด๊ฐ ์ค๋๋ค.
๊ทธ๋ผ ์์ ๊ฐ์ด filebeat-* ๊ฐ ์๊ธด๊ฑธ ํ์ธํ ์ ์์ด์.
์์ ๊ฐ์ด Log๋ฅผ ํ์ธํ ์ ์์ด์.
๐ฆ metricbeat
ํจํค์ง๋ ์ filebeat์์ ์ค์นํ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ์ค์น๊ฐ ๋์ด ์๋ ์ํ์์.
setup.kibana:
# Kibana Host
# Scheme and port can be left out and will be set to the default (http and 5601)
# In case you specify and additional path, the scheme is required: http://localhost:5601/path
# IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
host: "192.168.20.253:5601"
Kibana์ IP์ฃผ์๋ฅผ ์ ์ด์ฃผ๊ณ , Kibana์ Port ๋ฒํธ๋ฅผ ๋ช
์ํด ์ค๋๋ค.
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.20.254:9200"]
# Protocol - either `http` (default) or `https`.
protocol: "http"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
username: "elastic"
password: "changeme"
Elastic Search IP์ Port ๋ฒํธ๋ฅผ ์ ์ด์ฃผ๊ณ , ํต์ ์ ์ฌ์ฉ๋๋ Protocol์ ์์ฑํด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ , Elastic Search ๊ณ์ ์ ์
๋ ฅํด ์ค๋๋ค.
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/metricbeat
name: metricbeat
keepfiles: 7
permissions: 0640
metricbeat์ ๋ํ Log๋ฅผ ๋จ๊ธฐ๊ธฐ ์ํด ์์ ๊ฐ์ด ์์ฑํด ์ฃผ์์ด์.
์์ ๊ฐ์ด ๋ชจ๋ํฐ๋ง ๋์ ์๋น์ค์ ๋ํด ๋ชจ๋ ๋ชฉ๋ก์ ํ์ธํ ์ ์์ด์.
# ๋ชจ๋ ์ถ๊ฐ
metricbeat modules enable <module-name>
# ๋ชจ๋ ์ ๊ฑฐ
metricbeat modules disable <module-name>
system์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ถ๊ฐ๊ฐ ๋์ด ์๊ณ , ์์ ๊ฐ์ด ๋ชจ๋ํฐ๋ง ํ๊ณ ์ ํ๋ ๊ฒ๋ค์ ์ถ๊ฐํด ์ค ์ ์์ด์.
์์ ๊ฐ์ด ์ ์์ ์ผ๋ก ํต์ ์ด ๋๋์ง test ํด๋ณผ ์ ์์ด์.
์ฃผ๋๋ Elastic Search์ Kibana, Logstash๊ฐ ๋ค๋ฅธ ์๋ฒ์ ๋ฐ๋ก ์ค์น ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ์ฃผ์์ด์.
์ ๋ช
๋ น์ด๋ metricbeat๋ฅผ ์ค์ ํ๊ณ , ์คํํ๋ ๋ช
๋ น์ด๋ก Elastic Search์ Kibana์์ ํตํฉ์ ์ค์ ํ๋๋ฐ,
์ฌ์ฉํ๋ ๋ช
๋ น์ด์์.
๋ง์ฝ ๋ชจ๋ ๊ฐ์ ์๋ฒ์ ์ค์น ๋์ด ์๋ค๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ๋ผ์.
metricbeat setup -e
์ ๋ช
๋ น์ด๋ฅผ ํตํด metricbeat๋ฅผ ๋ถํ
์ ์๋์ผ๋ก ์๋น์ค๋๊ฒ ์๋น์ค์ ๋ฑ๋กํด ์ฃผ๊ณ ,
๋ฐ๋ก Daemon(๋ฐ๋ชฌ)์ ๊ธฐ๋ ์์ผ ์ฃผ์์ด์.
์์ ๊ฐ์ด metricmeat-*๊ฐ ์๊ธด๊ฑธ ํ์ธํ ์ ์์ด์.
์ด๋ฏธ ์ฃผ๋๋ ๋ช ๊ฐ์ ์๋ฒ๋ฅผ ๋ฑ๋กํด๋จ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด ํธ์คํธ ๊ฐ์๊ฐ 4๊ฐ๋ก ์ฐํ๊ณ ์๊ณ , ์์์ ๋ฑ๋กํ ์๋ฒ ํธ์คํธ junyss-os-controller๊ฐ ๋ณด์ด๋๊ฑธ ํ์ธํ ์ ์์ด์.
์์ ๊ฐ์ด ์๋ฒ ์ฌ์ฉ๋์ ๋ํด ๋ค์ํ ํ์ธ์ ํ ์ ์์ด์.
๐ฆ auditbeat
ํจํค์ง๋ ์ filebeat์์ ์ค์นํ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ์ค์น๊ฐ ๋์ด ์๋ ์ํ์์.
setup.kibana:
# Kibana Host
# Scheme and port can be left out and will be set to the default (http and 5601)
# In case you specify and additional path, the scheme is required: http://localhost:5601/path
# IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
host: "192.168.20.253:5601"
# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.20.254:9200"]
# Protocol - either `http` (default) or `https`.
protocol: "http"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
username: "elastic"
password: "password"
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/auditbeat
name: auditbeat
keepfiles: 7
permissions: 0640
์์ ๋ค๋ฅธ ๋นํธ๋ค๊ณผ ๋์ผํ๊ฒ ์ค์ ํ์ผ์ ๊ตฌ์ฑํด ์ฃผ์์ด์.
์์ ๊ฐ์ด auditbeat ๋ฐ๋ชฌ์ ๊ธฐ๋ ์ํค๊ณ , ์๋น์ค์ ๋ฑ๋กํด ์ฃผ์์ด์.
ํค๋ฐ๋์ ์์ ๊ฐ์ด auditbeat-*๊ฐ ์๊ธด๊ฑธ ํ์ธํ ์ ์์ด์.
ํค๋ฐ๋์ Dashboards์์ ์์ ๊ฐ์ด ๊ฒ์ํ๋ฉด ๊ฐ์ฌ ๊ด๋ จ ๋ชจ๋ํฐ๋ง์ ํ ์ ์์ด์.
๐ฆ packetbeat
ํจํค์ง๋ ์ filebeat์์ ์ค์นํ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ์ค์น๊ฐ ๋์ด ์๋ ์ํ์์.
setup.kibana:
# Kibana Host
# Scheme and port can be left out and will be set to the default (http and 5601)
# In case you specify and additional path, the scheme is required: http://localhost:5601/path
# IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
host: "192.168.20.253:5601"
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.20.254:9200"]
# Protocol - either `http` (default) or `https`.
protocol: "http"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
username: "elastic"
password: "changeme"
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/packetbeat
name: packetbeat
keepfiles: 7
permissions: 0640
์ ๋ด์ฉ๋ ๋ค๋ฅธ ๋นํธ์ฒ๋ผ ๋์ผํ๊ฒ ์์ ํด ์ฃผ์์ด์.
packetbeat๋ ์๋น์ค์ ๋ฑ๋กํ๊ณ , ๊ธฐ๋ ์์ผ ์ค๋๋ค.
ํค๋ฐ๋์ Discover์ ์์ ๊ฐ์ด packetbeat-*๊ฐ ๋ง๋ค์ด์ง๊ฑธ ํ์ธํ ์ ์์ด์.
Dashboards์์ ์์ ๊ฐ์ด ๊ฒ์์ ํ์ฌ Dashboard๋ฅผ ํ์ธํด ์ค๊ฒ์.
์์ ๊ฐ์ด Network ๊ด๋ จ ๋ชจ๋ํฐ๋ง์ ํ ์ ์๊ฒ ๋์์ด์.
๐ฆ heartbeat-elastic
์ต์ด ์์ ๊ฐ์ด ํจํค์ง๋ฅผ ์ค์นํด ์ค๋๋ค.
- type: icmp
schedule: '59 * * * * * *'
hosts:
- "192.168.0.2"
- "192.168.0.3"
- "192.168.0.4"
- "192.168.20.2"
- "192.168.20.3"
- "192.168.20.4"
- "192.168.20.5"
- "192.168.20.251"
- "192.168.20.252"
- "192.168.20.254"
- "192.168.30.2"
id: junyss-icmp-service
name: Junyss ICMP Service
์ต์ด ์์ ๊ฐ์ด Ping Test๋ฅผ ์ด์ฉํ์ฌ ํด๋น ์๋ฒ๊ฐ ์ด์์๋์ง ํ์ธํ ๋์ ์๋ฒ์ IP๋ฅผ ์์ฑํด ์ฃผ์์ด์.
schedule์๋ Linux Crontab ๋ฐฉ์์ผ๋ก ์๋ ์๊ฐ์ ์ค์ ํด ์ฃผ์๋๋ฐ,
์ฃผ๋๋ ๋งค 59๋ถ ๋ง๋ค ๋์ํ๋๋ก ์ค์ ํด ์ฃผ์์ด์.
์ ๋ด์ฉ์ tcp๋ฅผ ์ด์ฉํ์ฌ MariaDB๊ฐ ์ ์์ ์ผ๋ก ๊ตฌ๋์ค์ธ์ง ํ์ธํ๊ธฐ ์ํ ๋ถ๋ถ์ด์์.
๋งค์ผ 1800์ด ๊ฐ๊ฒฉ์ผ๋ก ํ์ธํ ์ ์๋๋ก ์ค์ ํด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ ์ ๋ด์ฉ์ http Protocol์ ํตํด ์๋น์คํ๋ ์๋น์ค๊ฐ ์ ๋์์ค์ธ์ง ํ์ธํ๊ธฐ ์ํ ๋ถ๋ถ์ด์์.
heartbeat.config.monitors:
# Directory + glob pattern to search for configuration files
path: ${path.config}/monitors.d/*.yml
# If enabled, heartbeat will periodically check the config.monitors path for changes
reload.enabled: true
# How often to check for changes
reload.period: 5s
# Configure monitors inline
heartbeat.monitors:
- type: icmp
schedule: '59 * * * * * *'
hosts:
- "192.168.0.2"
- "192.168.0.3"
- "192.168.0.4"
- "192.168.20.2"
- "192.168.20.3"
- "192.168.20.4"
- "192.168.20.5"
- "192.168.20.251"
- "192.168.20.252"
- "192.168.20.254"
- "192.168.30.2"
id: junyss-icmp-service
name: Junyss ICMP Service
- type: tcp
schedule: '@every 1800s'
hosts:
- "192.168.20.254:3306"
mode: any
id: junyss-tcp-service
- type: http
# Set enabled to true (or delete the following line) to enable this monitor
enabled: true
# ID used to uniquely identify this monitor in Elasticsearch even if the config changes
id: heartbeat_http_check_ID
# Human readable display name for this service in Uptime UI and elsewhere
name: Junyss HTTP Check With heartbeat Monitor
# List of URLs to query
urls:
- "192.168.20.3:80"
- "192.168.20.253:5601"
- "192.168.20.254:9200"
# Configure task schedule
schedule: '@every 1800s'
setup.kibana:
# Kibana Host
# Scheme and port can be left out and will be set to the default (http and 5601)
# In case you specify and additional path, the scheme is required: http://localhost:5601/path
# IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
host: "192.168.20.253:5601"
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.20.254:9200"]
# Protocol - either `http` (default) or `https`.
protocol: "http"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
username: "elastic"
password: "password"
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/heartbeat
name: heartbeat
keepfiles: 7
permissions: 0640
์ ๋ด์ฉ์ ๋ค๋ฅธ ๋นํธ์ ๋์ผํ๊ฒ ๋ณ๊ฒฝํด ์ฃผ์์ด์.
์์ ๊ฐ์ด heartbeat ๋ฐ๋ชฌ์ ๊ธฐ๋ ์ํค๊ณ , ์๋น์ค์ ๋ฑ๋กํด ์ฃผ์์ด์.
heartbeat์ ๊ฒฝ์ฐ ๋ค๋ฅธ beat ์ฒ๋ผ Discover์ ์๋์ผ๋ก ๋ฑ๋ก๋์ง ์์ ์ง์ ๋ฑ๋กํด ์ฃผ์ด์ผ ํด์.
์์ ๊ฐ์ด ์ด๋ฆ๊ณผ Index pattern์ ๋ฑ๋กํ๊ณ , Timestamp field๋ฅผ ์ ํํ ๋ค
์๋ Save data view to Kibana ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.
๊ทธ๋ผ ์์ ๊ฐ์ด heartbeat๊ฐ ๋ง๋ค์ด ์ง๊ฑธ ํ์ธํ ์ ์์ด์.
์ผ์ชฝ Navigator์ Observability์ ๋ณด๋ฉด Uptime Tab์ด ๋ง๋ค์ด์ก์ ๊ฑฐ์์.
์ด์ ์์ ๊ฐ์ด ๋ฑ๋กํ๋ ์๋น์ค๋ค์ด ๊ตฌ๋๋๊ณ ์๋์ง๋ฅผ ํ์ธํ ์ ์์ด์.
๐ฆ Winlogbeat
์ต์ด ์ ์ฌ์ดํธ์์ ์๋์ฐ์ฉ beat๋ฅผ ๋ด๋ ค ๋ฐ์ ์ค๊ฒ์.
์์ ๊ฐ์ด ๋ด๋ ค ๋ฐ๊ธฐ ํด ์ฃผ์์ด์.
์์ถํด์ ๋ ํ์ผ์ C:\ ๋ฐ์ ๋ฃ์ด์ค๋๋ค.
์ฐธ๊ณ ๋ก allow_older_version์ ๋ฒ์ ์ ๋ฐ๋ฅธ ํธํ ๋ฌธ์ ๋ฐ์์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฃ์ด์ค ๋ด์ฉ์ด์์.
์์ ๋ฆฌ๋
์ค์ ๊ฐ์ข
๋นํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก yml ํ์ผ์ ์์ ํด ์ฃผ์์ด์.
Power Shell์ ์์ ๊ฐ์ด ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํํด ์ค๋๋ค.
์ ๋ช
๋ น์ด๋ก beat๋ฅผ ์คํํด ์ฃผ์์ด์.
ํค๋ฐ๋์ Discover์ ๊ฐ๋ณด๋ฉด ์์ ๊ฐ์ด winlogbeat-*๊ฐ ์๊ธด๊ฑธ ํ์ธํ ์ ์์ด์.
Dashboards์ ์์ ๊ฐ์ด Template์ด ์๊ธฐ์๊ณ , ์์ Template์ ์ ํํด ๋ณผ๊ฒ์.
์์ ๊ฐ์ด ์๋์ฐ๋ฅผ ๋ชจ๋ํฐ๋ง ํ ์ ์๊ฒ ๋์์ด์.
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ง ์ฐธ๊ณ ์๋ฃ
'System ์์ ์ค > DevOps' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CI/CD] Jenkins์ Gitlab ์ฐ๋ (0) | 2023.10.30 |
---|---|
[Zabbix][Ubuntu22.04.3 LTS] Monitoring System ๊ตฌ์ถ feat.Docker & Grafana (0) | 2023.10.06 |
[Gitlab][CI/CD] GitLab Runner ์ค์น (0) | 2023.08.02 |
[Redmine] Cell Phone, Tablet์ผ๋ก ์ ์ํ๊ธฐ (0) | 2023.07.15 |
[๊ฐ์ํ - Container] Docker๋ฅผ ์ด์ฉํ Ansible ์ค์นํ๊ธฐ (0) | 2023.07.14 |