33
Copyright © 2016 TIS Inc. All rights reserved. 戦略技術センター 高橋和也 機械学習を用いた AWS CloudTrailログの積極的活用 July Tech Festa 2016 2016/07/24

機械学習を用いたAWS CloudTrailログの積極的活用

Embed Size (px)

Citation preview

Copyright © 2016 TIS Inc. All rights reserved.

戦略技術センター

高橋和也

機械学習を用いた AWS CloudTrailログの積極的活用

July Tech Festa 2016

2016/07/24

Copyright © 2016 TIS Inc. All rights reserved. 1

はじめに

本日の話

インフラエンジニアと機械学習

Amazon MLを用いて試行錯誤しながらログデータを機械学習させてみた事例

機械学習に触れてみて感じたこと

以下は出てきません

機械学習の理論やアルゴリズムの話

機械学習を活用して効果を挙げた事例

色々試してみたけれど、今のところ成功したかというと・・・

Copyright © 2016 TIS Inc. All rights reserved. 2

自己紹介

発表者

高橋和也

TIS株式会社 戦略技術センター所属

インフラ関連技術の活用に向けた検証や開発等を担当

主な経歴

社内システム運用

各種クラウドサービスの検証

Zabbixの拡張ツールであるHyClopsの開発

クラウドオーケストレーションツールCloudConductorの開発

機械学習の経験は無し

今年の4月から着手

Copyright © 2016 TIS Inc. All rights reserved. 3

背景

Copyright © 2016 TIS Inc. All rights reserved. 4

機械学習に対する期待の高まり

データ分析・活用の手段として機械学習に注目が集まっている

少し前からある事例

大量の購買データをリコメンドに利用

大量のセンサデータを障害予測に利用

ディープラーニングの登場でさらに適用範囲は拡大

解決したい問題にあわせて与える学習データを人が調整するのではなく、 大量に蓄積されたデータを大規模環境で学習させて法則を見つけ出す

法則を言語化しづらい画像認識などでも活躍

でも大量のデータを持っていない企業には縁が無い?

本当に大量にデータが無いといけないのか?

本当にインフラエンジニアは知らなくてよいのか?

まずは手元のデータで何ができて、何が足りないのか試してみよう

Copyright © 2016 TIS Inc. All rights reserved. 5

インフラエンジニアの身近にあるデータといえば

運用現場に眠る様々なログ

ログを残しておくことは運用上重要

現在の状態の把握

問題発生の検出

問題の原因切り分け

監査証跡

運用現場には大量のログデータが蓄積されている

AWS上だけでも様々なログが記録されている

CloudTrail: AWSのAPI呼び出しログ

VPC Flow Logs: VPC上のリソースの通信ログ

S3 Bucket Logging: S3のアクセスログ

CloudWatch Logs: 各サーバから収集したログやLambda Functionの実行ログ

でも普段から人がログに目を通す余裕は無い

Copyright © 2016 TIS Inc. All rights reserved. 6

ログデータの特徴

どのような特徴を持っているか

データ量がそれなりに多い

日常的に利用されるシステムのアクセスログは、不特定多数のユーザを対象としていなくても長期間集めればある程度のボリュームになる

製品毎に一定のフォーマットに従って出力されている

機械学習を適用するためのデータ加工がしやすい

一度うまくいけば同一製品/機器を使う他の運用現場にもノウハウを 横展開しやすい

長期間にわたり保管されている

思い立ってからデータを集め始めなくても過去のデータを活用できる

人が全部目を通すのは大変

何か問題が起きない限り確認されないログも多い

Copyright © 2016 TIS Inc. All rights reserved. 7

これまでのログデータ活用: 監視

ログデータは監視対象としても重要

障害につながるエラーログの検出

バッチ処理等の成功/失敗の確認

想定外のアクセスの検出

ログ監視は監視ルールのメンテナンスが大変

出力されるログメッセージを事前に把握する必要がある

ログレベルが出力される場合は比較的監視しやすいが、そうでない場合は 出力されるメッセージ内容の把握が必要

めったに出ないログメッセージは事前に調べるのが難しい

バージョンアップ等で変更があるとまた対応が必要

環境によって注視すべきログが異なる場合が多い

機械学習を使ってルールを置き換えられないか

Copyright © 2016 TIS Inc. All rights reserved. 8

これまでのログデータ活用: 可視化

ログの検索・可視化が簡単に実現可能な時代に

Elastic Stack, Splunk, etc.

AWSであればAmazon Elasticsearch Service (Amazon ES)

可視化することでログの傾向を短時間で確認可能

例: 過去1週間のアクセスログ件数の推移

