osquery
osqueryというものを見つけた。
facebookが出しているプロダクト。
何ができるのか
今のところ
- SQLライクなクエリを発行し、マシンの状態を確認する
- デーモンによるSQLライクなクエリを定時発行し、ログに出力する
の2点が主のようだ。
対応プラットフォーム
LinuxディストリビューションではRHEL系、Debian系、
それとMac OS X をサポートしている。
どんな値が取れるのか
以下のページを参考のこと。
USB抜き差しのイベントや、NICの状態を確認したり、登録されてるユーザ一覧、
Mac OS Xであればlauncthctlの状態などを見れるようだ。
Ubuntu上でのチェック
Ubuntu 14.04 LTS 上で動作チェックをしてみようと思う。
Ubuntu 14.04 LTSのVagrant boxを用意
hashcorpのものを使わせてもらう。
Vagrantをインストールしている状態で、以下のコマンドを実行し、Vagrant boxをダウンロードしよう。
> vagrant box add ubuntu/trusty64
Vagrantfile
以下のVagrant fileを作成後、Vagrant boxを起動する。
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "public_network"
config.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = "2048"
end
end
> vagrant up
そしてVagrant box内にsshログイン。
> vagrant ssh
日本語ロケールがないと、ロケール無いよとosquery起動時に怒られちゃうので
インストールしておこう。
> sudo apt-get install language-pack-ja
Ubuntu上でのosqueryインストール
debパッケージがオフィシャルで用意されているので、利用する。
以下、osqueryのオフィシャルサイトにある手順で
Vagrant上のマシンに対してosqueryをインストール。
> sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C9D8B80B
> sudo add-apt-repository "deb https://osquery-packages.s3.amazonaws.com/trusty trusty main"
> sudo apt-get update
> sudo apt-get install osquery
osqueryを試しに利用する
試しにosqueryを利用してみる。
対象マシン内のユーザを検索したいとする。
osqueryi
osqueryiというインタラクティブ環境を立ち上げる。
> osqueryi
すると、対話モードが開始される。
クエリを打ち込んでみる。
osqueryiを実行中にクエリを実行する。
> select * from users;
すると結果が返ってくる。
+-------+-------+------------+------------+------------+-------------------------------------------+--------------------[43/635]
--------------+
| uid | gid | uid_signed | gid_signed | username | description | directory | shell
l |
+-------+-------+------------+------------+------------+-------------------------------------------+----------------------+----$
--------------+
| 0 | 0 | 0 | 0 | root | root | /root | /bi$
/bash |
| 1 | 1 | 1 | 1 | daemon | daemon | /usr/sbin | /us$
/sbin/nologin |
| 2 | 2 | 2 | 2 | bin | bin | /bin | /us$
/sbin/nologin |
| 3 | 3 | 3 | 3 | sys | sys | /dev | /us$
/sbin/nologin |
| 4 | 65534 | 4 | 65534 | sync | sync | /bin | /bi$
/sync |
情報量が多いので、カラムを絞ってみよう。
> select uid, gid, username, shell from users;
+-------+-------+------------+-------------------+
| uid | gid | username | shell |
+-------+-------+------------+-------------------+
| 0 | 0 | root | /bin/bash |
| 1 | 1 | daemon | /usr/sbin/nologin |
| 2 | 2 | bin | /usr/sbin/nologin |
| 3 | 3 | sys | /usr/sbin/nologin |
| 4 | 65534 | sync | /bin/sync |
| 5 | 60 | games | /usr/sbin/nologin |
| 6 | 12 | man | /usr/sbin/nologin |
| 7 | 7 | lp | /usr/sbin/nologin |
| 8 | 8 | mail | /usr/sbin/nologin |
| 9 | 9 | news | /usr/sbin/nologin |
| 10 | 10 | uucp | /usr/sbin/nologin |
| 13 | 13 | proxy | /usr/sbin/nologin |
| 33 | 33 | www-data | /usr/sbin/nologin |
| 34 | 34 | backup | /usr/sbin/nologin |
| 38 | 38 | list | /usr/sbin/nologin |
| 39 | 39 | irc | /usr/sbin/nologin |
| 41 | 41 | gnats | /usr/sbin/nologin |
| 65534 | 65534 | nobody | /usr/sbin/nologin |
| 100 | 101 | libuuid | |
| 101 | 104 | syslog | /bin/false |
| 102 | 106 | messagebus | /bin/false |
| 103 | 109 | landscape | /bin/false |
| 104 | 65534 | sshd | /usr/sbin/nologin |
| 105 | 1 | pollinate | /bin/false |
| 1000 | 1000 | vagrant | /bin/bash |
| 106 | 65534 | statd | /bin/false |
| 107 | 112 | puppet | /bin/false |
| 1001 | 1001 | ubuntu | /bin/bash |
+-------+-------+------------+-------------------+
スッキリした結果を得られた。
ネットワーク・インタフェースから情報を取る
ネットワーク・インターフェース eth0のMACアドレス、及び
input packets, output packetsの値を取得してみる。
> select ipackets, opackets from interface_details where interface = 'eth0';
+-------------------+------+----------+----------+
| mac | mtu | ipackets | opackets |
+-------------------+------+----------+----------+
| 08:00:27:cf:da:f3 | 1500 | 14357 | 6066 |
+-------------------+------+----------+----------+
zabbix% にマッチするサービスは登録されているか確認
> select * from etc_services where name like 'zabbix%’;
+----------------+-------+----------+---------+----------------+
| name | port | protocol | aliases | comment |
+----------------+-------+----------+---------+----------------+
| zabbix-agent | 10050 | tcp | | Zabbix Agent |
| zabbix-agent | 10050 | udp | | |
| zabbix-trapper | 10051 | tcp | | Zabbix Trapper |
| zabbix-trapper | 10051 | udp | | |
+----------------+-------+----------+---------+----------------+
hashcorpが配布しているUbuntu 14.04 LTSのイメージにはすでにZabbix Agentが入っているのか…
毎時間実行するcronはあるのか?
> select * from crontab where hour = '*';
+-------+--------+------+--------------+-------+-------------+--------------------------------------------------+--------------+
| event | minute | hour | day_of_month | month | day_of_week | command | path |
+-------+--------+------+--------------+-------+-------------+--------------------------------------------------+--------------+
| | 17 | * | * | * | * | root cd / && run-parts --report /etc/cron.hourly | /etc/crontab |
+-------+--------+------+--------------+-------+-------------+--------------------------------------------------+--------------+
cronのチェックにosquery使えそうだ。cronが読みやすい。
osqueryd
osqueryを定期的に実行し、ログに吐き出させることもできる。
Ubuntuの14.04 LTSでのdebパッケージを利用する場合
/etc/init.d/osquerydの内容を見ると、
/etc/osquery/osquery.conf を見ている。
osquery.confに、適当な間隔で(10秒)適当なクエリを実行してもらうようにしてみる。
/etc/osquery/osquery.confを設定
こんなかんじに書いて、
{
"scheduledQueries": [
{
"name": "i/o packets for eth0",
"query": "select ipackets, opackets from interface_details where interface = 'eth0’;",
"interval": 10
}
]
}
osqueryd実行
> sudo service osqueryd start
ログの確認
実行中、ネットワークパケットのin/outを更新させるため、
適当にsudo apt-get update, sudo apt-get upgradeを実行する。
/var/log/osquery/osquery.results.logにosquery.confで設定した内容が記録されていく。
{"name":"i\/o packets for eth0","hostIdentifier":"vagrant-ubuntu-trusty-64","calendarTime":"Sat Feb 28 14:40:09 2015","unixTime":"1425134409","columns":{"ipackets":"21368","opackets":"10004"},"action":"removed"}
{"name":"i\/o packets for eth0","hostIdentifier":"vagrant-ubuntu-trusty-64","calendarTime":"Sat Feb 28 14:40:18 2015","unixTime":"1425134418","columns":{"ipackets":"27525","opackets":"12037"},"action":"added"}
{"name":"i\/o packets for eth0","hostIdentifier":"vagrant-ubuntu-trusty-64","calendarTime":"Sat Feb 28 14:40:18 2015","unixTime":"1425134418","columns":{"ipackets":"22527","opackets":"10554"},"action":"removed"}
{"name":"i\/o packets for eth0","hostIdentifier":"vagrant-ubuntu-trusty-64","calendarTime":"Sat Feb 28 14:40:27 2015","unixTime":"1425134427","columns":{"ipackets":"29638","opackets":"12979"},"action":"added"}
{"name":"i\/o packets for eth0","hostIdentifier":"vagrant-ubuntu-trusty-64","calendarTime":"Sat Feb 28 14:40:27 2015","unixTime":"1425134427","columns":{"ipackets":"27525","opackets":"12037"},"action":"removed"}
{"name":"i\/o packets for eth0","hostIdentifier":"vagrant-ubuntu-trusty-64","calendarTime":"Sat Feb 28 14:40:36 2015","unixTime":"1425134436","columns":{"ipackets":"30030","opackets":"13347"},"action":"added"}
{"name":"i\/o packets for eth0","hostIdentifier":"vagrant-ubuntu-trusty-64","calendarTime":"Sat Feb 28 14:40:36 2015","unixTime":"1425134436","columns":{"ipackets":"29638","opackets":"12979"},"action":"removed"}
変化があるときにのみ、記録されていっている。
action: remove, action: addがあるのが興味深い。時系列にログを流すだけじゃないんだな。
ログの出力形式
Logstash及びSplunkに合わせたログ形式を出力するEvent formatと、
バッチ形式のログのフォーマットがある。
今のところ
fuserしてファイルを掴んでいるプロセスを調べるときとか、
そういうのにさささっと実行できたり、
crontabの状態を見るのに利用できそう。
fluentdと組み合わせれば監視強化、には使えるんだろうか。
Zabbixを利用するのが良いのではないだろうか、とは考えてしまうが。