데이터 수집 경로의 보안 제어
Sentry Relay 는 이벤트가 본 서버로 전송되기 전에 중간 노드에서 데이터를 가공할 수 있는 능력을 제공합니다. 특히 개인식별 가능 정보 (PII, Personally Identifiable Information) 와 같은 민감한 데이터를 무결성을 해치지 않으면서 안전하게 제거하거나 변조하는 것이 중요합니다. 이 기술은 고급 데이터 정제 기능을 통해 구현되며, 구성 파일의 문법과 의미를 숙지하여 유연하게 제어할 수 있습니다.
기본적인 정제 구조 이해
만약 시스템 로그에 예외 발생 시 원치 않는 네트워크 주소가 포함되었다고 가정해 봅시다. 이를 보호하기 위한 정의는 선택자와 규칙의 조합으로 작성됩니다.
{
"scopes": {
"$string": ["sanitization_rule_v1"]
},
"definitions": {
"sanitization_rule_v1": {
"matcher": "@ip",
"operation": "replace_text"
}
}
}
위 예시에서 @ip 는 매칭 대상인 '규칙'이며, $string 은 해당 규칙이 적용될 '범위 (선택자)'를 의미합니다. 즉, 모든 문자열 타입의 필드에서 IP 패턴을 찾아 교체한다는 뜻입니다.
사전 정의된 패턴 매커니즘
Relay 는 일반적으로 발생하는 민감 데이터 유형을 감지하기 위해 내장된 로직을 가지고 있습니다. 각 항목마다 다양한 처리 방식을 지원합니다.
- 네트워크 주소: IPv4 및 IPv6 포맷 인식을 위한
@ip세트를 제공하며, 해싱 또는 대체 방식 선택 가능. - 모바일 기기 고유번호: IMEI 번호를 검출하고 마스킹하는
@imei규칙 포함. - 하드웨어 매체 어드레스: MAC 주소를 찾는
@mac로직을 적용할 수 있으며 일부 구간만 노출하는 기능도 존재. - 연락처 정보: 이메일 주소를 인식하여 앞뒤를 숨기는
@email처리. - 금융 카드: 신용카드 번호 형식을 검증하고 부분적으로 가리는
@creditcard옵션. - 로컬 스토리지 경로: 사용자 프로필 디렉토리 경로 (
C:/Users/...) 를 정규화하거나 삭제하는@userpath. - 인증 정보: 키 이름 자체에 'password', 'credential' 등의 단어가 포함된 경우 값을 완전히 지우는
@password정책. - 유니버설 제거: 특정 조건 없이 모든 값을 강제로 처리하는
@anything범용 규칙.
사용자 정의 룰 설계
내장 기능이 충족하지 못하는 경우가 있을 때는 커스텀 패턴을 정의해야 합니다. 규칙은 크게 두 가지 속성으로 나뉩니다.
- 매칭 타입 (Type): 어떤 형태의 데이터를 찾을 것인지 지정 (정규식, 고정 패턴 등).
- 처리 동작 (Method): 찾은 데이터를 어떻게 변경할 것인지를 결정 (삭제, 암호화, 대체 등).
예를 들어, 기기 내부 ID(16 진수 문자열) 를 해싱하여 익명화하고자 한다면 다음과 같이 설정 파일을 확장할 수 있습니다.
{
"allowed_origins": ["*"],
"scrapbook": {
"policies": {
"obfuscate_client_uid": {
"kind": "regex_matcher",
"expression": "[a-f0-9]{12}",
"effect": "sha256_hash"
}
},
"execution_scopes": {
"freeform_field": ["obfuscate_client_uid"]
}
}
}
이는 프로젝트 설정 경로 (.relay/projects/) 에 저장된 전체 구성 일부분에 해당하며, 수정 후 재시작 시 적용됩니다.
룰 매칭 유형 상세
pattern(정규식 매칭)- Perl 호환 정규식을 사용하여 복잡한 문자열 조합을 잡습니다. 예를 들어, 특정 길이와 형식을 가진 ID 코드를 표적할 때 유용합니다.
multiple(복합 논리)- 여러 규칙을 하나의 그룹으로 묶어 논리합 (OR) 을 형성합니다. 하나라도 일치하면 해당 조치사항을 실행합니다.
alias(대체 명칭)- 기존 규칙을 다른 이름으로 참조하여 재사용 편의성을 높입니다. 이는 단일 규칙을 포장하는 역할과 유사합니다.
anything(전역 매칭)- 특정 형식 없이 입력값 전체를 대상으로 하는 폭넓은 선택 방법입니다. 테스트 단계에서 모든 데이터를 일시적으로 차단할 때 자주 쓰입니다.
데이터 처리 동작 방식
표적 데이터를 찾았을 때 수행하는 실제 작업은 다음과 같습니다.
- 삭제 (Remove): 해당 필드 자체를 값이 없는 상태 (null) 로 만들거나 구조상 제거합니다.
- 대체 (Replace): 원래 값 대신 정해진 고정 텍스트 (예: [Redacted]) 를 삽입합니다.
- 마스킹 (Mask): 문자 길이는 유지하되 가독성을 저해할 만한 '*' 기호 등으로 치환합니다.
- 해싱 (Hash): 값을 암호화 해시 함수로 변환합니다. 동일한 값은 항상 동일한 해시 결과를 반환하므로 집계 분석에는 영향을 주지 않으면서 익명성을 보장합니다.
범위 지정 (Selector) 체계
규칙이 어디에 적용될지 정확히 제어하려면 선택자를 활용해야 합니다. 이는 이벤트 JSON 구조 내에서 특정 경로나 타입을 지정하는 역할을 합니다.
논리 연산 지원
경로를 더 정교하게 만들기 위해 불린 연산을 사용할 수 있습니다.
- 반전 (!): 특정 키를 제외하고 나머지를 모두 선택.
- 단결 (&&): 두 조건이 모두 만족되는 교집합을 선택.
- 결합 (||): 둘 중 하나의 조건이라도 만족되면 포함됨 (합집합).
야생카드 (Wildcard) 사용법
경로 탐색 시 불확실한 깊이를 처리하기 위한 기호들입니다.
**: 하위 구조의 모든 레벨을 재귀적으로 포함 (예:meta.**)*: 바로 다음 단계의 키 하나만을 대표 (예:data.*)
데이터 타입 제한
JSON 스키마 상의 데이터 타입을 기준으로 필터링을 걸 수 있습니다.
$string: 문자형 데이터 전용$number: 정수 또는 실수형$datetime: 타임스탬프 관련 필드$array: 배열 형태 구조$exception: 예외 블록 내 요소들$request: HTTP 요청 컨텍스트
예를 들어, 프레임 변수 내의 모든 정보를 없앤다고 하면 [Delete] [$frame.variables] 와 같은 형태로 표현됩니다.
또한 키 이름에 공백이나 특수문자가 포함되어 있다면, 따옴표로 감싸서 이스케이프 처리해야 정확한 매칭이 가능합니다. 작은따옴표 (' ) 를 포함하려는 경우에는 '' 로 대체하여 표현합니다.