• 作成:

専修大学のhttpによる認証を必要とする腐ったwifiに, NetworkManagerのdispatcherを使って自動ログインする

NetworkManagerを開発しているGnomeのロゴ

2017年度より, 専修大学のwifiにもWPAエンタープライズ認証が導入されました. よってこの記事は早くも腐りました.

背景

2014年に専修大学に入学して, 困ったことが1つありました.

それは, 専修大学の学内wifiSENSHUWLはまるで空港のような形でwifiの認証を行うということです.

  1. http通信に中間者攻撃をしてhttps://wcgw.senshu-u.ac.jp/cgi-bin/loginへリダイレクトするwebページを返す
  2. https://wcgw.senshu-u.ac.jp/cgi-bin/login上で学生番号と割り当てられたパスワードを入力する

こういった手順で, 学生は大学のwifiにログインします.

行きずりの空港ならともかく, 毎日ログインする大学のwifiでこの作業を行うのは非常に面倒くさいです.

さらに最近はhttpsやHSTSが普及したおかげで, 中間者攻撃が通じないため, 未だにhttpを使っているサイトを探さないといけません. わざわざwifiにログインするため, httpを提供し続けるというサイトが登場してきたぐらいです. NeverSSL - helping you get online

私は数日でこの面倒な作業に嫌気が差して, 自動化する方法を探し始めました. それで2014年にwifiに接続しただけで自動で認証する仕組みを作って, 3年間使い続けています. 今更ですがその方法を公開しようと思います.

自動認証するスクリプト

このスクリプトは/etc/NetworkManager/dispatcher.d/ディレクトリ内に設置します.

自分のパスワードは/etc/senshu-login.confに記述します. 学生番号は自分用のスクリプトなのでハードコーディングしましたが, いくら自分専用のスクリプトでもパスワードをハードコーディングするのは気が引けました.

接続タイミングの検出法

GNU/Linuxディストリビューションのデファクトスタンダードのネットワーク管理ソフトウェアはNetworkManagerです. このソフトウェアは, ネットワークに変化があるたびに/etc/NetworkManager/dispatcher.d/ディレクトリ内の実行可能ファイルを実行してくれます. また, 引数にupdownなどの状態変化の種類を, 環境変数CONNECTION_IDにssidを入力してくれたりします. これらを参照すれば「専修大学のwifiに接続した」ということがスクリプト側で判断できるわけですね.

ログイン

接続したことを感知できれば, 後はcurlで送信するはずのユーザーidとpasswordを送信するだけです.

pythonなのにurllibを使わずにcurlを使っている理由

  • 最初はシェルスクリプトで書いていたものをpythonに移植したから
  • python2のurllibは証明書を検証しない, ということを聞いて恐怖を覚えたため. python3のurllibはきちんと検証するようです

セキュリティリスク

一応セキュリティリスクも検証しましたが, httpsでサーバを認証している以上, DNSレコードの改竄などによって, 専修大学ではないサーバにパスワードを送信してしまうリスクはないはずです. ドメインごと乗っ取られた場合は諦めます.

空港やマクドナルドとかは?

似たような方法で自動で認証できるはずです. よく使うことになれば, 設定するかもしれません. NetworkManagerのdispatcherの仕様は, 例によってArchWikiが参考になります. NetworkManager - ArchWiki

windowsやmacはどうするの?

windowsならネットワーク接続が切れたら,自動的に再接続してくれるバッチ (WiFiの電波が弱くても,自動で無線LANにつなぎなおす) - 主に言語とシステム開発に関して macなら無線APによって自動でhostsを変える方法 - unknownplace.orgといった方法があるようですね. スクリプトを指定のディレクトリに置くだけのNetworkManagerと違ってどうも面倒くさいですね. やはりUNIX指向は素晴らしい.

これってバッドノウハウだよね?

その通りです. ただが学生に対策を用意させるシステムがおかしい. まず複数人が接続するwifiでWPAパーソナルを採用するのは盗聴に対して脆弱です. WPAエンタープライズモードを使って, 利用者個人の認証を行うべきです.

他大学ではeduroam JPのようなシステムを使って, WPAエンタープライズモードを使い, しかも複数の大学のwifiに同じアカウントでログインできる優れた仕組みを構築しているようです. 専修大学もこのような欠陥システムを修正して, せめてWPAエンタープライズモードを使用するべきです. 石巻専修大学はeduroam JPに参加しているようです, 本家も参加してください.