osqueryは、Facebookが開発した無料のオープンソースツールで、メモリ使用量、インストール済みパッケージ、プロセス情報、ログインユーザーなどのオペレーティングシステム関連情報のクエリに使用できます。リスニングポートなど。 Windows、Linux、FreeBSD、MacOSなどのいくつかのオペレーティングシステムで実行できます。これは、パフォーマンスと運用上の問題をトラブルシューティングするためのさまざまなユースケースに非常に役立つツールです。 OSの分析と監視を実行するのに役立つ多くのツールが付属しています。
このチュートリアルでは、Debian10にosqueryをインストールして使用する方法を学びます。
- Debian10を実行しているサーバー。
- ルートパスワードはサーバーで構成されています。
開始する前に、システムのパッケージを最新バージョンに更新することをお勧めします。次のコマンドを使用して、すべてのパッケージを更新できます。
apt-get update -y
apt-get upgrade -y
すべてのパッケージが更新されたら、システムを再起動して変更を適用します。
osqueryをインストールする
デフォルトでは、osqueryはDebian10のデフォルトリポジトリでは利用できません。そのため、システムにosqueryリポジトリを追加する必要があります。
まず、次のコマンドを使用してGPGキーをダウンロードして追加します。
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1484120AC4E9F8A1A577AEEE97A80C63C9D8B80B
次に、次のコマンドを使用してosqueryリポジトリを追加します。
apt-get install software-properties-common -y
add-apt-repository 'deb [arch=amd64] https://pkg.osquery.io/deb deb main'
次に、リポジトリを更新し、次のコマンドを使用してosqueryをインストールします。
apt-get update -y
apt-get install osquery -y
インストールが完了したら、次のコマンドを使用してosqueryサービスを開始します。
osqueryctl start osqueryd
次のコマンドを使用して、osqueryのステータスを確認することもできます。
osqueryctl status osqueryd
次の出力が表示されます。
? osqueryd.service - The osquery Daemon Loaded: loaded (/lib/systemd/system/osqueryd.service; disabled; vendor preset: enabled) Active: active (running) since Sun 2020-04-19 15:21:57 UTC; 6s ago Process: 25333 ExecStartPre=/bin/sh -c if [ ! -f $CONFIG_FILE ]; then echo {} > $CONFIG_FILE; fi (code=exited, status=0/SUCCESS) Process: 25334 ExecStartPre=/bin/sh -c if [ ! -f $FLAG_FILE ]; then touch $FLAG_FILE; fi (code=exited, status=0/SUCCESS) Process: 25336 ExecStartPre=/bin/sh -c if [ -f $LOCAL_PIDFILE ]; then mv $LOCAL_PIDFILE $PIDFILE; fi (code=exited, status=0/SUCCESS) Main PID: 25337 (osqueryd) Tasks: 13 (limit: 4701) Memory: 6.4M CGroup: /system.slice/osqueryd.service ??25337 /usr/bin/osqueryd --flagfile /etc/osquery/osquery.flags --config_path /etc/osquery/osquery.conf ??25339 /usr/bin/osqueryd Apr 19 15:21:57 debian10 systemd[1]: Starting The osquery Daemon... Apr 19 15:21:57 debian10 systemd[1]: Started The osquery Daemon. Apr 19 15:21:57 debian10 osqueryd[25337]: osqueryd started [version=4.2.0] Apr 19 15:21:57 debian10 osqueryd[25337]: I0419 15:21:57.261158 25339 events.cpp:863] Event publisher not enabled: auditeventpublisher: Publish Apr 19 15:21:57 debian10 osqueryd[25337]: I0419 15:21:57.261485 25339 events.cpp:863] Event publisher not enabled: syslog: Publisher disabled v
osqueryの操作
osqueryには、osqueryi、osqueryd、osqueryctlの3つの便利なコンポーネントが付属しています。 osqueryiはosqueryインタラクティブシェルであり、デーモンと通信しません。シェルを使用してクエリを実行し、オペレーティングシステムの現在の状態を調べることができます。 osquerydは、クエリをスケジュールし、OSの状態の変化を記録するために使用できるホスト監視デーモンです。 osqueryctlは、構成をテストするためのヘルパースクリプトです。
次のコマンドを実行して、osqueryシェルに接続できます。
osqueryi
次の出力が得られるはずです:
Using a virtual database. Need help, type '.help'
次に、.helpコマンドを実行して、osqueryで使用可能なすべてのオプションを確認します。
osquery> .help
次の出力が得られるはずです:
Welcome to the osquery shell. Please explore your OS! You are connected to a transient 'in-memory' virtual database. .all [TABLE] Select all from a table .bail ON|OFF Stop after hitting an error .echo ON|OFF Turn command echo on or off .exit Exit this program .features List osquery's features and their statuses .headers ON|OFF Turn display of headers on or off .help Show this message .mode MODE Set output mode where MODE is one of: csv Comma-separated values column Left-aligned columns see .width line One value per line list Values delimited by .separator string pretty Pretty printed SQL results (default) .nullvalue STR Use STRING in place of NULL values .print STR... Print literal STRING .quit Exit this program .schema [TABLE] Show the CREATE statements .separator STR Change separator used by output mode .socket Show the osquery extensions socket path .show Show the current values for various settings .summary Alias for the show meta command .tables [TABLE] List names of tables .types [SQL] Show result of getQueryColumns for the given query .width [NUM1]+ Set column widths for "column" mode .timer ON|OFF Turn the CPU timer measurement on or off osquery>
クエリに使用できるテーブルはたくさんあります。次のコマンドを使用して、すべてのテーブルを一覧表示できます。
osquery> .table
次の出力が得られるはずです:
=> acpi_tables => apparmor_profiles => apt_sources => arp_cache => atom_packages => augeas => authorized_keys => block_devices => carbon_black_info => carves => chrome_extensions => cpu_time => cpuid => crontab => curl => curl_certificate => deb_packages => device_file => device_hash => device_partitions => disk_encryption => dns_resolvers => docker_container_labels => docker_container_mounts
上記の表とosqueryを使用して、さまざまなシステム情報を見つけることができます。
osqueryでシステムを監視する
osqueryを使用して、メモリ使用量、プロセス情報、ディスク容量、ログインユーザーなどを監視できます。
まず、次のコマンドを使用してosqueryシェルを起動します。
osqueryi
次に、次のコマンドを使用して、システムのホスト名、CPUコア、および物理メモリの情報を取得できます。
osquery> select hostname,cpu_physical_cores,physical_memory from system_info;
次の出力が得られるはずです:
+------------+--------------------+-----------------+ | hostname | cpu_physical_cores | physical_memory | +------------+--------------------+-----------------+ | debian10 | 1 | 1032937472 | +------------+--------------------+-----------------+
ssh_configファイルに関する情報を取得するには、次のクエリを実行します。
osquery> select * from ssh_configs;
次の出力が得られるはずです:
W0419 15:47:17.043509 25397 virtual_table.cpp:959] The ssh_configs table returns data based on the current user by default, consider JOINing against the users table W0419 15:47:17.043740 25397 virtual_table.cpp:974] Please see the table documentation: https://osquery.io/schema/#ssh_configs +-----+--------+--------------------------+---------------------+ | uid | block | option | ssh_config_file | +-----+--------+--------------------------+---------------------+ | 0 | host * | sendenv lang lc_* | /etc/ssh/ssh_config | | 0 | host * | hashknownhosts yes | /etc/ssh/ssh_config | | 0 | host * | gssapiauthentication yes | /etc/ssh/ssh_config | +-----+--------+--------------------------+---------------------+ osquery>
システム内のすべてのユーザーのリストを取得するには、次のクエリを実行します。
osquery> SELECT * FROM users;
次の出力が得られるはずです:
+-------+-------+------------+------------+-----------------+------------------------------------+----------------------+-------------------+------+ | uid | gid | uid_signed | gid_signed | username | description | directory | shell | uuid | +-------+-------+------------+------------+-----------------+------------------------------------+----------------------+-------------------+------+ | 0 | 0 | 0 | 0 | root | root | /root | /bin/bash | | | 1 | 1 | 1 | 1 | daemon | daemon | /usr/sbin | /usr/sbin/nologin | | | 2 | 2 | 2 | 2 | bin | bin | /bin | /usr/sbin/nologin | | | 3 | 3 | 3 | 3 | sys | sys | /dev | /usr/sbin/nologin | | | 4 | 65534 | 4 | 65534 | sync | sync | /bin | /bin/sync | | | 5 | 60 | 5 | 60 | games | games | /usr/games | /usr/sbin/nologin | | | 6 | 12 | 6 | 12 | man | man | /var/cache/man | /usr/sbin/nologin | | | 7 | 7 | 7 | 7 | lp | lp | /var/spool/lpd | /usr/sbin/nologin | |
システム内のすべての非システムユーザーを一覧表示する場合は、次のクエリを実行します。
osquery> select * from users where uid <= 1000 limit 3;
次の出力が得られるはずです:
+-----+-----+------------+------------+----------+-------------+-----------+-------------------+------+ | uid | gid | uid_signed | gid_signed | username | description | directory | shell | uuid | +-----+-----+------------+------------+----------+-------------+-----------+-------------------+------+ | 0 | 0 | 0 | 0 | root | root | /root | /bin/bash | | | 1 | 1 | 1 | 1 | daemon | daemon | /usr/sbin | /usr/sbin/nologin | | | 2 | 2 | 2 | 2 | bin | bin | /bin | /usr/sbin/nologin | | +-----+-----+------------+------------+----------+-------------+-----------+-------------------+------+
現在ログインしているユーザーのリストを取得するには、次のクエリを実行します。
osquery> select * from logged_in_users where type = 'user';
次の出力が得られるはずです:
+------+------+-------+--------------+------------+-------+ | type | user | tty | host | time | pid | +------+------+-------+--------------+------------+-------+ | user | root | pts/0 | 27.61.217.59 | 1587309538 | 19279 | | user | root | pts/1 | 27.61.217.59 | 1587310737 | 25378 | | user | root | pts/2 | 27.61.217.59 | 1587310997 | 25394 | +------+------+-------+--------------+------------+-------+
システムのメモリ情報を表示するには、次のクエリを実行します。
osquery> select * from memory_info;
次の出力が得られるはずです:
+--------------+-------------+----------+------------+-------------+-----------+-----------+------------+-----------+ | memory_total | memory_free | buffers | cached | swap_cached | active | inactive | swap_total | swap_free | +--------------+-------------+----------+------------+-------------+-----------+-----------+------------+-----------+ | 4138455040 | 2407211008 | 79745024 | 1384751104 | 0 | 556371968 | 954744832 | 0 | 0 | +--------------+-------------+----------+------------+-------------+-----------+-----------+------------+-----------+ osquery>
システムの平均負荷を見つけるには、次のクエリを実行します。
osquery> select * from load_average;
次の出力が得られるはずです:
+--------+----------+ | period | average | +--------+----------+ | 1m | 0.000000 | | 5m | 0.000000 | | 15m | 0.000000 | +--------+----------+ osquery>
システムの最初の5つのパッケージのリストを取得するには、次のクエリを実行します。
osquery> select * from deb_packages top limit 5;
次の出力が得られるはずです:
+-------------------+------------+--------------+------+-------+----------+ | name | version | source | size | arch | revision | +-------------------+------------+--------------+------+-------+----------+ | acpi-support-base | 0.142-8 | acpi-support | 43 | all | 8 | | acpid | 1:2.0.31-1 | | 146 | amd64 | 1 | | adduser | 3.118 | | 849 | all | | | apparmor | 2.13.2-10 | | 1833 | amd64 | 10 | | apt | 1.8.2 | | 4064 | amd64 | | +-------------------+------------+--------------+------+-------+----------+
システムで実行されているプロセスに関する情報を取得するには、次のクエリを実行します。
osquery> SELECT DISTINCT processes.name, listening_ports.port, processes.pid FROM listening_ports JOIN processes USING (pid) WHERE listening_ports.address = '0.0.0.0';
次の出力が得られるはずです:
+------+------+-----+ | name | port | pid | +------+------+-----+ | sshd | 22 | 729 | +------+------+-----+
以前のすべてのログインを検索するには、次のクエリを実行します。
osquery> select * from last;
次の出力が得られるはずです:
+----------+-------+-------+------+------------+--------------+ | username | tty | pid | type | time | host | +----------+-------+-------+------+------------+--------------+ | root | pts/0 | 1448 | 7 | 1587365277 | 27.61.217.41 | | root | pts/1 | 13392 | 7 | 1587368569 | 27.61.217.41 | | | pts/0 | 1004 | 8 | 1587376329 | | | | pts/1 | 13321 | 8 | 1587376821 | | | | ttyS0 | 748 | 8 | 1587465619 | | | | tty1 | 749 | 8 | 1587465619 | | | root | pts/0 | 1057 | 7 | 1587465664 | 27.61.217.9 | | root | pts/1 | 1375 | 7 | 1587465846 | 27.61.217.9 | +----------+-------+-------+------+------------+--------------+
crontabによってスケジュールされたすべてのジョブを一覧表示するには、次のクエリを実行します。
osquery> select command, path from crontab ;
次の出力が得られるはずです:
+----------------------------------------------------------------------------------------------------------------------------------------+-------------------+ | command | path | +----------------------------------------------------------------------------------------------------------------------------------------+-------------------+ | root cd / && run-parts --report /etc/cron.hourly | /etc/crontab | | root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) | /etc/crontab | | root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) | /etc/crontab | | root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) | /etc/crontab | | root if [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ]; then /usr/share/mdadm/checkarray --cron --all --idle --quiet; fi | /etc/cron.d/mdadm |
システムで開いているすべてのポートを見つけるには、次のクエリを実行します。
osquery> select * from listening_ports;
次の出力が得られるはずです:
+------+------+----------+--------+------------+-----+--------+----------------------------------------+---------------+ | pid | port | protocol | family | address | fd | socket | path | net_namespace | +------+------+----------+--------+------------+-----+--------+----------------------------------------+---------------+ | 444 | 53 | 6 | 2 | 127.0.0.53 | 13 | 14910 | | 4026531993 | | 729 | 22 | 6 | 2 | 0.0.0.0 | 3 | 16940 | | 4026531993 | | 664 | 3306 | 6 | 2 | 127.0.0.1 | 69 | 15824 | | 4026531993 | | 544 | 6379 | 6 | 2 | 127.0.0.1 | 6 | 15472 | | 4026531993 | | 729 | 22 | 6 | 10 | :: | 4 | 16951 | | 4026531993 | | 544 | 6379 | 6 | 10 | ::1 | 7 | 15473 | | 4026531993 | | 759 | 80 | 6 | 10 | :: | 4 | 17009 | | 4026531993 | | 444 | 53 | 17 | 2 | 127.0.0.53 | 12 | 14909 | | 4026531993 | | 405 | 58 | 255 | 10 | :: | 15 | 16039 | | 4026531993 |
最もアクティブな上位5つのプロセスを一覧表示するには、次のクエリを実行します。
osquery> select count(pid) as total, name from processes group by name order by total desc limit 5;
次の出力が得られるはずです:
+-------+---------+ | total | name | +-------+---------+ | 4 | sshd | | 3 | apache2 | | 2 | systemd | | 2 | bash | | 2 | agetty | +-------+---------+
上記のチュートリアルでは、Debian 10にosqueryをインストールして使用する方法を学びました。osqueryは、システム内のバックドア、マルウェア、またはゾンビプロセスを見つけるのに非常に便利なツールです。 osqueryの詳細については、osqueryのドキュメントページにアクセスしてください。