보안 및 운영 — CodeIgniter 4용 NextPDF
한눈에 보기
섹션 제목: “한눈에 보기”이 페이지는 이 통합이 대응해야 할 위협을 나열하고, 패키지 소스에 구현된 제어를 명시하며, 안전한 배포를 위한 운영 규칙을 제공합니다.
위협 모델
섹션 제목: “위협 모델”공격자가 영향을 줄 수 있는 표면은 세 가지입니다.
- 큐 작업 페이로드. 큐는 작업 데이터를 저장합니다. 브로커 접근 권한이 있는 공격자는 해당 데이터를 변경할 수 있습니다. 이는 신뢰할 수 없는 역직렬화된 입력입니다.
- 응답 파일 이름. 사용자는 다운로드 파일 이름을 제공할 수 있습니다. 잘못된 이름으로 인해 헤더 콘텐츠가 주입될 수 있습니다.
- 구성 경로. 글꼴 경로와 서명 경로는 구성에서 가져옵니다. 잘못된 경로로 인해 의도하지 않은 위치를 읽거나 쓸 수 있습니다.
제어 1 — 큐 페이로드 허용 목록
섹션 제목: “제어 1 — 큐 페이로드 허용 목록”큐 작업은 페이로드를 신뢰할 수 없는 역직렬화된 데이터로 취급합니다. OWASP ASVS는 역직렬화된 신뢰할 수 없는 데이터에 안전한 입력 처리를 요구합니다(ASVS V1.5.2).
다음은 GeneratePdfJob의 검증된 제어입니다:
- 빌더는 비어 있지 않은 문자열이어야 합니다. 작업은 다른 유형을 거부합니다.
- 빌더는
App\PdfBuilders\<Class>::<method>패턴과 일치해야 합니다. 작업은 다른 네임스페이스나 일반 함수, 접두사 또는 접미사가 붙은 페이로드를 거부합니다. - 빌더는 호출 가능해야 합니다. 작업은 패턴에는 일치하지만 해석되지 않는 문자열을 거부합니다.
이러한 규칙은 변조된 큐 페이로드를 통한 임의 코드 실행을 차단합니다. 패키지 테스트는 각 거부 사례를 검증합니다.
제어 2 — 큐 출력 경로 제한
섹션 제목: “제어 2 — 큐 출력 경로 제한”작업은 파일을 디스크에 기록합니다. OWASP ASVS는 애플리케이션이 파일 작업용 파일 경로를 생성할 때 안전한 경로 처리를 요구합니다(ASVS V5.3.2).
다음은 GeneratePdfJob의 검증된 제어입니다:
- 출력 경로는 비어 있지 않은 문자열이어야 합니다.
- 작업은 경로를 정규화합니다. 검사하기 전에
.및..세그먼트를 해석하고 구분 기호를 변환합니다. - 정규화된 경로는
WRITEPATH/pdfs/안에 있어야 합니다. 작업은 이름 접두사가 같은 형제 디렉터리(pdfs-evil/)를 거부합니다. - 경로는
.pdf로 끝나야 합니다(대소문자 구분 없음).
이러한 규칙은 변조된 페이로드를 통한 임의 파일 쓰기를 차단합니다.
제어 3 — 응답 헤더 강화
섹션 제목: “제어 3 — 응답 헤더 강화”PdfResponse는 모든 PDF 응답에 고정된 헤더 집합을 추가합니다:
| 헤더 | 값 |
|---|---|
X-Content-Type-Options | nosniff |
X-Frame-Options | DENY |
Content-Security-Policy | default-src 'none' |
X-Robots-Tag | noindex, nofollow |
Referrer-Policy | no-referrer |
Cache-Control | private, max-age=0, must-revalidate |
파일 이름은 헤더에 들어가기 전에 정제됩니다. 패키지는 경로 구분 기호, 널 바이트 및 CR/LF를 제거합니다. 인용 형식에 맞게 큰따옴표를 이스케이프합니다. 비 ASCII 이름에는 RFC 5987의 filename*=UTF-8''… 매개변수를 추가합니다. 빈 이름은 document.pdf가 됩니다.
제어 4 — 구성 경로 검증
섹션 제목: “제어 4 — 구성 경로 검증”글꼴 레지스트리는 fontsPath에 스트림 래퍼(://)나 널 바이트가 포함되어 있으면 거부하고 런타임 오류를 발생시킵니다. 이는 php:// 또는 phar://와 같은 래핑된 경로를 차단합니다.
제어 5 — 최소 서비스 로케이터 표면
섹션 제목: “제어 5 — 최소 서비스 로케이터 표면”CodeIgniter 4에는 PSR-11 컨테이너가 없으며 Services 로케이터를 사용합니다. PSR-11 §1.3은 서비스 로케이터 패턴을 권장하지 않는 것으로 다룹니다(SHOULD NOT 규범). 패키지는 로케이터 표면을 작게 유지합니다. 각 서비스는 하나의 명명된 팩토리 메서드입니다. 서비스는 컨트롤러 경계에서 해석하십시오. 구체 객체를 안쪽으로 전달하십시오. 도메인 코드에는 Services 클래스를 전달하지 마십시오.
서명 및 TSA 작업(NextPDF Pro / Enterprise)
섹션 제목: “서명 및 TSA 작업(NextPDF Pro / Enterprise)”서명 서비스는 기본적으로 비활성화되어 있습니다. signature.enabled가 true이고 signature.certificate가 비어 있지 않은 경우에만 활성화됩니다. 패키지의 기본 서명 수준은 B-B입니다. NextPDF Pro는 B-B 베이스라인 서명을 제공합니다. 장기 검증은 별도의 Enterprise 기능입니다. 이는 여기가 아닌 Premium 참조 문서에 기재되어 있습니다.
운영 규칙:
- 인증서와 키 파일은 소스 제어에서 제외하십시오.
.env또는 비밀 관리자를 통해 제공하십시오. - 프로덕션에서는
tsa.allow_insecure_http를false로 유지하십시오. 평문 TSA 채널은 허용되지 않습니다. - TSA가 안정적인 키를 게시할 때
tsa.pinned_public_keys를 설정하십시오.tsa.warn_on_key_rotation을true로 유지하십시오. - 키 파일의 읽기 접근 권한은 애플리케이션 사용자로 제한하십시오.
운영 체크리스트
섹션 제목: “운영 체크리스트”- 해결된 모든 버전을
composer.lock에 고정하십시오. - 워커를 실행하는 애플리케이션에서는
codeigniter4/queue를 필수로 지정하십시오. - 큐 워커를 낮은 권한 사용자로 실행하십시오.
WRITEPATH/pdfs/에 대한 쓰기 접근 권한만 부여하십시오. - 워커에도 웹 계층과 동일한 NextPDF 확장을 제공하십시오. 서명된 PDF에는 워커 환경에 NextPDF Pro 또는 Enterprise가 필요합니다.
- PDF를 빌드하는 모든 런타임에서
mbstring및zlib확장을 확인하십시오. - 응답 헤더가 역방향 프록시를 통과하는지 확인하십시오.
- PDF 생성은 컨텍스트와 함께 로깅하십시오. 인증서 자료나 키 비밀번호를 로깅하지 마십시오.
적합성
섹션 제목: “적합성”- 큐 페이로드 처리는 OWASP ASVS V1.5.2를 따릅니다.
- 큐 출력 경로 처리는 OWASP ASVS V5.3.2를 따릅니다.
- 로케이터 설계는 PSR-11 §1.3 지침을 따릅니다.
상업적 컨텍스트
섹션 제목: “상업적 컨텍스트”NextPDF 코어는 Apache-2.0입니다. 서명 신뢰 앵커와 TSA 강화는 NextPDF Pro 또는 Enterprise가 설치된 경우에 적용됩니다. CodeIgniter 패키지는 해당 서비스 메서드를 노출하며, 일치하는 Premium 패키지가 설치될 때까지 null을 반환합니다. </get-license/?intent=codeigniter-signing>를 참조하십시오.
참고 항목
섹션 제목: “참고 항목”- /integrations/codeigniter/production-usage/ — 올바른 큐 등록 및 디스패치.
- /integrations/codeigniter/configuration/ — 서명, TSA 및 경로 키.
- /integrations/codeigniter/troubleshooting/ — 검증된 거부 메시지.
- /integrations/codeigniter/overview/ — 전체 API 표면.