WAF 및 보안
WAF 관리형 규칙 세트, 사용자 지정 방화벽 규칙, 요청 속도 제한, 공격 대응 모드와 핫링크 방지, 국가 및 User-Agent 목록 등의 액세스 제어를 구성합니다.
각 CDN 도메인에는 에지가 해당 도메인에 적용하는 보안 정책을 관리하는 방화벽 페이지가 있습니다. CDN → CDN 도메인으로 이동하여 도메인을 연 다음 방화벽을 선택합니다. 콘솔 URL은 /cdn/domains/<domain>/firewall입니다.
방화벽 페이지에는 네 개의 탭이 있습니다.
| 탭 | 용도 |
|---|---|
| 규칙 설정 | 사용자 지정 방화벽 규칙, WAF 관리형 규칙 세트, 사용자 지정 WAF 점수 규칙 |
| 접근 제어 | 핫링크 방지, 국가/ASN 차단, User-Agent 목록, 액세스 인증, 공격 대응 모드(UAM), 연결 보호 |
| WAF 분석 | 차단 및 기타 이벤트 통계(로그 및 분석 참조) |
| 이벤트 로그 | 차단되거나 챌린지가 적용된 요청별 항목 |
저장하면 구성이 에지에 자동으로 전송됩니다. 변경 사항은 보통 수초에서 1분 내에 적용되며 캐시를 삭제할 필요가 없습니다.
WAF 관리형 규칙 세트
WAF(웹 애플리케이션 방화벽)는 각 요청의 URI, 쿼리 문자열, User-Agent, Referer, 쿠키를 검사합니다. 폼 및 JSON 요청 본문도 검사하여 일반적인 공격 페이로드를 탐지합니다.
방화벽 → 규칙 설정을 열고 WAF 사전 정의 규칙 집합 카드를 찾습니다.
카드 헤더의 전체 활성화 스위치를 켭니다.
범주를 펼친 다음 개별 규칙 세트를 켜거나 끕니다.
규칙 세트 탐지 대상 SQL 인젝션 SQL 인젝션 페이로드 XSS 크로스 사이트 스크립팅 페이로드 경로 탐색 ../형식의 디렉터리 탐색명령 인젝션 OS 명령 인젝션 LFI/RFI 로컬 및 원격 파일 포함 프로토콜 공격 잘못된 형식이거나 비정상적인 HTTP 요청 스캐너 탐지 일반적인 취약점 스캐너 악성 로봇 알려진 악성 크롤러 CRS 엔진 설정에서 검사 모드를 선택합니다.
- 차단: 일치하는 요청을
403으로 차단하고 이벤트를 기록합니다. - 기록만: 이벤트를 기록하되 차단하지 않습니다. 새 규칙을 실제로 적용하기 전에 오탐 여부를 확인할 때 사용합니다.
- 차단: 일치하는 요청을
저장을 클릭합니다.
이상 점수 임계값은 점수 규칙에 적용됩니다. 일치하는 규칙마다 요청 점수에 해당 점수가 더해지며, 점수가 임계값에 도달하면 요청이 차단됩니다. 기본값은 5입니다. 값이 낮을수록 더 엄격하게 적용됩니다.
WAF는 요금제에 따라 제공되는 기능입니다. 작성 시점 기준으로 Professional 및 Enterprise CDN 요금제에는 포함되며 Free 및 Starter 요금제에는 포함되지 않습니다. 최신 정보는 요금제 페이지에서 확인합니다. 요금제에 WAF가 포함되어 있지 않으면 스위치를 켜도 에지에서 적용되지 않습니다.
WAF를 처음 활성화할 때는 한동안 시뮬레이션 모드로 실행합니다. 이벤트 로그에서 정상 요청이 차단 대상으로 분류되는지 확인한 다음 활성 모드로 전환합니다.
사용자 지정 WAF 점수 규칙
관리형 규칙 세트로 요구 사항을 충족할 수 없으면 사용자 지정 WAF 규칙, 점수 카드에서 규칙을 추가합니다.
- 검사 위치: URI(쿼리 문자열 포함), 경로, 쿼리 매개변수, 요청 본문, 요청 헤더, 쿠키, User-Agent 또는 메서드입니다. 헤더와 쿠키는 이름을 지정할 수 있습니다.
- 일치 유형: 정규 표현식, SQL 인젝션(libinjection) 또는 XSS(libinjection)입니다.
- 동작:
- 차단: 즉시 차단합니다. 상태 코드를 설정할 수 있으며 기본값은
403입니다. - 기록(점수): 요청에 규칙의 점수를 더합니다. 총점이 이상 점수 임계값에 도달하면 요청이 차단됩니다.
- 차단: 즉시 차단합니다. 상태 코드를 설정할 수 있으며 기본값은
사용자 지정 방화벽 규칙
사용자 지정 방화벽 규칙은 조건과 동작을 연결합니다. 주로 IP 주소 차단, 특정 국가의 트래픽만 허용, 로그인 엔드포인트 보호 등에 사용합니다.
규칙 생성
- 규칙에서 규칙 추가를 클릭합니다.
- 이름을 입력합니다. 우선순위는 1부터 9999까지 설정할 수 있으며 기본값은 100입니다.
- 하나 이상의 조건을 추가합니다. 각 조건은 필드, 선택적 키, 연산자, 값으로 구성됩니다. 요청이 모든 조건을 충족해야 규칙과 일치합니다.
- 동작을 선택하고 설정을 입력합니다.
- 저장합니다. 목록에서 언제든지 규칙을 활성화, 비활성화 또는 삭제할 수 있습니다.
필드
| 필드 | 설명 |
|---|---|
| IP 주소 | 클라이언트 IP입니다. "목록에 포함"에서는 각 값에 단일 IP 또는 CIDR 범위를 지정할 수 있습니다 |
| 국가 코드 | US 또는 DE와 같은 ISO 3166-1 alpha-2 코드입니다 |
| ASN | 13335와 같은 자율 시스템 번호입니다 |
| URI 경로 / 경로 | 쿼리 문자열을 제외한 요청 경로입니다 |
| Host | 요청한 호스트 이름입니다 |
| 메서드 | GET, POST 등입니다 |
| User-Agent / Referer | 해당 요청 헤더입니다 |
| 헤더 / 쿠키 / 쿼리 매개변수 | 키 필드에 이름을 입력합니다 |
| 확장자 | jpg와 같은 파일 확장자입니다 |
사용 가능한 연산자는 같음, 같지 않음, 포함, 포함하지 않음, 다음으로 시작, 다음으로 끝남, 목록에 포함, 목록에 포함되지 않음, 정규 표현식 일치, 초과/미만(또는 이상/이하), 존재함, 존재하지 않음입니다. 목록 연산자는 값을 한 줄에 하나씩 입력합니다.
국가와 ASN은 클라이언트 IP 주소를 기준으로 결정됩니다. IP에 해당하는 정보를 찾을 수 없으면 이 필드의 조건은 일치하지 않습니다.
동작
| 동작 | 효과 |
|---|---|
| 차단 | 오류 응답을 반환합니다. 상태 코드를 400부터 599까지 설정할 수 있으며 기본값은 403입니다 |
| 허용 | WAF와 나머지 규칙을 건너뜁니다. 신뢰할 수 있는 IP 또는 콜백 엔드포인트에 사용합니다 |
| JS 챌린지 / 관리형 챌린지 | 공격 대응 모드와 같은 메커니즘을 사용하는 브라우저 검증 페이지를 방문자에게 표시합니다. 통과한 방문자는 통과 자격의 유효 기간이 끝날 때까지 다시 챌린지를 받지 않습니다 |
| 요청 빈도 제한 | 일치하는 요청 수를 집계하고 한도를 초과하면 지정된 동작을 수행합니다(아래 참조) |
하나의 요청이 여러 규칙과 일치할 수 있습니다. 같은 범위를 허용하면서 차단하는 것처럼 동작이 충돌하는 중복 규칙을 활성화하지 마십시오. 예상과 다른 결과가 발생할 수 있습니다.
API 예시
서브넷 차단:
curl -X POST "https://api.yeap.cloud/api/user/cdn/firewall-rules/create" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"domain_id": 123,
"name": "Block bad subnet",
"expression": {"op": "and", "conditions": [
{"collection": "IP", "op": "in", "var": ["203.0.113.0/24"]}
]},
"action": "block",
"action_config": {"status": 403},
"priority": 100,
"enabled": true
}'기타 엔드포인트:
- 규칙 목록 조회:
GET /api/user/cdn/firewall-rules?domain_id=123 - 규칙 업데이트:
POST /api/user/cdn/firewall-rules/update, 본문에id포함 - 규칙 삭제:
DELETE /api/user/cdn/firewall-rules/delete?id=<id>
요청 속도 제한
트래픽의 요청 속도를 제한하려면 요청 속도 제한 동작을 사용하는 방화벽 규칙을 생성합니다. 조건을 사용하여 /api/login으로 시작하는 경로처럼 보호할 요청을 선택합니다. 그런 다음 다음 항목을 설정합니다.
- 요청 한도 및 집계 기간(seconds): 집계 기간 내 요청 수가 한도를 넘으면 한도 초과로 판단합니다.
- 키: IP 주소, 요청 헤더, 쿠키, URI 경로 또는 국가입니다. 헤더와 쿠키는
X-Api-Key와 같은 이름도 입력합니다. - 범위: 전체 도메인은 IP별 카운터처럼 키 값마다 별도의 카운터를 유지합니다. 전역은 규칙과 일치하는 모든 요청에 하나의 카운터를 사용합니다.
- 한도 초과 시:
429로 차단, 챌린지, 기록만 수행 또는 tarpit을 적용합니다. tarpit은 요청을 거부하지 않고 응답을 지연시킵니다.
각 에지 위치는 자체 카운터를 유지합니다. 클라이언트의 요청이 여러 위치로 분산되면 네트워크 전체에서 허용되는 총요청 수가 위치별 한도보다 많아질 수 있습니다.
액세스 제어
접근 제어 탭에는 여러 전용 모듈이 있습니다. 모듈마다 개별 스위치가 있습니다. 설정을 마치면 접근 제어 저장을 클릭하여 모두 저장합니다.
핫링크 방지(Referer 목록)
- 빈 Referer 허용 및 동일 도메인 허용: 직접 방문과 자체 사이트의 링크를 통한 접근을 허용합니다.
- 허용 도메인: 한 줄에 하나씩 입력합니다. 정확한 이름,
*.example.com과 같은 와일드카드 또는~로 시작하는 정규 표현식을 사용할 수 있습니다. 목록이 비어 있지 않으면 Referer가 목록의 항목 중 하나와 일치해야 합니다. - 차단 도메인: 일치하는 요청을 차단합니다. 이 목록은 허용 목록보다 우선합니다.
- 보호할 확장자:
.jpg또는.mp4와 같은 특정 파일 형식에만 보호를 적용합니다. 비워 두면 모든 경로를 보호합니다.
국가 / ASN 차단
국가, 하위 행정 구역(ISO 3166-2 코드), ASN별로 차단 및 허용 목록을 설정하며, 한 줄에 하나씩 입력합니다. 차단 목록과 일치하면 차단됩니다. 특정 분류의 허용 목록이 비어 있지 않으면 해당 목록에 있는 방문자만 허용됩니다. 여러 분류를 사용하면 방문자가 모든 분류의 조건을 통과해야 합니다.
User-Agent 목록
기본 동작, 빈 User-Agent 처리 방식, 차단 상태 코드를 설정한 다음 규칙을 추가합니다. 기본 동작을 허용으로 선택하면 차단 목록으로, 차단으로 선택하면 허용 목록으로 작동합니다. 규칙은 위에서 아래로 검사하며 처음 일치한 규칙에 따라 결과가 결정됩니다. 부분 문자열, 와일드카드, 정규 표현식, 정확한 값, 접두사 또는 접미사로 일치 여부를 판단할 수 있습니다.
액세스 인증
CIDR 범위를 지원하는 IP 허용 및 거부 목록을 설정할 수 있습니다. HTTP Basic 인증, 토큰 매개변수 또는 서명된 URL(A, B, C, D 유형)을 요구할 수도 있습니다. 여러 방식을 구성하면 요청이 모든 방식을 통과해야 하는지, 하나만 통과해도 되는지 선택합니다.
공격 대응 모드(UAM)
| 모드 | 동작 |
|---|---|
| 끄기 | 선제적 챌린지를 적용하지 않습니다 |
| 적응형 | 평소에는 챌린지를 적용하지 않습니다. 플랫폼의 자동 보호 기능이 비정상 트래픽을 탐지할 때만 방문자에게 챌린지를 적용합니다 |
| 공격 대응(5-second 보호) | 모든 방문자는 먼저 브라우저 검증(작업 증명)을 통과해야 합니다 |
| CAPTCHA 강제 적용 | 모든 방문자는 CAPTCHA를 풀어야 합니다. captcha.la를 지원하며 Site Key와 Secret을 입력해야 합니다. 입력하지 않으면 대신 브라우저 검증이 적용됩니다 |
최소 대기 시간(seconds)(5 이상 권장), 난이도(15 이상 권장), **통과 자격 유효 기간(seconds)**을 조정할 수 있습니다. 0을 입력하면 기본값을 사용합니다. 허용 목록의 IP/CIDR은 모든 모드에서 챌린지를 건너뜁니다. 정적 파일 확장자와 허용 봇 ASN은 적응형 모드에만 적용되며, 공격 대응 및 CAPTCHA 강제 적용 모드에서는 무시됩니다.
플러드 공격 중에는 공격 대응 모드로 전환합니다. 공격이 끝나면 API 클라이언트와 검색 엔진 크롤러에 영향을 주지 않도록 끄기 또는 적응형 모드로 되돌립니다.
연결 보호(Slowloris)
IP별 동시 연결 수를 제한하고 저속 요청 공격을 탐지합니다. 최소 본문 전송 속도, 샘플링 기간, 유예 기간, 최대 유휴 시간, 본문 수신 최대 시간을 설정할 수 있습니다. 0을 입력하면 제한하지 않습니다.