Serilog를 사용하여 로그의 민감한 데이터 노출 방지
1. 문제
애플리케이션 개발 시 로그를 작성하면 개발자가 디버깅 및 추적을 쉽게 할 수 있습니다. 그러나 좋은 로그를 작성하는 것만으로는 충분하지 않습니다. 암호, 계정 번호 등과 같은 일부 민감한 데이터가 로그에 노출될 수 있기 때문입니다.
2. 아이디어
이 문제를 방지하려면 모든 민감한 단어를 마스크 문자로 바꿔야 합니다.
이 문서의 목적은 .NET Core의 일반적인 로거 확장 중 하나인 Serilog를 사용하여 간단한 민감한 데이터 파괴 정책을 구현하는 데 도움을 주는 것입니다. 이 정책을 적용하면 로그에 민감한 데이터가 노출되는 것을 방지할 수 있습니다. 충분합니다. 코드를 살펴보겠습니다...
3. 시행
3.1. 기술 스택
3.2 코드 표시
public class SensitiveDataDestructuringPolicy : IDestructuringPolicy
{
public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, out LogEventPropertyValue result)
{
throw new NotImplementedException();
}
}
var mask = "******";
var sensitiveKeywords = new List<string> {
"Password", "NewPassword",
};
실제로 구성 파일과 같은 민감한 키워드 목록을 정의해야 합니다.
Bellow는 완전한 코드입니다.
using Microsoft.Extensions.Configuration;
using Serilog.Core;
using Serilog.Events;
using System.Reflection;
namespace Microsoft.Extensions.Logging;
public class SensitiveDataDestructuringPolicy : IDestructuringPolicy
{
private const string DEFAULT_MASK_VALUE = "******";
private const string SENSITIVE_KEYWORDS_SECTION = "Logging:SensitiveData:Keywords";
private const string MASK_VALUE = "Logging:SensitiveData:Mask";
private readonly IConfiguration _configuration;
public SensitiveDataDestructuringPolicy(IConfiguration configuration)
{
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
}
public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, out LogEventPropertyValue result)
{
var sensitiveKeywords = _configuration.GetValue<string[]>(SENSITIVE_KEYWORDS_SECTION) ?? Array.Empty<string>();
var maskValue = _configuration.GetValue<string>(MASK_VALUE) ?? DEFAULT_MASK_VALUE;
if (!sensitiveKeywords.Any())
{
result = new StructureValue(new LogEventProperty[] { });
return false;
}
var props = value.GetType().GetTypeInfo().DeclaredProperties;
var logEventProperties = new List<LogEventProperty>();
foreach (var propertyInfo in props)
{
if (sensitiveKeywords.Any(x => x.Equals(propertyInfo.Name, StringComparison.InvariantCultureIgnoreCase)))
{
logEventProperties.Add(new LogEventProperty(propertyInfo.Name, propertyValueFactory.CreatePropertyValue(maskValue)));
}
else
{
logEventProperties.Add(new LogEventProperty(propertyInfo.Name, propertyValueFactory.CreatePropertyValue(propertyInfo.GetValue(value))));
}
}
result = new StructureValue(logEventProperties);
return true;
}
}
# Rest of code
.UseSerilog((context, services, configuration) =>
{
var loggerConfiguration = configuration
.ReadFrom.Configuration(context.Configuration)
.Enrich.FromLogContext()
.Enrich.WithProperty("Application", context.HostingEnvironment.ApplicationName)
.Enrich.WithProperty("Environment", context.HostingEnvironment.EnvironmentName)
.MinimumLevel.Information();
loggerConfiguration.Destructure.With<SensitiveDataDestructuringPolicy>();
});
4. 결론
SensitiveDataDestructuringPolicy를 적용하면 로그를 더 안전하게 만들 수 있으므로 로그 추적 중에 민감한 데이터가 노출되는 것을 방지할 수 있습니다.
참고: 위의 샘플은 매우 간단한 예일 뿐이며 프로젝트에 맞게 수정하고 최적화할 수 있습니다.
이 문서의 원래 게시 위치: https://sangau.me/prevent-sensitive-data-exposure-in-log-with-serilog
Reference
이 문제에 관하여(Serilog를 사용하여 로그의 민감한 데이터 노출 방지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/auvansang/prevent-sensitive-data-exposure-in-log-with-serilog-1pk7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)