Hamdy Tabsissi
한국어

보안 옵저버토리 운영 중 개인 프로젝트

사이트 보안이 약해지면 자동으로 알아차리다

제 웹사이트들을 30분마다 점검하고, 소리 없이 사라진 보안 설정이 있으면 알려 주는 작은 로봇입니다.

필요

업데이트 중에 실수로 빠진 보안 설정은 눈에 보이지 않습니다. 감사나 고객이 알아차리기 전까지는요.

아이디어

점검하는 것을 기억에 의존하지 않습니다. 감시 대상과 떨어져서 스스로 돌아가게 해, 한 장애가 다른 장애를 가리는 일이 없도록 합니다.

만든 것

  • 웹사이트가 보내야 하는 기본 보호 장치를 점검하는 기능: 보안 헤더 다섯 가지, HTTPS 전환, 쿠키 설정, 그리고 3주 전에 경고하는 인증서 만료.
  • 웹사이트 밖에서 자체 일정에 따라 실행되고, 이력은 자체 데이터베이스에 저장합니다.
  • 인증 관문 뒤에 있는 비공개 대시보드.

결과

  • 30분점검 주기
  • 5매번 확인하는 보안 헤더 수
  • 3주인증서 만료 전 사전 경고
  • 2026년 8월 30일운영 시작일

첫 점검에서 사용 중인 프레임워크 버전을 드러내는 헤더를 찾아 1시간 안에 고쳤습니다. 그다음에는 스스로의 실수까지 잡아냈습니다. 첫 대시보드가 공개된 채 사이트맵에 올라 있어, 사실상 공격자를 위한 지도였던 것입니다. 그날 바로 닫고, 인증 뒤에서 다시 열었습니다.

화면으로 보기

도식: 제 웹사이트들, 헤더·TLS·쿠키 자동 점검, 그리고 결과 이력이 끊임없이 이어지는 흐름

배운 점

보안 도구는 먼저 자기 자신의 점검을 통과해야 합니다. 무엇을 감시하는지 공개적으로 보여 주는 모니터링 도구는, 그것을 발견한 누구에게나 정찰 도구가 됩니다.

기술 세부 정보 기술 스택, 아키텍처, 설계 결정 — 기술 담당자용

기술 스택

  • Node.js(npm 의존성 없음)
  • Express
  • SQLite (node:sqlite)
  • systemd 타이머
  • Cloudflare Access

작동 방식

  • 점검 항목: CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy 존재 여부, Server·X-Powered-By 정보 노출 없음, 모든 쿠키의 Secure·HttpOnly, HTTP → HTTPS 리디렉션, 3주 안에 만료되지 않는 TLS 인증서.
  • npm 의존성 0개 — Node 내장 모듈만 사용합니다.
  • 설계상 분리: 점검기는 30분마다 실행되는 systemd 서비스로 자체 SQLite 데이터베이스에 기록하고, 대시보드는 그 데이터베이스를 읽기만 할 뿐 직접 점검하지 않습니다.
  • 스스로 만든 노출 이후: 대시보드를 사이트맵과 robots.txt에서 빼고, 서비스 식별자를 소스 코드 밖으로 옮긴 뒤, 전용 서브도메인에서 Cloudflare Access 뒤에서만 다시 열었습니다.

아직 부족한 점

  • 대시보드는 비공개 — 의도한 설계