Open1

Linux (Ubuntu) で任意のコマンドを実行したあとに新規生成されたファイルを特定する方法

PINTOPINTO

Linuxでは特定のコマンドを実行した後に新しく生成されたファイルを特定するために、inotifyやauditdといったツールを使うことができます。

inotifyを用いた方法

inotifyはLinuxカーネルが提供するファイルシステムのイベント監視ツールです。これを利用して特定のディレクトリに新しくファイルが作られたときのイベントを監視することが可能です。

inotifywaitコマンドを使うと、特定のディレクトリを監視して新規にファイルが作られたときに通知を受けることができます。以下は一例です:

inotifywait -m -r -e create /path/to/directory

このコマンドは、/path/to/directoryで指定したディレクトリ(およびそのサブディレクトリ)に新規ファイルが作成されたときに通知します。このコマンドを実行した後、別のターミナルウィンドウで任意のコマンドを実行し、新規ファイルが作られるとその通知が得られます。

ただし、これは特定のディレクトリのみを監視するため、全体のファイルシステムを監視するには適していません。

auditdを用いた方法

auditdはLinuxの監査デーモンで、システム上のアクティビティをトラッキングするために使用できます。これを利用して特定のコマンドによって作成されたファイルを特定することができます。

まず、監査ルールを設定してコマンドの実行を監査します。以下はtouchコマンドの実行を監査するルールの例です:

auditctl -a exit,always -F arch=b64 -S execve -C uid!=euid -F euid=0 -k rootcmd

これで、rootユーザーによって実行される全てのコマンドが監査されます。それから特定のコマンドを実行します。

その後、ausearchコマンドを使用して監査ログを検索します:

ausearch -k rootcmd

これにより、特定のコマンドが実行されたときの詳細な情報(実行されたコマンド、実行時間、関連ファイルなど)が表示されます。

auditdは一般的にシステムのセキュリティ監査を目的としているため、日々の作業での使用には向いていません。そのため、auditdは一時的な監査や特定の問題解決のためにのみ使用することが望ましいです。

また、auditdはシステム全体の監査を行うため、ログが大量に生成される可能性があります。そのため、長期間にわたる監査を行う場合は、ディスクスペースやパフォーマンスの影響を考慮する必要があります。

それぞれのツールは特定の目的に合わせて適切に選択・使用することが重要です。ある特定のコマンドが生成するファイルを追跡したいのであれば、そのコマンドを特定の一時ディレクトリ内で実行し、そのディレクトリをinotifyで監視するという方法も考えられます。この方法なら、そのコマンドが生成するファイルを特定しやすいでしょう。

ただし、これらの方法は新規に作成されたファイルを追跡するものであり、既存のファイルが変更されたことを検出するものではありません。ファイルの変更を追跡するには、inotifywaitコマンドに-e modifyオプションを付けるか、auditdでファイルアクセスを監査する設定を行う必要があります。

auditdを使ってrootユーザー以外の特定のユーザーによって実行されたコマンドを追跡することも可能です。以下にその手順を示します:

まず、監査ルールを設定してコマンドの実行を監査します。以下はユーザーusernameのコマンドの実行を監査するルールの例です:

auditctl -a exit,always -F arch=b64 -S execve -F auid=1000 -k usercmd

ここで、auid=1000はusernameユーザーのUIDを指定します。各ユーザーのUIDは/etc/passwdファイルを見るか、id -u usernameコマンドを実行することで調べることができます。

次に、ユーザーusernameでコマンドを実行します。

その後、ausearchコマンドを使用して監査ログを検索します:

ausearch -k usercmd

これにより、特定のユーザーが実行したコマンドの詳細な情報(実行されたコマンド、実行時間、関連ファイルなど)が表示されます。

ただし、auditdはシステムのセキュリティ監査を目的としているため、一般的な作業での使用には向いていません。そのため、auditdは一時的な監査や特定の問題解決のためにのみ使用することが望ましいです。

また、auditdはシステム全体の監査を行うため、ログが大量に生成される可能性があります。そのため、長期間にわたる監査を行う場合は、ディスクスペースやパフォーマンスの影響を考慮する必要があります。

これらの方法は新規に作成されたファイルを追跡するものであり、既存のファイルが変更されたことを検出するものではありません。ファイルの変更を追跡するには、auditdでファイルアクセスを監査する設定を行う必要があります。

Ubuntuでも同様の操作を行うことができます。UbuntuはLinuxディストリビューションの一つであり、先程説明したinotifyやauditdはLinuxの標準的な機能であるためです。

ただし、inotify-toolsやauditdが既にインストールされているかどうかを確認する必要があります。インストールされていない場合は、以下のコマンドを使用してインストールすることができます。

inotify-toolsのインストール:

sudo apt-get update
sudo apt-get install inotify-tools

auditdのインストール:

sudo apt-get update
sudo apt-get install auditd audispd-plugins

これらのコマンドは、Ubuntuのパッケージ管理システムであるapt-getを使用しています。このコマンドを使用すると、ソフトウェアを簡単にインストール、更新、削除することができます。

これらのツールをインストールした後は、先程説明した方法でコマンドの実行と新規ファイルの生成を追跡することができます。

"Operation not permitted"というエラーメッセージは、通常、コマンドを実行するユーザーがその操作を行うための適切な権限を持っていない場合に表示されます。

auditdを使用する場合や特定のディレクトリに対してinotifyを設定する場合など、多くの操作はrootユーザーの権限が必要です。そのため、このエラーが表示される場合は、コマンドの前にsudoを付けて実行してみてください。

たとえば、auditdの設定を行う場合は以下のようになります:

sudo auditctl -a exit,always -F arch=b64 -S execve -F auid=1000 -k usercmd

もし、sudoを使っても問題が解決しない場合は、そのユーザーがsudoを使用できる設定になっているか確認してみてください。sudoを使用できるユーザーは/etc/sudoersファイルや/etc/sudoers.dディレクトリ内のファイルに記述されています。

また、inotifyを設定するディレクトリがrootユーザーの所有である場合や特別な権限を必要とする場合も、同様のエラーが発生する可能性があります。その場合は、そのディレクトリの所有者を変更するか、適切な権限を設定する必要があります。

docker の中で sudo auditctl -a exit,always -F arch=b64 -S execve -F auid=1000 -k usercmd を実行するとそのようなエラーが表示されます。

Dockerコンテナ内でauditdを使用するのは難しい場合があります。Dockerコンテナはホストマシンのカーネルを共有するため、コンテナ内から直接カーネルレベルのオペレーションを行うことは基本的に制限されています。auditdはLinuxカーネルの監査フレームワークであり、カーネルレベルでの操作が必要です。

したがって、"Operation not permitted"エラーが発生する原因は、コンテナがホストのカーネル監査フレームワークにアクセスできないためと考えられます。

代替策として、ホストマシン上でauditdを設定し、その結果をコンテナと共有するという手法があります。ただし、これはコンテナ化の基本的な原則である隔離性を損なう可能性がありますので、セキュリティ上のリスクを理解した上で行ってください。

また、コンテナ内でのファイルの変更を監視するためには、inotifyツールを使用する方法もあります。この方法なら、特定のディレクトリを監視してファイルの作成や変更を検出することができます。ただし、これも特定のディレクトリに限定された監視となります。

以上のように、Dockerコンテナ内でのauditdの使用は制限されています。そのため、必要な監査を行うための最善の手段は、ユースケースと具体的な制約によります。