ログについて

ログとは

ソフトウェアから出力されるメッセージのこと.

ソフトウェアの例

  • 機械学習のコード
    • scikit learn
    • TensorFlow
  • Webアプリケーション
    • Flask
    • WordPress
  • ミドルウェア
    • OpenSSH Server
    • Nginx
    • PHP-FPM
  • OS
    • Linux Kernelから出力される各種ログ
    • DeviceLog
    • AuditLog
    • SecurityLog
    • BootLog

メッセージの例

NSD(DNSサーバ用ミドルウェア)

[2020-11-17 03:35:02.681] nsd[8910]: info: XSTATS 1605551702 1603811058 RR=4 RNXD=0 RFwdR=0 RDupR=0 RFail=0 RFErr=0 RErr=0 RAXFR=0 RLame=0 ROpts=0 SSysQ=0 SAns=621 SFwdQ=0 SDupQ=0 SErr=0 RQ=637 RIQ=0 RFwdQ=0 RDupQ=0 RTCP=31 SFwdR=0 SFail=0 SFErr=2 SNaAns=3 SNXD=5 RUQ=0 RURQ=0 RUXFR=0 RUUpd=0
[2020-11-17 03:40:02.975] nsd[8911]: info: NSTATS 1605552002 1603811058 TYPE0=3 A=184 NS=28 CNAME=28 SOA=369 PTR=21 TXT=130 AAAA=106 DS=1 RRSIG=1 TYPE252=1 TYPE255=54
[2020-11-17 03:40:02.975] nsd[8911]: info: XSTATS 1605552002 1603811058 RR=4 RNXD=0 RFwdR=0 RDupR=0 RFail=0 RFErr=0 RErr=0 RAXFR=0 RLame=0 ROpts=0 SSysQ=0 SAns=908 SFwdQ=0 SDupQ=0 SErr=0 RQ=926 RIQ=0 RFwdQ=0 RDupQ=0 RTCP=35 SFwdR=0 SFail=0 SFErr=3 SNaAns=5 SNXD=0 RUQ=0 RURQ=0 RUXFR=0 RUUpd=0

Cron(バッチ処理用ミドルウェア)

