デジタルセキュリティは、今の時代において非常に重要です。特に自分のコンピューターに保存されたデータが勝手に触られていた場合、それが第三者による不正アクセスだったら嫌ですよね。
ということで、今回はPythonで「第三者によるファイル操作」を記録するアプリケーションを作成する方法をご紹介。つまり、ファイルが新規作成・変更・削除されるたびに、誰が、いつ、どのような操作を行ったかをログとして記録します。
Pythonも学べるので是非、ご覧ください!(^^)!
主な仕様
このアプリケーションは、特定のフォルダ内のファイル操作(作成・変更・削除)を監視し、その情報をログとして保存します。実行ファイル(.exe
)が配置されている場所にログファイルが生成され、そしてさらにアクセスした時のシステム情報(ユーザー名、IPアドレス、CPU使用率など)も記録されます。
以下の情報が記録されます。
- 日時: いつ操作が行われたか
- イベント: ファイルの作成・変更・削除のどれか
- 対象ファイル: 操作が行われたファイルのパス
- ユーザー名: 操作を行ったユーザー
- IPアドレス: 操作を行ったマシンのIPアドレス
- システム情報: 使用しているOSやバージョン、CPU使用率、メモリ使用率 など
これにより、誰がどのファイルにアクセスしたのか、常に監視することが可能になります。特に、第三者がファイルを勝手に操作した場合、その痕跡を記録できます。
まずはPythonを準備しよう
・Pythonのインストール
- 公式サイトからダウンロード
- Python公式サイト にアクセスし、適切なバージョンをダウンロードします。
- 注: Windows 7では、最新のPythonバージョンはサポートされない場合があるため、Python 3.8以下を選択することをお勧めします。
- インストールの設定
- インストーラーを起動し、「Add Python to PATH」にチェックを入れます。
- 「カスタムインストール」で必要に応じて設定を確認。
- 動作確認
- コマンドプロンプトを開き、以下を実行してバージョンを確認します:
python --version
正しいバージョンが表示されればOK。エラーが表示される場合、Pythonがインストールされていないか、システムのPATHに追加されていない可能性があります。
・PATHにPythonを追加
Pythonインストール時に「Add Python to PATH」にチェックを入れていなかった場合、手動で追加する必要があります。
手動でPATHを設定する方法
- Pythonのインストールディレクトリを確認
- Pythonがインストールされているフォルダを事前に確認する(例:
C:\Python38\
) Scripts
フォルダを事前に確認する(例:C:\Python38\Scripts\
)
- Pythonがインストールされているフォルダを事前に確認する(例:
- システム環境変数に追加(windowsのバージョンによってやり方は異なる)
- コントロールパネルを開き、「システム」 > 「システムの詳細設定」 > 「環境変数」を選択
- 「システム環境変数」で
Path
を選択し、「編集」をクリック - セミコロンで複数入力できる。例⇒⇒
C:\Python38
;C:\Python38\Scripts
- 設定を保存して再起動
- 再試行
- コマンドプロンプトを再起動し、再度以下を実行
- pip –version
- もし正しくインストールされていれば、
pip
のバージョン情報が表示される - その後、
pyinstaller
をインストールするために以下を実行できる - pip install pyinstaller
- もし、pipのバージョンが古い場合は以下を実行
- python -m pip install –upgrade pip
windowsのバージョンによって異なるので、このへんはAIに尋ねるのが一番楽だと思います(笑)
・エディタの準備
Pythonのコードを書くには、以下の方法がおすすめです。
方法1: IDLE(Pythonに付属)
- Pythonをインストールすると、デフォルトで「IDLE」というシンプルなエディタが使える
方法2: テキストエディタ(Notepad++やVS Code)
- より使いやすいエディタを使いたい場合は、以下をインストール
- Notepad++(軽量で初心者向け)
- Visual Studio Code(拡張機能が豊富でプロ向け)
準備ができたら、さっそくコードを入力しましょう!(^^)!
コード全文
以下がPythonコードの全文です!
import os
import sys
import socket
import platform
import psutil
from datetime import datetime
from getpass import getuser
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import tkinter as tk
from tkinter import filedialog, messagebox
# エラーログをファイルに書き込む関数
def log_error(error_message, error_log_path):
with open(error_log_path, 'a', encoding='utf-8') as f:
f.write(f"{datetime.now()} - {error_message}\n")
# ドメイン情報を取得する関数
def get_domain():
try:
return os.environ.get("USERDOMAIN", "ドメイン情報取得失敗")
except Exception as e:
log_error(f"ドメイン情報の取得エラー: {str(e)}")
return "ドメイン情報取得失敗"
# 情報を取得してファイルに記録する関数
def log_system_info(event_type, file_path):
try:
# 現在の日時
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# ユーザー名
user_name = getuser()
# ドメイン名
domain_name = get_domain()
# マシン名(ホスト名)
machine_name = socket.gethostname()
# IPアドレス(ローカルIP)
ip_address = socket.gethostbyname(machine_name)
# システム情報(OSとバージョン)
system_info = platform.system() + " " + platform.version()
# CPU使用率
cpu_usage = psutil.cpu_percent(interval=1)
# メモリ使用率
memory_usage = psutil.virtual_memory().percent
# 実行ファイルのディレクトリ
exe_directory = os.path.dirname(sys.argv[0])
# ログファイルのパス
log_file_path = os.path.join(exe_directory, 'file_info.txt')
# ファイルに保存する内容
content = f"日時: {current_time}\n"
content += f"イベント: {event_type}\n"
content += f"対象ファイル: {file_path}\n"
content += f"ユーザー名: {user_name}\n"
content += f"ドメイン名: {domain_name}\n"
content += f"マシン名: {machine_name}\n"
content += f"IPアドレス: {ip_address}\n"
content += f"システム情報: {system_info}\n"
content += f"CPU使用率: {cpu_usage}%\n"
content += f"メモリ使用率: {memory_usage}%\n\n"
# ログファイルに記録
with open(log_file_path, 'a', encoding='utf-8') as f:
f.write(content)
except Exception as e:
log_error(f"システム情報取得エラー: {str(e)}", log_file_path)
# フォルダ監視用のイベントハンドラー
class FolderHandler(FileSystemEventHandler):
def on_modified(self, event):
if not event.is_directory:
log_system_info("ファイルが変更されました", event.src_path)
def on_created(self, event):
if not event.is_directory:
log_system_info("ファイルが作成されました", event.src_path)
def on_deleted(self, event):
if not event.is_directory:
log_system_info("ファイルが削除されました", event.src_path)
def on_opened(self, event): # 開く操作を追加する場合
if not event.is_directory:
log_system_info("ファイルが開かれました", event.src_path)
# メインGUI部分
def main():
root = tk.Tk()
root.withdraw()
folder_path = filedialog.askdirectory(title="監視するフォルダを選択")
if not folder_path:
messagebox.showerror("エラー", "フォルダが選択されませんでした。")
return
messagebox.showinfo("監視中", f"フォルダ {folder_path} を監視中...\nアクセスイベントを記録します。")
observer = Observer()
handler = FolderHandler()
observer.schedule(handler, folder_path, recursive=True)
observer.start()
try:
while True:
pass # 永久ループで監視を続ける
except KeyboardInterrupt:
observer.stop()
observer.join()
if __name__ == "__main__":
main()
上記のコードを.pyで保存したら実行できます。ですが、このままだとモジュールがインストールされていないため、エラーが発生すると思います。以下の手順でモジュールをインストールしましょう。
依存モジュールをインストール
pip install watchdog
pip install psutil
pip install pywin32
.py スクリプトを直接実行する場合は、上記をインストールしたら実行できます。
ですが、なんかエレガントじゃないですよね。なんか黒い画面は邪魔だし。それにやっぱり.exeにしたいですよね。それに .exe
ファイルに変換すれば、Pythonがインストールされていない環境でも動作します。なので以下の手順で.exeに変換しましょう!(^^)!
exeにして使うときは下記のコマンドを入力
.exe
を作成する際に、--windowed
または --noconsole
オプションを追加することで、コマンド画面を非表示にできます。このオプションを使うと、GUIアプリケーション(Tkinterなど)のみが表示され、コマンドプロンプトは表示されません。
pyinstaller --onefile --noconsole --hidden-import=psutil --hidden-import=watchdog --hidden-import=pywin32 ○○○○.py
これで完成です!(^^)!
コードのポイント
- Watchdog ライブラリを使用し、フォルダ内のファイル操作を監視
- psutil ライブラリで、システムのリソース使用状況(CPU、メモリ)を取得
- tkinter を使用して、ユーザーが監視するフォルダを選択するGUIを提供
- ログ記録: イベントが発生するたびに、日時、ユーザー名、システム情報などをログファイルに記録
まとめ
セキュリティの意識も高められて、Pythonも学ぶこともできるのでまさに一石二鳥です。