【技術備忘録⑦】自分の環境のシステム情報をSQL言語ベースで便利に確認できる「osquery」の記録

- 現在利用している言語や技術の記法や不明点等を記録していく記事第七弾。
- 某書店の膨大な技術書の量を目の当たりにした私の反応は、店員さんが引きつる程の羞恥行為。
- 今回は、MacやWindows等でのシステム環境情報を、SQL言語ベースで確認できる「osquery」を試用することにしよう。

## 概要
- Facebook製のシステム(OS)環境情報ツール。
- SQL言語を利用して、あらゆるシステム情報を確認することができる。
- [公式Github](https://github.com/osquery/osquery)

## 特徴

### SQL言語ベース
- システム情報確認の際は、SQL言語ベースでリレーショナルデータベース形式で問い合わせることができる。
- そのため、LIKE(検索や条件)やLIMIT(出力制限)等のSQL独自の形式で出力することが可能。

### マルチプラットフォーム
- WindowsやMac,Linux等のあらゆるオペレーションシステムに対応しており、各種OS独自情報の確認も可能。

### 定期実行
- 手動での確認だけではなく、プログラムとして常駐(デーモン)化しておくことができ、定期的に実行できる。
- そのため、ログとして保存しておき、分析や監視等の作業が可能。

## 結果
- 下記のように、確認したい情報をSQL言語で記述すれば、指定のシステム環境情報が見やすく可視化される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/7f4b2f7c-937f-a00d-cb7b-8e8610838084.png)

- また、CSV形式やカラム形式等、表示形式の変更も可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/7fd065ef-6edf-6dd2-2075-137242a84010.png)

## 環境
- Amazon Linux 2

## インストール

### Linux(RPM)
- 下記のコマンドをうち、osqueryをインストールする。

```bash
# osqueryインストール
$ curl -L https://pkg.osquery.io/rpm/GPG | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-osquery
$ sudo yum-config-manager --add-repo https://pkg.osquery.io/rpm/osquery-s3-rpm.repo
$ sudo yum-config-manager --enable osquery-s3-rpm
$ sudo yum install osquery
```

### Mac
- 下記のコマンドをうち、osqueryをHomebrewでインストールする。
    - **※Macのパッケージ管理ツールのHomebrewを利用しての導入のため、未導入の場合、[こちら](https://brew.sh/index_ja)を参考にしてHomebrewをインストールする。**

```bash
# osqueryのインストール
$ brew install osquery
```

### Windows
- 下記のコマンドをうち、osqueryをchocolateyでインストールする。
    - **※Windwosのパッケージ管理ツールのchocokateyを利用しての導入のため、未導入の場合、[こちら](https://qiita.com/konta220/items/95b40b4647a737cb51aa)を参考にしてchocolateyをインストールする。**

```bash
# osqueryのインストール
$ choco install osquery
```

### その他
- その他環境でのインストール手順は、[こちら](https://osquery.readthedocs.io/en/stable/installation/install-linux/)を確認する。

## 基本操作

### 対話モード起動・終了
- 下記のコマンドをうち、osqueryを対話モードで起動する。
    - **※今回は、対話モード起動の状態で、SQLベースでの問い合わせを行っていく。**

```bash
# 対話モード起動
$ osqueryi
```

- 問い合わせ作業が完了して、対話モード終了時は、下記のコマンドをうつ。

```bash
# 対話モード終了
# osquery> .exit でも可能
# Ctrl + c でも可能
osquery> .quit
```

### 基本問い合わせ
- **※上記のステップで、対話モードを起動しておく。**
- 問い合わせの基本文としては、下記。
    - **※各種環境情報や高機能等を含めると、膨大なため、今回は利用頻度の高い基本操作のみの一覧**
    - **※osqueryで利用可能なテーブル一覧は[こちら](https://osquery.io/schema/3.3.2)。確認したい項目等があるときに、テーブル名やカラム名を確認する。**

|命令文|内容|
|:---:|:---:|
|`.help`|ヘルプ情報表示|
|`.tables`|osqueryで利用可能なテーブル一覧|
|`pragma table_info(テーブル名);`|テーブルの詳細表示<br>例: `pragma table_info(users);`|
|`select name,version,platform,platform_like from os_version;`|OS情報確認|
|`select username,time,host from last;`|ログイン履歴確認<br>LIMIT指定で表示数制御可能|
|`select pid,name,state from processes;`|実行プロセス確認|
|`select username,description,directory,shell from users;`|ユーザー情報確認|
|`select interface,mac from interface_details;`|インターフェース(接続)情報の確認|
|`select * from crontab;`|定期実行プログラム(cron)確認|

### 表示形式変更
- 表示形式を変更して出力する際のモード変更文は、下記。

|変更文|内容|
|:---:|:---:|
|`.mode pretty`|デフォルト表示形式。|
|`.mode line`|一行単位での表示|
|`.mode list`|文字列区切りでのリスト表示|
|`.mode column`|カラム形式での表示|
|`.mode csv`|csv形式での表示。|
|`.mode pretty`|デフォルト表示形式。|

## 定期実行
- osqueryでは、問い合わせ文をプログラムとして、システムで定期実行できる。
- **※定期実行操作は、対話モード終了してから行う。**
- 定期実行の手順としては、主に下記。
    - 1. `/etc/osquery/osquery.conf`に定期実行するクエリ情報等の設定を記述
    - 2. 設定後、`sudo osqueryctl stop`でosquerydを実行して、定期実行を開始。
    - 3. 実行後、結果は`osqueryd.results.log`にログとして保存されていく。
    - 4. 定期実行を止める場合、`sudo osqueryctl stop`を実行して終了。

### 設定ファイル記述例
- 上記の手順1の`/etc/osquery/osquery.conf`の設定ファイル例は、下記。
    - `query` : 実行問い合わせ
    - `interval` : 定期実行時間(秒)

```conf:/etc/osquery/osquery.conf
{
  "schedule": {
    "login_info": {
      "query": "select username,time,host from last;",
      "interval": 100
    }
  }
}
```

## まとめ
- 今回は、システム環境情報参照ということで、稀であるこの機会に、隅々まで愛用環境の内面の把握に躍起になりながら記事を書く。
- 愛用環境が隠し持っていた、あらゆる内面情報に、更なる愛着が数分おきに沸きあがる。
- 高流動性の私は、早速環境情報監視に心身を奪われたため、次なるものを求めて調査することにしよう。

## 参考
- https://github.com/osquery/osquery  
→公式Gihubです。大変お世話になりました。
- https://dev.classmethod.jp/server-side/get-server-data-using-osquery-ja/  
→こちらを参考にしました。大変お世話になりました。
- https://qiita.com/futoase  
→こちらを参考にしました。大変お世話になりました。