Spring Bootの秘密情報の扱い方を徹底解説!初心者でもわかる安全な設定方法
生徒
「Spring Bootの設定ファイルって、APIキーやパスワードも書いて大丈夫なんですか?」
先生
「APIキーやパスワードのような秘密情報は、設定ファイルに直接書くのは危険です。環境変数や外部ファイルに分けて管理するのが基本です。」
生徒
「それってどうやってやるんですか?初心者なので、実際のやり方が知りたいです!」
先生
「それでは、Spring Bootで秘密情報を安全に扱う方法を丁寧に説明していきましょう。」
1. Spring Bootにおける秘密情報の定義とは
「1. Spring Bootにおける秘密情報の定義とは」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
Spring Bootでは、application.propertiesやapplication.ymlを使って設定を管理します。例えば、データベースのユーザー名やパスワード、APIキー、認証トークンなどが該当します。これらの情報は「秘密情報」として扱うべきもので、コードや設定ファイルに直接書くと、誤ってGitなどのバージョン管理に含めてしまい、セキュリティリスクが生じます。
2. application.propertiesやapplication.ymlに直接書いてはいけない理由
例えば下記のように記述してしまうと、情報漏洩の危険があります。
spring.datasource.username=admin
spring.datasource.password=secret123
このような書き方は初心者にありがちですが、GitHubなどにアップロードしてしまうと、第三者に情報を盗まれる可能性があります。
3. 環境変数を使った安全な設定方法
Spring Bootでは、環境変数を使って設定値を外部から注入することができます。これはセキュリティ的にも非常に有効な方法です。
例えば、以下のように環境変数を設定しておきます。
export DB_USERNAME=admin
export DB_PASSWORD=secret123
そして、application.propertiesでは以下のように記述します。
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
この方法なら、ソースコード上には秘密情報を含めずに済みます。
4. 外部ファイルを使ったプロパティの分離
「4. 外部ファイルを使ったプロパティの分離」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
もう一つの方法として、application.propertiesとは別に秘密情報専用の外部ファイルを作成し、それを読み込む方法もあります。たとえばsecret.propertiesというファイルを作り、その中に以下のように書きます。
db.username=admin
db.password=secret123
そして、SpringApplicationでそのファイルを読み込むようにします。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(DemoApplication.class);
app.setDefaultProperties(
Collections.singletonMap("spring.config.additional-location", "classpath:/secret.properties")
);
app.run(args);
}
}
5. プロファイルごとの設定管理
開発環境・テスト環境・本番環境で設定を分けたいときは、Spring Bootの「プロファイル機能」を使うのが効果的です。
以下のようなファイルを用意します。
application-dev.properties
application-prod.properties
実行時に使用するプロファイルは次のように指定します。
java -Dspring.profiles.active=dev -jar myapp.jar
プロファイルごとに秘密情報を管理すれば、開発用のパスワードが誤って本番で使われるようなミスも防げます。
6. ログへの露出を防ぐ方法
Spring Bootでは、起動時やログ出力時にプロパティの内容が表示される場合があります。これが原因で秘密情報がログに記録されるリスクがあります。
下記のようにして、ログに出力されないよう設定します。
logging.level.org.springframework.boot.context=ERROR
また、Spring Boot 2.4以降では「敏感な情報をマスキングする」機能が追加されています。
management.endpoint.env.show-values=when-authorized
management.endpoint.env.keys-to-sanitize=password,secret,key,token
この設定を追加することで、例えばpasswordなどのキーワードを含むプロパティの値は、******のようにマスキングされて表示されます。
7. .gitignoreで機密ファイルを管理対象外にする
「7. .gitignoreで機密ファイルを管理対象外にする」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
秘密情報を含むファイル(例:secret.propertiesなど)は、必ず.gitignoreに追加しましょう。
# 機密ファイル
secret.properties
.env
これにより、誤ってバージョン管理に追加してしまうことを防ぎます。
8. 環境ごとに異なる外部設定を切り替える工夫
DockerやKubernetesのようなコンテナ環境では、環境変数やvolumeマウントを利用することで、本番と開発で異なる秘密情報を安全に切り替えることができます。
例えば、Dockerfileでは次のように設定できます。
ENV DB_USERNAME=admin
ENV DB_PASSWORD=secret123
KubernetesではSecretを使って、より高度に情報を分離・管理できます。