Raspberry Piは個人が使うもので、自分以外の人がアクセスする事は想定しないものです。
しかし大学などでグループで1台を共有するといった事をする場合には、IDやパスワードの取り扱いには配慮が必要です。
今回は、Wi-Fiに接続する方法は他にもまとめられている方が大勢いますが、この点を配慮してWPA2-EAP(PEAP)に接続する方法をまとめました。
2020/02/21追記
この文書の当初の想定は、Raspbian with desktopだけでしたが、Raspberry Pi4 4GBを入手したので、Ubuntu Server 19.10を利用した際の対応方法についても追記しています。
対象とする読者
- 大学・企業などで個人毎のID・パスワードを利用してWi-Fiに接続している (WPA2-EAP(PEAP)を想定)
- Raspberry Pi3に内蔵されているWi-Fiを利用したい
- パスワードをファイルに記述したくない
とはいえ、設定ファイル全体をコピーされれば、他の機器がWi-Fiに接続することは防げません。
パスワード自体がWi-Fi接続以外の目的で利用される可能性を低くするための方法です。
パスワードの取り扱い上の注意
パスワードをRaspberry Piのような小型デバイスに入力する際には、SDカードからパスワードを窃取される可能性に注意が必要です。例えば、~/.bash_historyファイルには、bashが実行したコマンドのリストが記録されています。
そのため次のような点に注意してください。
- コマンド引数にパスワードを含めない (e.g. $ echo -n "my password")
- ファイル上に読める状態でパスワードを書き残さない
もしbashのコマンドライン上でパスワードを入力してしまった場合
パスワードを入力してしまった端末上で $ history -a コマンドを実行して、メモリ上の履歴を書き出してから、$ rm ~/.bash_history のように、~/.bash_historyファイルを削除してください。
続いて、$ history コマンドを実行して、画面に表示された履歴にパスワードが出力されていない事を確認してください。
【すぐに.bash_historyファイルを削除しない理由】~/.bash_historyファイルに記録されるタイミングは、通常はshellが終了するタイミングです。history -aでメモリ上の履歴を書き出させています。 他には一度再起動してから~/.bash_historyファイルを削除するといった方法もあります。
これらの点に注意することで、パスワード自身が漏洩する可能性はかなり低くなります。しかし、設定ファイルに記述するハッシュ化した文字列とIDが漏洩した場合は、第三者がWi-Fiに接続することは可能なため、SDカードの管理は厳重に行なってください。
作業の流れ
上記を踏まえて、次のような流れで作業を進めていきます。
- 設定ファイルの雛形の入手
- パスワードのハッシュ化
- 設定ファイルの編集
- 設定ファイルの/etc以下へのコピー (要: root権限)
- 再起動 + 確認
設定ファイルの雛形の入手
端末ウィンドウを開き、ホームディレクトリ等の書き込み権限のある任意のディレクトリで、任意の名前のファイルを作成します。
(ここから先では、カレントディレクトリに wpa_supplicant.conf ファイルを作成したものとして説明していきます)
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
ssid=""
priority=1
proto=RSN
key_mgmt=WPA-EAP
pairwise=CCMP
auth_alg=OPEN
eap=PEAP
identity=""
password=hash:
phase1="peaplabel=0"
phase2="auth=MSCHAPV2"
}
キーボードを使って手動で入力すると間違いが入り込みやすくなります。
USBメモリなどでCopy&Pasteなどして作成したファイルをコピーしてください。
次の次で説明する設定ファイルの編集に書かれたで、次の3行を編集すれば、(私のいる大学の環境では)接続できます。
- ssid=
- identity=
- password=hash:
パスワードのハッシュ化
パスワードを入力するため、手元を盗み見られないように注意してください。
失敗してもやり直せるため、自分のペースで操作をしてください。
$ read -s pass
********
$ echo -n "$pass" | iconv -t utf16le | openssl md4
$ unset pass
********
の部分はパスワードを入力しますが、出力されないため、画面上は2行になります。
イメージしずらいと思うので、asciinemaの動画を確認してください。
*******
の部分がパスワードで、、コマンド履歴(history)にも残りません。
最後の"utf16le"は、"ユー/ティー/エフ/いち/ろく/エル/イー"(英数小文字と数字)です。いち(1)とエル(l)を間違わないようにしてください。
3行目のコマンドを実行結果は、(stdin)= bd5e04d88e5bb1744a27c78570da12ef
のように画面に出力されます。
この(stdin)=から続く右側の文字列をハッシュ値と呼びます。
このハッシュ値を次のセクションでファイルに記入します。
入力するコマンドの解説
ハッシュ値は他人に知られても大丈夫ですか?
設定ファイルの編集
wpa_supplicant.conf ファイルを開き、ssid=、 identity=、 password=hash:、で始まる3行を編集します。
...
network={
ssid="xxxx-wifi"
...
identity="xxxxxxxx"
password=hash:bd5e04d88e5bb1744a27c78570da12ef
...
}
- ssidは各組織で利用できるものを指定してください。
- identityはユーザーIDです。
- password=hash:の後ろはスペースを空けずに先ほど出力したハッシュ値の文字列をコピーします。
設定ファイルの/etc以下へのコピー (要: root権限)
作成したファイルを /etc/wpa_supplicant/wpa_supplicant.conf ファイルの名前でコピーします。
$ sudo cp wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf
自分でwpa_supplicant.conf以外の名前のファイルを作成した場合でも、コピー先のファイル名は変更せずwpa_supplicant.confの名称を利用してください。
再起動 + 確認
再起動は、GUIでもCUIでも、好きな方法で行なってください。
$ sudo shutdown -r now
再起動後に、画面右上のWi-Fiアイコンから動作状況を確認できます。
参考文献
2020/02/21 追記 - Ubuntu Server 19.10 for Raspberry Pi 3/4 について
Raspberry Pi4を入手したので、4GBバグが修正されたUbuntu Serverを利用しています。
$ uname -a
Linux ubuntu 5.3.0-1018-raspi2 #20-Ubuntu SMP Mon Feb 3 19:45:46 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 19.10
Release: 19.10
Codename: eoan
改めてこの手順を確認したところ、次のような問題がありました。
- wpa_supplicantは導入されているものの、iBus(+NetowrkManager)と(-uオプションの指定により)連携するようになっていて、Desktopを想定したと思われる設定になっている点
- AP(アクセスポイント)に接続した後、dhclient(DHCPクライアント)が自動的には起動しない点
単純な解決方法は次のとおりです。
- あらかじめ wpa_supplicant.service を停止、無効化させておく
- このページに記述した方法で /etc/wpa_supplicant/wpa_supplicant.conf を配置する
- 手動で、wpa_supplicantを起動する (配置したwpa_supplicant.confファイルを指定する)
- wlan0がUPステータスになった後(
$ ip addr
で確認)、dhclientを手動で起動する
$ sudo systemctl stop wpa_supplicant.service
$ sudo systemctl disable wpa_supplicant.service
$ sudo /sbin/wpa_supplicant -B -s -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0
$ sudo dhclient wlan0
これは少し乱暴な方法で、検索すると、systemctlを利用して/lib/systemd配下のwpa_supplicant.serviceファイルを編集したり、dhclient.confを編集するなどして、有効化している例はいくつかみつかると思います。
ただ、そういった方法が良いのか、最終的な解決策は少し検討が必要だと感じました。
以上