POSA_LEAKSMS/docs/SECURITY_PLAN_ATTACHMENT_GUIDE.md
유창욱 90f121e14c chore: import codebase with security hardening
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 제외.
2026-06-20 09:37:40 +09:00

303 lines
12 KiB
Markdown

# 보안대책서 첨부·제공자료 가이드
작성일: 2026-05-20
대상: HWP 보안대책서의 `4. HWP에 반드시 추가해야 할 보안통제 매트릭스`
## 1. 먼저 정리
`보안통제 매트릭스`는 사용자가 따로 첨부해야 하는 파일이 아니라, **HWP 본문에 들어갈 표**입니다.
사용자가 준비해야 하는 것은 표의 마지막 열인 **확인 증적**입니다.
즉, 심사자가 “그 보안대책이 실제로 적용됐나요?”라고 물었을 때 보여줄 자료입니다.
소스코드, API 인증, 측정값 검증, 관리자 로그인, 비밀값 분리처럼 코드에서 설명 가능한 항목은 [SOURCE_SECURITY_EVIDENCE.md](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 | 화재/누수/전원 이상도 이번 범위에 포함한다 | 추가 센서, 코드, 증적이 더 필요 |
권장 답변:
```text
이번 1차 구축 범위는 서버실 온습도 모니터링, 임계 SMS 경보, 정상복귀 알림, 장비 오프라인 감지, 대시보드/월간보고까지로 한정한다.
화재·누수 및 전원 이상 감지는 향후 확장 범위로 분리한다.
```
### 3.2 서버 정보
비밀번호나 API 키 원문은 주면 안 됩니다. 아래처럼 마스킹해서 주면 됩니다.
```text
서비스 도메인: 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 단말 정보
```text
장비명: STM32 보드 (SHT30 온습도 센서 연계)
장비 ID: stm32-sht30-01
설치 위치: 서버실 / 서버랙 주변 / 기타
센서 모델: SHT30 온습도 센서
측정 주기: 5분 (펌웨어 기본)
네트워크 방식: 유선 LAN / Wi-Fi / 기타
단말 접속 방식: 현장 직접 접속 / SSH / 기타
```
첨부하면 좋은 증적:
- 단말과 센서 설치 사진
- STM32 USART3(PD8/PD9, 115200) 부팅 콘솔 로그(링크업/DHCP/SNTP/TLS 핸드셰이크) 캡처
- 동일 콘솔에서 서버 200 OK 응답이 보이는 정상 보고 로그 캡처
### 3.4 네트워크 연결 방식
이 부분이 심사에서 중요합니다. 아래 질문에 답이 필요합니다.
```text
1. 단말이 기관 업무망에 연결되는가?
2. 단말이 별도 인터넷망 또는 별도 Wi-Fi를 사용하는가?
3. 기관 방화벽에서 Cafe24 서버로 나가는 443 포트만 허용하는가?
4. 외부에서 단말로 접속할 수 있는 포트가 열려 있는가?
5. 단말 원격관리는 어떻게 하는가?
```
권장 구조:
```text
단말은 기관 업무망으로 들어오는 인바운드 접속을 허용하지 않고,
승인된 Cafe24 서버로 HTTPS 아웃바운드 통신만 수행한다.
```
첨부하면 좋은 증적:
- 네트워크 구성도
- 방화벽 허용 정책
- 단말에서 `ss -lntup` 실행 결과
- 기관망 미연결 또는 분리 운영 확인 문구
### 3.5 운영 담당자 정보
개인 이름을 꼭 문서에 넣을 필요는 없습니다. 역할 중심으로 적으면 됩니다.
```text
사업총괄: 혁신전략실장
사업관리: 정보기반팀
사업수행: 우편혁신AI연구팀
보안검토/점검: 정보보안센터
SMS 수신자: 전산실 운영 담당자 2명
월간 점검 담당: 정보기반팀 담당자
```
첨부하면 좋은 증적:
- 운영 담당자 지정표
- SMS 수신자 현행화 확인표
- 월간 점검표 양식
### 3.6 보관기간 기준
기관 내부 기준이 없으면 아래 권장안을 쓰면 됩니다.
| 데이터 | 권장 보관기간 |
|---|---:|
| SMS 발송 로그 | 1년 |
| 센서 이벤트 로그 | 1년 |
| 온습도 측정 이력 | 1년 |
| 관리자 감사로그 | 1년 |
| 백업 파일 | 1년 또는 기관 기준 |
사용자가 결정해서 제공할 내용:
```text
SMS 로그 보관기간: 1년
센서 로그 보관기간: 1년
온습도 측정 이력 보관기간: 1년
관리자 감사로그 보관기간: 1년
기관 내부 규정 우선 적용 여부: 예 / 아니오
```
### 3.7 백업·복구 정보
```text
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. 사용자에게 요청할 답변 양식
아래 양식만 채워주면 보안대책서에 넣을 표와 첨부자료 목록을 확정할 수 있습니다.
```text
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 비밀번호
- 단말 로그인 비밀번호
문서에는 다음처럼 마스킹해서 적습니다.
```text
API_KEY: 운영 비밀값으로 서버와 단말에 동일 설정, 원문 미기재
SMS_SECURE: Cafe24 SMS 인증키, 원문 미기재
DB_PASS: config.local.php에만 저장, 원문 미기재
ADMIN_TOTP_SECRET: 운영 비밀값으로 서버에만 저장, 증빙에는 원문 미기재 또는 증빙용 임시 키 사용
```