シェルスクリプトの平文パスワードをセキュアにする方法
追記: (2015/8/3) 大量のはてブが付いたので 続き を書きました。
sshを使用している人は文字列を手軽に暗号化・復号化できるという話。 このテクニックを使えば色々セキュアになるのでおすすめ。 今回はシェルスクリプト中の平文パスワードをセキュアに代替する。
平文パスワードはやめよう
シェルスクリプト中でパスワードが必要になったとき、 とりあえず平文で書いてしまいがち。
#!/bin/sh PASSWORD="hoge"
これをセキュアにしたい。 面倒くさいのは嫌なので、なるべく手持ちのツールで暗号化、復号化したい。 ssh用の rsa 秘密鍵と、openssl(大抵の環境に入っている)を使って改善しよう。
秘密鍵の準備
パスワードを暗号化するにあたって、秘密鍵を使用する.
sshを常用している場合は ~/.ssh/id_rsa
という秘密鍵が存在するだろう。
もし秘密鍵が無ければ ssh-keygen
で作成しよう。
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/auewe/.ssh/id_rsa): # ENTER を押す Enter passphrase (empty for no passphrase): # ENTER を押す Enter same passphrase again: # ENTER を押す Your identification has been saved in /home/auewe/.ssh/id_rsa Your public key has been saved in /home/auewe/.ssh/id_rsa.pub The key fingerprint is: 0f:2c:88:3d:40:13:0f:b5:a3:d4:0e:b7:e5:86:28:91 auewe@orenomachine The key's randomart image is: +--[ RSA 2048]----+ | o. | | k = . | | a . a | | o X B . m | |. a B S S | | B o . o | | o | | | | | +-----------------+
これで秘密鍵 ~/.ssh/id_rsa
が作成される。
openssl で文字列を暗号化、復号化
秘密鍵 ~/.ssh/id_rsa
を用いて文字列やファイルを暗号化し、
pass.rsa
というファイルに保存しよう。
openssl rsautl -encrypt
を用いる。
- 暗号化
# hoge という文字列を暗号化して pass.rsa に書き込むコマンド $ echo 'hoge' | openssl rsautl -encrypt -inkey ~/.ssh/id_rsa > pass.rsa # plain.txt というテキストファイルを暗号化して pass.rsa に書き込むコマンド $ openssl rsautl -encrypt -inkey ~/.ssh/id_rsa -in plain.txt > pass.rsa
暗号化後のファイル pass.rsa
を復号化するには
openssl rsautl -decrypt
を用いる。
- 復号化
# 暗号化された pass.rsa を復号化して標準出力に表示するコマンド $ openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in pass.rsa
従って、冒頭のインセキュアなシェルスクリプトは次のように書き換えよう。
#!/bin/sh # 暗号化されたパスワードファイル pass.rsa は、あらかじめ用意しておく PASSWORD=$(openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in pass.rsa)
補足
暗号化も復号化も秘密鍵を使用したが、
暗号化に関して言うと、原理的には公開鍵 ~/.ssh/id_rsa.pub
を用いれば
pass.rsa が得られるはずだ。
今回は秘密鍵ファイル中に含まれる公開鍵の情報を用いて暗号化している。