例: 権限不足により拒否された操作ログを種別毎に抽出

しかし可視化した結果をどう判断するかはまだ人に委ねられている

例: このアクセス傾向は普段通りなのか、普段と異なるのか

例: この拒否された操作は問題ないのか、攻撃の兆候なのか

機械学習を使って自動的に判断できないか

Copyright © 2016 TIS Inc. All rights reserved. 9

機械学習に触れてみよう

Copyright © 2016 TIS Inc. All rights reserved. 10

機械学習とは?

機械学習に対して持っていた漠然としたイメージ

数式がたくさん出てきて統計学の知識が必要。難しそう。

大規模な並列分散処理を行う環境が必要。手が出しにくい。

しかし今ならクラウドサービスがある

理論やアルゴリズムを知らなくてもとりあえずは使える

覚えるのは詰まってからでも遅くない

自前で環境を用意する必要が無い

試行錯誤する段階では財布にやさしい

機械学習関連のクラウドサービスの例

Amazon Machine Learning

Azure Machine Learning

Google Prediction API / Cloud Machine Learning

Copyright © 2016 TIS Inc. All rights reserved. 11

機械学習でできること

教師あり学習

入力と対応する答えの例を大量に与えると、その法則を学習して 他の入力に対しても答えを導き出す

例: あるアクセスログを見て、通常のアクセスか不審なアクセスか分類

例: バッチ処理の入力データを見て、そのデータの処理にかかる時間を推定

学習データの答えは事前に用意しておく必要がある

教師なし学習

大量の入力を与えると、それらの入力から関係性を見出す

例: 似た入力をまとめて複数のクラスタにグルーピングする

学習データに答えは用意しなくて良いが、機械学習から得られた結果が妥当かどうかは人が解釈する必要がある

Copyright © 2016 TIS Inc. All rights reserved. 12

今回の題材: AWS CloudTrailのログを用いた操作主体分類

AWS CloudTrailのログには様々なAPI呼び出しが記録される

人による操作

Management Console

CLI

連携させた外部サービス/スクリプトによる操作

AccessKey/SecretKeyによるスクリプト/外部ツール連携

Instance ProfileによるEC2インスタンス内からのAPI呼び出し

SAMLによる外部サービス連携

何らかのEventと連動したLambda Functionからの操作

AWS Config Rules

AWS CloudWatch Event

その他 S3/SNS/DynamoDB/CloudWatch Logs等との連携

それぞれで傾向は異なるため、操作主体を区別して可視化したい

Copyright © 2016 TIS Inc. All rights reserved. 13

ログの特徴

同一の操作でも操作主体や対象サービスによってログ内容が異なる

ec2:RunInstancesの場合

人がManagementConsoleから起動した場合

sourceIPAddress: 接続元IP

userAgent: signin.amazonaws.com

人がSwitchRoleした後ManagementConsoleから起動した場合

sourceIPAddress: 接続元IP

userAgent: console.ec2.amazonaws.com

人がManagementConsoleからMarketplaceのAMIを起動した場合

sourceIPAddress: marketplace.amazonaws.com

userAgent: marketplace.amazonaws.com

スクリプトからSDKを使って起動した場合

sourceIPAddress: 接続元IP

userAgent: 利用したツールやSDKのuserAgent

上記のような傾向は対象サービス毎にさらに少しずつ異なる

Copyright © 2016 TIS Inc. All rights reserved. 14

現状の課題

ルールベースでログから操作主体を区別するのが難しい

どんなログであれば人による操作なのか

Management Consoleでの操作の場合

userAgent = "signin.amazonaws.com"の場合?

他にも"AWS CloudWatch Console"とか"[S3Console/0.4]"とか色々ある

これからも新サービスが出るたびに増え続ける

ルール化できないこともない気がするが、ルールのメンテナンスで 挫折することが目に見えている

結局使われているUser/Role名を見て判断する

このアカウントではこのUser/Roleはこの用途で使われているはず

この判断基準だと運用ルールに依存し、横展開が難しい

さらにRoleを追加するたびにフィルタルールの更新が必要に

Amazon MLを試してみよう

Copyright © 2016 TIS Inc. All rights reserved. 15

今回用意した学習データ

検証用AWSアカウントのCloudTrailログ

対象データ: 2016年6月に記録されたログ

対象データ件数: 7467件 (重複排除後)

学習用データ(70%): 5235件

評価用データ(30%): 2232件

Copyright © 2016 TIS Inc. All rights reserved. 16

前準備: 学習データの整形

CloudTrailのログをAmazon ML用に整形

JSONで記述されているログをCSV形式に変換

