Exchange ãš ELK ã®åéãäœãæ¹æ³ã«ã€ããŠã®è©±ãç¶ããŸã (å§ãŸã)
ELK ã¹ã¿ãã¯ã® Logstash ã¯ããã°ãã€ã³ããªãžã§ã³ãã«åŠçããããã¥ã¡ã³ã圢åŒã§ Elastic ã«é
眮ããæºåãããããã«äœ¿çšãããŸããããã«åºã¥ããŠãKibana ã§ããŸããŸãªèŠèŠåãæ§ç¯ããã®ã«äŸ¿å©ã§ãã
ã€ã³ã¹ããŒã«
次㮠XNUMX ã€ã®æ®µéã§æ§æãããŸãã
- OpenJDK ããã±ãŒãžã®ã€ã³ã¹ããŒã«ãšæ§æã
- Logstash ããã±ãŒãžã®ã€ã³ã¹ããŒã«ãšæ§æã
OpenJDK ããã±ãŒãžã®ã€ã³ã¹ããŒã«ãšæ§æ
OpenJDK ããã±ãŒãžãããŠã³ããŒãããŠãç¹å®ã®ãã£ã¬ã¯ããªã«è§£åããå¿ èŠããããŸãã 次ã«ããã®ãã£ã¬ã¯ããªãžã®ãã¹ã Windows ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã® $env:Path å€æ°ãš $env:JAVA_HOME å€æ°ã«å ¥åããå¿ èŠããããŸãã
Java ã®ããŒãžã§ã³ã確èªããŠã¿ãŸãããã
PS C:> java -version
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)
Logstash ããã±ãŒãžã®ã€ã³ã¹ããŒã«ãšæ§æ
Logstash ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ã¢ãŒã«ã€ã ãã¡ã€ã«ãããŠã³ããŒããã C:Program Files
ããã¯ç¡é§ã§ããLogstash ã¯éåžžã®èµ·åãæåŠããŸãã 次ã«ããã¡ã€ã«ã«å
¥åããå¿
èŠããããŸã jvm.options
Java ããã»ã¹ã« RAM ãå²ãåœãŠãåé¡ãä¿®æ£ããŸããã ãµãŒããŒã® RAM ã®ååãæå®ããããšããå§ãããŸãã 16 GB ã® RAM ãæèŒãããŠããå Žåãããã©ã«ãã®ããŒã¯æ¬¡ã®ãšããã§ãã
-Xms1g
-Xmx1g
ã¯æ¬¡ã®ããã«çœ®ãæããå¿ èŠããããŸãã
-Xms8g
-Xmx8g
ããã«ã次ã®è¡ãã³ã¡ã³ãã¢ãŠãããããšããå§ãããŸãã -XX:+UseConcMarkSweepGC
ã ããã«è©³ãã
input {
stdin{}
}
filter {
}
output {
stdout {
codec => "rubydebug"
}
}
ãã®æ§æã§ã¯ãLogstash ã¯ã³ã³ãœãŒã«ããããŒã¿ãèªã¿åããããã空ã®ãã£ã«ã¿ãŒã«éããã³ã³ãœãŒã«ã«åºåããŸãã ãã®æ§æã䜿çšãããšãLogstash ã®æ©èœããã¹ããããŸãã ãããè¡ãã«ã¯ã察話ã¢ãŒãã§å®è¡ããŸãããã
PS C:...bin> .logstash.bat -f .logstash.conf
...
[2019-12-19T11:15:27,769][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2019-12-19T11:15:27,847][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2019-12-19T11:15:28,113][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
Logstash ã¯ããŒã 9600 ã§æ£åžžã«èµ·åããŸããã
ã€ã³ã¹ããŒã«ã®æåŸã®æé : Logstash ã Windows ãµãŒãã¹ãšããŠèµ·åããŸãã ããã¯ãããšãã°ããã±ãŒãžã䜿çšããŠå®è¡ã§ããŸãã
PS C:...bin> .nssm.exe install logstash
Service "logstash" installed successfully!
èé害æ§
ãœãŒã¹ ãµãŒããŒãã転éããããšãã®ãã°ã®å®å šæ§ã¯ãæ°žç¶ãã¥ãŒ ã¡ã«ããºã ã«ãã£ãŠç¢ºä¿ãããŸãã
ãã®ä»çµã¿
ãã°åŠçäžã®ãã¥ãŒã®ã¬ã€ã¢ãŠãã¯ãå ¥å â ãã¥ãŒ â ãã£ã«ã¿ãŒ + åºåã§ãã
å ¥åãã©ã°ã€ã³ã¯ãã° ãœãŒã¹ããããŒã¿ãåä¿¡ããããããã¥ãŒã«æžã蟌ã¿ãããŒã¿ãåä¿¡ããããšã®ç¢ºèªããœãŒã¹ã«éä¿¡ããŸãã
ãã¥ãŒããã®ã¡ãã»ãŒãžã¯ Logstash ã«ãã£ãŠåŠçããããã£ã«ã¿ãŒãšåºåãã©ã°ã€ã³ãééããŸãã ãã°ãéä¿¡ããããšããåºåããã®ç¢ºèªãåãåããšãLogstash ã¯åŠçããããã°ããã¥ãŒããåé€ããŸãã Logstash ãåæ¢ãããšããã¹ãŠã®æªåŠçã®ã¡ãã»ãŒãžãšç¢ºèªãåä¿¡ãããŠããªãã¡ãã»ãŒãžã¯ãã¥ãŒã«æ®ããLogstash ã¯æ¬¡åèµ·åæã«åŠçãç¶è¡ããŸãã
調æŽ
ãã¡ã€ã«å
ã®ããŒã§èª¿æŽå¯èœ C:Logstashconfiglogstash.yml:
queue.type
: (å¯èœãªå€ -persisted
Оmemory (default))
.path.queue
: (ããã©ã«ã㧠C:Logstashqueue ã«ä¿åããããã¥ãŒ ãã¡ã€ã«ãå«ãŸãããã©ã«ããŒãžã®ãã¹)ãqueue.page_capacity
: (æ倧ãã¥ãŒ ããŒãž ãµã€ãºãããã©ã«ãå€ã¯ 64mb)ãqueue.drain
: (true/false - Logstash ãã·ã£ããããŠã³ããåã«ãã¥ãŒåŠçãåæ¢ããããšãæå¹ãŸãã¯ç¡å¹ã«ããŸããããã¯ãµãŒããŒã®ã·ã£ããããŠã³é床ã«çŽæ¥åœ±é¿ãããããæå¹ã«ããããšã¯ãå§ãããŸãã)ãqueue.max_events
: (ãã¥ãŒå ã®ã€ãã³ãã®æ倧æ°ãããã©ã«ã㯠0 (ç¡å¶é))ãqueue.max_bytes
: (ãã€ãåäœã®æ倧ãã¥ãŒ ãµã€ãºãããã©ã«ã - 1024mb (1gb))ã
èšå®ãããŠããå Žå queue.max_events
О queue.max_bytes
ããããã®èšå®ã®ããããã®å€ã«éãããšãã¡ãã»ãŒãžã¯ãã¥ãŒã«åãå
¥ããããªããªããŸãã æ°žç¶ãã¥ãŒã®è©³çŽ°ã«ã€ããŠã¯ããã¡ããã芧ãã ããã
ãã¥ãŒã®èšå®ãæ åœãã logstash.yml ã®éšåã®äŸ:
queue.type: persisted
queue.max_bytes: 10gb
調æŽ
éåžžãLogstash æ§æ㯠XNUMX ã€ã®éšåã§æ§æãããåä¿¡ (å ¥åã»ã¯ã·ã§ã³)ã解æ (ãã£ã«ã¿ãŒ ã»ã¯ã·ã§ã³)ãElastic ãžã®éä¿¡ (åºåã»ã¯ã·ã§ã³) ãšãããåä¿¡ãã°ã®åŠçã®ããŸããŸãªãã§ãŒãºãæ åœããŸãã 以äžã§ããããã«ã€ããŠè©³ããèŠãŠãããŸãã
å ¥å
Filebeat ãšãŒãžã§ã³ãããçã®ãã°ãå«ãåä¿¡ã¹ããªãŒã ãåãåããŸãã å ¥åã»ã¯ã·ã§ã³ã§æå®ããã®ã¯ãã®ãã©ã°ã€ã³ã§ãã
input {
beats {
port => 5044
}
}
ãã®æ§æã®åŸãLogstash ã¯ããŒã 5044 ã®ãªãã¹ã³ãéå§ãããã°ãåä¿¡ãããšãã£ã«ã¿ãŒ ã»ã¯ã·ã§ã³ã®èšå®ã«åŸã£ãŠåŠçããŸãã å¿
èŠã«å¿ããŠãfilebit ãããã°ãåä¿¡ãããã£ãã«ã SSL ã§ã©ããã§ããŸãã Beats ãã©ã°ã€ã³ã®èšå®ã«ã€ããŠè©³ããèªã
ãã£ã«ã¿
Exchange ãçæããåŠçã«é¢ä¿ããããã¹ã ãã°ã¯ãã¹ãŠããã° ãã¡ã€ã«èªäœã«ãã£ãŒã«ããèšè¿°ããã CSV 圢åŒã§ãã CSV ã¬ã³ãŒãã解æããããã«ãLogstash 㯠XNUMX ã€ã®ãã©ã°ã€ã³ãæäŸããŸãã
ããšãã°ã次ã®ã¬ã³ãŒã㯠(ãã£ãŒã«ãå
ã«ã«ã³ããååšãããã) XNUMX ã€ã«åå²ãããããããã°ãæ£ãã解æãããŸããã
âŠ,"MDB:GUID1, Mailbox:GUID2, Event:526545791, MessageClass:IPM.Note, CreationTime:2020-05-15T12:01:56.457Z, ClientType:MOMT, SubmissionAssistant:MailboxTransportSubmissionEmailAssistant",âŠ
IIS ãªã©ã®ãã°ã解æãããšãã«äœ¿çšã§ããŸãã ãã®å Žåããã£ã«ã¿ãŒ ã»ã¯ã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
filter {
if "IIS" in [tags] {
dissect {
mapping => {
"message" => "%{date} %{time} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
}
remove_field => ["message"]
add_field => { "application" => "exchange" }
}
}
}
Logstash æ§æã«ããã次ã®ããšãå¯èœã«ãªããŸãã IIS
ã ãã©ã°ã€ã³å
ã§ãã£ãŒã«ãå€ãšãã®ååãç
§åããå
ã®ãã£ãŒã«ããåé€ããŸã message
ããã«ã¯ãã°ã®ãšã³ããªãå«ãŸããŠãããããšãã°ãã°ãåéããã¢ããªã±ãŒã·ã§ã³ã®ååãå«ãã«ã¹ã¿ã ãã£ãŒã«ããè¿œå ã§ããŸãã
ãã°ã远跡ããå Žåã¯ãè€éãªãã£ãŒã«ããæ£ããåŠçã§ãã csv ãã©ã°ã€ã³ã䜿çšããããšããå§ãããŸãã
filter {
if "Tracking" in [tags] {
csv {
columns => ["date-time","client-ip","client-hostname","server-ip","server-hostname","source-context","connector-id","source","event-id","internal-message-id","message-id","network-message-id","recipient-address","recipient-status","total-bytes","recipient-count","related-recipient-address","reference","message-subject","sender-address","return-path","message-info","directionality","tenant-id","original-client-ip","original-server-ip","custom-data","transport-traffic-type","log-id","schema-version"]
remove_field => ["message", "tenant-id", "schema-version"]
add_field => { "application" => "exchange" }
}
}
ãã©ã°ã€ã³å
ã§ãã£ãŒã«ãå€ãšãã®ååãç
§åããå
ã®ãã£ãŒã«ããåé€ããŸã message
(ãã£ãŒã«ãã tenant-id
О schema-version
) ã«ã¯ãã°ã®ãšã³ããªãå«ãŸããŠãããããšãã°ãã°ãåéããã¢ããªã±ãŒã·ã§ã³ã®ååãå«ãã«ã¹ã¿ã ãã£ãŒã«ããè¿œå ã§ããŸãã
ãã£ã«ã¿ãªã³ã°æ®µéã®çµäºæã«ãäžæ¬¡è¿äŒŒã§ããã¥ã¡ã³ããåãåããKibana ã§èŠèŠåã§ããããã«ãªããŸãã 次ã®ãã®ãæ¬ èœããŸãã
- æ°å€ãã£ãŒã«ãã¯ããã¹ããšããŠèªèããããããæ°å€ãã£ãŒã«ãã«å¯Ÿããæäœã¯ã§ããŸããã ã€ãŸãããã£ãŒã«ã
time-taken
IIS ãã°ãšãã£ãŒã«ãrecipient-count
Оtotal-bites
ãã°è¿œè·¡ã - æšæºããã¥ã¡ã³ãã®ã¿ã€ã ã¹ã¿ã³ãã«ã¯ããµãŒããŒåŽã§ãã°ãæžã蟌ãŸããæéã§ã¯ãªãããã°ãåŠçãããæéãå«ãŸããŸãã
- ãã£ãŒã«ã
recipient-address
XNUMX ã€ã®å»ºèšçŸå Žã®ããã«èŠãããããæçŽã®åä¿¡è ãæ°ããåæã¯ã§ããŸããã
ãã°åŠçããã»ã¹ã«ã¡ãã£ãšããéæ³ãå ããŠã¿ãŸãããã
æ°å€ãã£ãŒã«ãã®å€æ
dissect ãã©ã°ã€ã³ã«ã¯ãªãã·ã§ã³ããããŸã convert_datatype
ãããã¹ããã£ãŒã«ããããžã¿ã«åœ¢åŒã«å€æããããã«äœ¿çšã§ããŸãã ããšãã°ã次ã®ããã«ãªããŸãã
dissect {
âŠ
convert_datatype => { "time-taken" => "int" }
âŠ
}
ãã®æ¹æ³ã¯ããã£ãŒã«ãã«å¿ ãæååãå«ãŸããå Žåã«ã®ã¿é©ããŠããããšãèŠããŠãããŠãã ããã ãã®ãªãã·ã§ã³ã¯ãã£ãŒã«ãããã® Null å€ãåŠçãããäŸå€ãã¹ããŒããŸãã
ãã°ã远跡ããå Žåãåæ§ã®å€æã¡ãœããã䜿çšããªãããšããå§ãããŸãã recipient-count
О total-bites
空ããŠããå¯èœæ§ããããŸãã ãããã®ãã£ãŒã«ããå€æããã«ã¯ããã©ã°ã€ã³ã䜿çšããããšããå§ãããŸãã
mutate {
convert => [ "total-bytes", "integer" ]
convert => [ "recipient-count", "integer" ]
}
recipient_address ãåã ã®åä¿¡è ã«åå²ãã
ãã®åé¡ã¯ãmutate ãã©ã°ã€ã³ã䜿çšããŠè§£æ±ºããããšãã§ããŸãã
mutate {
split => ["recipient_address", ";"]
}
ã¿ã€ã ã¹ã¿ã³ãã®å€æŽ
ãã°ã®è¿œè·¡ã®å Žåãåé¡ã¯ãã©ã°ã€ã³ã«ãã£ãŠéåžžã«ç°¡åã«è§£æ±ºãããŸãã timestamp
ãã£ãŒã«ãããã®æ¥ä»ãšæå»ãå¿
èŠãªåœ¢åŒã§å
¥åããŸã date-time
:
date {
match => [ "date-time", "ISO8601" ]
timezone => "Europe/Moscow"
remove_field => [ "date-time" ]
}
IIS ãã°ã®å Žåããã£ãŒã«ã ããŒã¿ãçµåããå¿
èŠããããŸãã date
О time
mutate ãã©ã°ã€ã³ã䜿çšããŠãå¿
èŠãªã¿ã€ã ãŸãŒã³ãç»é²ãããã®ã¿ã€ã ã¹ã¿ã³ãã timestamp
æ¥ä»ãã©ã°ã€ã³ã䜿çšãã:
mutate {
add_field => { "data-time" => "%{date} %{time}" }
remove_field => [ "date", "time" ]
}
date {
match => [ "data-time", "YYYY-MM-dd HH:mm:ss" ]
timezone => "UTC"
remove_field => [ "data-time" ]
}
åºå
åºåã»ã¯ã·ã§ã³ã¯ãåŠçããããã°ããã°åä¿¡è
ã«éä¿¡ããããã«äœ¿çšãããŸãã Elasticã«çŽæ¥éä¿¡ããå Žåã¯ãã©ã°ã€ã³ã䜿çšããŸã
output {
elasticsearch {
hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
manage_template => false
index => "Exchange-%{+YYYY.MM.dd}"
}
}
æçµæ§æ
æçµçãªæ§æã¯æ¬¡ã®ããã«ãªããŸãã
input {
beats {
port => 5044
}
}
filter {
if "IIS" in [tags] {
dissect {
mapping => {
"message" => "%{date} %{time} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
}
remove_field => ["message"]
add_field => { "application" => "exchange" }
convert_datatype => { "time-taken" => "int" }
}
mutate {
add_field => { "data-time" => "%{date} %{time}" }
remove_field => [ "date", "time" ]
}
date {
match => [ "data-time", "YYYY-MM-dd HH:mm:ss" ]
timezone => "UTC"
remove_field => [ "data-time" ]
}
}
if "Tracking" in [tags] {
csv {
columns => ["date-time","client-ip","client-hostname","server-ip","server-hostname","source-context","connector-id","source","event-id","internal-message-id","message-id","network-message-id","recipient-address","recipient-status","total-bytes","recipient-count","related-recipient-address","reference","message-subject","sender-address","return-path","message-info","directionality","tenant-id","original-client-ip","original-server-ip","custom-data","transport-traffic-type","log-id","schema-version"]
remove_field => ["message", "tenant-id", "schema-version"]
add_field => { "application" => "exchange" }
}
mutate {
convert => [ "total-bytes", "integer" ]
convert => [ "recipient-count", "integer" ]
split => ["recipient_address", ";"]
}
date {
match => [ "date-time", "ISO8601" ]
timezone => "Europe/Moscow"
remove_field => [ "date-time" ]
}
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
manage_template => false
index => "Exchange-%{+YYYY.MM.dd}"
}
}
䟿å©ãªãªã³ã¯ïŒ
Windows ã« OpenJDK 11 ãã€ã³ã¹ããŒã«ããã«ã¯ã©ãããã°ããã§ãã? ãã°ã¹ã¿ãã·ã¥ãããŠã³ããŒã Elastic ã¯éæšå¥šã®ãªãã·ã§ã³ UseConcMarkSoupGC #36828 ã䜿çšããŸã NSSM æ°žç¶çãªãã¥ãŒ Beatså ¥åãã©ã°ã€ã³ Logstash ãããç§ã®ãã§ãŒã³ãœãŒã¯ã©ãã ïŒ ãã°ãåæããå¿ èŠããã åæãã£ã«ã¿ãŒãã©ã°ã€ã³ æ¡ä»¶åŒ å€ç°ãã£ã«ã¿ãŒãã©ã°ã€ã³ æ¥ä»ãã£ã«ã¿ãŒãã©ã°ã€ã³ Elasticsearchåºåãã©ã°ã€ã³
åºæïŒ habr.com