ExchangeãšELKã®åéãäœãæ¹æ³ã«ã€ããŠã®ç§ã®è©±ãç¶ããŸãïŒããããå§ããŠãã ããïŒããã®çµã¿åããã§ã¯ãéåžžã«å€ãã®ãã°ãããããããšãªãåŠçã§ããããšãæãåºããŠãã ãããä»åã¯ãExchangeãLogstashããã³Kibanaã³ã³ããŒãã³ããšé£æºãããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ELKã¹ã¿ãã¯ã®Logstashã¯ããã°ãã€ã³ããªãžã§ã³ãã«åŠçããããã¥ã¡ã³ãã®åœ¢åŒã§Elasticã«é 眮ããæºåãããããã«äœ¿çšãããŸããããã«åºã¥ããŠãKibanaã§ããŸããŸãªèŠèŠåãæ§ç¯ãããšäŸ¿å©ã§ãã
ã€ã³ã¹ããŒã«
2ã€ã®æ®µéã§æ§æãããŸãã
- 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ã®ååãæå®ããããšããå§ãããŸãã圌ã16GBã®RAMãæèŒããŠããå Žåãããã©ã«ãã®ããŒã¯æ¬¡ã®ãšããã§ãã
-Xms1g
-Xmx1g
次ã®ããã«çœ®ãæããå¿ èŠããããŸãã
-Xms8g
-Xmx8g
è¡ãã³ã¡ã³ãã¢ãŠãããããšããå§ãã
-XX:+UseConcMarkSweepGC
ãŸãã詳ããã¯ãã¡ããã芧ãã ããã次ã®ã¹ãããã¯ãlogstash.confãã¡ã€ã«ã«ããã©ã«ãæ§æãäœæããããšã§ãã
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ãµãŒãã¹ãšããŠèµ·åããããšã§ããããã¯ãããšãã°ãNSSMããã±ãŒãžã䜿çšããŠå®è¡ã§ããŸãã
PS C:\...\bin> .\nssm.exe install logstash
Service "logstash" installed successfully!
èé害æ§
æ°žç¶ãã¥ãŒã¡ã«ããºã ã¯ããœãŒã¹ãµãŒããŒããã®éä¿¡äžã®ãã°ã®å®å šæ§ãä¿èšŒããŸãã
ããã¯ã©ã®ããã«æ©èœããŸãã
ãã°åŠçäžã®ãã¥ãŒã®ã¬ã€ã¢ãŠãïŒå ¥åâãã¥ãŒâãã£ã«ã¿ãŒ+åºåã
å ¥åãã©ã°ã€ã³ã¯ããã°ãœãŒã¹ããããŒã¿ãåä¿¡ããããããã¥ãŒã«æžã蟌ã¿ãããŒã¿ã®å信確èªããœãŒã¹ã«éä¿¡ããŸãã
ãã¥ãŒããã®ã¡ãã»ãŒãžã¯Logstashã«ãã£ãŠåŠçããããã£ã«ã¿ãŒãšåºåãã©ã°ã€ã³ãééããŸããLogstashã¯ããã°éä¿¡ã®åºåãã確èªãåãåããšãåŠçããããã°ããã¥ãŒããåé€ããŸããLogstashãåæ¢ããå ŽåãæªåŠçã®ã¡ãã»ãŒãžãšéä¿¡ã®ç¢ºèªãåä¿¡ããŠââããªãã¡ãã»ãŒãžã¯ãã¹ãŠãã¥ãŒã«æ®ããLogstashã¯æ¬¡åã®èµ·åæã«ããããåŠçãç¶ããŸãã
ã»ããã¢ãã
ãã¡ã€ã«å ã®ããŒã«ãã£ãŠèª¿æŽãããŸã
C:\Logstash\config\logstash.yml:
queue.type
ïŒïŒå¯èœãªå€ã¯persisted
ãšmemory (default))
ãpath.queue
ïŒ(ããã©ã«ãã§CïŒ\ Logstash \ queueã«ä¿åãããŠãããã¥ãŒãã¡ã€ã«ãå«ããã©ã«ããŒãžã®ãã¹ïŒã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æ§æã¯éåžžãåä¿¡ãã°ã®åŠçã®ããŸããŸãªãã§ãŒãºïŒåä¿¡ïŒå ¥åã»ã¯ã·ã§ã³ïŒã解æïŒãã£ã«ã¿ãŒã»ã¯ã·ã§ã³ïŒãElasticãžã®éä¿¡ïŒåºåã»ã¯ã·ã§ã³ïŒïŒãæ åœãã3ã€ã®éšåã§æ§æãããŸãã以äžã§ã¯ãããããã«ã€ããŠè©³ããèŠãŠãããŸãã
å ¥å
çã®ãã°ãå«ãçä¿¡ã¹ããªãŒã ã¯ããã¡ã€ã«ããŒããšãŒãžã§ã³ãããåä¿¡ãããŸããå ¥åã»ã¯ã·ã§ã³ã§æå®ããã®ã¯ãã®ãã©ã°ã€ã³ã§ãã
input {
beats {
port => 5044
}
}
ãã®èšå®åŸãLogstashã¯ããŒã5044ã§ãªãã¹ã³ãéå§ãããã°ãåä¿¡ãããšããã£ã«ã¿ãŒã»ã¯ã·ã§ã³ã®èšå®ã«åŸã£ãŠãã°ãåŠçããŸããå¿ èŠã«å¿ããŠããã¡ã€ã«ããããããã°ãåä¿¡ããããã®ãã£ãã«ãSSLã§ã©ããã§ããŸããããŒããã©ã°ã€ã³ã®èšå®ã«ã€ããŠè©³ããã¯ããã¡ããã芧ãã ããã
ãã£ã«ã¿
ExchangeãåŠçã®ããã«çæãããã¹ãŠã®èå³æ·±ãããã¹ããã°ã¯ããã°ãã¡ã€ã«èªäœã«èšè¿°ããããã£ãŒã«ããæã€csv圢åŒã§ããïŒCSVã¬ã³ãŒãã解æããããã«ãLogstashã¯ç§éã«3ã€ã®ãã©ã°ã€ã³æäŸè§£åãCSVãGROKãã1ã€ç®ã¯æéã§ãããæãåçŽãªãã°ãã解æã§ããŸããã
ããšãã°ã次ã®ã¬ã³ãŒãã2ã€ã«åå²ããŸãïŒãã£ãŒã«ãå ã«ã³ã³ããååšããããïŒãããã«ããããã°ã誀ã£ãŠè§£æãããŸãã
âŠ,"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æ§æã§ã¯æ¡ä»¶ä»ãã¹ããŒãã¡ã³ããèš±å¯ãããŠãããããfilebeatã¿ã°ã§ããŒã¯ãããdissectãã©ã°ã€ã³ã«ã®ã¿ãã°ãéä¿¡ã§ããŸã
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
ã¯åäžã®æ§é ã®ããã«èŠããŸãããæåã®åä¿¡è ãæ°ããããšã«ããåæã¯ã§ããŸããã
ä»ããããã°åŠçããã»ã¹ã«éæ³ãå ãããšãã§ãã
æ°å€ãã£ãŒã«ãã®å€æ
dissectãã©ã°ã€ã³ã«ã¯ã
convert_datatype
ããã¹ããã£ãŒã«ããããžã¿ã«åœ¢åŒã«å€æããããã«äœ¿çšã§ãããªãã·ã§ã³ããããŸããããšãã°ã次ã®ããã«ãªããŸãã
dissect {
âŠ
convert_datatype => { "time-taken" => "int" }
âŠ
}
ãã®æ¹æ³ã¯ããã£ãŒã«ãã«æååã確å®ã«å«ãŸããå Žåã«ã®ã¿é©ããŠããããšãèŠããŠãã䟡å€ããããŸãããã®ãªãã·ã§ã³ã¯ããã£ãŒã«ãããã®nullå€ãåŠçãããäŸå€ã«ã¹ããŒãããŸãã
ãã°ã®å€æã远跡ããå Žåããã£ãŒã«ã
recipient-count
ãštotal-bites
ã¯ç©ºçœã«ãªãå¯èœæ§ããããããåæ§ã®æ¹æ³ã¯é¿ããå¿
èŠããããŸãããããã®ãã£ãŒã«ããå€æããã«ã¯ãmutateãã©ã°ã€ã³ã䜿çšããããšããå§ãããŸãã
mutate {
convert => [ "total-bytes", "integer" ]
convert => [ "recipient-count", "integer" ]
}
receive_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ã«çŽæ¥éä¿¡ããå Žåã¯ãelasticsearchãã©ã°ã€ã³ã䜿çšãããŸããããã¯ãçæãããããã¥ã¡ã³ããéä¿¡ããããã®ãµãŒããŒã¢ãã¬ã¹ãšã€ã³ããã¯ã¹åã®ãã³ãã¬ãŒããæå®ããŸãã
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}"
}
}
䟿å©ãªãªã³ã¯ïŒ
- OpenJDK 11ãWindowsã«ã€ã³ã¹ããŒã«ããã«ã¯ã©ãããã°ããã§ããïŒ
- LogstashãããŠã³ããŒããã
- Elasticã¯å°çšãªãã·ã§ã³UseConcMarkSweepGCïŒ36828ã䜿çšããŸã
- NSSM
- æ°žç¶ãã¥ãŒ
- å ¥åãã©ã°ã€ã³ãæã¡è² ãã
- Logstash Dudeãç§ã®ãã§ãŒã³ãœãŒã¯ã©ãã«ãããŸããïŒãã°ãåæããå¿ èŠããããŸã
- ãã£ã«ã¿ãŒãã©ã°ã€ã³ãåæãã
- æ¡ä»¶ä»ã
- ãã£ã«ã¿ãã©ã°ã€ã³ãå€æŽããŸã
- æ¥ä»ãã£ã«ã¿ãŒãã©ã°ã€ã³
- Elasticsearchåºåãã©ã°ã€ã³