OPS

osqueryでマシンの状態を確認してみた

2018.10.30

本記事のポイント

OSの状態をSQLライクなコマンドで取得できるosqueryという
Facebookによって開発されたソフトウェアで、オペレーティングシステムに関する各種情報を
SQLライクなコマンドで問い合わせ可能にしているという特徴を持ってます。

Linux以外にもMac、Windowsにも対応してます。

今回はCentOSにインストールしてみます。

osqueryでマシンの状態を確認してみた

はじめまして、JIG-SAWのY.Oです。

マネジメント本部でサーバ監視・運用の業務携わってます。
休日はぼーっと詰将棋を解いたり、子供と将棋道場へ通う齢40を過ぎてしまった爺エンジニアでございます。

今回はosqueryというソフトウェアを使ってみたいと思います。

osqueryはFacebookによって開発されたソフトウェアで、
オペレーティングシステムに関する各種情報をSQLライクなクエリを発行して、
問い合わせを可能にしているという特徴があります。

https://osquery.io/

対応しているプラットフォームは、Linux(RHEL系, Debian系)、Mac OS X、Windowsと
幅広く対応しているのも良いところかと思います。

osqueryでどんなことができるかといいますと・・・
・SQLライクなクエリを発行して、マシンの状態を確認することが可能
・デーモン化することでクエリを定時発行してログ出力することが可能

ではでは早速インストールしてみましょう。
今回使うのはCentos6.10を利用してインストールからコマンド実行まで、
一通りやってみたいと思います。

■インストール

# yum -y install https://osquery-packages.s3.amazonaws.com/centos7/noarch/osquery-s3-centos7-repo-1-0.0.noarch.rpm

# yum -y install osquery

■使い方
操作方法と各情報が格納されているテーブルについては以下をみてください。
https://osquery.io/docs/tables/

・対話シェル起動

# osqueryi
# osqueryi
Using a virtual database. Need help, type '.help'
osquery>

・テーブルのリストを表示

osquery> .tables
=> acpi_tables
=> apt_sources
=> arp_cache
=> augeas
=> authorized_keys
=> block_devices
=> carbon_black_info
=> carves
=> chrome_extensions
=> cpu_time
=> cpuid
=> crontab
~~~以下省略

・OSバージョンのテーブルを全て表示してみる。

osquery> select * from os_version;
+--------+-----------------------------+-------+-------+-------+-------+----------+---------------+----------+
| name | version | major | minor | patch | build | platform | platform_like | codename |
+--------+-----------------------------+-------+-------+-------+-------+----------+---------------+----------+
| CentOS | CentOS release 6.10 (Final) | 6 | 10 | 0 | | rhel | rhel | |
+--------+-----------------------------+-------+-------+-------+-------+----------+---------------+----------+
osquery>

・毎時間実行するcronが存在するかの確認

osquery> select * from crontab where hour = '*';
+-------+--------+------+--------------+-------+-------------+---------------------------------------------------------------------------------------+----------------------+
| event | minute | hour | day_of_month | month | day_of_week | command | path |
+-------+--------+------+--------------+-------+-------------+---------------------------------------------------------------------------------------+----------------------+
| | 01 | * | * | * | * | root run-parts /etc/cron.hourly | /etc/cron.d/0hourly |
| | */3 | * | * | * | * | sh -x /root/scripts/hogehoge/hugahuga.sh &> /root/scripts/hogehoge/hugahuga.log | /var/spool/cron/root |
+-------+--------+------+--------------+-------+-------------+---------------------------------------------------------------------------------------+----------------------+

・可動プロセス

osquery> select * from processes;

↑これだと情報量が多すぎてカオスなので・・・・

osquery> select pid, name from processes;

とするとカラムを調整することも可能

+------+-----------------+
| pid | name |
+------+-----------------+
| 1 | init |
| 10 | events_power_ef |
| 1013 | rsyslogd |
| 1076 | pz-commd |
| 1087 | pz-agentd |
| 11 | cgroup |
| 1102 | sshd |
| 1181 | master |
| 1189 | pickup |
| 1190 | qmgr |
| 1195 | crond |
| 12 | khelper |
| 1208 | mingetty |
| 1210 | mingetty |
| 1212 | mingetty |
| 1214 | mingetty |
| 1216 | mingetty |
| 1218 | mingetty |
| 1219 | sshd |
~~~以下省略

