오늘, API용 Cloudflare Sequence Analytics를 발표합니다. API Gateway 구독 고객은 Sequence Analytics를 사용하여 엔드포인트로 들어오는 요청 중에서 가장 중요한 API 요청 시퀀스를 확인할 수 있습니다. 고객은 이 새로운 기능을 통해 가장 중요한 엔드포인트에 보호 조치를 우선적으로 적용할 수 있습니다.
시퀀스란? 시퀀스는 간단히 말해 특정 방문자가 웹 사이트를 브라우징하거나 모바일 앱을 사용하거나 API를 통해 B2B 파트너와 상호 작용할 때 수행한 HTTP API 요청을 시간 순으로 나열한 목록입니다. 예를 들어, 은행 자금 이체 중에 생성된 시퀀스의 일부는 다음과 같을 수 있습니다.
.tg {border-collapse:collapse;border-color:#ccc;border-spacing:0;} .tg td{background-color:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;word-break:normal;} .tg th{background-color:#f0f0f0;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;} .tg .tg-1wig{font-weight:bold;text-align:left;vertical-align:top} .tg .tg-0lax{text-align:left;vertical-align:top}
Order | Method | Path | Description |
---|---|---|---|
1 | GET | /api/v1/users/{user_id}/accounts | user_id is the active user |
2 | GET | /api/v1/accounts/{account_id}/balance | account_id is one of the user’s accounts |
3 | GET | /api/v1/accounts/{account_id}/balance | account_id is a different account belonging to the user |
4 | POST | /api/v1/transferFunds | Containing a request body detailing an account to transfer funds from, an account to transfer funds to, and an amount of money to transfer |
순서
방법
경로
설명
1
GET
Order | Method | Path | Description |
---|---|---|---|
1 | GET | /api/v1/users/{user_id}/accounts | user_id is the active user |
2 | GET | /api/v1/accounts/{account_id}/balance | account_id is one of the user’s accounts |
3 | GET | /api/v1/accounts/{account_id}/balance | account_id is a different account belonging to the user |
4 | POST | /api/v1/transferFunds | Containing a request body detailing an account to transfer funds from, an account to transfer funds to, and an amount of money to transfer |
… attacker copies the request to a debugging tool like Postman … | |||
5 | POST | /api/v1/transferFunds | Attacker has modified the POST body to try and trick the API |
6 | POST | /api/v1/transferFunds | A further modified POST body to try and trick the API |
7 | POST | /api/v1/transferFunds | Another, further modified POST body to try and trick the API |
/api/v1/users/{user_id}/accounts
user_id는 활성 사용자입니다
2
GET
/api/v1/accounts/{account_id}/balance
account_id는 사용자의 계정 중 하나입니다
3
GET
/api/v1/accounts/{account_id}/balance
account_id는 사용자에게 속한 다른 계정입니다
4
POST
/api/v1/transferFunds
송금 계좌, 수취 계좌, 이체 금액을 나타내는 요청 본문을 포함합니다
API 보안을 위해 시퀀스에 관심을 가져야 하는 중요한 이유는 무엇일까요? 위의 API가 이전 요청 없이 POST /api/v1/transferFunds 요청을 받은 경우 의심스러울 수 있습니다. 다음을 생각해보세요. API 클라이언트가 관련 계정 ID를 사용자에게 나열하지 않고 알 수 있는 방법은 무엇일까요? API 클라이언트는 얼마의 금액을 송금할 수 있는지 어떻게 알 수 있을까요? 이 예시는 명백하다고 보일 수 있지만, 주어진 프로덕션 API에 호출한 API 요청의 수가 많으면 인간 분석가는 사용이 의심되는 부분을 발견하기 어려울 수 있습니다.
보안에서, 팀이 선별할 수 없는 수 많은 위협을 방어하기 위한 한 가지 접근 방식은 _능동적 보안 모델_을 만드는 것입니다. 잠재적으로 위협이 될 수 있는 모든 행위를 차단하는 대신, 알려진 트래픽이나 무해한 트래픽을 모두 허용하고 그 외의 트래픽은 모두 차단합니다.
고객은 다음 두 가지 주요 영역에서 API Gateway를 사용하여 능동적 보안 모델을 만들 수 있습니다. 바로 볼류메트릭 남용 보호와 스키마 유효성 검사입니다. 시퀀스는 API 트래픽을 위한 능동적 보안 모델의 세 번째 기둥을 형성합니다. API Gateway는 모든 특정 API 시퀀스에서 엔드포인트의 우선순위를 적용할 수 있습니다. API Gateway는 API 시퀀스 내에서 우선순위를 설정하여 예상된 행위와 일치하지 않는 트래픽을 모두 기록하거나 차단하여 악의적인 트래픽을 줄입니다.
시퀀스별 남용 감지
공격자가 악의적인 방법으로 데이터를 유출하려 할 경우, 예상된 API 트래픽 패턴을 따르는 경우는 거의 없습니다. 공격자는 종종 특별한 소프트웨어를 사용하여 API를 ‘퍼징’하고 다양한 요청 매개변수로 여러 요청을 전송하여 데이터를 유출할 수 있는 기회를 나타내는 API의 예기치 못한 응답을 찾으려고 합니다. 공격자는 취약한 개체 수준 인증 공격을 통해 공격자에게 상승된 권한이나 데이터 액세스 권한을 부여하는 등 권한이 없는 작업을 수행하도록 API를 속이는 요청을 수동으로 보낼 수도 있습니다. 속도를 제한하여 API를 보호하는 것이 일반적인 모범 사례이지만, 위의 두 가지 예에서 공격자는 볼류메트릭 남용 감지를 저지하려고 의도적으로 요청 시퀀스를 느리게 실행할 수 있습니다.
위의 요청 시퀀스를 다시 생각해 보고, 이번에는 공격자가 합법적인 자금 이체 요청을 복사하고 시스템을 속이려고 요청 페이로드를 수정한다고 상상해 보세요.
.tg {border-collapse:collapse;border-color:#ccc;border-spacing:0;} .tg td{background-color:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;word-break:normal;} .tg th{background-color:#f0f0f0;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;} .tg .tg-1wig{font-weight:bold;text-align:left;vertical-align:top} .tg .tg-0lax{text-align:left;vertical-align:top} .tg .tg-5frq{font-style:italic;text-align:center;vertical-align:top} .tg .tg-8zwo{font-style:italic;text-align:left;vertical-align:top}
순서
방법
경로
설명
1
GET
/api/v1/users/{user_id}/accounts
user_id는 활성 사용자입니다
2
GET
/api/v1/accounts/{account_id}/balance
account_id는 사용자의 계정 중 하나입니다
3
GET
/api/v1/accounts/{account_id}/balance
account_id는 사용자에게 속한 다른 계정입니다
4
POST
/api/v1/transferFunds
송금 계좌, 수취 계좌, 이체 금액을 나타내는 요청 본문을 포함합니다
… 공격자는 Postman과 같은 디버깅 도구에 요청을 복사합니다 …
5
POST
/api/v1/transferFunds
공격자는 API를 속이려고 POST 본문을 수정했습니다
6
POST
/api/v1/transferFunds
API를 속이려고 추가로 수정한 POST 본문
7
POST
/api/v1/transferFunds
API를 속이려고 추가로 수정한또 다른 POST 본문
고객이 자금 이체 엔드포인트 보호가 중요하고 시퀀스 중에 한 번만 발생한다는 사실을 미리 알고 있다면, 연속으로 두 번 호출되지 않고 GET /balance가 항상 POST /transferFunds보다 앞에 오도록 하는 규칙을 작성할 수 있습니다. 하지만 어떤 엔드포인트 시퀀스를 보호하는 게 중요한지 사전에 알 수 없다면 고객은 어떤 규칙을 정의해야 하는지 어떻게 알 수 있을까요? API 사용자가 짧은 시간 내에 합법적으로 여러 건의 자금 이체 요청을 수행할 수도 있으므로 속도 제한이 낮으면 너무 위험합니다. 현실에서는 이러한 유형의 남용을 방지할 수 있는 도구가 없으며 고객 대부분은 남용이 발생한 후 애플리케이션 팀 및 사기 부서와 함께 남용을 해결하는 사후 대응에 의존합니다.
궁극적으로 고객에게 API 요청 시퀀스에 대해 능동적 보안 모델을 정의할 수 있는 기능을 제공하려면 세 가지 측면의 접근 방식이 필요하다고 우리는 믿습니다.
Sequence Analytics: 어떤 API 요청의 시퀀스가 언제 발생했는지 파악하고 데이터를 쉽게 이해할 수 있는 형태로 요약합니다.
시퀀스 남용 감지: API 요청의 어떤 시퀀스가 무해한 원본이거나 악의적인 원본일 가능성이 있는지 파악합니다.
시퀀스 완화: 허용하거나 차단할 트래픽을 결정하기 위해 API 요청 시퀀스에 대한 관련 규칙을 확인합니다.
시퀀스 생성 시 문제점
Sequence Analytics에는 어려운 기술적 문제가 몇 가지 있습니다. 세션은 수명이 길 수도 있고 많은 요청으로 구성될 수 있기 때문에 세션 식별자만으로는 시퀀스를 정의하는 것으로는 충분하지 않습니다. 그래서 특정 세션 내에서 발생하는 여러 시퀀스를 자동으로 확인할 수 있는 솔루션 개발이 필요했습니다. 또한 반드시 용량만으로는 중요한 시퀀스를 분류할 수 없고, 가능한 시퀀스 세트가 많으므로, 빈번한 시퀀스를 단순하게 표면화하는 것이 아니라 중요한 시퀀스를 확인할 수 있는 솔루션을 개발해야 했습니다.
api.cloudflare.com의 예시에서 이러한 문제를 설명하는 데 도움이 되도록 API 요청을 세션별로 그룹화하고 고유한 시퀀스 수와 시퀀스 길이를 그래프로 그릴 수 있습니다.
이 그래프는 301개의 개별 API 엔드포인트와 함께 약 88,000개의 세션과 2억 6천만 개의 API 요청으로 구성된 1시간의 스냅샷을 기반으로 합니다. 각 세션에 고정 길이 슬라이딩 윈도우를 적용하여 데이터를 처리한 다음, 슬라이딩 윈도우를 적용한 결과로 관찰되는 다양한 고정 길이 시퀀스(‘n-그램’)의 총 개수를 계산합니다. 그래프에는 요청이 1개~10개 사이에서 변할 때 윈도우 크기(‘n-그램 길이’)의 결과가 표시됩니다. 고유한 시퀀스 개수의 범위는 301개(요청이 1개인 윈도우 크기의 경우)에서 약 780,000개(요청이 10개인 윈도우 크기의 경우) 사이입니다. 그래프를 보면 시퀀스 길이에 따라 증가하는 가능한 시퀀스를 많이 관찰할 수 있습니다. 슬라이딩 윈도우 크기를 늘리면 샘플에서 점점 더 많은 양의 시퀀스를 다양하게 확인할 수 있습니다. 동향이 부드러운 이유는 시퀀스 길이에 비해 상대적으로 많은 긴 세션과 함께 슬라이딩 윈도우(세션 자체에 많은 시퀀스가 포함될 수 있음)가 적용되었다는 사실로 설명할 수 있습니다.
가능한 시퀀스 수가 많으므로 남용 시퀀스를 찾는 것은 ‘건초 더미에서 바늘 찾기’와 같은 상황입니다.
Sequence Analytics 소개
다음은 Sequence Analytics를 강조 표시한 API Gateway 대시보드의 스크린샷입니다.
스크린샷에서 볼 수 있는 새로운 기능을 세부적으로 살펴보겠습니다.
API Gateway는 이 문서의 앞 부분에서 설명한 방법을 사용하여 API 소비자가 수행한 요청의 시퀀스를 지능적으로 결정합니다. API Gateway는 상관 관계 점수라는 지표로 시퀀스의 점수를 매깁니다. Sequence Analytics는 상관 관계 점수가 가장 높은 순으로 상위 20개의 시퀀스를 표시하고 이것을 가장 중요한 시퀀스라고 부릅니다. 중요도가 높은 시퀀스에는 순서대로 발생할 가능성이 높은 API 요청이 포함되어 있습니다.
각 시퀀스를 검사하여 상관 관계 점수를 파악해야 합니다. 상관 관계 점수가 높은 시퀀스는 드물게 사용되는 엔드포인트(잠재적으로 사용자 행동이 비정상적임)와 널리 사용되는 엔드포인트(무해한 사용자 행동일 가능성이 있음)로 구성될 수 있습니다. 이 시퀀스에서 발견되는 엔드포인트는 일반적으로 함께 발생하므로 API의 실제 사용 패턴을 나타냅니다. 이러한 엔드포인트(레이트 리미팅 제안 사항, 스키마 유효성 검사, JWT 유효성 검사, mTLS)에 가능한 모든 API Gateway 보호 기능을 적용하고 개발팀과 함께 특정 엔드포인트 순서를 확인해야 합니다.
Cloudflare에서는 고객이 현재 API Gateway에서 제공하는 능동적 보호 기능을 넘어 API에 허용 가능한 동작을 명시적으로 설정하기를 원한다는 것을 알고 있습니다. 곧 시퀀스 우선순위 규칙을 출시하고 이러한 규칙에 따라 요청을 차단하는 기능을 제공할 예정입니다. 고객은 새로운 시퀀스 우선순위 규칙을 사용하여 허용 가능한 API 요청의 순서를 정확하게 지정할 수 있으므로 알려지지 않은 위협으로부터 API를 보호하는 능동적 보안 모델을 또 다른 방식으로 구축할 수 있습니다.
시작 방법
이제 모든 API Gateway 고객은 Sequence Analytics에 액세스할 수 있습니다. Cloudflare 대시보드에서 영역으로 이동한 다음, 보안 탭 > API Gateway 탭 > Sequences 탭을 클릭합니다. API 소비자가 요청하는 가장 중요한 시퀀스를 확인할 수 있습니다.
API Gateway를 구매하지 않은 Enterprise 고객은 Cloudflare 대시보드에서 API Gateway 평가판을 활성화하거나 계정 관리자에게 문의하여 시작할 수 있습니다.
다음 단계
시퀀스 기반 감지는 공격을 식별하고 차단할 수 있는 많은 새로운 기회를 열어주는 강력하고 고유한 기능입니다. Cloudflare에서는 이러한 시퀀스를 식별하여 전역 네트워크로 보내는 방법을 세밀하게 조정하고 있으므로 향후 맞춤형 시퀀스 매칭과 실시간 완화 기능을 출시할 예정입니다. 또한 정책과 일치하지 않는 시퀀스를 요청한 API 사용자가 누군지에 대한 실행 가능한 인텔리전스를 팀에 전달할 수 있도록 지원할 예정입니다.