Скрытие конфиденциальной информации в файлах журналов
Как вы собираетесь скрывать конфиденциальную информацию от входа в лог файлы? Да, вы можете сознательно выбирать, чтобы не регистрировать важные биты информации в первую очередь, но могут быть общие случаи, когда вы слепо регистрируете сообщения об ошибках при сбоях или сообщениях трассировки при исследовании проблемы и т.д. И в конечном итоге получаете конфиденциальную информацию, лог файлы.
Например, вы можете попытаться вставить в базу данных запись заказа, содержащую номер кредитной карты клиента. При сбое базы данных вы можете захотеть зарегистрировать только что выполненный оператор SQL. Затем вы получите номер кредитной карты клиента в файле журнала.
Существует ли парадигма дизайна, которая может быть использована для "маркировки" определенных битов информации как чувствительных, так что общий конвейер протоколирования может отфильтровывать их?
Ответы
Ответ 1
Моя текущая практика для рассматриваемого случая заключается в регистрации хэша такой важной информации. Это позволяет нам идентифицировать записи журнала, относящиеся к конкретному требованию (например, номер кредитной карты), но никому не дается возможность просто захватывать журналы и использовать конфиденциальную информацию для своих злых целей.
Разумеется, для этого последовательно применяются хорошие методы кодирования. Обычно я выбираю журнал всех объектов, используя их перегрузки toString
(в Java или .NET), который сериализует хэш значений для полей, отмеченных атрибутом Sensitive
, примененным к ним.
Конечно, строки SQL более проблематичны, но мы больше полагаемся на наш ORM для сохранения данных и регистрируем состояние системы на разных этапах, а затем записываем SQL-запросы, тем самым она становится не-проблемой.
Ответ 2
Я лично сам рассмотрю файлы журналов как конфиденциальную информацию и обязательно ограничу их доступ.
Ответ 3
Регистрация номера кредитной карты может быть нарушением PCI. И если вы не совместимы с PCI, вам платят более высокие комиссионные за обработку карт. Либо не регистрируйте конфиденциальную информацию, либо зашифруйте все файлы журнала.
Ваша идея "маркировки" чувствительной информации интригует. У вас может быть специальный тип данных для Sensitive
информации, которая завершает реальный базовый тип данных. Всякий раз, когда этот объект отображается как символьная строка, он просто возвращает "***"
или что-то еще.
Однако это может потребовать широкомасштабных изменений в кодировании и требует уровня разумной бдительности, подобного тому, который необходим, чтобы во избежание регистрации важной информации в первую очередь.
Ответ 4
В вашем примере вы должны шифровать номер кредитной карты или, еще лучше, даже не хранить его в первую очередь.
Если, скажем, вы регистрировали что-то еще, например, логин, вы можете явно заменить пароль на *****.
Тем не менее, это удается аккуратно избежать ответа на вопрос, который вы поставили в первую очередь. В общем, при работе с конфиденциальной информацией он должен быть зашифрован на пути к любой форме постоянного хранилища, будь то файл базы данных или файл журнала. Предположим, что "Бад-гай" тоже сможет получить доступ к ним и защитить информацию соответствующим образом.
Ответ 5
Если вы знаете, что вы пытаетесь отфильтровать, вы можете запустить вывод журнала через выражение для очистки регулярных выражений перед его записью.
Ответ 6
Что касается специфических операторов SQL, если ваш язык поддерживает его, вы должны использовать параметры вместо того, чтобы вводить значения в самом выражении. Другими словами:
select * from customers where credit_card = ?
Затем установите параметр на номер кредитной карты.
Конечно, если вы планируете записывать операторы SQL с заполненными параметрами, вам понадобится другой способ фильтрации конфиденциальных данных.
Ответ 7
Обратитесь к этому инструменту, созданному именно для этого прецедента.
Если вы хотите замаскировать только выбранное поле, во время ведения журнала и сохранять другие значения полей как есть. вы можете попробовать это.
https://github.com/senthilaru/sp-util
<dependency>
<groupId>com.immibytes</groupId>
<artifactId>sp-utils</artifactId>
<version>1.0.0-RELEASE</version>
</dependency>