今回はアカウントの運用ルールに左右されにくい属性のみを利用

その他の属性はラベル付け時には参照したが、学習データには含めていない

属性名 データ例

awsRegion ap-northeast-1

eventName RunInstances

eventSource ec2.amazonaws.com

eventType AwsApiCall

sourceIPAddress 52.197.67.xxx, lambda.amazonaws.com

userAgent awslambda-worker

userIdentity.accessKeyId (先頭4文字) AKIA, ASIA

userIdentity.invokedBy signin.amazonaws.com, (空値)

userIdentity.type IAMUser, AssumedRole

Copyright © 2016 TIS Inc. All rights reserved. 17

前準備: ラベルの付与

手作業で答えとなるラベルを付与

今回は以下の4カテゴリに分類

Human (人による操作)

Script (スクリプトや外部ツールによる操作)

AWSLambda (Lambda Functionによる操作)

AWSService (AWSの他のサービスによる操作)

分類毎のデータの分布

Copyright © 2016 TIS Inc. All rights reserved. 18

Amazon ML: DataSource登録

先ほど用意したCSVファイルをDataSourceとして登録

S3上にファイルを格納してファイルパスを指定

この後デフォルト設定で進めるなら、データは事前にシャッフルしておく

データの各属性のタイプを指定

Binary, Number, Text, Categorical

今回はUserAgentとSourceIPAddressがText、それ以外はCategorical

最後に機械学習で推定したい属性を指定

Copyright © 2016 TIS Inc. All rights reserved. 19

Amazon ML: Model作成

どのような学習モデルを生成するかを設定

今回はデフォルト設定を利用

今回は目的変数がCategoricalなので、 多項分類が行われる

データは学習用(70%)と 評価用(30%)に分割

後は評価用データを用いてEvaluationまで実施 してくれる

簡単!

Copyright © 2016 TIS Inc. All rights reserved. 20

Amazon ML: Evaluation結果の確認

評価結果

同一アカウント、同一時期であればそれなりには分類できそう

分割した評価データ(左)では高い精度で分類できている

追加で翌月のログ2週間分もラベルを付与して評価した場合(右)は Scriptに関してはうまく分類できていないデータがあった

外した5件は学習データに含まれていなかったツールのログだった

Copyright © 2016 TIS Inc. All rights reserved. 21

Amazon ML: 追加の評価

では別のAWSアカウントのログの場合はどうなるか

開発に利用している別のAWSアカウントのログを1日分だけ 借りてきて同様にラベルを付与

データ数3771件、このアカウントではAWS Lambdaは利用していない

評価結果は微妙な結果に

学習データには無かったスクリプトや外部ツールの分類精度が低い

しかし初出のスクリプト全てが分類できなかったわけではない

学習データには無かったCloudFormationから間接的に呼び出されるAPI呼び出しの分類精度が低い

Copyright © 2016 TIS Inc. All rights reserved. 22

評価結果を踏まえた改善

評価結果が出てからが機械学習の本番

機械学習を動かしてみるだけであれば、知識が無くても簡単

結果を解釈してどのように改善していくかは、知識が無いと厳しい

試してみたけれどぱっとしない結果のまま詰まってしまう

今回はどのように改善すべきか

学習データの多様性の向上

そもそも複数のアカウントへの適用を想定するのであれば、 学習データも用途が異なる複数のアカウントから集めるべき

最も確実だと思われるが、手作業でのラベルの付与作業が負担に

ラベル付与を半自動化する仕組みが無いと厳しい

使い方の転換

学習データの元となったアカウントであれば精度が出るのであれば、 まずはそのアカウントだけでしばらく運用し、他の課題を洗い出す

もう少し腰を据えて学習データをためる仕組みを作ってみよう

Copyright © 2016 TIS Inc. All rights reserved. 23

その他の試行錯誤してみた例

Copyright © 2016 TIS Inc. All rights reserved. 24

行き詰った事例1: 普段行われない外部への通信の検出

目的

AWSのVPC Flow Logsを使うと通信ログを記録することができる

InboundはSecurityGroupでしっかり塞いでいるが、Outboundの通信は検証用アカウントなので厳密に制御していない

常時稼動させているサーバの過去の通信ログを学習すれば、そのサーバが普段行わない不審な外部通信を見つけられないか

結果 (Azure MLでAnomaly Detectionを利用)

アクセス先が一定でないサーバでは、頻度の低い通信が検出される

正常な通信も不審な通信もHTTP(S)通信にしか見えず、傾向が出にくい

これはデータがより蓄積されれば、用途によってはパケット数や転送データ量で区別できるようになる可能性はある

