データベースのクエリ操作を使用して、システム情報に簡単にアクセスできます。
Linuxには、ファイルやディレクトリの属性情報を一覧表示したり、インストールされているパッケージや実行中のコマンド、ブート時に開始されるサービスを照会したり、システムのハードウェアについて調べたりするなど、ユーザーがホスト・オペレーティング・システムに関する情報を収集するのに役立つコマンドが多数用意されています。
各コマンドは、独自の出力フォーマットを使ってシステムに関する情報を一覧表示します。特定の情報を見つけるためには、grep、sed、awk などのツールを使ってコマンドの出力をフィルタリングする必要があります。さらに、これらの情報の多くは頻繁に変更され、システムの状態に変化をもたらします。
このような情報をすべて、データベースのSQLクエリの出力として表示できたら便利でしょう。psコマンドやrpmコマンドの出力を、あたかも同じような名前のSQLデータベースのテーブルに照会るように照会ることができることを想像してみてください。
Osquery 、 オープンソースの "オペレーティングシステムの計測、監視、分析のためのSQL駆動フレームワーク "です。
セキュリティ、DevOps、コンプライアンス、倉庫管理などを扱う多くのアプリケーションは、Osqueryが提供するコア機能に内部的に依存しています。
Osqueryのインストール
OsqueryはLinux、macOS、Windows、FreeBSDで利用可能です。お使いのオペレーティングシステムの最新バージョンをインストール するには、ガイドに従って ください。
インストールが完了したら、Osqueryが動作していることを確認してください:
$ rpm -qa | grep osqueryosquery-4.7.0-1.linux.x86_64$ osqueryi --versionosqueryi version 4.7.0
Osquery コンポーネント
Osqueryには2つの主要コンポーネントがあります:
- osqueri は、スタンドアロンで実行でき、スーパーユーザ権限を必要としない対話型 SQL クエリコンソールです。
- osquerydは、ホストにインストールされた監視デーモンのように動作し、定期的にクエリ操作をスケジュールして実行し、基盤となるアーキテクチャから情報を収集することができます。
osquerydを実行せずにosqueriを実行することも可能です。別のツールosqueryctlは、デーモンの起動と停止を制御し、その状態をチェックします。
$ rpm -ql osquery-4.8.0-1.linux.x86_64 | grep bin/usr/bin/osqueryctl/usr/bin/osqueryd/usr/bin/osqueryi
osqueryi対話型コマンドプロンプトの使用
OsqueryとのやりとりはSQLデータベースを使用するのと非常に似ています。実際、osqueryiはSQListシェルの改良版です。Osqueryコマンドを実行するには、osqueryiコマンドを実行して対話型コマンドプロンプトに入ります。 コマンドは通常:
$ osqueryiUsing a virtual database. Need help, type '.help'osquery>
対話型コマンドプロンプトを終了するには、.quitコマンドを実行してオペレーティングシステムのコマンドプロンプトに戻ります:
osquery>osquery> .quit
利用可能なテーブルの検索
前述したように、OsqueryはSQLクエリのようにデータを出力し、データベース内の情報は通常テーブルに格納されています。しかし、テーブル名を知らずにこれらのテーブルに照会るにはどうすればよいのでしょうか?.tablesコマンドを実行することで、照会可能なすべてのテーブルをリストすることができます。長年のLinuxユーザーやシステム管理者であれば、同じ情報を取得するためにオペレーティング・システムのコマンドを使用しているため、テーブル名には慣れているでしょう:
osquery> .tables=> acpi_tables=> apparmor_events=> apparmor_profiles=> apt_sources<< >>=> arp_cache=> user_ssh_keys=> users=> yara=> yara_events=> ycloud_instance_metadata=> yum_sourcesosquery>
各テーブルのスキーマをチェック
テーブルの名前が分かれば、各テーブルが提供する情報を見ることができます。psコマンドはプロセスに関する情報を取得するためによく使用されるので、プロセスを例にして説明します。テーブル名を指定して.schemaコマンドを実行し、テーブルにどのような情報が格納されているかを確認します。コマンドから返された結果を確認したい場合は、ps -efまたはps auxを素早く実行して、コマンドの出力とテーブルの内容を比較することができます:
osquery> .schema processesCREATE TABLE processes(`pid` BIGINT, `name` TEXT, `path` TEXT, `cmdline` TEXT, `state` TEXT, `cwd` TEXT, `root` TEXT, `uid` BIGINT, `gid` BIGINT, `euid` BIGINT, `egid` BIGINT, `suid` BIGINT, `sgid` BIGINT, `on_disk` INTEGER, `wired_size` BIGINT, `resident_size` BIGINT, `total_size` BIGINT, `user_time` BIGINT, `system_time` BIGINT, `disk_bytes_read` BIGINT, `disk_bytes_written` BIGINT, `start_time` BIGINT, `parent` BIGINT, `pgroup` BIGINT, `threads` INTEGER, `nice` INTEGER, `is_elevated_token` INTEGER HIDDEN, `elapsed_time` BIGINT HIDDEN, `handle_count` BIGINT HIDDEN, `percent_processor_time` BIGINT HIDDEN, `upid` BIGINT HIDDEN, `uppid` BIGINT HIDDEN, `cpu_type` INTEGER HIDDEN, `cpu_subtype` INTEGER HIDDEN, `phys_footprint` BIGINT HIDDEN, PRIMARY KEY (`pid`)) WITHOUT ROWID;osquery>
さらに確認するには、以下のコマンドを使用して RPM パッケージの構造に関する情報を表示し、オペレーティング・システムのコマンド rpm -qa および rpm -qi の出力と比較します:
osquery>osquery> .schema rpm_packagesCREATE TABLE rpm_packages(`name` TEXT, `version` TEXT, `release` TEXT, `source` TEXT, `size` BIGINT, `sha1` TEXT, `arch` TEXT, `epoch` INTEGER, `install_time` INTEGER, `vendor` TEXT, `package_group` TEXT, `pid_with_namespace` INTEGER HIDDEN, `mount_namespace_id` TEXT HIDDEN, PRIMARY KEY (`name`, `version`, `release`, `arch`, `epoch`, `pid_with_namespace`)) WITHOUT ROWID;osquery>
詳細はOsqueryの フォームドキュメントを ご覧ください。
PRAGMA コマンドの使用
スキーマ情報が難しすぎて読めないかもしれませんが、テーブルの情報を詳細な表形式で表示する別の方法があります:PRAGMAコマンドです。例えば、PRAGMAを使ってrpm_packagesテーブルの情報をわかりやすい形式で表示したいとします:
osquery> PRAGMA table_info(rpm_packages);
この表形式の情報の利点の1つは、クエリーしたいフィールドにフォーカスして、コマンドによって提供されるタイプ情報を見ることができることです:
osquery> PRAGMA table_info(users);+-----+-------------+--------+---------+------------+----+| cid | name | type | notnull | dflt_value | pk |+-----+-------------+--------+---------+------------+----+| 0 | uid | BIGINT | 1 | | 1 || 1 | gid | BIGINT | 0 | | 0 || 2 | uid_signed | BIGINT | 0 | | 0 || 3 | gid_signed | BIGINT | 0 | | 0 || 4 | username | TEXT | 1 | | 2 || 5 | description | TEXT | 0 | | 0 || 6 | directory | TEXT | 0 | | 0 || 7 | shell | TEXT | 0 | | 0 || 8 | uuid | TEXT | 1 | | 3 |+-----+-------------+--------+---------+------------+----+osquery>
最初のお照会
テーブル、スキーマ、エントリからクエリを作成するのに必要な情報がすべて揃ったら、最初のSQLクエリを作成して、その中の情報を確認します。以下の照会は、システム上のユーザと各ユーザのユーザID、グループID、ホームディレクトリ、デフォルトのコマンドラインインタープリタを返します。Linuxユーザは、/etc/passwdファイルの中身を見て、grep、sed、awkコマンドを実行することで同じ情報を得ることができます。
osquery>osquery> select uid,gid,directory,shell,uuid FROM users LIMIT 7;+-----+-----+----------------+----------------+------+| uid | gid | directory | shell | uuid |+-----+-----+----------------+----------------+------+| 0 | 0 | /root | /bin/bash | || 1 | 1 | /bin | /sbin/nologin | || 2 | 2 | /sbin | /sbin/nologin | || 3 | 4 | /var/adm | /sbin/nologin | || 4 | 7 | /var/spool/lpd | /sbin/nologin | || 5 | 0 | /sbin | /bin/sync | || 6 | 0 | /sbin | /sbin/shutdown | |+-----+-----+----------------+----------------+------+osquery>
対話モードに入らないクエリー
osqueriの対話型モードに入らずにクエリを実行したい場合はどうすればよいでしょうか?これは、照会操作を含むコマンドラインインタプリタスクリプトを書きたい場合に便利です。この場合、BashインタプリタからSQL照会を直接エコーし、osqueriにパイプ出力することができます:
$ echo "select uid,gid,directory,shell,uuid FROM users LIMIT 7;" | osqueryi+-----+-----+----------------+----------------+------+| uid | gid | directory | shell | uuid |+-----+-----+----------------+----------------+------+| 0 | 0 | /root | /bin/bash | || 1 | 1 | /bin | /sbin/nologin | || 2 | 2 | /sbin | /sbin/nologin | || 3 | 4 | /var/adm | /sbin/nologin | || 4 | 7 | /var/spool/lpd | /sbin/nologin | || 5 | 0 | /sbin | /bin/sync | || 6 | 0 | /sbin | /sbin/shutdown | |+-----+-----+----------------+----------------+------+
システム起動時に開始されるサービスを通知
Osqueryは、システム起動時に開始されるすべてのサービスを一覧表示することもできます。たとえば、 | uid | gid | directory | shell | uuid | テーブルを照会して、起動時に開始された最初の5つのサービスの名前、ステータス、パスを取得できます:
osquery> SELECT name,type,status,path FROM startup_items LIMIT 5;name = READMEtype = Startup Itemstatus = enabledpath = /etc/rc.d/init.d/READMEname = anamontype = Startup Itemstatus = enabledpath = /etc/rc.d/init.d/anamonname = functionstype = Startup Itemstatus = enabledpath = /etc/rc.d/init.d/functionsname = osquerydtype = Startup Itemstatus = enabledpath = /etc/rc.d/init.d/osquerydname = AT-SPI D-Bus Bustype = Startup Itemstatus = enabledpath = /usr/libexec/at-spi-bus-launcher --launch-immediatelyosquery>
バイナリファイルのELF情報を検索
ls バイナリの詳細を知りたい場合、通常は readelf -h コマンドと ls コマンドへのパスを使用します。Osqueryのelf_infoテーブルに照会ることで、同じ情報を得ることができます:
osquery> SELECT * FROM elf_info WHERE path="/bin/ls";class = 64abi = sysvabi_version = 0type = dynmachine = 62version = 1entry = 04264flags = 0path = /bin/lsosquery>
ここまでで、osqueriを使用して必要な情報をクエリする方法について初歩的な理解ができたはずです。しかし、これらの情報は膨大な数のテーブルに格納されています。私が照会したあるシステムには156の異なるテーブルがあり、その数は途方もない数になる可能性があります:
$ echo ".tables" | osqueryi | wc -l
Linuxシステムに関する情報を得るには、これらの表から始めると簡単です:
システム情報シート:
osquery> select * from system_info;
システム制限情報:
osquery> select * from ulimit_info;
様々なプロセスによって開かれたファイル:
osquery> select * from process_open_files;
システムで開いているポート:
osquery> select * from listening_ports;
実行中のプロセス情報
osquery> select * from processes;
インストールされたパッケージに関する情報:
osquery> select * from rpm_packages;
ユーザーログイン情報
osquery> select * from last;
シスログ情報:
osquery> select * from syslog_events;
さらに詳しく
Osqueryは、様々なユースケースを解決するために使用できる多くのホスト情報を提供する強力なツールです。Osqueryの詳細については、 お読みください。




