Rails 및 Faraday에서 민감한 파라미터 로깅 필터링

Prevent logging sensitive information in Rails, and beyond

작성자
발행일
2025년 04월 23일

핵심 요약

  • 1 Rails는 기본적으로 민감한 요청 파라미터를 로그에서 필터링하며, 암호화된 속성도 자동으로 처리하여 데이터 보안을 강화합니다.
  • 2 Faraday와 같은 외부 HTTP 클라이언트를 사용할 때는 개발자가 직접 민감한 정보를 필터링해야 하며, Rails의 설정을 재사용하는 커스텀 포맷터를 구현하여 해결할 수 있습니다.
  • 3 엄격한 규정 준수를 위해 허용 목록(Allow List) 방식을 고려할 수 있으나, 이는 디버깅 경험에 영향을 미칠 수 있으므로 보안 요구사항과 편의성 사이의 균형을 고려해야 합니다.

도입

Rails 애플리케이션 개발 시 로그 파일에 민감한 정보가 노출되지 않도록 파라미터를 필터링하는 것은 매우 중요합니다. Rails는 기본적으로 강력한 파라미터 필터링 기능을 제공하여 개발자가 별도의 설정 없이도 상당한 수준의 보안을 유지할 수 있도록 돕습니다. 본 문서는 Rails의 기본 필터링 메커니즘과 암호화된 속성 처리 방식, 그리고 Faraday와 같은 외부 도구 사용 시 발생할 수 있는 필터링 문제점 및 이를 해결하기 위한 커스텀 포맷터 구현 방안을 심층적으로 다룹니다. 또한, 모든 것을 필터링하고 특정 항목만 허용하는 허용 목록 방식의 장단점도 함께 논의합니다.

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_bodyfilter_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과 같이 디버깅에 유용할 수 있는 정보까지 필터링하여 개발 경험을 저해할 수 있습니다. 따라서 팀의 보안 요구사항과 디버깅 편의성 사이의 균형을 고려해야 합니다.

결론

Rails는 기본적으로 견고한 파라미터 필터링 기능을 제공하며, 민감한 정보는 반드시 암호화하여 데이터베이스와 로그 모두에서 보호해야 합니다. 그러나 Faraday와 같은 외부 API 및 서비스를 사용할 때는 개발자의 책임 하에 민감한 정보를 필터링해야 합니다. 이 경우, Rails의 기존 필터링 설정을 재활용하는 커스텀 포맷터 구현이 효과적인 해결책이 될 수 있습니다. 마지막으로, 의료 분야와 같이 엄격한 규정 준수가 요구되는 애플리케이션의 경우, 모든 것을 필터링하고 필요한 항목만 허용하는 허용 목록(Allow List) 방식이 더 나은 보안 옵션이 될 수 있습니다. 어떤 방법을 선택하든, 애플리케이션의 보안 요구사항과 개발 편의성 사이의 적절한 균형을 찾는 것이 중요합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!