SHT30 온습도 모니터링 시스템 전체 소스(서버 PHP, STM32 펌웨어, SQL, 테스트). 전체 코드리뷰에서 도출된 보안 하드닝 10건 반영: - 요청 서명 HMAC-SHA256 전환(펌웨어 sig.c/서버 config.php/호스트 패리티 동시) - 재전송 방어 + 기본 API_KEY fail-closed + 디바이스 문자열 정제(api/sensor_data.php) - 오프라인 SMS 중복 발송 경합 제거(cron_heartbeat.php, 원자적 선점) - CSV 수식 주입 방지(monthly_report.php), 감사로그 회전 락(retention_cleanup.php) - 브루트포스 카운터 원자화(login.php), 예시 TOTP 비밀키 무효화, 마이그레이션 멱등화 _backup/(하드코딩 실 비밀값 포함)·config.local.php·런타임 상태는 .gitignore 제외.
12 KiB
보안대책서 첨부·제공자료 가이드
작성일: 2026-05-20
대상: HWP 보안대책서의 4. HWP에 반드시 추가해야 할 보안통제 매트릭스
1. 먼저 정리
보안통제 매트릭스는 사용자가 따로 첨부해야 하는 파일이 아니라, HWP 본문에 들어갈 표입니다.
사용자가 준비해야 하는 것은 표의 마지막 열인 확인 증적입니다.
즉, 심사자가 “그 보안대책이 실제로 적용됐나요?”라고 물었을 때 보여줄 자료입니다.
소스코드, API 인증, 측정값 검증, 관리자 로그인, 비밀값 분리처럼 코드에서 설명 가능한 항목은 SOURCE_SECURITY_EVIDENCE.md에 별도로 정리했습니다.
프로젝트에는 보안대책서 첨부용 증적을 바로 만들기 위한 산출물도 포함되어 있습니다.
| 산출물 | 용도 |
|---|---|
php/security_evidence.php |
운영 점검 결과와 보안통제 매트릭스를 화면으로 확인 |
php/security_evidence.php?format=md |
HWP에 붙여넣을 Markdown 보안 증적 보고서 다운로드 |
| STM32 USART3 부팅 콘솔 로그 캡처 | 단말 링크업/DHCP/SNTP/TLS 핸드셰이크/서버 200 OK 증적 확인 |
docs/SECURITY_EVIDENCE_PACKAGE.md |
제출 첨부자료 패키지 구성 순서 |
docs/OPERATIONS_SECURITY_CHECKLIST.md |
월간 운영·보안 점검표 |
docs/SOURCE_SECURITY_EVIDENCE.md |
소스코드 기반 기술통제 설명 |
docs/evidence/security_plan_mfa_evidence.html |
관리자 MFA, 감사로그, 보관기간·백업 증빙 문구와 화면 캡처 |
php/retention_cleanup.php |
SMS 로그, 센서 로그, 온습도 측정 이력, 관리자 감사로그 보관기간 정리 |
scripts/backup_evidence.php |
백업 파일 목록과 복구 테스트 결과 Markdown 증빙 생성 |
2. 결론: 사용자가 지금 제공해야 할 것
최소로는 아래 8가지만 있으면 HWP 보완이 가능합니다.
| 우선순위 | 제공자료 | 왜 필요한가 |
|---|---|---|
| 1 | 실제 구축 범위 확정 | 화재/누수/전원 이상을 넣을지, 온습도/오프라인만 넣을지 결정해야 문서 범위가 맞음 |
| 2 | 서버 접속 URL | HTTPS 적용, API URL, 대시보드 URL을 문서에 정확히 적기 위함 |
| 3 | Cafe24 서버 설치 경로 | PHP 파일 위치를 증적으로 쓰기 위함 |
| 4 | STM32 단말 설치 위치와 장비 정보 | 장비 식별, 설치 위치, 자산대장 항목 작성 |
| 5 | 기관망 연결 방식 | 단말이 업무망에 붙는지, 별도 인터넷인지, 방화벽 정책이 있는지 확인 |
| 6 | 운영 담당자 역할 | 누가 점검하고, 누가 SMS를 받고, 누가 경보를 조치하는지 명확화 |
| 7 | 보관기간 기준 | SMS 로그, 센서 로그, 측정 이력을 며칠/몇 년 보관할지 결정 |
| 8 | 캡처 가능한 운영 화면 | 설치 점검, 대시보드, 월간 보고서, SMS 테스트 결과 증적 |
반대로 아래 항목은 사용자가 일일이 설명하지 않아도 됩니다. 프로젝트 소스코드에서 근거를 뽑아 문서화할 수 있습니다.
| 항목 | 처리 방식 |
|---|---|
| API 서명 검증 | 코드 근거와 HWP 문구 작성 가능 |
| JSON API 필수값 검증 | 코드 근거와 HWP 문구 작성 가능 |
| 측정값 범위 검증 | 코드 근거와 HWP 문구 작성 가능 |
| 서버 임계 판정·쿨다운 | config.php METRIC_* 근거와 HWP 문구 작성 가능 |
| 관리자 TOTP MFA | 코드 근거, 등록 화면 캡처, HWP 문구 작성 가능 |
| 관리자 감사로그 | 코드 근거와 운영 점검 증빙 작성 가능 |
| 보관기간 정리 | retention_cleanup.php --dry-run 결과로 증빙 가능 |
| 백업·복구 증빙 | scripts/backup_evidence.php 결과로 증빙 가능 |
| 관리자 로그인/세션 보호 | 코드 근거와 HWP 문구 작성 가능 |
| 비밀값 분리 구조 | 코드 근거와 HWP 문구 작성 가능 |
| 보안 헤더 | .htaccess 근거 제시 가능 |
| HTTPS URL 구조 | 코드/설정 예시는 제시 가능. 단 실제 적용 증적은 운영 화면 필요 |
3. 자료별로 정확히 무엇을 주면 되는가
3.1 실제 구축 범위
아래 중 하나로 답하면 됩니다.
| 선택 | 의미 | 문서 반영 |
|---|---|---|
| A | 이번 구축은 온습도 모니터링만 한다 | 화재/누수/전원 이상은 향후 확장으로 분리 |
| B | 온습도 모니터링 + 장비 오프라인 감지만 한다 | 현재 프로젝트와 가장 잘 맞음 |
| C | 화재/누수/전원 이상도 이번 범위에 포함한다 | 추가 센서, 코드, 증적이 더 필요 |
권장 답변:
이번 1차 구축 범위는 서버실 온습도 모니터링, 임계 SMS 경보, 정상복귀 알림, 장비 오프라인 감지, 대시보드/월간보고까지로 한정한다.
화재·누수 및 전원 이상 감지는 향후 확장 범위로 분리한다.
3.2 서버 정보
비밀번호나 API 키 원문은 주면 안 됩니다. 아래처럼 마스킹해서 주면 됩니다.
서비스 도메인: https://example.com
설치 경로: public_html/sht30_monitor/
API URL: https://example.com/sht30_monitor/api/sensor_data.php
대시보드 URL: https://example.com/sht30_monitor/dashboard.php
HTTPS 적용 여부: 적용 / 미적용 / 확인 필요
DB 종류: Cafe24 MySQL
첨부하면 좋은 증적:
- Cafe24 파일 관리자에서
sht30_monitor폴더가 보이는 화면 setup_wizard.php점검 화면dashboard.php로그인 화면 또는 대시보드 화면monthly_report.php화면
3.3 단말 정보
장비명: STM32 보드 (SHT30 온습도 센서 연계)
장비 ID: stm32-sht30-01
설치 위치: 서버실 / 서버랙 주변 / 기타
센서 모델: SHT30 온습도 센서
측정 주기: 5분 (펌웨어 기본)
네트워크 방식: 유선 LAN / Wi-Fi / 기타
단말 접속 방식: 현장 직접 접속 / SSH / 기타
첨부하면 좋은 증적:
- 단말과 센서 설치 사진
- STM32 USART3(PD8/PD9, 115200) 부팅 콘솔 로그(링크업/DHCP/SNTP/TLS 핸드셰이크) 캡처
- 동일 콘솔에서 서버 200 OK 응답이 보이는 정상 보고 로그 캡처
3.4 네트워크 연결 방식
이 부분이 심사에서 중요합니다. 아래 질문에 답이 필요합니다.
1. 단말이 기관 업무망에 연결되는가?
2. 단말이 별도 인터넷망 또는 별도 Wi-Fi를 사용하는가?
3. 기관 방화벽에서 Cafe24 서버로 나가는 443 포트만 허용하는가?
4. 외부에서 단말로 접속할 수 있는 포트가 열려 있는가?
5. 단말 원격관리는 어떻게 하는가?
권장 구조:
단말은 기관 업무망으로 들어오는 인바운드 접속을 허용하지 않고,
승인된 Cafe24 서버로 HTTPS 아웃바운드 통신만 수행한다.
첨부하면 좋은 증적:
- 네트워크 구성도
- 방화벽 허용 정책
- 단말에서
ss -lntup실행 결과 - 기관망 미연결 또는 분리 운영 확인 문구
3.5 운영 담당자 정보
개인 이름을 꼭 문서에 넣을 필요는 없습니다. 역할 중심으로 적으면 됩니다.
사업총괄: 혁신전략실장
사업관리: 정보기반팀
사업수행: 우편혁신AI연구팀
보안검토/점검: 정보보안센터
SMS 수신자: 전산실 운영 담당자 2명
월간 점검 담당: 정보기반팀 담당자
첨부하면 좋은 증적:
- 운영 담당자 지정표
- SMS 수신자 현행화 확인표
- 월간 점검표 양식
3.6 보관기간 기준
기관 내부 기준이 없으면 아래 권장안을 쓰면 됩니다.
| 데이터 | 권장 보관기간 |
|---|---|
| SMS 발송 로그 | 1년 |
| 센서 이벤트 로그 | 1년 |
| 온습도 측정 이력 | 1년 |
| 관리자 감사로그 | 1년 |
| 백업 파일 | 1년 또는 기관 기준 |
사용자가 결정해서 제공할 내용:
SMS 로그 보관기간: 1년
센서 로그 보관기간: 1년
온습도 측정 이력 보관기간: 1년
관리자 감사로그 보관기간: 1년
기관 내부 규정 우선 적용 여부: 예 / 아니오
3.7 백업·복구 정보
DB 백업 주기: 매일 / 매주 / 매월
설정파일 백업 위치: 운영자 보관 / 암호화 저장소 / 기타
복구 테스트 주기: 월 1회 / 분기 1회 / 필요 시
첨부하면 좋은 증적:
- DB 백업 파일 목록
- 복구 테스트 결과표
- 백업 담당자 지정표
4. 보안통제 매트릭스 행별로 필요한 증적
| 매트릭스 항목 | 사용자가 줘야 하는 것 | 프로젝트에서 이미 준비 가능한 것 |
|---|---|---|
| 사업 범위 | 이번 구축 범위 확정 문장 | HWP 교체 문구 |
| 네트워크 | 단말 네트워크 연결 방식, 방화벽 정책 | 네트워크 구성도 이미지 |
| 전송구간 | 실제 서비스 URL, HTTPS 적용 여부 | API URL 구조, 설치 문서 |
| API 인증 | API 키 원문이 아니라 “서버/단말 키 일치 확인” 결과 | 코드의 서명 검증 설명 |
| 비밀값 | 설정파일 권한 캡처 | config.local.php, firmware/common/secrets.h(APP_API_KEY) 구조 설명 |
| 관리자 인증 | 관리자 로그인 화면, MFA 등록 증빙, 감사로그 | 비밀번호 해시, TOTP MFA, 세션 보호, 실패 제한 코드 설명 |
| 측정/임계 | 임계 운영 기준(METRIC_*) |
측정값 범위 검증, 서버 임계 판정·쿨다운 설명 |
| 개인정보 | SMS 수신자 관리 기준 | SMS 설정 구조, 로그 테이블 설명 |
| 로그관리 | 로그 보관기간, 관리자 감사로그 | sensor_log, sensor_metric, sms_log, php/var/admin_audit.log 설명 |
| 백업 | DB/설정 백업 주기, 복구 테스트 결과 | backup_evidence.php 결과와 백업·복구 문구 |
| 패치 | 월간 패치 점검 담당자 | 점검표 양식 |
| 물리보안 | 설치 사진, 자산 정보 | 자산대장 양식 |
| 장애대응 | 임계 경보/오프라인 대응 담당자 | 대시보드, 임계 경보, 월간보고 설명 |
5. 지금 당장 준비할 첨부자료 체크리스트
필수
- 실제 구축 범위 확정 문장
- 서버 도메인과 설치 경로
- 단말 설치 위치와 장비 ID
- 네트워크 연결 방식 설명
- SMS 수신자 관리 기준
- 로그/측정 이력 보관기간 기준
- 관리자 MFA 등록 확인표
- 임계 설정(
METRIC_*) 확인 화면 setup_wizard.php점검 화면 캡처- 대시보드 화면 캡처
- 단말 서비스 상태 화면 캡처
있으면 통과 가능성을 높이는 자료
- 방화벽 정책 또는 네트워크 분리 확인 자료
- 설치 사진
- 자산관리대장
- 테스트 SMS 수신 화면
- 측정값 저장/임계 경보 테스트 결과
- DB 테이블 생성 화면
- 월간 보고서 화면
- 백업 파일 목록
- 보관기간 정리 dry-run 결과
- 백업·복구 증빙 Markdown
- 복구 테스트 결과
- 월간 보안점검표
6. 사용자에게 요청할 답변 양식
아래 양식만 채워주면 보안대책서에 넣을 표와 첨부자료 목록을 확정할 수 있습니다.
1. 이번 구축 범위:
예) 서버실 온습도 모니터링 + 임계 SMS 경보 + 장비 오프라인 감지 + 대시보드 + 월간보고
2. 서버 도메인:
예) https://example.com
3. 서버 설치 경로:
예) public_html/sht30_monitor/
4. 단말 설치 위치:
예) 서버실 서버랙 하단
5. 단말 네트워크 방식:
예) 별도 Wi-Fi / 기관망 / 유선 LAN / 기타
6. 외부에서 단말로 접속 가능 여부:
예) 불가 / SSH만 가능 / 확인 필요
7. SMS 수신자 수:
예) 운영 담당자 2명
8. 온습도 임계값:
예) 고온30/저온10℃, 고습70/저습20%
9. 로그 보관기간:
예) 센서 1년, SMS 1년, 측정 이력 1년
10. 백업 주기:
예) DB 주 1회
7. API 키와 비밀번호 제공 금지
다음 값은 문서 작성자에게 원문으로 제공하지 않는 것이 원칙입니다.
- DB 비밀번호
- API 키 원문
- SMS secure key
- 관리자 원문 비밀번호
ADMIN_TOTP_SECRET원문- 서버 FTP/SFTP 비밀번호
- 단말 로그인 비밀번호
문서에는 다음처럼 마스킹해서 적습니다.
API_KEY: 운영 비밀값으로 서버와 단말에 동일 설정, 원문 미기재
SMS_SECURE: Cafe24 SMS 인증키, 원문 미기재
DB_PASS: config.local.php에만 저장, 원문 미기재
ADMIN_TOTP_SECRET: 운영 비밀값으로 서버에만 저장, 증빙에는 원문 미기재 또는 증빙용 임시 키 사용