Serilog를 사용하여 로그의 민감한 데이터 노출 방지

12883 단어 csharpdotnetsecurity

1. 문제



애플리케이션 개발 시 로그를 작성하면 개발자가 디버깅 및 추적을 쉽게 할 수 있습니다. 그러나 좋은 로그를 작성하는 것만으로는 충분하지 않습니다. 암호, 계정 번호 등과 같은 일부 민감한 데이터가 로그에 노출될 수 있기 때문입니다.

2. 아이디어



이 문제를 방지하려면 모든 민감한 단어를 마스크 문자로 바꿔야 합니다.
이 문서의 목적은 .NET Core의 일반적인 로거 확장 중 하나인 Serilog를 사용하여 간단한 민감한 데이터 파괴 정책을 구현하는 데 도움을 주는 것입니다. 이 정책을 적용하면 로그에 민감한 데이터가 노출되는 것을 방지할 수 있습니다. 충분합니다. 코드를 살펴보겠습니다...

3. 시행


3.1. 기술 스택


  • .NET Core(이 기사에서는 .NET 6.0을 사용함)
  • Serilog

  • 3.2 코드 표시


  • Destructing Policy를 구현하려면 Serilog.Core 네임스페이스에서 IDestructuringPolicy 인터페이스를 구현해야 합니다.

  • 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;
        }
    }
    
    


  • 마지막으로 SensitiveDataDestructuringPolicy를 아래와 같이 loggerConfiguration에 추가합니다.

  • # 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

    좋은 웹페이지 즐겨찾기