説明
コードに埋め込まれたパスワードは、セキュリティ事故の際に漏えいするおそれがあります。GitHubやGitLabなどのソースコードリポジトリに含まれることで、攻撃者に取得され、不正アクセスに使われる可能性もあります。
パスワードをコードに埋め込まず、シークレットストアやアクセスを制限した実行時の設定から読み込んでください。
想定される影響
- パスワードの漏えい: コードの流出やバージョン管理への登録によって、パスワードが露出する可能性があります。
- 自動化された攻撃: 攻撃者がパスワードを抽出し、自動化したログイン試行に利用する可能性があります。
- 変更の難しさ: 埋め込まれたパスワードの変更には、コードの修正と再デプロイが必要です。
対処方法
-
コードにパスワードを直接含めない
- シークレットストアや実行時の設定から読み込みます。すでに漏えいしたパスワードは交換してください。
-
用途に合ったシークレットストアを使う
- HashiCorp Vaultなどのシークレット管理機能でパスワードを保管し、アクセスを制限します。AWS KMSとGoogle Cloud KMSは暗号鍵を管理するサービスであり、パスワードの保存とは区別する必要があります。
-
環境変数や設定ファイルを保護する
.envファイルやOSの環境変数で値を渡す場合も、実際のパスワードをリポジトリにコミットせず、ファイルや実行環境へのアクセスを制限します。
例
変更前
java
import java.security.KeyStore;
public class InsecurePasswordExample {
public void loadKeyStore() throws Exception {
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(null, "hardcoded_password".toCharArray()); // ハードコードされたパスワード
}
}
変更後
java
import java.security.KeyStore;
public class SecurePasswordExample {
public void loadKeyStore() throws Exception {
String password = System.getenv("KEYSTORE_PASSWORD"); // 環境変数からパスワードを読み込みます
if (password == null) {
throw new SecurityException("Keystore password is not set");
}
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(null, password.toCharArray());
}
}
説明:
- 変更前:
keyStore.load(null, "hardcoded_password".toCharArray());にパスワードが直接含まれています。 - 変更後:
System.getenv("KEYSTORE_PASSWORD")で実行時の値を読み込みます。この環境変数にアクセスできる主体も制限する必要があります。
どちらの例でも、load(null, ...)は空のキーストアを初期化します。既存のキーストアファイルを開く例ではありません。