セキュリティ上の理由から、アクセスを監視できるようにしたい Web サーバー上の特定のファイルがあります。アクセスされるたびに、MySQL ログ テーブルにエントリを追加したいと考えています。このようにして、Web アプリケーション内からセキュリティ違反に積極的に対応できます。
3 に答える
Apache HTTP サーバーはログ機能を提供します。
サーバー アクセス ログには、サーバーによって処理されたすべての要求が記録されます。アクセス ログの場所と内容は、CustomLogディレクティブによって制御されます。LogFormatディレクティブを使用すると、ログの内容を簡単に選択できます。このセクションでは、アクセス ログに情報を記録するようにサーバーを構成する方法について説明します。
ログをファイルに書き込むために使用できます。MySQL テーブルに保存する必要がある場合は、cron ジョブを実行してファイルをデータベースにインポートします。
ログの詳細については、http: //httpd.apache.org/docs/1.3/logs.html#accesslogを参照してください。
PHP7 から削除されましたが、この投稿を見つけた他の人のために、FAM (現在の PECL) 拡張機能にはいくつかのオプションがあります。この関数http://php.net/manual/en/function.fam-monitor-file.phpは、ここで必要なものを説明しているようです
さらに、 http://php.net/manual/en/function.stat.phpでファイルのステータスに関する多くの詳細にアクセスできます。これを cron またはスリープ ドリブン スクリプト内に配置すると、いつ変更されたかを確認できます。
このファイルには、次の 3 つのポイントからアクセスできます。
- ファイルシステムへの直接アクセス
- のような URL を呼び出し
www.example.com/importantfile.jpg
ます (Apache がファイルを提供します)。 www.example.com/readfile.php?name=important.jpg
ファイルを読み取るサーバー上のいくつかのphpスクリプトを呼び出します。
ケース 2 だけが気になる場合は、Rishi Dua の解決策を確認してください。
しかし、それ以上のことが必要な場合は、fileatime()呼び出しを使用してスクリプトを作成し、それを cron に追加して、たとえば毎分実行する必要があります。
そのための擬似コード:
<?php
$previous_access_time = get_previous_access_time(); // get the previous last access time from you remembered in db or textfile or whatever
$current_access_time = fileatime('path/to/very_important_file.jpg');
if ($previous_access_time != $current_access_time) {
log_access_to_db();
save_new_access_time(); // update the new last access time
}
ただし、このソリューションにはいくつかの問題があります。1 つ目は、ファイルにアクセスしたユーザーのユーザー ID や IP ではなく、アクセス時間のみを取得できることです。2 つ目は、マニュアルにあるように、一部の Unix システムはアクセス時間を更新しないため、ソリューションが失敗する可能性があることです。
セキュリティについて真剣に心配している場合は、このような監査ユーティリティを確認する必要があると思います