Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

osquery

logo

osqueryというものを見つけた。
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を起動する。 

# -*- 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

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

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

ログの出力形式

resultsログの出力形式に関するページを見ると、

Logstash及びSplunkに合わせたログ形式を出力するEvent formatと、
バッチ形式のログのフォーマットがある。

今のところ

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした