2번 모듈 신규(raspberry_pi4_sht30/): SHT30 온습도 → cafe24, raw-body X-Signature HMAC, 폐쇄망 오프라인 설치(vendor/install), systemd, CRC/포맷 자가점검. firmware sht30_fw wire 포맷과 byte-parity 검증. 1번 모듈 통합(raspberry_pi4/): 누수+카메라를 동일 서버로. 레거시 sha256(key+json) body-sig → X-Signature HMAC 전환, 사진 canonical=device_id|sensor_id|log_id|timestamp. 서버 통합(php/): api/sensor_data.php 누수 이벤트 수신, api/photo_upload.php 신규(HMAC·finfo·서버생성 파일명·nonce 멱등·sensor 결속), photo.php 인증 사진서빙, dashboard.php 누수 패널+사진, sms_send.php 누수 SMS, config.php 태그/요약. DB: sql/migration_add_leak.sql(가산·멱등), schema_sht30.sql 통합 스키마. 보안 하드닝(외부 펜테스트 대비, 확정 CRITICAL/HIGH 0): cron_heartbeat api_key fail-closed, setup_mfa 부트스트랩 토큰 post-enrollment 잠금, var/ PHP 실행차단, HSTS. 문서/테스트: SYSTEM_OVERVIEW.md, security_hardening_test.php 갱신. 참고: 사용자 요청으로 세션 외 기존 미커밋 변경도 함께 포함. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
306 lines
13 KiB
Markdown
306 lines
13 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
|
|
```
|
|
|
|
> 참고: 위 `sht30_monitor/` 는 예시 폴더명입니다. 실제 서버 웹루트 경로는 펌웨어 `firmware/common/app_config.h` 의 `APP_API_PATH`(예: `/raspi_leck_detecter/api/sensor_data.php`)와 **반드시 일치**해야 합니다. 운영 경로를 정한 뒤 위 URL과 `APP_API_PATH` 를 같은 폴더명으로 맞추세요.
|
|
|
|
첨부하면 좋은 증적:
|
|
|
|
- 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/
|
|
※ 실제 폴더명은 펌웨어 `app_config.h` 의 `APP_API_PATH` 와 동일해야 함
|
|
|
|
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: 운영 비밀값으로 서버에만 저장, 증빙에는 원문 미기재 또는 증빙용 임시 키 사용
|
|
```
|