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 제외.
303 lines
12 KiB
Markdown
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: 운영 비밀값으로 서버에만 저장, 증빙에는 원문 미기재 또는 증빙용 임시 키 사용
|
|
```
|