説明
パスワード、トークン、APIキー、セッション識別子をそのままログへ記録すると、ログ収集システム、コンソール、運用ダッシュボード、エラーレポートに秘密値が残る可能性があります。ログはアプリケーションのデータより広く共有されたり長く保管されたりすることがあり、アカウント乗っ取りや権限昇格のきっかけになり得ます。
想定される影響
- 運用ログ、中央収集システム、エラーレポートに認証情報が長期間残る可能性があります。
- ログへアクセスできる人が、トークンやAPIキーを再利用してアカウントを乗っ取るおそれがあります。
- インシデント対応でログを共有する際に、さらに情報が漏えいする可能性があります。
対処方法
- 秘密値をログへ記録せず、必要な場合だけ固定のマスク値や追跡用の識別子を残してください。
- 共通の秘匿処理ヘルパーで、
password、token、secret、apiKey、authorization、cookieなどのフィールドを除去してください。 - 構造化ログでも記録するフィールドを許可リストで制限し、機密フィールドを除外してください。
stdoutやstderrへの直接出力も運用ログに収集される場合があるため、同じ制限を適用してください。
例
getTokenId はアプリケーションで実装するヘルパーです。認証に再利用できない追跡用識別子だけを返す必要があります。トークン検証、ログのアクセス権限、保管期間の制限も別途適用してください。
変更前
javascript
function login(req) {
const token = req.headers.authorization;
console.info("login token", token);
}
変更後
javascript
function login(req) {
const tokenId = getTokenId(req.headers.authorization);
console.info("login token accepted", { tokenId });
}
解説:
- 変更前: 認証トークン全体を記録するため、ログを読める人が再利用できるおそれがあります。
- 変更後: 秘密値そのものではなく、追跡用の識別子だけを記録します。