Rails의 기본 파라미터 필터링
Rails는 config/initializers/filter_parameter_logging.rb 파일을 통해 로그에서 민감한 요청 파라미터를 자동으로 필터링합니다. 기본 설정은 대부분의 경우에 적합하며, :passw, :email, :secret, :token 등과 같은 키워드를 부분적으로 일치시켜 필터링합니다. 예를 들어, email_address는 :email 키워드에 의해 필터링됩니다.
-
설정 예시:
ruby Rails.application.config.filter_parameters += [ :passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc ] -
암호화된 속성 자동 필터링: Rails 7의
Active Record Encryption을 사용하여 데이터를 암호화하면, 해당 속성 또한 로그에서 자동으로 필터링됩니다. 이는 민감한 정보를 데이터베이스에 안전하게 저장할 뿐만 아니라 로그에서도 보호하는 이점을 제공합니다.
Faraday와 같은 외부 도구에서의 필터링
Rails의 강력한 기본 필터링 기능에도 불구하고, Faraday와 같은 외부 HTTP 클라이언트를 사용하여 요청을 로깅할 때는 민감한 정보가 노출될 수 있습니다. 이는 Faraday가 기본적으로 Rails의 필터링 설정을 따르지 않기 때문입니다.
-
문제점:
api_key와 같은 민감한 쿼리 파라미터나User모델의email_address,password_digest,phone_number와 같은 속성이 로깅될 때 필터링되지 않고 그대로 노출됩니다. -
해결책: 커스텀 Faraday 포맷터: Rails의
filter_parameters설정을 재사용하는 커스텀Faraday::Logging::Formatter를 구현하여 이 문제를 해결할 수 있습니다.ApplicationFormatter클래스를 정의하고,log_body및filter_url메서드를 통해ActiveSupport::ParameterFilter를 활용하여 요청 및 응답 본문, URL 쿼리 파라미터를 필터링합니다.filter_parameters메서드에서Rails.configuration.filter_parameters를 호출하여 Rails의 필터링 규칙을 가져옵니다.parameter_filter메서드를 통해ActiveSupport::ParameterFilter인스턴스를 생성합니다.log_body에서는 JSON 파싱 후walk메서드를 통해 재귀적으로 데이터를 탐색하고 필터링을 적용합니다.filter_url에서는 URL 쿼리 파라미터를 파싱하여 필터링 후 다시 인코딩합니다.
허용 목록(Allow List) 방식의 도입
모든 것을 필터링하고 특정 항목만 허용하는 허용 목록 방식은 엄격한 보안 요구사항을 충족해야 하는 애플리케이션에 유용할 수 있습니다.
-
설정 예시:
ruby Rails.application.config.filter_parameters += [ lambda { |k, v| v.replace("[FILTERED]") unless k.match?(/ A(id|.*_id|.*_at|.*_on) Z/) } ]이 람다는id,_id,_at,_on으로 끝나는 키를 제외한 모든 파라미터 값을 필터링합니다. -
장단점: 이 방식은
name과 같은 잠재적 민감 정보를 자동으로 필터링하지만,commit버튼 텍스트나 전체 URL과 같이 디버깅에 유용할 수 있는 정보까지 필터링하여 개발 경험을 저해할 수 있습니다. 따라서 팀의 보안 요구사항과 디버깅 편의성 사이의 균형을 고려해야 합니다.