Linuxには、ユーザーがホストオペレーティングシステムに関する情報を収集するのに役立つ多くのコマンドが用意されています。属性を確認するためのファイルまたはディレクトリの一覧表示。インストールされているパッケージ、実行中のプロセス、および起動時にサービスが開始されるかどうかを確認するためのクエリ。またはシステムのハードウェアについて学習します。
各コマンドは、独自の出力形式を使用してこの情報を一覧表示します。 grep
などのツールを使用する必要があります 、sed
、およびawk
結果をフィルタリングして特定の情報を検索します。また、この情報の多くは頻繁に変更され、システムの状態が変化します。
その他のLinuxリソース
- Linuxコマンドのチートシート
- 高度なLinuxコマンドのチートシート
- 無料のオンラインコース:RHELの技術概要
- Linuxネットワーキングのチートシート
- SELinuxチートシート
- Linuxの一般的なコマンドのチートシート
- Linuxコンテナとは何ですか?
- 最新のLinux記事
データベースSQLクエリの出力のようにフォーマットされたこの情報をすべて表示すると便利です。 ps
の出力をクエリできると想像してみてください およびrpm
同様の名前のSQLデータベーステーブルをクエリしているかのようにコマンドを実行します。
幸いなことに、それだけでなく、さらに多くのことを実行するツールがあります。Osqueryは、オープンソースの「SQLを利用したオペレーティングシステムのインストルメンテーション、監視、および分析フレームワーク」です。
セキュリティ、DevOps、コンプライアンス、在庫管理(いくつか例を挙げると)を処理する多くのアプリケーションは、Osqueryが提供するコア機能に依存しています。
Osqueryをインストールする
Osqueryは、Linux、macOS、Windows、およびFreeBSDで使用できます。インストール手順に従って、オペレーティングシステムの最新バージョンをインストールします。 (これらの例ではバージョン4.7.0を使用します。)
インストール後、機能していることを確認します:
$ rpm -qa | grep osquery
osquery-4.7.0-1.linux.x86_64
$
$ osqueryi --version
osqueryi version 4.7.0
$
Osqueryコンポーネント
Osqueryには2つの主要なコンポーネントがあります:
- オスケリ インタラクティブな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インタラクティブプロンプトを使用する
SQLデータベースを使用するのと同じように、Osqueryを操作します。実際、osqueryiはSQLiteシェルの修正バージョンです。 osqueryi
の実行 コマンドを使用すると、インタラクティブシェルに移動し、Osqueryに固有のコマンドを実行できます。コマンドは多くの場合.
:
$ osqueryi
Using 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
<< snip >>
=> arp_cache
=> user_ssh_keys
=> users
=> yara
=> yara_events
=> ycloud_instance_metadata
=> yum_sources
osquery>
テーブル名がわかったので、各テーブルが提供する情報を確認できます。例として、processes
を選択します 、ps
以降 コマンドは、この情報を取得するために頻繁に使用されます。 .schema
を実行します コマンドの後にテーブル名を続けて、このテーブルに保存されている情報を確認します。結果を確認したい場合は、ps -ef
をすばやく実行できます。 またはps aux
出力をテーブルの内容と比較します:
osquery> .schema processes
CREATE 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_packages
CREATE 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インタラクティブモードに入らずにクエリを実行したい場合はどうなりますか?これは、その周りにシェルスクリプトを記述している場合に非常に役立ちます。この場合、echo
することができます SQLクエリをBashシェルから直接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は、起動時に開始するように設定されたすべてのサービスを返すこともできます。たとえば、startup_items
をクエリするには テーブルを作成し、起動時に実行される最初の5つのサービスの名前、ステータス、パスを取得します。
osquery> SELECT name,type,status,path FROM startup_items LIMIT 5;
name = README
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/README
name = anamon
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/anamon
name = functions
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/functions
name = osqueryd
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/osqueryd
name = AT-SPI D-Bus Bus
type = Startup Item
status = enabled
path = /usr/libexec/at-spi-bus-launcher --launch-immediately
osquery>
ls
の詳細を知りたいと想像してみてください。 バイナリ。通常は、readelf -h
を使用して行います コマンドの後にls
が続きます コマンドのパス。 elf_info
にクエリを実行できます Osqueryを使用してテーブルを作成し、同じ情報を取得します:
osquery> SELECT * FROM elf_info WHERE path="/bin/ls";
class = 64
abi = sysv
abi_version = 0
type = dyn
machine = 62
version = 1
entry = 24064
flags = 0
path = /bin/ls
osquery>
これで、osqueriを使用して関心のある情報を探す方法を味わうことができます。ただし、この情報は膨大な数のテーブルに保存されます。私が照会した1つのシステムには、156の異なるテーブルがあり、圧倒される可能性があります。
$ echo ".tables" | osqueryi | wc -l
156
$
作業を簡単にするために、次の表から始めて、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の詳細については、そのドキュメントをお読みください。