パスワードの難読化

最近、レンタルサーバーの移行をしました。
ながらく放置されているコンテンツをあらためて整理しなおし、ついでに小さな見直しもしてみました。
そのなかの1つの改善で、シェルスクリプトの平文パスワードの難読化もやってみました。

おはずかしながら…

あるシェルスクリプト処理でサービス接続用にパスワードが必要なのですが、パスワードが平文でむき出しな状態になっていました。
いろいろな理由があってのことだと思いますが、ありがちなパターン。こんな感じですね。

#!/bin/bash
USER_NAME="my_user_name"
PASSWORD="this_is_plain_text_password_1234"

これは、あまりにも脆弱すぎるのでセキュアにしておきたい。
いろいろな前提が必要となる仕組みだと、レンタルサーバーの範疇でできなかったり、大事な情報とは言ってもそこそこなので、簡単な改善でできることは何かと考えてopensslを使った難読化を考えました。

秘密鍵を作成

秘密鍵はopensslのコマンドで作成が可能です。
鍵長を引数として指定するのですが、1024と書いてあるサイトが結構たくさんあります。あまり今回の目的では、大きな違いはないと思いますが、世の中のオススメに従い2048ビット以上にしました。詳細は、従来の暗号技術の危険性のサイトが、詳しいです。

$ openssl genrsa 3072 > private-key.pem
Generating RSA private key, 3072 bit long modulus
............++
..........................................................................++
e is 65537 (0x10001)

ちゃんと3072ビットの鍵長の秘密鍵ができているようです。

$ openssl rsa -text < private-key.pem
Private-Key: (3072 bit)
modulus:
    00:ca:a6:72:c4:b9:85:97:d3:61:ec:3b:bc:74:6f:
    d6:40:08:6c:9a:30:b8:5a:30:23:d1:13:e5:7d:7a:
    -続く-

作成した秘密鍵を使って、平文を難読化

早速、難読化をしてみましょう。
opensslコマンドで、難読化パスワードファイル(pass.rsa)を作成します。

$ echo 'this_is_plain_text_password_1234' | openssl rsautl -encrypt -inkey private-key.pem > pass.rsa

ちなみに復号は下記のコマンドで可能です。
確かに復号できていますね。

$ openssl rsautl -decrypt -inkey private-key.pem -in pass.rsa
this_is_plain_text_password_1234

ちなみにですが、異なる秘密鍵で暗号化した難読化パスワードファイル(pass2.rsa)を複合しようとすると、エラーになります。大丈夫そうですね。

$ openssl rsautl -decrypt -inkey private-key.pem -in pass2.rsa
RSA operation error
34381005096:error:0407109F:rsa routines:RSA_padding_check_PKCS1_type_2:pkcs decoding error:rsa_pk1.c:273:
34381005096:error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed:rsa_eay.c:602:

最後にシェルスクリプトに組み込み

これで、シェルスクリプトに組み込みができました。
ファイルの配置は多少考えたほうが良いかもしれませんが、平文でパスワードをシェルの中に記載するよりは、セキュアになったのではないでしょうか。

#!/bin/bash
USER_NAME="my_user_name"
PASSWORD=$(openssl rsautl -decrypt -inkey private-key.pem -in pass.rsa)

参照

OpenSSL で RSA の秘密鍵を作成する方法
従来の暗号技術の危険性
公開鍵暗号をプログラムで扱う方法のまとめ