【iDempiere Lab】パスワードの暗号化について

Compiere Distributionのパスワードの初期保存状態について

 業務アプリケーションレベルでのセキュリティー管理で重要な事の1つはユーザーのIDとログイン時に認証に使用するパスワードの管理だと思います。通常、業務アプリケーションではIDとパスワードは個人毎に付与され、その管理は個人に委ねられます。そのため個人が不注意に他人にIDとパスワードを教えてしまう事は、システム的には防ぎようがありません。

 IDとパスワードを他の人に教えてはいけないよ、というのはどのシステムでも言える事で、例えシステム管理者であってもユーザーのパスワードは知らない方が(知ることのできない方が)セキュリティー的に好ましいと言えると思います。

 ここで1つ注意が必要になるのですが、多くのCompiere Distributionでは初期状態ではパスワードは平文で保存されています。これは、セキュリティー的に無頓着というわけではなく、オープンソースの特性上、デモ環境に用意されているユーザーのIDやパスワードは公開して誰でも試せるようにしておきたいという意図からだと私は理解しています。その証拠に、暗号化する処理がちゃんと用意されています。

 私のこれまでの経験では、Compiere(コンピエール)ADempiere(アデンピエレ)iDempiere(アイデンピエレ)の3つのCompiere Distributionは、初期状態ではパスワードは平文で保存されています。

 

多くのCompiere Distributionでは初期状態ではパスワードは平文で保存されている。

AD_userテーブル
AD_userテーブル

 nameカラムに入力されているデータがIDで、passwordカラムに入力されているデータがパスワードになります。IDがSuperUserのパスワードはSystemだというのが、簡単に判別できます。

 ちなみに、上記画像で紹介している4つのユーザーIDとそのパスワードはシステム管理者とサンプルユーザーのIDと初期パスワードであり、Compiereの時代から公表されていますので、本番導入の際には、少なくともパスワードは変更しておく事を強く推奨致します。

 それではPasswordを暗号化する方法として、まずはCompiere(コンピエール)の頃からある暗号化プロセス(Column Encryption)を実行する方法を紹介したいと思います。

 

暗号化プロセス(Column Encryption)を実行する方法

 Systemクライアントにログインし、アプリケーション辞書のテーブルとカラムウィンドウを開きます。テーブルとカラムウィンドウで、暗号化したいカラムの設定画面に行きます。ここでは、例としてAD_UserテーブルのPasswordカラムを暗号化してみたいと思います。

テーブルとカラムウィンドウのカラムタブ
テーブルとカラムウィンドウのカラムタブ

 カラム暗号化ボタンを押します。そうすると、カラム暗号化ポップアップウィンドウが表示されますので、暗号化フラグと現在設定の変更フラグをONにします。

カラム暗号化ポップアップウィンドウ
カラム暗号化ポップアップウィンドウ

 暗号化処理が終了すると、下記のようなメッセージが表示されます。メッセージは、「org.compiere.util.Secureクラスを呼び出して、18件のデータを暗号化し、暗号化するフラグをONにしたよ。」という内容だと思います。

実行ログ
実行ログ
AD_Userテーブル
AD_Userテーブル

 確認するとpasswordカラムに保存されているデータが先ほどの平文から暗号化されているのがわかります。

 この暗号化の処理はiDempiereではorg.compiere.process.ColumnEncryptionクラスがプロセスエンジンから呼び出され、実際の暗号化処理はorg.comoiere.utile.Secureクラスに処理を引き継いでいます。

 暗号化の処理的には、Cipherクラスを使用して、暗号化のアルゴリズムを差し替えて色々な暗号処理ができるような作りになっていますが、デフォルトでは、DES(Data Encryption Standard)という暗号処理が施されるようです。

 

 下記のようなパラメータ指定で、いったん暗号化(Encryption)したデータも、復号化(Decryption)してもとの平文に戻す事もできます。

 ここではパスワードを例にして暗号化の処理を説明しましたが、この機能はパスワード以外も暗号化する事ができます。

パスワードをハッシュ化する方法

 iDempiereでは、DESの暗号化処理の他にも、パスワードについては、ハッシュ化する方法が実装されています。

 ハッシュ方法としては、MUserクラスを確認してみるとSHA512を採用しているようです。

 

 パスワードについてハッシュ化したい場合はパスワードをハッシュ化(Convert passwords to hashes)するプロセスを実行します。

 パスワードをハッシュ化するプロセスを実行すると、次のように既に登録されているパスワードがハッシュ化されます。

AD_Userテーブル
AD_userテーブル

パスワードをハッシュ化する(Convert passwords to hashes)プロセスを実行する際に"Passwords already hashed"というエラーが表示された場合は、既にハッシュ化処理が行われています。 

パスワードをハッシュ化するプロセスを実行すると、 システムコンフィグ設定で、USER_PASSWORD_HASHのValue(検索キー)がYに変更になります。

USER_PASSWORD_HASHの初期値はNです。
USER_PASSWORD_HASHの初期値はNです。

システムコンフィグ設定の、USER_PASSWORD_HASHの値が"Y"になっている事で、新規に追加されたパスワード及び更新があったパスワードについてはハッシュ化されてデータベースに保存されます。

【注意】USER_PASSWORD_HASHの値は手で修正しない!!

システムコンフィグ設定のUSER_PASSWORD_HASHの値は手入力で変更しない事をオススメします。手入力で変更してしまうと、ハッシュ化されているパスワードと、ハッシュ化されていないパスワードが混在してしまい、ユーザーによってはログインできなくなってしまう可能性があります。

パスワードをハッシュ化するプロセスを実行した後は、USER_PASSWORD_HASHの値は変更しないように注意して下さい!!

参考サイト

関連するコンテンツ