アクセス先が一定なサーバであれば、ホワイトリストを作った方が早い

Copyright © 2016 TIS Inc. All rights reserved. 25

行き詰った事例2: 定常的なログと例外的なログの分類

目的

定常運用中のサーバは出力されるログもある程度一定である

エラーログは監視で検知するが、その他の例外的なログは拾っていない

過去のログメッセージを学習させれば、普段出ていないINFOやWARNINGのログをうまく分類できるのでは無いか

結果

過去にも出ていて学習データに含まれていた例外的ログに関しては メッセージが一部変化していてもほぼ正確に分類できる

学習データに含まれていない初出のログメッセージは分類が安定しない

普段発生しないログメッセージを学習データに含めるのは難しい

Copyright © 2016 TIS Inc. All rights reserved. 26

行き詰った事例の共通点

単一のデータだけを見てできることを考えている

人が判断する場合、一種類のデータだけを見て判断することは少ない

複数のログを確認して総合的に考える

運用設計の内容も踏まえて考える

メンテナンスなどのイベントも把握している

その時世の中で流行っている攻撃方法の特性も考慮する

データを見て適用先を考えていると、目的がぶれやすい

どのような課題を解決したいのかを決め、そのためにどのようなデータが役立ちそうか考えるべき

複数のデータが役立ちそうなら組み合わせてみる

判断に前提知識が必要そうであれば、事前に学習データに組み込んでみる

課題解決に必要なデータが足りなければ、まずはためる仕組みから

人が気付いていない法則を学習させるためには、 多様性が保たれた大量の学習データを用意することが前提

Copyright © 2016 TIS Inc. All rights reserved. 27

機械学習に触れてみて感じたこと

Copyright © 2016 TIS Inc. All rights reserved. 28

機械学習に触れてみて (1/2)

人は様々な情報を組み合わせて判断を下している

今回のCloudTrailログを用いた例の場合

環境特有の知識

このIAM Roleはこの目的に使用している

このIPアドレスは社内からのアクセスである

過去に起こったイベントの知識

この機能はこの頃から使い始めた

こうした情報は機械学習で扱いやすい形式になっていない

Excelの設計書等にしか記載されていなかったり

本当に機械学習に代替させたい問題の答えは、扱いやすいデータとして記録できていない

教師あり学習では答えは事前に用意しなければいけない

答えに相当する、人の判断結果は意外と記録されていない

記録されていてもフォーマットが一定でない

Copyright © 2016 TIS Inc. All rights reserved. 29

機械学習に触れてみて (2/2)

実際に機械学習に触れてみると、データに対する意識が変わる

色々学習させてみると、こういう属性も取得してあればよかったのに と思うようになる

例: Apacheのアクセスログにこういう情報も含めておけばよかった

例: rsyslogの標準フォーマットではログに年の情報がなかった

重要なのは頻度の低い事象の記録

よく起こる事象はルールベースでも対応しやすい

学習データに無い事象に機械学習で対応させるのは難しい

少なくとも似た事象のデータが含まれていないと推測できない

単一のPJや組織で記録しているデータにはそれほど多様性は無い

Copyright © 2016 TIS Inc. All rights reserved. 30

機械学習との付き合い方

まずは試してみて、普段の業務におけるデータの捉え方を見直す 良い機会とする

今見直しておけば、1年後にはデータの量や質に差がつく

何か人が判断を下したときは、その時の情報と下した判断結果を 扱いやすい形式で残しておこう

今まで短期間分しか残していなかったログももう少しためてみよう

小さな問題から補助的に適用してみる

手元にあるそれほど多くないデータだけでもできることはある

過去に起こった事と同じ内容であれば高い精度で推定できる

新しく起こったことでも、それを再学習させれば次からは推定できる

ただし目的意識は明確に

目的を明確にしておかないと、何をKPIとして結果を評価すべきかが 定まらない

別の方法で達成可能であるのであればそれで構わない

Copyright © 2016 TIS Inc. All rights reserved. 31

まとめ

インフラエンジニアにも機械学習は無縁では無い

運用現場には様々なログデータが存在する

知らなければどう活用してよいか検討できない

機械学習は怖くない

知識がなくても初期設定で動かしてみるだけなら簡単

どう活用するかのアイデアと、対象領域に関する知識が重要に

まずは試してみてどのようなものか知ろう

多分最初から役に立つものは作れない

ルールベースでも日常的な運用の大部分はカバーできている

非日常的なイベントを機械学習で解決するにはデータが足りない

データをためる仕組みを作るためには、知ることが重要

こういうデータもあればよかったという気付きが1年後の改善へ

ご清聴ありがとうございました