シェルスクリプトの平文パスワードをセキュアにする方法

追記: (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 が得られるはずだ。 今回は秘密鍵ファイル中に含まれる公開鍵の情報を用いて暗号化している。

参考

ssh の RSA 鍵を openssl コマンドで扱ってみる