Keepass-CLIの自動入力

mac
コマンドラインからkeepassを使う方法を提案。

photo-credit: IconAarchive



自分の昔書いた記事が紹介されていたので、嬉しくなりました。

OSXでKeePassXの鍵をコマンドライン1発で取得するまでの手順


ということで、今回は、 kptool をちょっとだけ改良し、IDやパスワードなどの自動入力をやってみようと思います。


もちろん、上記の記事も参考にしますが、私の場合、 json 形式でデータを扱うことにします。


なので、 jq というツールが必要です。


ダウンロードと改造



git clone https://github.com/shirou/kptool

cd $!:t/kptool

vim kptool_kai.py



#!/usr/bin/env python
# -*- coding: utf-8 -*-
# http://qiita.com/letsspeak/items/2c46a2492b4d62d47d66

import argparse
import getpass
import datetime
import readline

from keepassdb import keepassdb

if __name__ == '__main__':

parser = argparse.ArgumentParser(description='search entry from keepass DB')
parser.add_argument('kdb_file',
nargs=1,
help = 'keepass DB file path')
parser.add_argument('title',
nargs=1,
help = 'entry title')
parser.add_argument('-p', '--password')

args = parser.parse_args()

if (not args.password):
password = getpass.getpass()
else:
password = args.password

try:
k = keepassdb.KeepassDBv1(args.kdb_file[0], password)
except ValueError:
print("Invalid password.")
exit(1)

for e in k.get_entries():
title = e['title'].encode('utf-8')
if (title == args.title[0]):
print("{\"id\": \"%s\"" % e['id'].encode('utf-8'))
print(", \"title\": \"%s\"" % title)
print(", \"url\": \"%s\"" % e['url'].encode('utf-8'))
print(", \"username\": \"%s\"" % e['username'].encode('utf-8'))
print(", \"password\": \"%s\"}" % e['password'].encode('utf-8'))



なお、 pythonの入力を省きたい場合は、実行権限は与えておきましょう。


試しに運用してみる



先ほどダウンロードしたフォルダ内に、テストファイルがあります。それを使ってみましょう。パスワードは、 Hogehogeです。


./kptool_kai.py -p Hogehoge ~/kptool/tests/keepass-test.kdb Entry1






このようなjson形式で出力されるデータは、 jq コマンドにより扱いが容易となります。


例えば、 usernamepasswordを取得してみましょう。


./kptool_kai.py -p Hogehoge ~/kptool/tests/keepass-test.kdb Entry1 | jq .username,.password



ちなみに、すべてのデータをインデント?を付けて表示する場合は、 jq . でいけます。


この辺りの説明は、以下の記事が参考になります。

軽量JSONパーサー『jq』のドキュメント:『jq Manual』をざっくり日本語訳してみました


と言っても、最初はやっぱり分かりにくいかもですね。この辺りは、また記事でも作って補足することにします...。


Keepass-CLIの自動入力



kptoolの思想



では、もう少しパスワード入力を楽にするために、フォームに自動で入力されるような形にしてみることにします。


その前に、まずは、kptoolの思想に関する推測を話しておくことにします。


kptoolは、パスワードの扱いを楽にすると同時に、セキュリティ上にも気を使っています。


そもそも、このようなパスワード管理ツールは、便利さとセキュリティのバランスが求められている場合が多いからです。


一番のセキュリティを考えるなら、パスワード管理ツールは使わないほうが良いです。なぜなら、一箇所にパスワードを集めること自体が危険であるからです。


したがって、便利さとセキュリティのバランスを考えなくてはなりません。


kptoolの場合は、「プロンプトに情報を残さない」という点で、セキュリティのことを考えているようです。


具体的には、パスワードの入力及び、情報の表示は、当該ツール(Python:kptool)を閉じると、シェルのプロンプトに残らないようになっています。


しかし、上で紹介した記事では、このような思想があまり理解されずに、改良されているような印象を受けました。


ということで、私が考えるkptoolの改良は、「プロンプトに情報を残さない」ということを気をつけていきたいと思います。


もちろん、便利さを重視するのと、セキュリティを重視するのとでは、多くの場合、これらは両立しません。


よって、どちらを重視するのかは、個々の問題だと思います。


kptool_kai.pyを使ったフォームの自動入力



ここでは、ShellScriptとAppleScriptを使います。


簡単には、情報の取得は、ShellScriptで行い、Browserへの出力は、AppleScriptを使うといった感じです。なお、AppleScriptの処理部分は、JavaScriptを使っても出来ますので、環境に応じて、JavaScriptを使っていただければと思います。


例えば、以下の様なエントリーを作成します。ポイントとしては、 URLです。





function kptool () {
dev=`~/kptool/kptool/kptool_kai.py ~/kptool/tests/keepass-test.kdb $1 | jq .url,.username,.password | sed 's/"//g'`
url=`echo $dev | awk 'NR==1'`
user=`echo $dev | awk 'NR==2' | pbcopy`
pass=`echo $dev | awk 'NR==3'`

# prompt:url, username, password
#echo $dev

# auto-input
open -a Google\ Chrome $url
sleep 2
keepass_chrome_auto_input.scpt $pass

# security
dev="" user="" pass=""
#echo "" | pbcopy
}



ここで、 ~/kptool/tests/keepass-test.kdb の部分は、データファイルになります。自身のデータファイルのあるパスに書き換えましょう。


以下のファイルを作成し、パスの通った場所にコピーします。なお、実行権限は与えておいてください。


#!/bin/bash

echo "
tell application \"Google Chrome\"
activate
tell application \"System Events\"
delay 0.5
keystroke \"v\" using {command down}
delay 0.5
keystroke tab
delay 1
keystroke \"$1\"
end tell
end tell
" | osascript -



では、 $ kptool githubと実行してみます。