・ロードアベレージを確認

osquery> select * from load_average;
+--------+----------+
| period | average |
+--------+----------+
| 1m | 0.000000 |
| 5m | 0.000000 |
| 15m | 0.000000 |
+--------+----------+
osquery>

・ログインユーザーの履歴

osquery> select * from last where username like 'root';
+----------+-------+------+------+------------+----------+
| username | tty | pid | type | time | host |
+----------+-------+------+------+------------+----------+
| root | tty1 | 1230 | 7 | 1537493018 | |
| root | tty1 | 1184 | 7 | 1537493384 | |
| root | pts/0 | 1211 | 7 | 1537493537 | 10.0.x.x |
| root | pts/0 | 1664 | 7 | 1537841084 | 10.0.x.x |
| root | tty1 | 1208 | 7 | 1537871338 | |
~~~以下省略

・メモリ情報(byte)

osquery> select * from memory_info;
+--------------+-------------+---------+----------+-------------+----------+----------+------------+-----------+
| memory_total | memory_free | buffers | cached | swap_cached | active | inactive | swap_total | swap_free |
+--------------+-------------+---------+----------+-------------+----------+----------+------------+-----------+
| 1044402176 | 910262272 | 6459392 | 58650624 | 0 | 31477760 | 45748224 | 855633920 | 855633920 |
+--------------+-------------+---------+----------+-------------+----------+----------+------------+-----------+
osquery>

という感じでサーバ内の様々な情報を確認することが可能です。

またosquerydがありデーモン化してログに出力することも可能みたいなので、
/etc/init.d/osqueryd の中身を見てみると、どうやら/etc/osquery/内に書かれたコンフィグを読んで
ログに出すっぽい事がわかったので…

/etc/osquery/osquery.conf の中に

{
"scheduledQueries": [
{
"name": "uptime",
"query": "SELECT * FROM uptime;",
"interval": 10
}
]
}

こんな感じの設定ファイルを作ってあげて

osqueryd実行してみると…

# ps auxwf | grep osquery
root 1498 0.0 0.0 103332 900 pts/0 S+ 14:07 0:00 \_ grep osquery
root 1483 0.0 0.3 213816 3580 ? SNsl 14:07 0:00 osqueryd --config_path=/etc/osquery/osquery.conf --pidfile=/var/run/osqueryd.pidfile --daemonize=true
root 1485 0.2 1.3 448620 13400 ? SNl 14:07 0:00 \_ osqueryd

デーモン化してる事がわかる。

ログは/var/log/osquery/ の中の osqueryd.results.log に記録されるみたいなので、

{"name":"uptime","hostIdentifier":"yota-centos1","calendarTime":"Mon Oct 22 05:24:50 2018 UTC","unixTime":1540185890,"epoch":0,"counter":0,"columns":{"days":"0","hours":"0","minutes":"58","seconds":"35","total_seconds":"3515"},"action":"added"}
{"name":"uptime","hostIdentifier":"yota-centos1","calendarTime":"Mon Oct 22 05:25:00 2018 UTC","unixTime":1540185900,"epoch":0,"counter":1,"columns":{"days":"0","hours":"0","minutes":"58","seconds":"35","total_seconds":"3515"},"action":"removed"}
{"name":"uptime","hostIdentifier":"yota-centos1","calendarTime":"Mon Oct 22 05:25:00 2018 UTC","unixTime":1540185900,"epoch":0,"counter":1,"columns":{"days":"0","hours":"0","minutes":"58","seconds":"45","total_seconds":"3525"},"action":"added"}
{"name":"uptime","hostIdentifier":"yota-centos1","calendarTime":"Mon Oct 22 05:25:10 2018 UTC","unixTime":1540185910,"epoch":0,"counter":2,"columns":{"days":"0","hours":"0","minutes":"58","seconds":"45","total_seconds":"3525"},"action":"removed"}

ちゃんと記録されているのがわかる。

サーバ調査やハード調査したり、
crontabやプロセスの状態を調査したりするにはすごく良さそうです。

あとはスクリプト書いて定期的にSlackに通知してあげたり、
ウチのpuzzleや他の監視ツールともうまいこと連携できそうだったり、
いろいろな事ができそうだなと感じました。