タイガー!タイガー!じれったいぞー!(SE編)

AS400, Java, JavaEE, JSF等の開発、習慣など。日々の気づきをまとめたブログ(備忘録)

【Java】機密情報を環境変数で取り扱う

GitHubにPrivate格納ができるようになってきたとはいえ、プラットフォームのリポジトリに機密情報を預けるのが、どうも苦手でした。

苦手というより、もし万が一漏洩してしまったら、「超大変」でかつ「超危険」ということです。

ハッシュ関数でハッシュ化した機密情報を保存する方法もあるのでしょうが、その都度復号するのも大変なので、今回は環境変数で参照する方法で構築してみました。

環境変数の準備

まずは、OSに環境変数を登録しておく必要があります。

本番機がLinuxであっても、開発環境がWindowsというケースが多いと思われますので、WindowsLinuxそれぞれで環境変数を登録する方法を説明します。

Windowsの場合

Windowsキー+Sで「環境変数」で検索すると、登録画面がすぐに出てくるのでオススメです。

f:id:no14141:20200229110617j:plain

f:id:no14141:20200229110957j:plain

環境変数ボタンで、ユーザー環境変数とシステム環境変数の登録が可能になります。

下記の例は、システム環境変数に「ENV_TEST」というキーとその値「123」を登録したものです。

f:id:no14141:20200229111010j:plain

Linuxの場合

次に、Linuxです。CentOS7での例になります。

全ユーザー共通に使われる設定ファイルは、「/etc/profile」なので、そちらに変数を追加。

# vim /etc/profile  
:
ENV_TEST=123
export ENV_TEST

(save)

# source /etc/profile   // 設定反映

# echo $ENV_TEST
123

Javaでの環境変数の取得方法

環境変数の取得方法がこちらのサイトに詳しくまとめられておりました。

【Java】環境変数の取得について(System.getenv) - TASK NOTES

参考にして、サンプルを書いてみます。
めでたく環境変数を取得することができました!

String env = System.getenv("ENV_TEST");
System.out.println(env);

// 実行結果
// 123

サンプル

最後は、Javaのコンソールアプリで環境変数に保存したRDB接続情報を参照する事例です。
Mybatisでの例になります。

Mybatisでは、XML設定ファイルに認証情報をベタ書きできるのですが、今回のケースでは機密情報をコード管理させたくないので、下記のように値は変数化しておきます。

mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="MAIN">
        <environment id="MAIN">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

次に、DB接続時に環境変数情報を取得した認証用のプロパティを生成するメソッドを準備。 (ちなみに、DRIVERとLIBRARIESは、 内部プロパティファイルから取得しています)

MyBatisUtils.java
/**
 * DB接続情報を取得
 *
 * @return MyBatis設定
 */
public static Properties getOptionParam() {
    //mybatis Props作成
    Properties mybatisProps = new Properties();
    mybatisProps.put("driver", ResourceBundle.getBundle("appConfig").getString("DRIVER"));
    String url = "jdbc:as400://" + System.getenv("AS400_SERVER") 
            + ";libraries=" + ResourceBundle.getBundle("appConfig").getString("LIBRARIES");
    mybatisProps.put("url", url);
    mybatisProps.put("username", System.getenv("AS400_USER"));
    mybatisProps.put("password", System.getenv("AS400_PASSWORD"));
     return mybatisProps;
}

この方法で、無事にRDBへ接続できるようになりました!!

注意事項

「Write once, Run anywhere」を実現するJavaの実行環境ではありますが、アプリが環境変数を参照するようになったことで、別サーバへ移行した際に環境変数の登録を忘れてしまうと、正常に動作しなくなってしまいますよね。

ここは、手間が増えてしまいますが、アプリの初期処理で環境変数の存在チェックを実装して、準備が整っていない環境では動作させないようにするなどの対策が必須になるでしょう。

まとめ

  • GitHubには機密情報を書かないようにした。
  • そのために「環境変数」を参照するルールにした。