Google Apps Script でパスワード管理ツール作りました
皆さん、 Web サービスなどのアカウント情報(パスワード)の管理はどうしているでしょうか。よく使うパスワードは出先でも確認できるようにしたい反面、アクセスが手軽すぎると万が一の漏洩が心配です。 1Password 等の便利なサービスもありますが、パスワードの管理を完全に他人任せにするのもちょっと不安。
ここはやはり自分なりの管理ツールを作ろうと思いたち、年末の空き時間と Google Apps Script 、そして Closure Library の暗号化モジュールを使ってでっち上げてみました。その名も「GAS Password Manager」です。
Web ベースのパスワード管理ツールで、入力されたパスワードを Web ブラウザ側の JavaScript で暗号化し、 Google Apps Script を介して Google Drive (Spreadsheets) に保存します。そして、サイト名やユーザー名などで検索して、やはり Web ブラウザ側の JavaScript で暗号化を解除、パスワードを表示できます。特徴は以下のようなところでしょうか。
- ブラウザ側で暗号化するので、生のパスワードがネットに流れない
- Web ブラウザとネット回線があればアクセス可能
- iPhone や Android のブラウザでも使用可能(JS のパフォーマンスの関係上、動作がかなり重いですが)
- データは Google Spreadsheets に保存されるので、バックアップ等も簡単
まあ、さすがに私が作ったものをそのまま使う気にはならないでしょうが、ソースコードを公開しているので、自分なりの管理ツールを作るための参考にでもしていただければ幸いです。
使っている技術について
前述のとおり、 GAS Password Manager は Google Apps Script と Closure Library で構築されています。
Google Apps Script (略して GAS)は、サーバーサイドで動作する JavaScript から Google の各種サービス(Google Drive や Gmail 等)の機能を呼び出して Web アプリケーションが構築できるというものです。こちらの記事で解説しているので参考にしてください。
Closure Library は Google が開発する JavaScript ライブラリで、今回は主にその暗号化モジュール (goog.crypt) を利用して、パスワードに AES による暗号化を施しています。
http://closure-library.googlecode.com/svn/docs/nam...
この暗号化モジュールの使い方は、別の記事としてまとめたいと思っています。
使い方
GAS Password Manager は以下の URL で公開してあります。
https://script.google.com/macros/s/AKfycbyZ1IkP7gC...
アクセスすると、初回のみ Google Spreadsheets のデータと User Properties (GAS でユーザーごとの設定を保存するための Key-Value ストレージ)へのアクセス許可を求める画面が表示されます。
「Click to Authorize」をクリックしてアクセスを許可すると、暗号鍵となるマスターパスワードを入力する画面になります。
マスターパスワードは毎回入力しなければいけませんが、パスワードを記録したスプレッドシートを盗まれたときの最後の防御になるものなので、安易なものにはしないでください。少なくとも 10 文字以上で、数字、アルファベットの大文字・小文字、記号をすべて含むことをお勧めします。
マスターパスワードを入力すると、メイン画面になります。上部のフォームが保存したアカウント情報を呼び出すための検索窓で、下が新しい情報を保存するためのフォームになります。
アカウント情報を保存するときは、下にあるフォームに情報を入力して、「Save」をクリックしてください。手抜きなのでインジケータ等は表示されませんが、保存が完了すると入力したデータが消えるので、それまで待ってください。
アカウント情報を呼び出したいときは、検索窓に Site もしくは User の文字列を入力して検索してください(部分一致です)。ヒットしたアカウントがリスト表示されます。
マウスオーバーで表示される 2 つのアイコンのうち、左側の南京錠が暗号化解除ボタンになっています。これをクリックすることではじめてパスワードが複合され、表示されます。
暗号化解除ボタンを押しただけだと、画面を覗かれても簡単には読めないようにチェック模様の背景になっています。コピー & ペーストはこの状態でも可能です。さらに右側の目のアイコンをクリックすると、チェック模様が消えて読める状態になります。
使い方はこれだけです。パスワードは「GAS Password Manager」という名前のスプレッドシートに保存されていますので、パスワードを削除したい場合は Google Drive 上で該当行を削除してください。ただし、編集履歴には情報が残っているので要注意です。完全に削除するにはスプレッドシート自体を削除し、さらにゴミ箱を空にしてください。
利用中止
利用を中止するときは、「GAS Password Manager」というスプレッドシートを手動で削除してください。 Spreadsheets 等へのアクセス許可が残っているのが気になる場合は、アクセスを許可した時に送信されるメールに含まれている「Uninstall GAS Password Manager」のリンクから許可を無効にできます。
本当はすべての GAS アプリを管理できるページがあると便利なのですが、そういったものはないみたいなんですよね。ここはぜひ改善してほしいところ。
注意点
アカウント情報の安全を保つため、以下の点に注意してください。
- 悪意あるブラウザ拡張などを使用していると、パスワードを盗まれる恐れがあります。拡張を入れていないブラウザを使うか、シークレットモードなどの拡張が動作しないモードで使うことをお勧めします。
- 悪意ある Google Apps Script や Drive アプリなどをインストールすると、暗号化されたパスワードの入ったスプレッドシートを盗まれる可能性があります。万が一のために強固なマスターパスワードを使ってください。
- 言うまでもないですが、パスワードを保存したスプレッドシートを他人と共有したりするのは避けてください。
このあたり把握した上で、 At your own risk でご利用ください。
ソースコード
ソースコードは GitHub で公開しています。
https://github.com/webos-goodies/gas-password-manager
Google Drive で新規の Google Apps Script プロジェクトを作成し、上記リポジトリの app/gas 以下にあるファイルをプロジェクトに含めれば、ひとまず動くはずです。クライアントサイドの JS を変更する場合は、 build.sh でコンパイル後(要 Python と JRE)、 assets/gaspass.js を適当なサーバーで公開して index.html 中のパスを変更してください。
作ってみた感想など
今回は実験的に GAS のクライアントサイドを Closure Library で組んでみたのですが、正直ちょっと厳しい感じです。 GAS のクライアントサイドではセキュリティ確保のため Caja が適用されるのですが、これと Closure Library はかなり相性が悪いですね。とくに goog.base が使えないので(Function.callee を呼ぶ所でエラーになる)、スクリプトを ADVANCED_OPTIMIZATIONS でコンパイルしないと実行できないのは痛い。
ただでさえ GAS のクライアントサイドは自動で minify されてデバッグが難しいのですが、さらにコンパイルしないと実行できないという生き地獄。 GAS のクライアントサイドでそれなりの JS を動かす場合は、別環境で完全にデバッグしてから載せるのがお勧めです。
これに対して、 GAS のサーバーサイドの開発効率は素晴らしいですね。 Google Spreadsheets などの Google のサービスに簡単にアクセスできるので、僅かなコードでもけっこう面白いことができます。 Web ベースの IDE でコーディングも手軽ですし。おかげで、クライアントサイドで上記のような地獄を味わいながらも、基本部分は一日、暗号鍵の生成を PBKDF2 にするなどの改善を含めても二日で完成できました。
ということで、 GAS かわいいよ GAS 、というお話でしたw
詳しくはこちらの記事をどうぞ!
この記事にコメントする