- 홈
- 클라이언트 측 방어
- 진단 및 검증
진단 및 검증
이 페이지는 클라이언트 측 방어 배포를 엔드투엔드로 검증하기 위한 계층화된 UAT 검증 매트릭스를 제공합니다. 각 테스트 케이스는 DNS 확인부터 CSD 텔레메트리까지 인프라 의존성 체인을 따르므로, 모든 구성 요소가 올바르게 작동하는지 체계적으로 증명할 수 있습니다.
이러한 명령은 CSD 콘솔 연습의 API 동등물입니다. 터미널에서 검증해야 하거나, 모니터링을 자동화하거나, UI 없이 CSD 기능을 시연해야 할 때 사용하십시오.
사전 요구 사항
섹션 제목: “사전 요구 사항”API 자동화 — 환경 설정에 설명된 대로 환경 변수를 설정하십시오:
set -a && source .env && set +a아래의 모든 명령은 xTOKENx 플레이스홀더 형식을 사용합니다. 환경 변수($F5XC_API_TOKEN, $F5XC_NAMESPACE 등)로 대체하거나 페이지 상단의 인터랙티브 양식을 사용하십시오.
API 동작 참고 사항
섹션 제목: “API 동작 참고 사항”시간 범위 도우미
섹션 제목: “시간 범위 도우미”많은 CSD 엔드포인트는 에포크 타임스탬프(Unix 에포크 이후 초)를 필요로 합니다. 이 원라이너들은 일반적인 범위에 대한 시작/종료 시간을 계산합니다.
크로스 플랫폼 (macOS + Linux):
# 현재 시간을 에포크 초로NOW=$(date +%s)
# 1시간 전START_1H=$(( NOW - 3600 ))
# 24시간 전START_24H=$(( NOW - 86400 ))
# 7일 전START_7D=$(( NOW - 604800 ))
# 30일 전START_30D=$(( NOW - 2592000 ))| 프리셋 | 초 | 셸 표현식 |
|---|---|---|
| 1시간 | 3,600 | $(( $(date +%s) - 3600 )) |
| 24시간 | 86,400 | $(( $(date +%s) - 86400 )) |
| 7일 | 604,800 | $(( $(date +%s) - 604800 )) |
| 30일 | 2,592,000 | $(( $(date +%s) - 2592000 )) |
테스트 케이스 형식
섹션 제목: “테스트 케이스 형식”아래의 각 테스트는 다음 구조를 따릅니다:
| 필드 | 설명 |
|---|---|
| 테스트 ID | 계층 번호 + 순차 ID (예: DNS-1, TLS-2) |
| 증명하는 것 | 검증되는 특정 인프라 사실 |
| 명령 | 바로 실행 가능한 curl 또는 dig 명령 |
| 합격 / 불합격 | 정상 상태 대 비정상 상태의 예상 출력 |
| 수정 | 관련 설정 또는 문제 해결 섹션 링크 |
계층 1: DNS 확인
섹션 제목: “계층 1: DNS 확인”DNS는 기초입니다 — 도메인이 로드 밸런서 VIP로 확인되지 않으면 다른 것은 작동하지 않습니다.
DNS-1: A 레코드 확인
섹션 제목: “DNS-1: A 레코드 확인”증명하는 것: 도메인이 로드 밸런서 VIP IP 주소로 확인됩니다.
dig +short xF5XC_DOMAINNAMEx A| 결과 | 의미 |
|---|---|
합격 — VIP IP 반환됨 (예: 72.19.3.185) | 도메인이 LB 가상 IP로 확인됨 |
| 불합격 — 빈 응답 | DNS A 레코드가 구성되지 않음 |
DNS-2: ACME 챌린지 레코드
섹션 제목: “DNS-2: ACME 챌린지 레코드”증명하는 것: 자동 TLS 인증서 프로비저닝을 위한 ACME 챌린지 레코드가 존재합니다.
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEdig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT| 결과 | 의미 |
|---|---|
합격 — *.autocerts.ves.volterra.io.로의 CNAME (외부 DNS) | ACME 챌린지 CNAME이 준비됨 |
| 합격 — 도메인 값이 있는 TXT 레코드 (F5 Distributed Cloud (F5 XC) 관리 DNS) | 플랫폼 관리 ACME 챌린지 (TXT 레코드를 통해) |
| 불합격 — 둘 다 비어 있음 | ACME 레코드가 구성되지 않음; 인증서가 PreDomainChallengePending 상태로 유지됨 |
수정: 외부 DNS의 경우, CNAME 생성: _acme-challenge.xF5XC_DOMAINNAMEx → *.autocerts.ves.volterra.io. F5 XC 관리 DNS의 경우, DNS 영역에서 allow_http_lb_managed_records를 활성화하십시오 — DNS-4 참조. API 자동화 — 4단계를 참조하십시오.
DNS-3: 네임서버 권한
섹션 제목: “DNS-3: 네임서버 권한”증명하는 것: F5 XC가 루트 도메인에 대한 권한 있는 DNS 공급자인지 여부.
dig +short NS xF5XC_ROOT_DOMAINx| 결과 | 의미 |
|---|---|
ns1.f5clouddns.com 및 ns2.f5clouddns.com 포함 | F5 XC 관리 DNS — 레코드가 자동 생성될 수 있음 |
| 다른 네임서버 | 외부 DNS — 레코드를 수동으로 생성해야 함 |
DNS-4: F5 XC 관리 레코드 활성화
섹션 제목: “DNS-4: F5 XC 관리 레코드 활성화”증명하는 것: F5 XC DNS 영역이 로드 밸런서에 대한 자동 레코드 생성을 허용합니다 (F5 XC 관리 DNS만 해당).
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/dns/namespaces/system/dns_zones/xF5XC_ROOT_DOMAINx" \ | jq '.spec.primary.allow_http_lb_managed_records'| 결과 | 의미 |
|---|---|
합격 — true | 플랫폼이 LB에 대한 A 및 ACME 레코드를 자동 생성함 |
불합격 — false 또는 null | 관리 레코드가 비활성화됨; 영역 업데이트를 통해 활성화 |
수정: API 자동화 — 옵션 A: F5 XC 관리 DNS
계층 2: TLS 인증서
섹션 제목: “계층 2: TLS 인증서”DNS가 확인된 후, 로드 밸런서에 유효한 TLS 인증서가 있어야 합니다.
TLS-1: 인증서 상태
섹션 제목: “TLS-1: 인증서 상태”증명하는 것: HTTPS LB에 자동 TLS 인증서가 발급되었습니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '.spec.cert_state'| 결과 | 의미 |
|---|---|
합격 — "CertificateValid" 또는 "AutoCertRenewing" | 인증서가 유효하고 활성 상태 |
경고 — "DomainChallengePending" 또는 "DomainChallengeStarted" | ACME 챌린지 진행 중 — 5–10분 대기 |
정보 — "AutoCertDomainRateLimited" | Let’s Encrypt 속도 제한에 도달 — 데모 환경에서 예상되며, HTTP LB에는 영향 없음 |
불합격 — "PreDomainChallengePending" | ACME 챌린지 레코드 누락 — DNS-2 참조 |
수정: ACME 챌린지 레코드가 준비되어 있는지 확인하십시오 (외부 DNS의 경우 CNAME, F5 XC DNS의 경우 관리 레코드 활성화). 인증서 프로비저닝은 레코드 구성 후 5–10분이 소요됩니다. 15분이 지나도 멈춰 있으면 인증서 중단 — 초기화 재생성을 참조하십시오. 속도 제한의 경우, HTTP LB는 영향받지 않습니다.
TLS-2: 인증서 세부 정보
섹션 제목: “TLS-2: 인증서 세부 정보”증명하는 것: 인증서가 예상 도메인을 포함하고 만료 정보를 표시합니다. HTTPS LB에만 적용됩니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '{ cert_state: .spec.cert_state, auto_cert_info: .spec.auto_cert_info }'| 결과 | 의미 |
|---|---|
합격 — auto_cert_info에 dns_records 및 인증서 메타데이터 포함 | 인증서 프로비저닝 세부 정보 이용 가능 |
불합격 — auto_cert_info가 null 또는 비어 있음 | 인증서가 아직 프로비저닝되지 않음 |
TLS-3: 라이브 TLS 핸드셰이크
섹션 제목: “TLS-3: 라이브 TLS 핸드셰이크”증명하는 것: TLS 인증서가 유효하고 클라이언트 측에서 핸드셰이크가 완료됩니다. HTTPS LB에 유효한 인증서가 있는 경우에만 적용됩니다.
curl -sv "https://xF5XC_DOMAINNAMEx/" 2>&1 \ | grep -E 'SSL connection|subject:|expire date:|issuer:'| 결과 | 의미 |
|---|---|
합격 — SSL connection using TLSv1.3, 유효한 주체 및 만료 표시 | 엔드투엔드 TLS가 작동 중 |
| 불합격 — 연결 거부 또는 인증서 오류 | DNS 확인 및 인증서 상태 확인; 속도 제한의 경우 HTTP 사용 |
TLS-4: LB의 ACME 레코드 대상
섹션 제목: “TLS-4: LB의 ACME 레코드 대상”증명하는 것: HTTPS 로드 밸런서가 인증서 검증을 위한 올바른 ACME 대상을 보고합니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '{ vip_ip: .spec.dns_info[0].ip_address, acme_target: .spec.auto_cert_info.dns_records }'| 결과 | 의미 |
|---|---|
합격 — vip_ip 및 acme_target 채워짐 | 이 값에 대해 DNS 레코드를 검증할 수 있음 |
불합격 — null 값 | LB에 https_auto_cert가 구성되지 않았을 수 있음 |
계층 3: HTTP 로드 밸런서
섹션 제목: “계층 3: HTTP 로드 밸런서”로드 밸런서는 준비 상태여야 하고 올바르게 구성되어야 합니다.
LB-1: 운영 상태
섹션 제목: “LB-1: 운영 상태”증명하는 것: HTTP 로드 밸런서(기본)가 완전히 작동하며 트래픽을 수용하고 있습니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '.spec.state'| 결과 | 의미 |
|---|---|
합격 — "VIRTUAL_HOST_READY" | LB가 작동 중 |
불합격 — "VIRTUAL_HOST_PENDING_A_RECORD" | DNS A 레코드가 구성되지 않음 — DNS-1 참조 |
수정: VIRTUAL_HOST_PENDING_A_RECORD에 멈춘 LB
LB-2: 도메인 구성
섹션 제목: “LB-2: 도메인 구성”증명하는 것: HTTP 로드 밸런서가 올바른 도메인으로 구성되어 있습니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '.spec.domains'| 결과 | 의미 |
|---|---|
합격 — 배열에 FQDN 포함 (예: ["app.example.com"]) | LB가 예상 도메인에 대해 구성됨 |
| 불합격 — 누락되거나 잘못된 도메인 | 올바른 도메인으로 LB 사양을 업데이트 |
LB-3: LB에서 CSD 활성화
섹션 제목: “LB-3: LB에서 CSD 활성화”증명하는 것: 올바른 JS 주입 정책으로 로드 밸런서에 클라이언트 측 방어가 활성화되어 있습니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '{ csd_enabled: (if .spec.client_side_defense then true else false end), js_policy: .spec.client_side_defense.policy }'| 결과 | 의미 |
|---|---|
합격 — csd_enabled: true이고 정책에 js_insert_all_pages 포함 | 모든 페이지에 JS 주입이 활성화된 CSD |
불합격 — csd_enabled: false | LB에 CSD가 구성되지 않음 |
LB-4: 기본 라우트 풀
섹션 제목: “LB-4: 기본 라우트 풀”증명하는 것: 로드 밸런서가 예상 가중치 및 우선순위로 올바른 오리진 풀을 참조합니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '.spec.default_route_pools[] | { pool: .pool.name, namespace: .pool.namespace, weight: .weight, priority: .priority }'| 결과 | 의미 |
|---|---|
| 합격 — 가중치/우선순위와 함께 오리진 풀 이름 표시 | LB가 올바른 백엔드로 라우팅 중 |
| 불합격 — 비어 있거나 잘못된 풀 | LB default_route_pools 구성을 업데이트 |
LB-5: 배포 상태 (사이트별 조건)
섹션 제목: “LB-5: 배포 상태 (사이트별 조건)”증명하는 것: 로드 밸런서가 배포되어 모든 사이트에서 정상 조건을 보고합니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '{ state: .spec.state, dns_info: .spec.dns_info, host_name: .spec.host_name }'| 결과 | 의미 |
|---|---|
합격 — state가 VIRTUAL_HOST_READY이고 dns_info 채워짐 | VIP가 할당된 LB가 완전히 배포됨 |
불합격 — 보류 상태 또는 빈 dns_info | 배포를 차단하는 DNS 또는 인증서 문제 |
LB-6: 전체 LB 요약
섹션 제목: “LB-6: 전체 LB 요약”증명하는 것: 디버깅을 위한 두 LB 구성의 포괄적인 스냅샷.
HTTP LB (기본):
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '{ name: .metadata.name, state: .spec.state, domains: .spec.domains, csd_enabled: (if .spec.client_side_defense then true else false end), route_pools: [.spec.default_route_pools[] | .pool.name], advertise: (if .spec.advertise_on_public_default_vip then "public_default_vip" else "custom" end) }'HTTPS LB (보조 — 인증서 상태 포함):
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '{ name: .metadata.name, state: .spec.state, cert_state: .spec.cert_state, domains: .spec.domains, csd_enabled: (if .spec.client_side_defense then true else false end), route_pools: [.spec.default_route_pools[] | .pool.name] }'계층 4: 오리진 풀
섹션 제목: “계층 4: 오리진 풀”오리진 풀은 로드 밸런서가 트래픽을 라우팅하는 백엔드 서버를 정의합니다.
OP-1: 오리진 풀 구성
섹션 제목: “OP-1: 오리진 풀 구성”증명하는 것: 오리진 풀이 올바른 백엔드 서버, 포트 및 LB 알고리즘으로 존재합니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \ | jq '{ name: .metadata.name, origin_servers: [.spec.origin_servers[] | { ip: .public_ip.ip, labels: .labels }], port: .spec.port, lb_algorithm: .spec.loadbalancer_algorithm, endpoint_selection: .spec.endpoint_selection }'| 결과 | 의미 |
|---|---|
| 합격 — 올바른 IP, 포트 및 알고리즘 표시 | 오리진 풀이 올바르게 구성됨 |
불합격 — 404 또는 잘못된 값 | 오리진 풀이 누락되거나 잘못 구성됨 |
OP-2: 오리진으로의 TLS
섹션 제목: “OP-2: 오리진으로의 TLS”증명하는 것: LB와 오리진 서버 간의 연결에 TLS가 구성되어 있는지 여부.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \ | jq '{ tls_config: (if .spec.no_tls then "no_tls (plaintext)" elif .spec.use_tls then "use_tls (encrypted)" else "unknown" end) }'| 결과 | 의미 |
|---|---|
no_tls (plaintext) | LB가 HTTP를 통해 오리진에 연결 (Juice Shop 데모에서 예상됨) |
use_tls (encrypted) | LB가 HTTPS를 통해 오리진에 연결 |
OP-3: 헬스 체크 연결
섹션 제목: “OP-3: 헬스 체크 연결”증명하는 것: 오리진 풀에 올바른 헬스 체크가 연결되어 있습니다 (해당하는 경우).
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \ | jq '.spec.healthcheck'| 결과 | 의미 |
|---|---|
| 합격 — 헬스 체크 참조가 있는 배열 (이름, 네임스페이스, 종류) | 헬스 체크가 연결됨 |
확인 — 빈 배열 [] | 헬스 체크 없음 (허용됨 — CSD에는 필요하지 않음) |
| 불합격 — 헬스 체크가 예상되지만 배열이 비어 있음 | 생성 시 헬스 체크를 찾을 수 없음 — 헬스 체크가 연결되지 않음 참조 |
OP-4: 오리진 연결
섹션 제목: “OP-4: 오리진 연결”증명하는 것: 오리진 서버가 클라이언트 측에서 연결 가능합니다 (LB-오리진 경로를 테스트하지 않음).
curl -s -o /dev/null -w '%{http_code}' \ "http://xF5XC_ORIGIN_IPx:xF5XC_ORIGIN_PORTx/"| 결과 | 의미 |
|---|---|
합격 — 200 (또는 다른 유효한 HTTP 코드) | 오리진 서버가 응답 중 |
불합격 — 000 또는 연결 거부 | 이 네트워크에서 오리진 서버에 연결할 수 없음 |
계층 5: 헬스 체크
섹션 제목: “계층 5: 헬스 체크”헬스 체크는 백엔드 가용성을 모니터링합니다. CSD에는 선택 사항이지만 프로덕션 배포에 유용합니다.
HC-1: 헬스 체크 구성
섹션 제목: “HC-1: 헬스 체크 구성”증명하는 것: 헬스 체크가 올바른 유형, 경로, 타이밍 및 임계값으로 존재합니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks/xF5XC_HC_NAMEx" \ | jq '{ name: .metadata.name, type: (if .spec.http_health_check then "HTTP" elif .spec.tcp_health_check then "TCP" else "unknown" end), path: .spec.http_health_check.path, expected_status: .spec.http_health_check.expected_status_codes, timeout: .spec.timeout, interval: .spec.interval, unhealthy_threshold: .spec.unhealthy_threshold, healthy_threshold: .spec.healthy_threshold }'| 결과 | 의미 |
|---|---|
합격 — 경로 /와 예상 200이 있는 HTTP 유형 표시 | 헬스 체크가 올바르게 구성됨 |
불합격 — 404 응답 | 헬스 체크가 존재하지 않음 (건너뛰었을 수 있음 — 1단계 1단계 참조) |
HC-2: 모든 헬스 체크 나열
섹션 제목: “HC-2: 모든 헬스 체크 나열”증명하는 것: 네임스페이스의 모든 헬스 체크를 열거하여 이름 지정 및 개수를 확인합니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks" \ | jq -r ' ["NAME", "NAMESPACE", "DESCRIPTION"], (.items[] | [ .name, .namespace, (.description | if length == 0 then "—" else . end) ]) | @tsv' | column -t계층 6: CSD 구성
섹션 제목: “계층 6: CSD 구성”CSD는 테넌트 수준에서 활성화되어야 하고 JavaScript 주입 태그가 구성되어 있어야 합니다.
CSD-1: 테넌트 CSD 상태
섹션 제목: “CSD-1: 테넌트 CSD 상태”증명하는 것: CSD가 테넌트에 대해 구성되고 활성화되어 있습니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq '{isConfigured, isEnabled}'| 결과 | 의미 |
|---|---|
합격 — 둘 다 true | 이 테넌트에 CSD가 활성화됨 |
불합격 — isConfigured: false | 테넌트 수준에서 CSD가 활성화되지 않음 — F5 XC 관리자에게 문의 |
불합격 — isEnabled: false | CSD가 구성되었지만 활성 상태가 아님 |
CSD-2: JS 주입 태그
섹션 제목: “CSD-2: JS 주입 태그”증명하는 것: CSD JavaScript 주입 태그가 생성되어 주입 준비가 완료되었습니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq '{has_script_tag: (.scriptTag | length > 0)}'| 결과 | 의미 |
|---|---|
합격 — has_script_tag: true | JS 주입 태그가 구성됨 |
불합격 — has_script_tag: false | 스크립트 태그 없음 — CSD가 활성화되어 있고 보호된 도메인이 등록되어 있는지 확인 |
CSD-3: JS 태그 내용
섹션 제목: “CSD-3: JS 태그 내용”증명하는 것: 확인 또는 수동 주입을 위한 전체 스크립트 태그를 표시합니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq '.scriptTag'CSD-4: 보호 도메인 등록
섹션 제목: “CSD-4: 보호 도메인 등록”증명하는 것: 루트 도메인이 테넌트에서 CSD 보호 도메인으로 등록되어 있습니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \ | jq '.items[] | {name, namespace, description}'| 결과 | 의미 |
|---|---|
합격 — 비어 있지 않은 name이 있는 항목 표시 | 도메인이 보호됨 |
불합격 — 항목에 빈 name 및 namespace 필드 | 등록된 보호 도메인 없음 — 1단계 6단계 참조 |
CSD-5: 라이브 JS 주입 검증
섹션 제목: “CSD-5: 라이브 JS 주입 검증”증명하는 것: CSD JavaScript가 실제로 로드 밸런서가 제공하는 페이지 응답에 주입되고 있습니다.
curl -s "http://xF5XC_DOMAINNAMEx/" \ | grep -oE '(zeronaught|shape)\.com[^"]*' | head -1| 결과 | 의미 |
|---|---|
합격 — zeronaught.com 또는 shape.com URL 조각 반환 (예: zeronaught.com/__imp_apg__/js/...) | CSD JavaScript가 페이지에 주입되고 있음 |
| 불합격 — 빈 출력 | JS가 주입되지 않음 — LB-3 및 CSD-1 확인 |
계층 7: 트래픽 검증
섹션 제목: “계층 7: 트래픽 검증”라이브 트래픽이 로드 밸런서에 도달하여 올바르게 처리되고 있는지 확인합니다.
TV-1: 요청 수 (지난 24시간)
섹션 제목: “TV-1: 요청 수 (지난 24시간)”증명하는 것: 트래픽이 로드 밸런서에 도달하고 있습니다. 결과가 0이면 트래픽이 도달하지 않는 것입니다.
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "start_time": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)"'", "end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'" }' \ "xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs/aggregation" \ | jq '{total_requests: .total_hits}'| 결과 | 의미 |
|---|---|
합격 — total_requests가 0이 아닌 문자열 (예: "380") | 트래픽이 LB를 통해 흐르고 있음 |
불합격 — "0" 또는 데이터 없음 | LB에 트래픽이 도달하지 않음 — DNS-1 및 LB-1 확인 |
TV-2: 상태 코드 분포
섹션 제목: “TV-2: 상태 코드 분포”증명하는 것: 응답 상태 코드의 분포가 오류 패턴을 드러냅니다.
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "start_time": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)"'", "end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'", "sort": "DESCENDING", "limit": 100 }' \ "xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \ | jq -r ' [.logs[] | fromjson | .rsp_code_class] | group_by(.) | map({class: .[0], count: length}) | sort_by(-.count) | ["STATUS_CLASS", "COUNT"], (.[] | [.class, .count]) | @tsv' | column -t정상 사이트의 예상 출력:
STATUS_CLASS COUNT2xx 82downstream_remote_disconnect 18| 결과 | 의미 |
|---|---|
합격 — 대부분 2xx | 사이트가 성공적인 응답을 제공 중 |
경고 — 높은 4xx 수 | 클라이언트 오류 (잘못된 URL, 누락된 리소스) |
불합격 — 높은 5xx 수 | 서버 오류 — 오리진 서버 상태 확인 |
downstream_remote_disconnect 클래스는 응답이 완료되기 전에 클라이언트가 연결을 닫았음을 나타냅니다 (롱 폴링 또는 WebSocket 업그레이드 요청에 일반적).
TV-3: 최근 요청 샘플
섹션 제목: “TV-3: 최근 요청 샘플”증명하는 것: 개별 요청이 올바른 필드와 함께 기록되고 있습니다.
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "start_time": "'"$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-1H +%Y-%m-%dT%H:%M:%SZ)"'", "end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'", "sort": "DESCENDING", "limit": 10 }' \ "xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \ | jq -r ' ["TIMESTAMP", "METHOD", "PATH", "STATUS", "SRC_IP"], (.logs[] | fromjson | [.["@timestamp"], .method, .req_path, .rsp_code, .src_ip]) | @tsv' | column -tTV-4: 액세스 로그의 CSD JS 주입
섹션 제목: “TV-4: 액세스 로그의 CSD JS 주입”증명하는 것: 액세스 로그가 CSD JavaScript가 응답에 주입되고 있음을 확인합니다.
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "start_time": "'"$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-1H +%Y-%m-%dT%H:%M:%SZ)"'", "end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'", "sort": "DESCENDING", "limit": 20 }' \ "xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \ | jq '[.logs[] | fromjson | select(.csd_js_injection == "true")] | length as $injected | {injected_count: $injected, total_sampled: 20}'| 결과 | 의미 |
|---|---|
합격 — injected_count > 0 | CSD JS가 페이지 응답에 주입되고 있음 |
불합격 — injected_count: 0 | JS가 주입되지 않음 — CSD-1 및 LB-3 확인 |
TV-5: 엔드투엔드 연결 테스트
섹션 제목: “TV-5: 엔드투엔드 연결 테스트”증명하는 것: 완전한 요청이 클라이언트에서 DNS, LB, 오리진을 통해 흘러 유효한 응답을 반환합니다.
curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 \ | grep -E 'Connected to|< HTTP|< content-type'| 결과 | 의미 |
|---|---|
| 합격 — 연결, HTTP 200 및 content-type 표시 | 전체 스택이 작동 중 |
| 불합격 — 연결 거부 또는 DNS 오류 | 계층 1: DNS에서 디버깅 시작 |
계층 8: CSD 텔레메트리 & 도메인 정책
섹션 제목: “계층 8: CSD 텔레메트리 & 도메인 정책”이러한 명령은 CSD 콘솔 대시보드, 스크립트 목록, 양식 필드 및 네트워크 뷰에 표시된 것과 동일한 데이터를 쿼리합니다.
TEL-1: 스크립트 인벤토리
섹션 제목: “TEL-1: 스크립트 인벤토리”증명하는 것: CSD가 보호된 도메인에서 실행 중인 스크립트를 감지하고 카탈로그화하고 있습니다.
NOW=$(date +%s)START=$(( NOW - 604800 ))
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{ \"startTime\": \"${START}\", \"endTime\": \"${NOW}\" }" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \ | jq -r ' ["SCRIPT", "RISK", "STATUS", "FIELDS", "USERS"], (.scripts[] | [ (.script_name | if length > 50 then .[:47] + "..." else . end), .risk_level, .status, (.form_fields_read // 0), (.affected_users_count // 0) ]) | @tsv' | column -t| 결과 | 의미 |
|---|---|
| 합격 — 위험 수준과 함께 스크립트 나열 | CSD가 스크립트를 활발히 모니터링 중 |
| 불합격 — 빈 배열 | 문제 해결: 빈 스크립트 배열 참조 |
TEL-2: 감지된 도메인
섹션 제목: “TEL-2: 감지된 도메인”증명하는 것: CSD가 스크립트 소스 도메인을 감지하고 상태별로 분류했습니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{ summary: { action_needed: .domain_summary.actionNeededCount.count, mitigated: .domain_summary.mitigatedDomains.count, allowed: .domain_summary.allowedDomains.count, total: .domain_summary.totalDomains.count }, domains: [.domains_list[] | { domain: .domain, category: .category, status: .status, first_seen: (.firstSeenDate | tonumber | todate), latest_seen: (.latestSeenDate | tonumber | todate) }] }'| 결과 | 의미 |
|---|---|
합격 — total > 0이고 도메인 나열됨 | CSD가 스크립트 도메인을 추적 중 |
경고 — action_needed > 0 | 일부 도메인에 검토 필요 |
| 불합격 — 빈 응답 | 텔레메트리 데이터 없음 — CSD-5 확인 |
TEL-3: 도메인 정책 상태
섹션 제목: “TEL-3: 도메인 정책 상태”증명하는 것: 허용된 도메인 대 완화된 도메인의 분포를 표시하고 정책이 일관성 있는지 여부.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{ action_needed: .domain_summary.actionNeededCount.count, mitigated: .domain_summary.mitigatedDomains.count, allowed: .domain_summary.allowedDomains.count, total: .domain_summary.totalDomains.count, domains_needing_action: [.domains_list[] | select(.status == "AN") | .domain] }'| 결과 | 의미 |
|---|---|
합격 — action_needed: 0 | 모든 도메인이 검토되고 분류됨 |
경고 — action_needed > 0 | domains_needing_action에 나열된 도메인이 검토 필요 |
TEL-4: 양식 필드 인벤토리
섹션 제목: “TEL-4: 양식 필드 인벤토리”증명하는 것: CSD가 스크립트가 읽고 있는 양식 필드를 감도 분류와 함께 감지했습니다.
NOW=$(date +%s)START=$(( NOW - 604800 ))
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/formFields?startTime=${START}&endTime=${NOW}" \ | jq -r ' ["FIELD", "SENSITIVITY", "SCRIPTS"], (.form_fields[] | [ .name, .analysis, (.scripts_count // 0) ]) | @tsv' | column -t| 결과 | 의미 |
|---|---|
| 합격 — 감도와 함께 양식 필드 나열 | CSD가 양식 필드 접근을 추적 중 |
| 정보 — 빈 배열 | 양식 필드가 감지되지 않음 (사이트에 양식이 없는 경우 예상됨) |
TEL-5: 스크립트 심층 분석
섹션 제목: “TEL-5: 스크립트 심층 분석”증명하는 것: 위험, 동작 및 네트워크 상호작용을 포함한 특정 스크립트에 대한 자세한 정보.
먼저 TEL-1에서 스크립트 ID를 가져온 다음 세부 정보를 쿼리하십시오:
SCRIPT_ID="your-script-id"
# 개요 (위험 수준, 유형, 소스 도메인)curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/dashboard" \ | jq '{script_name, risk_level, type, source_domain, status}'
# 시간에 따른 동작curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/behaviors" \ | jq '.behaviors'
# 네트워크 상호작용 (스크립트가 통신하는 도메인)curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/networkInteractions" \ | jq '.network_interactions'TEL-6: 영향받은 사용자
섹션 제목: “TEL-6: 영향받은 사용자”증명하는 것: 특정 스크립트의 영향을 받은 사용자 목록으로 노출 범위를 표시합니다.
SCRIPT_ID="your-script-id"NOW=$(date +%s)START=$(( NOW - 604800 ))
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{ \"startTime\": \"${START}\", \"endTime\": \"${NOW}\" }" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/affectedUsers" \ | jq -r ' ["IP_ADDRESS", "DEVICE_ID", "GEO", "CHANNEL", "USER_AGENT"], (.affected_users[] | [ .ip_address, (.device_id | if length > 12 then .[:12] + "..." else . end), .geolocation, .channel, (.user_agent | if length > 30 then .[:27] + "..." else . end) ]) | @tsv' | column -tTEL-7: 위험 수준별 스크립트 수
섹션 제목: “TEL-7: 위험 수준별 스크립트 수”증명하는 것: 감지된 모든 스크립트에 걸친 집계 위험 분포.
NOW=$(date +%s)START=$(( NOW - 604800 ))
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{ \"startTime\": \"${START}\", \"endTime\": \"${NOW}\" }" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \ | jq '[.scripts[] | .risk_level] | group_by(.) | map({risk_level: .[0], count: length}) | sort_by(-.count)'| 결과 | 의미 |
|---|---|
합격 — 모두 No Risk | 위험한 스크립트가 감지되지 않음 |
경고 — Low Risk 또는 High Risk 존재 | TEL-5에서 플래그된 스크립트 검토 |
TEL-8: 텔레메트리 최신성
섹션 제목: “TEL-8: 텔레메트리 최신성”증명하는 것: CSD 텔레메트리 데이터가 최신이며 활발한 모니터링을 확인합니다.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{ total_domains: .domain_summary.totalDomains.count, latest_update: (.domain_summary.totalDomains.lastUpdated // "unknown"), most_recent_domain: (.domains_list | sort_by(.latestSeenDate) | last | { domain: .domain, latest_seen: (.latestSeenDate | tonumber | todate) }) }'| 결과 | 의미 |
|---|---|
합격 — latest_seen이 지난 24시간 이내 | 텔레메트리가 데이터를 활발히 수집 중 |
경고 — latest_seen이 24시간보다 오래됨 | 트래픽이 중단되었거나 CSD 처리가 지연되고 있을 수 있음 |
전체 스택 대시보드
섹션 제목: “전체 스택 대시보드”모든 계층에 걸친 모든 중요한 상태 지표를 확인하고 요약 표를 생성하는 단일 명령 실행:
echo "=== CSD Verification Dashboard ==="echo ""
# 계층 1: DNSDNS_A=$(dig +short xF5XC_DOMAINNAMEx A | head -1)DNS_ACME=$(dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME | head -1)
# 계층 2-3: LB + TLSLB=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http")LB_HTTPS=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https")
LB_STATE=$(echo "$LB" | jq -r '.spec.state // "UNKNOWN"')CERT_STATE=$(echo "$LB_HTTPS" | jq -r '.spec.cert_state // "UNKNOWN"')CSD_ON_LB=$(echo "$LB" | jq -r 'if .spec.client_side_defense then "ENABLED" else "DISABLED" end')DOMAINS=$(echo "$LB" | jq -r '.spec.domains | join(", ")')ROUTE_POOL=$(echo "$LB" | jq -r '[.spec.default_route_pools[] | .pool.name] | join(", ")')
# 계층 6: CSD 상태CSD=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status")
CSD_CONFIGURED=$(echo "$CSD" | jq -r '.isConfigured // false')CSD_ENABLED=$(echo "$CSD" | jq -r '.isEnabled // false')
# 계층 6: JS 구성JS_TAG=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq -r 'if (.scriptTag | length) > 0 then "PRESENT" else "MISSING" end')
# 계층 7: 트래픽 (지난 24시간)TRAFFIC=$(curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{ \"start_time\": \"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)\", \"end_time\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" }" \ "xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs/aggregation" \ | jq -r '.total_hits // "0"')
printf "%-28s %s\n" "CHECK" "STATUS"printf "%-28s %s\n" "----------------------------" "----------------------------"printf "%-28s %s\n" "[DNS] A Record" "${DNS_A:-NOT_FOUND}"printf "%-28s %s\n" "[DNS] ACME CNAME" "${DNS_ACME:-NOT_FOUND}"printf "%-28s %s\n" "[TLS] Certificate" "$CERT_STATE"printf "%-28s %s\n" "[LB] State" "$LB_STATE"printf "%-28s %s\n" "[LB] Domains" "$DOMAINS"printf "%-28s %s\n" "[LB] Route Pool" "$ROUTE_POOL"printf "%-28s %s\n" "[LB] CSD on LB" "$CSD_ON_LB"printf "%-28s %s\n" "[CSD] Configured (tenant)" "$CSD_CONFIGURED"printf "%-28s %s\n" "[CSD] Enabled" "$CSD_ENABLED"printf "%-28s %s\n" "[CSD] JS Script Tag" "$JS_TAG"printf "%-28s %s\n" "[Traffic] Requests (24h)" "$TRAFFIC"액세스 로그 필드 참조
섹션 제목: “액세스 로그 필드 참조”| 필드 | 유형 | 설명 |
|---|---|---|
@timestamp | 문자열 | 요청 타임스탬프 (ISO 8601). @ 접두사 참고 — jq에서 .["@timestamp"]로 접근 |
method | 문자열 | HTTP 메서드 (GET, POST 등) |
req_path | 문자열 | 요청 URI 경로 |
rsp_code | 문자열 | HTTP 응답 상태 코드 (문자열, 예: "200", "404") |
rsp_code_class | 문자열 | 상태 코드 클래스 (2xx, 3xx, 4xx, 5xx 또는 downstream_remote_disconnect) |
src_ip | 문자열 | 클라이언트 소스 IP 주소 |
dst_ip | 문자열 | 대상 (VIP) IP 주소 |
domain | 문자열 | 요청 Host 헤더 값 |
user_agent | 문자열 | 클라이언트 User-Agent 문자열 |
rsp_size | 문자열 | 응답 본문 크기 (바이트, 문자열로 반환) |
req_size | 문자열 | 요청 본문 크기 (바이트, 문자열로 반환) |
duration_with_data_tx_delay | 문자열 | 총 요청 지속 시간 (초, 문자열로 반환, 예: "0.024219") |
csd_js_injection | 문자열 | CSD JavaScript가 주입된 경우 "true" (활성 시에만 존재) |
CSD 텔레메트리 필드 참조
섹션 제목: “CSD 텔레메트리 필드 참조”| 필드 | 엔드포인트 | 설명 |
|---|---|---|
isConfigured | status | 테넌트 수준에서 CSD 활성화 여부 |
isEnabled | status | 이 네임스페이스에 CSD 활성 여부 |
scripts[] | scripts | 감지된 스크립트 객체의 배열 |
.script_name | scripts | JavaScript 파일의 전체 URL |
.risk_level | scripts | 위험 수준 (No Risk, Low Risk, High Risk) |
.status | scripts | AN (조치 필요) 또는 NA (조치 불필요) |
.form_fields_read | scripts | 스크립트가 읽는 양식 필드 수 |
.affected_users_count | scripts | 영향받은 고유 사용자/세션 수 |
domain_summary | detected_domains | 상태별 수: .actionNeededCount.count, .mitigatedDomains.count, .allowedDomains.count, .totalDomains.count (각각 .count 및 .lastUpdated 포함) |
domains_list[] | detected_domains | .domain, .status, .category, .firstSeenDate, .latestSeenDate (에포크 초, 문자열)가 있는 감지된 도메인 객체의 배열 |
form_fields[] | formFields | 감지된 양식 필드 객체의 배열 |
.analysis | formFields | 감도 분류 (Sensitive, Not Sensitive) |
문제 해결
섹션 제목: “문제 해결”액세스 로그 없음
섹션 제목: “액세스 로그 없음”TV-1이 0을 반환하는 경우:
-
DNS 확인 확인 — 도메인이 LB VIP로 확인되는지 검증:
Terminal window dig +short xF5XC_DOMAINNAMEx A비어 있으면 DNS가 구성되지 않은 것입니다. API 자동화 — 4단계를 참조하십시오.
-
LB 상태 확인 — 로드 밸런서가
VIRTUAL_HOST_READY여야 합니다:Terminal window curl -s \-H "Authorization: APIToken xF5XC_API_TOKENx" \"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \| jq '.spec.state' -
테스트 요청 전송 — 엔드투엔드 연결을 확인하기 위해 트래픽 생성:
Terminal window curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 | head -20성공적인 HTTP 응답을 확인하십시오. HTTPS LB 인증서가 유효한 경우에만
https://를 사용하십시오.
DNS 영역에서 관리 레코드가 비활성화됨
섹션 제목: “DNS 영역에서 관리 레코드가 비활성화됨”DNS-4가 false를 반환하면, F5 XC가 권한 있는 DNS 공급자임에도 불구하고 자동 레코드 생성이 비활성화됩니다. 이는 A 레코드와 ACME CNAME이 모두 누락되게 하는 일반적인 잘못된 구성으로, 로드 밸런서가 VIRTUAL_HOST_READY에 도달하고 인증서가 발급되는 것을 차단합니다.
관리 레코드를 활성화하려면 DNS 영역 구성을 업데이트하여 allow_http_lb_managed_records: true로 설정하십시오. API 호출은 API 자동화 — 옵션 A: F5 XC 관리 DNS를 참조하십시오.
VIRTUAL_HOST_PENDING_A_RECORD에 멈춘 LB
섹션 제목: “VIRTUAL_HOST_PENDING_A_RECORD에 멈춘 LB”로드 밸런서가 VIP를 가리키는 DNS A 레코드를 기다리고 있습니다. 자세한 해결 단계는 VIRTUAL_HOST_PENDING_A_RECORD에 멈춘 LB를 참조하십시오.
PreDomainChallengePending에 멈춘 인증서
섹션 제목: “PreDomainChallengePending에 멈춘 인증서”자동 TLS 인증서에는 ACME 챌린지 레코드가 필요합니다. 방법은 DNS 공급자에 따라 다릅니다:
F5 XC 관리 DNS: DNS 영역에서 allow_http_lb_managed_records를 활성화하십시오 (DNS-4). 플랫폼이 x-ves-io-managed RR 세트 그룹에 TXT 기반 ACME 챌린지 레코드를 자동 생성합니다. 관리 레코드를 활성화한 후에도 인증서가 멈춰 있으면, 새로운 인증서 요청을 트리거하기 위해 로드 밸런서를 삭제하고 다시 생성하십시오.
외부 DNS: DNS 공급자에서 CNAME 레코드를 생성하십시오:
_acme-challenge.xF5XC_DOMAINNAMEx CNAME *.autocerts.ves.volterra.io레코드가 존재하는지 확인하십시오:
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEdig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT둘 다 비어 있으면 ACME 레코드가 구성되지 않은 것입니다. 인증서 프로비저닝은 레코드가 준비된 후 5–10분이 소요됩니다. 특정 ACME 검증 오류에 대한 LB 오류 상태를 확인하십시오:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '[.status[]? | select(.virtual_host_status != null) | .virtual_host_status.error_description]'CSD isConfigured가 false
섹션 제목: “CSD isConfigured가 false”CSD는 F5 XC 관리자가 테넌트 수준에서 활성화해야 합니다. 이것은 네임스페이스 API를 통해 구성할 수 없는 테넌트 전체 설정입니다. 클라이언트 측 방어를 활성화하려면 관리자에게 문의하십시오.
빈 스크립트 배열
섹션 제목: “빈 스크립트 배열”TEL-1이 빈 배열을 반환하는 경우:
-
보호된 도메인 확인 — CSD는 등록된 도메인의 스크립트만 모니터링합니다:
Terminal window curl -s \-H "Authorization: APIToken xF5XC_API_TOKENx" \"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \| jq '.items[] | {name, namespace}' -
JS 주입 확인 — CSD 스크립트 태그가 페이지에 주입되고 있는지 확인:
Terminal window curl -s "http://xF5XC_DOMAINNAMEx/" | grep -oE '(zeronaught|shape)\.com[^"]*' | head -1일치하지 않으면 CSD JavaScript가 주입되지 않는 것입니다. LB에
client_side_defense가 활성화되어 있는지 확인하십시오. -
처리 시간 허용 — CSD를 처음 활성화하거나 새 보호 도메인을 등록한 후, 스크립트 감지에 5–15분이 걸릴 수 있습니다. 사이트에 트래픽을 생성하고 다시 확인하기 전에 기다리십시오.
빠른 참조
섹션 제목: “빠른 참조”시간 범위 프리셋
섹션 제목: “시간 범위 프리셋”| 기간 | 에포크 오프셋 | ISO 8601 (Linux) | ISO 8601 (macOS) |
|---|---|---|---|
| 1시간 | $(( $(date +%s) - 3600 )) | date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ | date -u -v-1H +%Y-%m-%dT%H:%M:%SZ |
| 24시간 | $(( $(date +%s) - 86400 )) | date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ | date -u -v-24H +%Y-%m-%dT%H:%M:%SZ |
| 7일 | $(( $(date +%s) - 604800 )) | date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ | date -u -v-7d +%Y-%m-%dT%H:%M:%SZ |
| 30일 | $(( $(date +%s) - 2592000 )) | date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ | date -u -v-30d +%Y-%m-%dT%H:%M:%SZ |
검증 계층 요약
섹션 제목: “검증 계층 요약”| 계층 | 테스트 | 포함 범위 |
|---|---|---|
| 1. DNS 확인 | DNS-1 ~ DNS-4 | A 레코드, ACME CNAME, 네임서버 권한, 관리 레코드 |
| 2. TLS 인증서 | TLS-1 ~ TLS-4 | 인증서 상태, 인증서 세부 정보, 라이브 핸드셰이크, ACME 대상 |
| 3. HTTP 로드 밸런서 | LB-1 ~ LB-6 | 상태, 도메인, CSD 플래그, 라우트 풀, 배포, 요약 |
| 4. 오리진 풀 | OP-1 ~ OP-4 | 구성, TLS 모드, HC 연결, 오리진 연결 |
| 5. 헬스 체크 | HC-1 ~ HC-2 | HC 구성, 모든 HC 나열 |
| 6. CSD 구성 | CSD-1 ~ CSD-5 | 테넌트 상태, JS 태그, 보호 도메인, 라이브 주입 |
| 7. 트래픽 검증 | TV-1 ~ TV-5 | 요청 수, 상태 코드, 샘플, 로그의 JS, E2E 테스트 |
| 8. CSD 텔레메트리 | TEL-1 ~ TEL-8 | 스크립트, 도메인, 정책, 양식 필드, 심층 분석, 사용자, 위험, 최신성 |
엔드포인트 요약
섹션 제목: “엔드포인트 요약”| 진단 | 엔드포인트 | 메서드 | 시간 형식 |
|---|---|---|---|
| 요청 수 | /api/data/namespaces/\{ns\}/access_logs/aggregation | POST | ISO 8601 |
| 상태 코드 | /api/data/namespaces/\{ns\}/access_logs | POST | ISO 8601 |
| 최근 요청 | /api/data/namespaces/\{ns\}/access_logs | POST | ISO 8601 |
| LB 상태 | /api/config/namespaces/\{ns\}/http_loadbalancers/\{name\} | GET | 없음 |
| 오리진 풀 | /api/config/namespaces/\{ns\}/origin_pools/\{name\} | GET | 없음 |
| 헬스 체크 | /api/config/namespaces/\{ns\}/healthchecks/\{name\} | GET | 없음 |
| DNS 영역 | /api/config/dns/namespaces/system/dns_zones/\{zone\} | GET | 없음 |
| CSD 상태 | /api/shape/csd/namespaces/\{ns\}/status | GET | 없음 |
| JS 구성 | /api/shape/csd/namespaces/\{ns\}/js_configuration | GET | 없음 |
| 보호 도메인 | /api/shape/csd/namespaces/\{ns\}/protected_domains | GET | 없음 |
| 스크립트 목록 | /api/shape/csd/namespaces/\{ns\}/scripts | POST | 에포크 초 |
| 감지된 도메인 | /api/shape/csd/namespaces/\{ns\}/detected_domains | GET | 없음 |
| 양식 필드 | /api/shape/csd/namespaces/\{ns\}/formFields | GET | 에포크 초 (쿼리 파라미터) |
| 스크립트 세부 정보 | /api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/dashboard | GET | 없음 |
| 스크립트 동작 | /api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/behaviors | GET | 없음 |
| 스크립트 네트워크 | /api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/networkInteractions | GET | 없음 |
| 영향받은 사용자 | /api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/affectedUsers | POST | 에포크 초 |