この記事でやること
前回の記事では osquery でサーバー情報をJSON形式のログに出力できるところまで確認しました。
この記事では出力されたログを AWS Firehose 経由で S3 に転送し、AWS Athena で分析してみようと思います。
参考にしたページ
Capturing Osquery query results with AWS Firehose (Kinesis) and AWS Athena
動作環境
前回の記事で作成した Amazon Linux 2 のEC2インスタンスをそのまま利用します。サーバー内で実行する作業があるのでセッションマネージャー等で接続できるようにしておいてください。
AWS S3 バケットを作成
まずはS3のマネジメントコンソールでログを保管先(=Firehoseの転送先)とするS3バケットを作成します。
作成するバケットに特別な権限を付与する必要はありません。
Kinesis Firehose の配信ストリームを作成
サーバーから osquery のログを転送する Kinesis Firehose 配信ストリームを作成します。
- マネジメントコンソールからKinesisダッシュボードを開き「今すぐ始める - Kinesis Data Firehose」を選択して「配信ストリームを作成」を押します。
- Create a delivery stream 画面で必要事項を入力して「Create delivery stream」を押します。
Firehose にデータ送信する IAM ユーザーを作成
osquery が Firehose へデータをプッシュする権限を持つ IAM ユーザーを作成します。
- IAM のマネジメントコンソールから IAM ポリシーを作成します。
- ポリシーの作成画面の入力項目
- サービス: Firehose
- アクション: PutRecordBatch ※キャプチャでは他のアクションを含めてますがこれだけでいいはず
- リソース: 先に作成した配信ストリームのARN
- ポリシーの作成画面の入力項目
- IAM ユーザーを作成します。クレデンシャル情報は記録しておきましょう。
- ユーザーの作成画面の入力項目
- ユーザー名: osquery-test ※任意の名前
- AWS 認証情報タイプを選択: アクセスキー - プログラムによるアクセス をチェック
- ユーザーの作成画面の入力項目
- また、作成した IAM ユーザーには先ほどのポリシーをアタッチしてください。
osquery から Firehose にデータを送信する
osquery を実行するサーバーに接続してシェルから osquery を設定していきます。
- 設定ファイル(/etc/osquery/osquery.conf)に Firehose へログ送信する aws_firehose プラグインの設定を追加します。
sh-4.2$ sudo vi /etc/osquery/osquery.conf
"options": {
"config_plugin": "filesystem",
// Firehoseにログを送信するplugin:aws_firehose を追加
"logger_plugin": "filesystem,aws_firehose",
// aws_firehoseプラグイン用の設定を追加
"aws_access_key_id": "作成したIAMユーザーのアクセスキー",
"aws_secret_access_key": "作成したIAMユーザーのシークレットアクセスキー",
"aws_region": "配信ストリームを作成したリージョン",
"aws_firehose_stream": "osquery-test", // 作成した配信ストリームの名前
・・・
}
// テスト結果を確認しやすくするために以下も変更
"schedule": {
"system_info": {
"query": "SELECT hostname, cpu_brand, physical_memory FROM system_info;",
//"interval": 3600
"interval": 60, // 取得間隔を60秒に変更
"snapshot": true // ログの形式をスナップショットに変更
}
- osqueryd を起動します。
sh-4.2$ sudo systemctl start osqueryd
- しばらく待つと Firehose 配信ストリームの宛先に指定した S3 バケットにログが溜まっていきます。
- osqueryでは1分単位でログを取得しますがS3へは5分位の間隔で送信されていました。osqureyd側でバッファリングして送っているのでしょうか?
- ログの中身を覗いてみましょう。ここでは見やすいよう改行していますが実際のログには1イベント1行で出力されています。
前半戦終了
ここまでで osquery のログを AWS Firehose 経由で S3 バケットに集約することができました。
ここからは S3 バケットに保存されたログを Athena で分析する手順を記載していきます。
AWS Glue を設定
- Athenaのマネジメントコンソールから「データソース - データソースを接続」を開き、以下を選択して「AWS Glueの作成」を押します。
- データソースの選択: S3 - AWS Glue データカタログ
- AWS Glue データカタログを選択:このアカウントの AWS Glue データカタログ
- テーブルの作成方法を選択:AWS Glue でクローラを作成
- AWS Glue Consoleが立ち上がったら「今すぐ始める」を押し、「テーブル - クローラを使用してテーブルを追加」を押します。
-
クローラの追加画面からクローラを作成していきます。
-
作成されたクローラを選択してクローラの実行を押しましょう。
- クローラの実行が終わるとテーブルが作成されています。
AWS Athena でクエリを実行
クローラで作成されたテーブルに対して Athena でクエリを実行してみましょう。
-
Athenaのマネジメントコンソールからクエリエディタを開きます。
- あらかじめ「設定 - クエリの結果と暗号化の設定」でクエリ実行結果を保存するバケットフォルダを選択しておいてください
-
クエリエディタからクエリを実行します。
これで必要な作業は完了です!
osquery でサーバーから収集する情報を増やしつつ、いろんなAthenaクエリを実行して分析していきましょう。
まとめ
この記事では osquery で収集したサーバー情報のログを AWS Firehose 経由で S3 に転送し AWS Athena で分析しました。
osquery には標準で AWS Kinesis Firehose や Kinesis Stream にログを転送するプラグインが組み込まれているので、あまり手間をかけずに Athena で分析可能な形に集約することが可能です。一度試してみてはいかがでしょうか。