모의해킹 중 실수로 서비스를 터뜨린 날 - 그 후 어떻게 했나?

모의해킹 중 실수로 서비스를 터뜨린 날 - 그 후 어떻게 했나?

모의해킹 중 실수로 서비스를 터뜨린 날 - 그 후 어떻게 했나?

화요일 오후 3시 42분

모의해킹 중이었다. 결제 API 침투 테스트. OWASP Top 10 체크리스트 따라가는 중.

SQL Injection 테스트 페이로드 날렸다. ' OR '1'='1 같은 거. 기본 중의 기본.

근데 응답이 이상했다. 500 에러. 한 번 더. 또 500.

슬랙에 알림 떴다. “결제 시스템 장애 발생” “고객 결제 불가” “긴급 점검 중”

심장이 멈췄다.

15초 후

손이 떨렸다. 진짜로. 내가 터뜨린 거다. 확신했다.

타임스탬프 확인했다. 내 테스트: 15:42:38 장애 시작: 15:42:39

1초 차이.

로그 봤다. 내 IP 주소. 내 테스트 페이로드. 데이터베이스 커넥션 풀이 다 죽어있었다.

“씨발.”

입 밖으로 나왔다.

즉시 보고

팀장한테 슬랙 날렸다. “제가 터뜨린 것 같습니다” “지금 즉시 복구 지원하겠습니다”

전화 왔다. 떨리는 목소리로 받았다.

“뭐 했어?” “SQL Injection 테스트요. 근데…” “스테이징이야 프로덕션이야?” ”…”

침묵.

VPN 설정 확인했다. 프로덕션 DB 접속되어 있었다.

“프로덕션입니다.”

팀장 한숨 소리. 길게.

상황 파악 10분

CTO 포함 긴급 회의. 개발팀장, 인프라팀장, 보안팀장, 나.

내가 설명했다. “SQL Injection 페이로드 날렸고요” “데이터베이스 커넥션이 과부하 걸렸습니다” “제가 스테이징인 줄 알고…”

변명 아니다. 사실 그대로.

CTO가 물었다. “데이터 유실은?” “없습니다. 확인했습니다.” “개인정보 유출은?” “없습니다. Read 쿼리만 실행됐습니다.”

로그 파일 공유했다. 다 떨렸다.

인프라팀장이 DB 재시작 중. 커넥션 풀 리셋. 5분 뒤 복구 완료.

15:57. 15분간 장애.

피해 규모

고객 278명 결제 실패. 예상 매출 손실 약 1200만원. CS 문의 83건.

장애 공지 올라갔다. “일시적 시스템 점검” “불편을 드려 죄송합니다”

고객들은 몰랐다. 보안 테스터가 터뜨렸다는 걸.

근데 회사는 안다. 내가 터뜨렸다는 걸.

즉시 수습 작업

오후 4시부터 밤 11시까지.

내가 한 일:

  1. 전체 로그 분석 리포트 작성
  2. 영향받은 트랜잭션 리스트 추출
  3. 재시도 필요 건 식별 (개발팀 전달)
  4. 근본 원인 분석 문서화
  5. 재발방지 대책 수립

왜 터졌나.

DB 커넥션 풀 설정이 약했다. 맞다. 근데 그건 핑계다.

진짜 문제는 내가 프로덕션에 접속했다는 것. 스테이징인 줄 착각했다. VPN 설정 확인 안 했다.

기본 중의 기본을 안 지켰다.

보고서 작성

11시 반. 최종 보고서 완성.

사고 경위

  • 15:42 보안 테스터가 프로덕션 환경에서 침투 테스트 실시
  • SQL Injection 페이로드로 DB 커넥션 풀 소진
  • 15분간 결제 서비스 장애

직접 원인

  • 프로덕션/스테이징 환경 미확인
  • 테스트 전 체크리스트 미준수

근본 원인

  • VPN 프로파일 네이밍이 불명확
  • 프로덕션 접근 권한 통제 미흡
  • 모의해킹 가이드라인 부재

재발방지 대책

  1. 프로덕션 DB 접근 시 2단계 승인 필요
  2. VPN 프로파일명 명확화 (PROD-빨간색 표시)
  3. 침투 테스트 체크리스트 의무화
  4. 프로덕션 테스트 시 Read-Only 계정만 사용
  5. 부하 테스트 전 Rate Limiting 확인

