ZIP暗号/複号アプリを作ってみる(bashスクリプト)¶
はじめに¶
Rakuten Rapid APIのDAuth トライアル(評価版)を使用して、簡単なZIP暗号/複号アプリケーションを作ります。
YubiKeyのOTP(ワンタイムパスワード)を使用することで、ユーザはZIPの暗号化/復号する際のパスワード入力が不要になります。
準備するもの¶
- DAuthアカウント (チュートリアル Step 1で作成済み)
- Rakuten Rapid APIのアカウント (チュートリアル Step 1で作成済み)
- YubiKey
- インターネットに接続したPC (Webブラウザ)
- サンプルアプリケーションを動かす端末(OS:Linux系)
このチュートリアルは、AWSのEC2(Amazon Linux2)上で作成しています。 OSが違う環境で作成する場合は、本手順と若干異なる場合があります。
DAuth等のアカウントが未登録の場合は、Step1を参照してください。
環境¶
DAuthのトライアル版(Rakuten Rapid APIマーケットプレイスモデル)で構築します。
料金は発生しませんが、下記の制限があります。
- APIのリクエスト数に上限(ハードリミット)がある
- 利用期限は1ヶ月間
この制限は、通常プランに変更することで解除できます。 通常プランへの切り替え方法は、こちらを参照してください。
注意事項¶
本アプリケーションで圧縮・暗号化した場合、DAuthのトライアル用アカウントの期限超過、DKVSの該当データが削除された場合、データの解凍・複号ができなくなります。
圧縮・暗号化前のオリジナルデータを削除しないようにしてください。
このサンプルアプリケーションの目的は、YubiKeyをログイン認証以外で使うことにあります。
セキュリティについては、利用される環境のセキュリティポリシーに合わせてご対応ください。
また、本アプリケーションの使用により生じる如何なる損害に対しても、その法的根拠に関わらず弊社は責任を負いません。
上記の内容に同意した上でご利用ください。
GitHub¶
このチュートリアルで使用するプロクラムは、GitHubで公開されています。
ご不明な点などあれば、GitHubにてご質問ください。
GitHub : dauth-yubikey-zip-bash
チュートリアル開始¶
1. 本アプリケーション用のAPIキーを作成する
1-1. DAuthのWebコンソールにログインする。
1-2. APIキーの管理画面に移動する。
1-3. [新規作成]をクリックする。
1-4. 必要事項を入力して[保存]をクリックする。
[YubiKey API(認可)]と[DKVS API(認可)]は、必要最低限の項目のみチェックします。
各項目の詳細は、こちらを参照してください。
1-5. APKキーが発行されます。
作成したAPIキーは、"手順4-2"と"手順5-1"で使用します。
2. YubiKeyを登録する
2-1. YubiKeyの管理画面に移動する。
2-2. [新規作成]をクリックする。
2-3. 必要事項を入力して[保存]をクリックする。
[ネームスペース]は、"手順1-5"で作成したAPIキーのネームスペースと同じにします。
画面はYubiKey購入後にAESを変更していないときの入力例です。
AESを変更したYubiKeyを登録する場合は、独自AESにチェックを付け、AESを入力する必要があります。
各項目の詳細は、こちらを参照してください。
3. 必要なアプリケーションをインストールする
3-1. アプリケーションを動かす端末(sshなど)に接続します
ここでは、EC2(OS:Amazon Linux2)にssh接続しています。
3-2. 必要なアプリケーションがインストールされているか確認します。
必要なアプリケーション一覧
- zip
- curl
- jq
$ zip -v
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
Currently maintained by E. Gordon. Please send bug reports to
the authors using the web page at www.info-zip.org; see README for details.
:
:
$ curl -V
curl 7.61.1 (x86_64-koji-linux-gnu) libcurl/7.61.1 OpenSSL/1.0.2k zlib/1.2.7 libidn2/2.3.0 libssh2/1.4.3 nghttp2/1.41.0
Release-Date: 2018-09-05
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy Metalink
:
:
$ jq -V
jq-1.5
インストールされてない場合は、各OSに合わせた方法でインストールしてください。
4. ZIP(圧縮 + 暗号化)アプリケーションを作成する
4-1. RapidAPI-Keyを取得する
DAuth トライアル(評価版) エンドポイントの[X-RapidAPI-Key]の値をコピーします。
コピーが上手くできないときは、画面右側のプログラムコードに書かれている"x-rapidapi-key"の値をコピーしてください。
この値は、次の"手順4-2"と"手順5-1"で使用します。
4-2. ZIPスクリプト作成
仕組みは下記のとおりです。
$ mkdir sample
$ cd sample
sample
ディレクリ直下に、下記の内容でzip.sh
を作成します。
#!/bin/bash
# Usage : zip.sh source.txt otp
# ここの値を入れ替える
APIKEY=<API KEY>
RAPIDKEY=<RAPID KEY>
# ランダム文字生成
PASSWORD=$(tr -dc 'A-Za-z0-9#%@&()' < /dev/urandom | fold -w64 | head -n 1)
KEY=$(tr -dc 'A-Za-z0-9' < /dev/urandom | fold -w8 | head -n 1)
ZIPFILE=${1}
OTP=${2}
KEYID=${OTP::12}
# call DAuth API
# Rapid
RESULT=$(curl \
-X POST \
-s \
-H "X-DAUTH-API-KEY:${APIKEY}" \
-H "x-rapidapi-key: ${RAPIDKEY}" \
-H "Content-Type: application/json" \
-d '{"device_id":"'${KEYID}'", "key":"'${KEY}'", "value":"\"'${PASSWORD}'\""}' \
'https://dauth-trial.p.rapidapi.com/v1/dkvs' \
)
# Error check
if [ "`echo ${RESULT} | grep 'errors'`" ] ; then
echo "Error!!"
echo "`echo ${RESULT} | jq -r '.errors[0].message'`"
exit 1
fi
# zip
zip -e --password=${PASSWORD} ${ZIPFILE}.${KEY}.zip ${ZIPFILE}
下記の値を入れ替えます。
<API KEY>
は、"手順1-5"で作成したAPIキーを入力します。
<RAPID KEY>
は、"手順4-1"でコピーしたRapidAPI-Keyを貼り付けます。
4-3. テスト
$ chmod +x zip.sh
$ date > test.txt
$ ./zip.sh test.txt <YUBIKEY OTP>
$ ls
test.txt test.txt.Sf8f0aHc.zip zip.sh
ZIPするテストファイル(test.txt)を作成します。
サンプルアプリケーションでZIP(圧縮+暗号化)し、ファイル(test.txt.Sf8f0aHc.zip)が作成されたのを確認します。
<YUBIKEY OTP>
は、"手順2-3"で登録したYubiKeyのワンタイムパスワードを入力します。
<元のファイル名>.xxxxxxxx.zip
のxxxxxxxx
は、DKVSのKeyです。Valueが暗号化したときのパスワードになります。
4-4. DKVSにデータが登録されたのを確認
Webコンソールで、サンプルアプリケーションからDKVSにデータが登録されたのを確認します。
5. UNZIP(復号)アプリケーションを作成する
5-1. UNZIPスクリプト作成
仕組みは下記のとおりです。
sample
ディレクリ直下に、下記の内容でunzip.sh
を作成します。
#!/bin/bash
# Usage : unzip.sh file.xxxxxxxx.zip otp
# ここの値を入れ替える
APIKEY=<API KEY>
RAPIDKEY=<RAPID KEY>
# test.txt.XXXXXX.zip -> XXXXXX
ZIPFILE=${1}
KEY=$(echo ${ZIPFILE} | sed 's/^.*\.\([^\.]*\)\.\([^\.]*\)$/\1/')
OTP=${2}
# call DAuth API
RESULT=$(curl \
-s \
-H "X-DAUTH-API-KEY:${APIKEY}" \
-H "x-rapidapi-key: ${RAPIDKEY}" \
"https://dauth-trial.p.rapidapi.com/v1/dkvs/yubikey_otp?key=${KEY}&otp=${OTP}")
# Error check
if [ "`echo ${RESULT} | grep 'errors'`" ] ; then
echo
echo "Error!!"
echo "`echo ${RESULT} | jq -r '.errors[0].message'`"
exit 1
fi
PASSWORD=`echo ${RESULT} | jq -r '.[0].value'`
unzip -o -P ${PASSWORD} ${ZIPFILE}
下記の値を入れ替えます。
<API KEY>
は、"手順1-5"で作成したAPIキーを入力します。
<RAPID KEY>
は、"手順4-1"でコピーしたRapidAPI-Keyを貼り付けます。
5-2. テスト
$ chmod +x unzip.sh
$ mv test.txt test.txt.org
$ ./unzip.sh test.txt.xxxxxxxx.zip <YUBIKEY OTP>
$ ls
test.txt test.txt.org test.txt.xxxxxxxx.zip unzip.sh zip.sh
解凍されたのがわかるように、"test.txt"のファイル名を"test.txt.org"に変更します。
サンプルアプリケーションでUNZIP(解凍)し、ファイル(test.txt)が作成されたのを確認します。
<YUBIKEY OTP>
は、"手順2-3"で登録したYubiKeyのワンタイムパスワードを入力します。
<ファイル名>.xxxxxxxx.zip
のxxxxxxxx
は、"手順4-3"で作成されたZIPファイル名になります。
以上で、Step 2のチュートリアルは終了です。