今回はWifiの接続情報流出リスクを低減させるためにM5 Stackに書き込んだ後にファイルから削除する為のツールを作成した。
最近我が家にCisco製品を導入したので、この機会に形だけじゃなくてちゃんとセキュリティを見直そうというのが発端である。
さて、以前誤って自宅のWifiパスワードをGitHubにUploadしてしまった記事を書いたので、今回はそれの続きといって良い。
thom.hateblo.jp
当時の再発防止策としては、Wifi接続情報をファイルにハードコードするのではなくArduinoライブラリフォルダに置いてそれをIncludeする方法だった。
作成したもの
今回はWifiパスワード流出防止の仕組みを更に発展させて、Arduinoライブラリフォルダ内のWifi接続情報も自動で削除・書き換えしてくれるプログラムを作った。
コンパイル前はそのツールでSSIDとWifiパスワードを設定し、コンパイルと書き込みが終わったら用済みなのでそのツールを使ってファイルからパスワードを削除するという運用にする。
外観はこんな感じ。自分用なので少々やぼったいけどSSIDとパスワードの視認性が良い。
※SSIDとパスワードはマジっぽく見えるけど適当に作ったサンプルなので、もちろん自宅のアクセスポイントをさらしてるわけではない。
コード (Python3)
import tkinter as tk from tkinter import ttk import tkinter.font as font from tkinter import messagebox SSID_DEFINE_LIB_PATH = r'C:\Program Files (x86)\arduino\libraries\ssid_define\ssid_define.h' class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) master.geometry("600x200") self.master = master self.pack(fill="both", expand=True) self.ssid = tk.StringVar() self.wpa_psk = tk.StringVar() self.layout() def layout(self): s = ttk.Style() self.entry_ssid = ttk.Entry(self) self.entry_wpa_psk = ttk.Entry(self) #self.display_font = font.Font(self,family="Consolas", size=26) self.display_font = ("Consolas", 26) s.configure('my.TButton', font=self.display_font) self.entry_ssid.configure(textvariable = self.ssid, font=self.display_font) self.entry_wpa_psk.configure(textvariable = self.wpa_psk, font=self.display_font) self.entry_ssid.grid(row=0,column=1, sticky = tk.W + tk.E) ttk.Label(self, text="ssid:", anchor="e", font=self.display_font).grid(row=0,column=0,sticky = tk.NSEW) ttk.Label(self, text="wpa_psk:", anchor="e", font=self.display_font).grid(row=1,column=0,sticky = tk.NSEW) self.button_erase = ttk.Button(self, text="Erase", style='my.TButton', command=self.erase_info) self.button_erase.grid(row=3,column=0, columnspan=2, sticky = tk.NSEW) self.button_register = ttk.Button(self, text="Write", style='my.TButton', command=self.register_info) self.button_register.grid(row=4,column=0, columnspan=2, sticky = tk.NSEW) self.entry_wpa_psk.grid(row=1,column=1,sticky = tk.W + tk.E) self.columnconfigure(1, weight=1) def erase_info(self): write_ssid_define('Undefined', 'Undefined') self.ssid.set("") self.wpa_psk.set("") messagebox.showinfo("ERASED", "Wifi info has been ERASED") def register_info(self): write_ssid_define(self.ssid.get(), self.wpa_psk.get()) messagebox.showinfo("WRITTEN", "Wifi info has been WRITTEN") def write_ssid_define(ssid, wpa_psk): f = open(SSID_DEFINE_LIB_PATH, 'w') code = [] code.append('#ifndef _SSID_DEFINE_\n') code.append('#define _SSID_DEFINE_\n') code.append('\n') code.append('#define MY_SSID "' + ssid + '"\n') code.append('#define MY_SSID_PASS "' + wpa_psk + '"\n') code.append('\n') code.append('#endif\n') f.writelines(code) root = tk.Tk() root.title("Wifi Info Register/Eraser") app = Application(master=root) app.mainloop()
使い方
使用の前にArduinoのライブラリパスを確認し、必要に応じてソースコード中のSSID_DEFINE_LIB_PATHの値を書き替える。
起動はpython wifi_conf.pyとするだけ。
SSIDとWPA_PSK(いわゆるパスワード)を入力してWRITEを押すとssid_define.hが書き換わる。
Arduinoコンパイルが終わったら忘れずにERASEしておく。
PSK(プリシェアードキー)の平文保存について
ESP32等のWifi対応デバイスのソースコードについて、パスフレーズが平文だと危険なのでwpa_passphraseコマンド等でハッシュ化しましょうといった記事がよくあるけど、ハッシュ化したら安全という誤解を招きそうなので補足しておく。
そもそも、なんでハッシュ化してる自分のクライアントが通信できるのかを考えてみてほしい。
。。。
そう、誰だってそのハッシュ値を入手できればあなたのWifiにアクセスできるということだ。
つまり、
流出したあとの危険性はハッシュ化前のPSKと変わらない。
安全性が上がる要素としては、後ろから覗き見られた場合にハッシュ化されていると極めて覚えにくいということが挙げられるが、しいて言えば違いはそれくらい。
なんとなくハッシュ化しておきたいとか、しないよりは良いとかいう曖昧な紹介が多く、リスクの方も「ハッシュ化したからといって100%安全とは言えない」といった説明になっていてちょっとお茶濁し感がある。
なので、より重要なのは流出させないこと。
そのためにはGitHubにうっかりPushしたりしないようにファイルを分けたり、今回紹介したみたいに用が済んだら消すという対策が良いんじゃないかと思う。
(参考サイト)
qiita.com