솔직하게 썼다. 내 실수 숨기지 않았다.

수요일 오전 회의

임원 회의실. 긴장됐다.

CTO가 먼저 말했다. “보고서 봤어요. 솔직하네요.” “네.” “처벌은 당연히 있습니다.”

각오했다.

“이번 달 성과급 50% 삭감” “그리고…”

잘렸나 싶었다.

“재발방지 대책 실행 책임자 맡으세요” “네?” “당신이 제일 잘 알잖아요. 어떻게 터지는지.”

의외였다.

팀장이 말했다. “실수는 누구나 해. 근데 수습을 어떻게 하느냐가 중요해.” “15분 만에 보고했고” “7시간 동안 수습했고” “솔직한 보고서 썼어” “이게 프로야”

눈물 날 뻔했다. 참았다.

그 후 2주

재발방지 대책 실행했다.

  1. 프로덕션 DB 접근 권한 재설계

    • 보안팀도 기본은 Read-Only
    • Write 권한은 Jira 티켓 + 팀장 승인
  2. VPN 프로파일 UI 개선

    • PROD는 빨간색, 경고 팝업
    • STAGING은 노란색
    • DEV는 초록색
  3. 침투 테스트 체크리스트 제작

    [ ] 환경 확인 (STAGING임을 3번 체크)
    [ ] Read-Only 계정 사용
    [ ] 테스트 범위 문서화
    [ ] 부하 영향도 사전 검토
    [ ] 팀장 승인
  4. 모의해킹 가이드라인 문서화

    • 전사 공유
    • 신규 입사자 필독
  5. 주간 보안팀 회의에서 Near-Miss 공유

    • “나 이번 주에 이런 실수 뻔했어”
    • 서로 배우는 문화

한 달 후

성과급 50% 깎였다. 150만원. 아팠다. 근데 마땅했다.

대신 얻은 것.

개발팀이 보안팀 보는 눈이 달라졌다. “보안팀도 실수하네. 우리만 그런 게 아니구나” “근데 수습 진짜 빠르더라”

예전엔 보안 이슈 리포트하면 “나중에요~” 했는데 이제는 “언제까지 고칠게요” 한다.

왜?

내가 터뜨렸을 때를 봤으니까. 수습하는 모습도 봤으니까.

신뢰가 생겼다.

3개월 후 회고

분기 회고 때 발표했다.

“제가 3개월 전에 프로덕션 터뜨렸습니다”

웃음 나왔다. 다들 알던 사실.

“그 후 바뀐 것들”

  • 프로덕션 장애 0건 (보안 테스트 관련)
  • 침투 테스트 체크리스트 준수율 100%
  • 타팀에서도 우리 가이드라인 참고
  • Near-Miss 공유 문화 정착

“배운 것”

  • 실수는 시스템으로 막아야 한다
  • 솔직한 보고가 신뢰를 만든다
  • 수습 속도가 전문성이다

CTO가 말했다. “이게 성숙한 조직이에요” “실수를 숨기는 게 아니라” “실수에서 배우는 거”

박수 나왔다. 부끄러웠다.

지금

여전히 모의해킹한다. 침투 테스트한다.

근데 체크리스트는 무조건 본다.

환경 확인. 세 번. STAGING 맞나. 또 확인. VPN 프로파일 색상. 노란색 맞나.

강박이 생겼다. 좋은 의미로.

후배가 입사했다. 보안 QA 신입.

첫날 내가 말했다. “내가 3개월 전에 프로덕션 터뜨렸어” “어떻게요?” “체크리스트 안 봐서”

그리고 가이드라인 줬다.

“이거 만든 사람이 나야” “왜냐면 터뜨려봐서 알거든”

후배가 웃었다. “선배, 솔직하시네요”

“보안 일 하려면 솔직해야 해” “취약점 찾는 것도” “내 실수 인정하는 것도”

교훈이랄 것도 없지만

실수는 한다. 보안 전문가도 사람이니까.

중요한 건 그 다음이다.

15초 만에 인정할 건가. 15분 만에 보고할 건가. 15시간 동안 수습할 건가.

아니면 숨길 건가.

나는 15초 만에 알았다. “내가 터뜨렸다”

그게 시작이었다.


프로덕션 터뜨린 날. 최악의 날이었다. 근데 최고의 배움이었다. 체크리스트는 생명이다.