알림이 조용하다고 안전한 건 아니다: 탐지와 공급망 보안 입문

아프로·2026년 10월 29일

알림이 조용하다고 안전한 건 아니다 표지

이 글은 인프런 강의 「백엔드 개발자를 위한 서버 보안 실무」 섹션 6 앞부분을 입문자용으로 풀어 쓴 글이에요.

한 계정이 하루에 만 번 넘게

배송지 조회 기록을 계정별로 세어 봤더니, 보통 사용자는 하루에 몇 번 자기 주소를 봅니다. 그런데 한 계정이 하루에 만 번 넘게 조회했어요. 몇 달 동안 아무도 몰랐습니다.

왜 몰랐을까요? 요청 하나하나는 완벽하게 정상이었거든요. 진짜 토큰으로, 수많은 IP에서 조금씩 나눠서 보냈으니까요. 에러도 없고, 알림도 울리지 않았습니다.

지금까지는 문을 닫는 이야기를 했다면, 이번 글은 문이 열렸을 때 알아채는 것과 우리가 가져다 쓰는 것들을 믿을 수 있는가에 관한 이야기예요.

어제 깨끗했던 이미지가 오늘은 취약하다

배포 후 시간이 지나면서 같은 이미지에 취약점이 생기는 흐름

석 달 전 배포할 때 스캔했던 컨테이너 이미지를 오늘 다시 스캔하면, 치명·높음 등급 취약점이 여러 건 나오기도 해요. 이미지는 한 글자도 바뀌지 않았는데 말이죠. 바뀐 건 취약점 데이터베이스입니다. 새 CVE는 매일 공개되니까요.

그래서 원칙은 운영 중인 이미지를 정해진 주기로 다시 스캔하는 거예요. 코드가 바뀌지 않으면 CI도 다시 돌지 않으니, 스캔은 코드 변경과 상관없이 돌아가야 합니다. 그리고 모든 결과를 당장 고칠 수는 없으니, 실제로 악용 중인 취약점부터 처리해요(마지막 글에서 자세히 다룹니다).

탐지는 두 층에서

  • 서버 층: 같은 주소에서 반복되는 로그인 실패, 스캐너처럼 뻔한 패턴은 로그를 보고 IP를 막습니다.
  • 애플리케이션 층: 위 사례처럼 정상 요청 속의 이상은 서버 로그만으로는 안 보여요. 계정별 조회량 같은 값을 앱이 세고, 기준을 넘으면 알리고, 확실할 때만 막습니다.

그리고 탐지의 함정이 하나 있어요. 알림이 너무 많으면 결국 아무도 안 봅니다. 처음부터 막지 말고 먼저 지켜보고, 확실한 신호부터 자동 대응을 붙이는 게 순서예요.

보안 테스트 삼총사: SAST, SCA, DAST

SAST, SCA, DAST 비교

금요일 오후에 올라온 PR이 기능 테스트도 통과하고 리뷰 승인도 받았어요. 그런데 검색어를 쿼리에 이어 붙인 코드와, 알려진 취약점이 있는 라이브러리 버전이 숨어 있습니다. 사람은 놓칠 수 있어요. 그래서 도구를 붙입니다.

  • SAST: 코드를 실행하지 않고 위험한 패턴을 찾아요. 빠르니까 PR마다.
  • SCA: 가져다 쓴 라이브러리의 알려진 취약점을 찾아요. 이것도 PR마다.
  • DAST: 실제로 요청을 보내 응답을 봐요. 느리니까 스테이징에서 주기적으로.

핵심은 오탐 관리예요. 결과가 시끄러우면 개발자는 결과를 보지 않게 됩니다. "새로 생긴 것만, 정확하게" 알리는 게 오래 쓰는 비결이에요.

공급망: 같은 이름, 다른 코드

공급망 공격의 평소, 공격, 방어 흐름

우리 서비스 코드의 대부분은 사실 남이 쓴 코드예요. 오픈소스 패키지, CI에서 쓰는 액션, 베이스 이미지까지요. 최근 몇 년 사이 실제로 이런 일들이 있었습니다.

  • 널리 쓰이던 CI 액션의 버전 태그가 악성 커밋을 가리키도록 바뀌어, 그 액션을 쓰던 CI가 비밀 값을 노출했어요.
  • 설치되면 개발자와 CI의 토큰을 훔쳐 다른 패키지에 자신을 심는 웜이 패키지 저장소에 퍼졌어요.

같은 태그, 같은 패키지 이름인데 내용이 바뀐 거예요. 원리 수준의 방어는 이렇습니다. 태그 대신 변하지 않는 커밋 해시로 고정하고, 새 버전은 며칠 지켜본 뒤 받아들이고(보안 업데이트는 예외), CI 권한은 최소로, 배포 전에는 서명과 출처를 확인해요. 보안 도구 자체도 공급망의 일부라는 점을 잊지 마세요.

뚫려도 갇혀 있는 컨테이너

위험한 컨테이너와 갇힌 컨테이너 비교

컨테이너 안의 앱이 root로 돌고, 특권 모드에, 디버깅하려고 연결한 호스트의 도커 소켓까지 붙어 있다면? 앱 취약점 하나로 얻은 셸이 호스트 전체와 같은 서버의 다른 컨테이너로 번질 수 있어요.

목표는 "안 뚫리는 컨테이너"가 아니라 "뚫려도 밖으로 못 나가는 컨테이너" 예요. 일반 사용자로, 읽기 전용으로, 필요 없는 권한은 빼고, 실행에 필요한 것만 남긴 작은 이미지로 만듭니다. 셸이 없으면 들어와도 쓸 도구가 없어요.

정리

  • 정상처럼 보이는 공격은 앱이 세어야 보인다. 알림은 적고 정확하게.
  • 스캔은 빌드 때 한 번이 아니라 운영 중에도 계속. SAST·SCA는 PR에, DAST는 스테이징에.
  • 공급망은 고정·지연·최소 권한·서명 확인으로, 컨테이너는 "뚫려도 갇히게".

강의에서는 이걸 직접 붙여 봅니다

섹션 6 전반부에서는 이미지와 의존성 스캔, 계정별 이상 조회 탐지와 자동 차단, CI 보안 테스트, 공급망 고정과 서명 검증, 컨테이너 탈출 재현과 차단을 직접 구성합니다.

  • 매일 운영 이미지를 다시 스캔하는 파이프라인과 예외 관리 방법
  • SAST·SCA·DAST를 PR과 스테이징에 나눠 붙이고 오탐을 다루는 규칙
  • 최소 권한 CI, SBOM, 키 없는 서명까지 이어지는 공급망 방어

강의 보러 가기: https://inf.run/XvwyH


profile
고인물 개발자(OG)

0개의 댓글