LabHub
배우기 러닝패스 코스

은행 현장의 언어 · 가리고도 따라갈 수 있게 · 실습

로그에서 개인정보를 지우고도 사건을 따라가기

LabHub 에서 이어서 보기

목표

이체 API 로그에서 개인정보 후보를 찾아 검사숫자로 오탐을 걸러 내고, 마스킹과 결정적 가명 토큰으로 반출본을 만든다. 그러고도 사고 고객의 사건을 토큰만으로 추적하고, 두 번 돌려도 같은 결과가 나오며 남은 누출이 없음을 증명한다.

왜 중요한가

장애 조사에 쓰는 로그에는 자유 문장이 섞여 있고 그 안에 계좌번호와 카드번호가 그대로 적혀 있다. 그대로 넘길 수는 없지만, 전부 별표로 덮으면 "같은 계좌에서 세 번 실패했다" 는 사실까지 사라진다.
정규식은 모양만 보므로 16자리 정산 일련번호까지 카드로 오해한다. 검사숫자를 한 번 더 걸면 오탐이 열 배 줄고, 조사에 필요한 식별자를 죽이지 않는다.
가린 값에 HMAC 결정적 토큰을 달면 같은 계좌는 언제나 같은 토큰이 되어 이어 볼 수 있고, 키가 없으면 되돌릴 수 없다. 스크러빙 파이프라인은 재시도되므로 두 번 돌려도 결과가 같아야 한다.

단계

1. /root/mask/gen_logs.py 를 만들어 실행해 /root/mask/app.log(JSON Lines 500줄 이상)와 /root/mask/customers.csv(고객 30명 이상)를 만든다. 계좌 30개 이상, 검사숫자를 통과하는 카드 40개 이상, 통과하지 못하는 16자리 수 20개 이상을 섞고, 가장 많이 나오는 계좌 하나가 2위보다 3줄 이상 많게 한다.
2. /root/mask/find_candidates.py 로 네 종류의 후보를 모두 찾아 /root/mask/candidates.json 에 적는다(total·by_kind·items).
3. /root/mask/luhn.py 를 만들고(유효하면 종료 코드 0), 카드 후보를 /root/mask/candidates_luhn.json 의 card_verified·not_card 로 가른다.
4. /root/mask/scrub.py/root/mask/app.scrubbed.log 를 만든다. 계좌·카드·전화·이메일을 아래 참고의 규칙대로 가리고, 카드가 아닌 16자리 수는 그대로 둔다.
5. /root/mask/keys/scrub.key 를 만들고 scrub.py 가 각 줄에 tokens(acct·card)를 붙이게 한 뒤 /root/mask/app.scrubbed.log 를 다시 만든다.
6. app.log 에서 가장 많이 나온 계좌의 토큰을 구해, 반출본만 보고 /root/mask/trace.json 에 top_account_token·event_count·req_ids·first_ts·last_ts 를 적는다.
7. /root/mask/leakscan.py 를 만들고, scrub.py 를 반출본에 다시 돌려도 결과가 같은지 확인한 뒤 검사 결과를 /root/mask/leak_report.json 에 남긴다.
8. /root/mask/policy.json/root/mask/scrub_report.json 을 만든다. 보고서의 숫자는 실제 파일에서 세고, policy_sha256 은 정책 파일을 sha256 으로 잰 값이다.

참고

단계 8개

  1. 합성 이체 로그 스냅샷 만들기
  2. 정규식으로 후보를 하나도 빠짐없이 찾기
  3. 검사숫자로 카드와 일련번호 가르기
  4. 규칙대로 가리고 일련번호는 남기기
  5. 같은 계좌에 같은 가명 토큰 달기
  6. 토큰만으로 사고 고객의 사건 따라가기
  7. 두 번 돌려도 같은지, 남은 누출이 없는지
  8. 반출 정책과 스크러빙 보고서 남기기