Nov 15 03:34:01 lc-conoha-1g run-parts(/etc/cron.daily)[5484]: finished logrotate
Nov 15 03:34:01 lc-conoha-1g run-parts(/etc/cron.daily)[5465]: starting man-db.cron
Nov 15 03:34:01 lc-conoha-1g run-parts(/etc/cron.daily)[5495]: finished man-db.cron
Nov 15 03:34:01 lc-conoha-1g run-parts(/etc/cron.daily)[5465]: starting mlocate
Nov 15 03:34:02 lc-conoha-1g run-parts(/etc/cron.daily)[5509]: finished mlocate
Nov 15 03:34:02 lc-conoha-1g anacron[2155]: Job `cron.daily' terminated
Nov 15 03:34:02 lc-conoha-1g anacron[2155]: Normal exit (1 job run)
Nov 15 03:35:01 lc-conoha-1g CROND[5594]: (root) CMD (      /usr/bin/python3 /opt/monitoring_conoha-2g/mackerel_metric.py)
Nov 15 03:36:01 lc-conoha-1g CROND[5898]: (root) CMD (      /usr/bin/python3 /opt/monitoring_conoha-2g/mackerel_metric.py)
Nov 15 03:37:01 lc-conoha-1g CROND[5950]: (root) CMD (      /usr/bin/python3 /opt/monitoring_conoha-2g/mackerel_metric.py)

OpenSSH(SSH接続用ミドルウェア)

[tkoyama@lc-conoha-1g log]$ sudo cat secure | head
Nov 15 03:35:36 lc-conoha-1g sshd[5850]: reverse mapping checking getaddrinfo for 1-1-1-1-static.hfc.comcastbusiness.net [96.69.13.140] failed - POSSIBLE BREAK-IN ATTEMPT!
Nov 15 03:35:36 lc-conoha-1g sshd[5850]: Invalid user conectar from 1.1.1.1 port 39635
Nov 15 03:35:36 lc-conoha-1g sshd[5850]: input_userauth_request: invalid user conectar [preauth]
Nov 15 03:35:36 lc-conoha-1g sshd[5850]: Received disconnect from 1.1.1.1 port 39635:11: Bye Bye [preauth]
Nov 15 03:35:36 lc-conoha-1g sshd[5850]: Disconnected from 1.1.1.1 port 39635 [preauth]
Nov 15 03:36:56 lc-conoha-1g sshd[5916]: Invalid user sysadm from 1.1.1.1 port 38518
Nov 15 03:36:56 lc-conoha-1g sshd[5916]: input_userauth_request: invalid user sysadm [preauth]
Nov 15 03:36:56 lc-conoha-1g sshd[5916]: Received disconnect from 1.1.1.1 port 38518:11: Bye Bye [preauth]
Nov 15 03:36:56 lc-conoha-1g sshd[5916]: Disconnected from 1.1.1.1 port 38518 [preauth]
Nov 15 03:38:01 lc-conoha-1g sshd[6001]: Invalid user dennis from 1.1.1.1 port 41822

アプリケーションのスタックトレース(Python)

Traceback (most recent call last):
  File "a.py", line 5, in <module>
    print("Hello ", new_name ," san",
NameError: name 'new_name' is not defined

↑これもログの一種として扱うこともできる.

Nginx(Webサーバのアクセスログ)

213.32.122.0 - - [17/Nov/2020:03:38:33 +0900] "GET / HTTP/1.1" 200 378 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36" "-"
183.136.225.0 - - [17/Nov/2020:03:56:39 +0900] "GET / HTTP/1.1" 200 378 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:47.0) Gecko/20100101 Firefox/47.0" "-"
82.223.139.0 - - [17/Nov/2020:04:03:32 +0900] "GET /.env HTTP/1.1" 502 559 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" "-"
82.223.139.0 - - [17/Nov/2020:04:03:32 +0900] "POST / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" "-"
82.223.139.0 - - [17/Nov/2020:04:03:33 +0900] "GET /.env HTTP/1.1" 404 555 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" "-"
82.223.139.0 - - [17/Nov/2020:04:03:35 +0900] "POST / HTTP/1.1" 405 559 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" "-"
193.174.89.0 - - [17/Nov/2020:04:13:44 +0900] "GET stager HTTP/1.1" 400 157 "-" "-" "-"
193.174.89.0 - - [17/Nov/2020:04:13:44 +0900] "GET stager64 HTTP/1.1" 400 157 "-" "-" "-"
178.94.4.0 - - [17/Nov/2020:04:20:19 +0900] "GET / HTTP/1.1" 502 157 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7" "-"
61.219.11.0 - - [17/Nov/2020:04:21:53 +0900] "\x01\x00\x00\x00" 400 157 "-" "-" "-"

Linuxの場合,ログは一般に /var/log/ に配置されている.

ログの利用用途

  1. 検知と調査の両面を兼ね備えるセキュリティ: 攻撃やマルウェア感染,データ盗難をはじめとするセキュリティ上の問題を検知して対応すること
  2. コンプライアンスや規制(組織外),規定(組織内): 多様な法律や命令,フレームワークや現地の企業政策を満たすこと
  3. システムとネットワークのトラブルシューティングと通常のオペレーション: システムの問題を調査したり,システムやアプリケーションの可用性を監視したりすること

出典: Chuvakin, A.: The complete guide to log and event management, White Paper (2010).

セキュリティ

悪意をもった攻撃者によりシステムに侵入された場合にログが役立つ.「いつ,だれが,どこで,何をしたのか」をログを使うことにより追跡できる.ただし,必要なログが十分に出力され,安全に保管されていることが必要となる.

当社は、本事案発生後、当社内での調査だけでなく、情報セキュリティ関連の5社の外部専門家にも調査を依頼し、本事案の発生原因の調査を行いました。これらの外部専門家は、サイバー攻撃や情報漏えい等のサイバーセキュリティ対応、フォレンジック・マルウェア解析等に実績のある企業です。 具体的な調査内容として、通信に関するログの解析、従業員のヒアリング、当社の端末のフォレンジック調査等を実施いたしました。調査の正確性及び信頼性を高めるべく、同一の調査を複数の外部専門家において行うなどして、本事案の原因究明に努めてまいりました。

出典: 仮想通貨NEMの不正送金に関する質問

法律や規定

タイではプロキシサーバの90日分のログを保存する法律が存在する.

Proxy Server (導入とアクセスログの実態) その1 - セキュリティと日常業務の間で揺れる社内ネットワーク - RWL - builder by ZDNet Japan

企業毎に社内規定でログの最低保管期間を定める場合がある.

このとき、ログを証拠として活用する場合には、法令やガイドラインに沿った期間を目安にする必要があります。例えば、PCI DSSでは「監査証跡(ログ)の履歴を少なくとも1年間保持する」とされています。また、サイバー犯罪に関する条約では「必要な期間」として「90日」という記述があります。法令やガイドラインごとに保存すべき期間には差があります。情報の重要性などを考慮して、組織ごとに保存期間を決める必要があります。

なぜ、ログを保存することが大切なの? (3/4):セキュリティ、いまさら聞いてもいいですか?(10) - @IT

国際的な条約であるサイバー犯罪に関する条約 第16条では、90日のコンピュータデータの完全性の保全および維持を義務付けています。

企業における情報システムのログ管理に関する実態調査 - 調査報告書, 独立行政法人 情報処理推進機構

日本国内の法令では、不正アクセス禁止法の時効は3年であり、電子計算機使用詐欺罪の時効は7年である。犯罪捜査のためにログを長期にわたり保存する要件がある。

補足: PCI DSSとは

クレジットカード業界が独自に定める業界団体によるルールをPCI DSSとよぶ. 正式名称は「Payment Card Industry Data Security Standard」である. クレジットカードで買い物できるサイトを提供する事業者は,このルールを満たさないとクレジットカード情報の取り扱いができない. 例えば,CVC(カードの裏面にある数字, VisaはCVV)は保存できず破棄する必要がある.

認証データは削除しなければならない | 日経クロステック(xTECH)

システム管理やオペレーション

システムを構築したり,保守や運用を行う場面でログを使う. 例えば,システム障害の原因を探ったり,ソフトウェアのバグを見つけたりする. 利用者の問い合わせ「ガチャを引いたらポイントはなくなったが,アイテムが得られなかった」に対応するときにも役立つ.

ログの形式

ログの形式はソフトウェアによってばらつきがある.

例えば…

独自の形式

[2020-08-02T18:09:30,389][INFO ][logstash.outputs.elasticsearch][main] Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}

syslog

Nov 15 03:34:01 lc-conoha-1g run-parts(/etc/cron.daily)[5465]: starting mlocate

Apache形式

213.32.122.0 - - [17/Nov/2020:03:38:33 +0900] "GET / HTTP/1.1" 200 378 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36" "-"

混ざると…

読みにくい.

2020-11-17 14:00:53 +0000 [info]: #0 'flush_interval' is configured at out side of <buffer>. 'flush_mode' is set to 'interval' to keep existing behaviour
2020-11-17 14:00:53 +0000 [info]: adding source type="tail"
2020-11-17 14:00:53 +0000 [info]: #0 starting fluentd worker pid=45 ppid=14 worker=0
2020-11-17 14:00:53 +0000 [info]: #0 fluentd worker is now running worker=0
 ^Clevel=info ts=2020-11-17T14:01:00.3084909Z caller=signals.go:55 msg="=== received SIGINT/SIGTERM ===\n*** exiting"
2020-11-17 14:01:00 +0000 [info]: Received graceful stop
level=info ts=2020-11-17T14:01:00.3087902Z caller=lifecycler.go:444 msg="lifecycler loop() exited gracefully" ring=ingester
level=info ts=2020-11-17T14:01:00.3088167Z caller=lifecycler.go:743 msg="changing instance state from" old_state=ACTIVE new_state=LEAVING ring=ingester
level=info ts=2020-11-17T14:01:00.3087903Z caller=module_service.go:90 msg="module stopped" module=table-manager
level=info ts=2020-11-17T14:01:00.3088973Z caller=module_service.go:90 msg="module stopped" module=distributor
2020-11-17 14:01:00 +0000 [info]: Received graceful stop
level=info ts=2020-11-17T14:01:00.3088429Z caller=module_service.go:90 msg="module stopped" module=ingester-querier
level=error ts=2020-11-17T14:01:00.3090805Z caller=transfer.go:200 msg="transfer failed" err="cannot find ingester to transfer chunks to: no pending ingesters"
INFO:     Shutting down
INFO:     Waiting for application shutdown.
INFO:     Application shutdown complete.
INFO:     Finished server process [15]

ログ管理の概要

ログ管理で実現することは大まかに次の2つに分類される.

  • ログの保存
    • ファイルでディスクに保存
    • データベースに保存 → Elasticsearch, Loki, MySQL
  • ログの取り出し・検索
    • CLI(コマンドライン)から検索 → LogCLI
    • GUI(Web, 専用デスクトップアプリ)から検索 → Kibana, Grafana

Kibana

ログ管理の方法(1) Linuxコマンド

サーバーの台数が数台であれば,サーバー本体の内部に保存しておき,SSHでログインしてLinuxコマンドを組み合わせることで検索や閲覧する方法が使われる.

  • sed

  • grep

  • cut

  • head

  • tail

  • awk

パイプ

Linuxコマンドはパイプ | をつなげることで結果を次のコマンドにわたすことが出来る.

パイプは,コマンドとコマンドをつなげるホースからヒントを得た機能である. たしかUnix考古学という本で読んだ記憶がある.

echo "hello world" | cut -c 3-5

リダイレクト

Linuxコマンドは入力と出力をファイルから渡すことができる.

## echoコマンドの結果を a.txt に保存
echo hello > a.txt

sed

stream editorの略でその名の通り文字列の加工ができる.

文字列の置換によく使う.例えば,文字列 hello world Linux に含まれる LinuxWindows に置き換える場合は以下を使う.

echo Linux | sed "s/Linux/Windows/g"

grep

g/re/p (globally search for a regular expression and print matching lines)の略で,検索を行い一致した結果を表示する.

例えば,文字列 error が含まれる行だけを絞り込みたいときに使う.

## ログ・ファイル LogFile.txt の中にある error を含む行だけを表示
grep error LogFile.txt

cut

標準入力から受け取った結果を文字数や,特定も文字ごとに切り出すときに使う.

## CSVファイルの3列目だけを切り出したい
cut -f 3 -d , < sample.csv

ログ管理の方法(2) ログ管理サーバ

システム規模が拡大すると管理するサーバーの台数も増える.サーバーの台数が増えるに連れ,ログを出力する対象(プログラム)も増える.その結果,ログが全体でバラバラに存在するため,ログが必要なときに個別のサーバにログインしなければならない.

そこで,以下の図ではログを集める専用のサーバーを用意して,そこにログを集約することで個々のサーバにログインしなくとも,ログの保存や取り出しが行えるようにした.

個々のサーバからログを送信や受信するソフトウェアのことを「Log Shipper」とよぶ.Log Shipperの例には以下がある.

  • Fluentd
  • rsyslog
  • syslog-ng
  • Logstash
  • Promtail
  • Embulk
  • logtail

今までLokiを使って実験してもらった構成もこれに似ている.

ログ管理の方法(3) ログ管理サービス PaaS

ログ検索のシナリオ

Apache HTTP Serverのアクセスログを使ったトラブルシューティングのシナリオが記述されている.

Troubleshoot with Apache Logs - The Ultimate Guide To Logging