【osquery】SQLライクなクエリを発行してマシンの状態を確認する

# osquery

![logo](http://osquery.io/static/site/img/logo-big.png)

[osquery](http://osquery.io/)というものを見つけた。
facebookが出しているプロダクト。

# 何ができるのか

今のところ

- SQLライクなクエリを発行し、マシンの状態を確認する
- デーモンによるSQLライクなクエリを定時発行し、ログに出力する

の2点が主のようだ。

# 対応プラットフォーム

LinuxディストリビューションではRHEL系、Debian系、
それとMac OS X をサポートしている。

# どんな値が取れるのか

以下のページを参考のこと。
USB抜き差しのイベントや、NICの状態を確認したり、登録されてるユーザ一覧、
Mac OS Xであればlauncthctlの状態などを見れるようだ。

http://osquery.io/docs/tables/

# 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を起動する。　

```rb
# -*- 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パッケージがオフィシャルで用意されているので、利用する。


http://osquery.io/downloads/

以下、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
```

すると、対話モードが開始される。

![Screen Shot 2015-03-01 at 00.15.10.png](https://qiita-image-store.s3.amazonaws.com/0/3985/18470d9c-f339-120f-0fff-ce7d25bc34a4.png)

## クエリを打ち込んでみる。

osqueryiを実行中にクエリを実行する。

```sql
> 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         |
```

情報量が多いので、カラムを絞ってみよう。

```sql
> 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の値を取得してみる。

```sql
> select ipackets, opackets from interface_details where interface = 'eth0';
```

```
+-------------------+------+----------+----------+
| mac               | mtu  | ipackets | opackets |
+-------------------+------+----------+----------+
| 08:00:27:cf:da:f3 | 1500 | 14357    | 6066     |
+-------------------+------+----------+----------+
```

## zabbix% にマッチするサービスは登録されているか確認

```sql
> 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はあるのか？

```sql
> 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を設定

こんなかんじに書いて、

```json
{
  "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で設定した内容が記録されていく。

```json

{"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があるのが興味深い。時系列にログを流すだけじゃないんだな。

### ログの出力形式

[resultsログの出力形式に関するページ](https://github.com/facebook/osquery/wiki/using-osqueryd#results-logs)を見ると、

[Logstash及びSplunkに合わせたログ形式を出力するEvent format](https://github.com/facebook/osquery/wiki/using-osqueryd#output-event-format)と、
[バッチ形式のログのフォーマット](https://github.com/facebook/osquery/wiki/using-osqueryd#output-batch-format)がある。

# 今のところ

fuserしてファイルを掴んでいるプロセスを調べるときとか、
そういうのにさささっと実行できたり、
crontabの状態を見るのに利用できそう。

fluentdと組み合わせれば監視強化、には使えるんだろうか。
Zabbixを利用するのが良いのではないだろうか、とは考えてしまうが。