GNU/Linux >> Linux の 問題 >  >> Linux

Linuxオペレーティングシステムをデータベースのようにクエリします

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>
バイナリのELF情報を検索する

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の詳細については、そのドキュメントをお読みください。


Linux
  1. procps-ngを使用してターミナルでLinuxシステムを監視します

  2. Linuxオペレーティングシステムをデータベースのようにクエリします

  3. Linux コンテナーおよび Linux ハイパーバイザーとは何ですか?

  1. Rsyncを使用してLinuxシステム全体をバックアップする方法

  2. Linuxサーバーのハードウェア廃止プロセスはどのようなものですか?

  3. Linuxオペレーティングシステムのインストール日を確認するにはどうすればよいですか?

  1. VirtualBoxを搭載したオペレーティングシステムでLinuxをお試しください

  2. Linuxのセキュリティ:fail2banでシステムを保護する

  3. inxiを使用したLinuxシステムの詳細