2014-02-19 3 views
5

내가 만들고있는 RESTful API에 대한 캐시/스로틀/etc 응답에 Varnish를 사용하는 데 관심이 있습니다. 나는 "HMAC"라는 용어를 너무 느슨하게 사용할 수도 있지만, 내 API에 대한 각 요청에는 요청의 일부 (타임 스탬프 포함)를 해싱하여 클라이언트가 계산 한 해시를 포함하는 헤더를 포함해야한다는 것을 의미합니다. 공유 비밀. 그런 다음 서버는 요청과 동일한 구성 요소를 사용하여 동일한 해시를 계산하고 요청이 유효하고 응답해야하는지 여부를 결정합니다.Varnish를 사용하여 RESTful API를 캐시하는 방법은 있지만 각 요청을 서명/확인하는 데 여전히 HMAC를 사용하고 있습니까?

잘 작동하지만 지금은 바니시를 사용하여 API 응답을 캐시하고 싶습니다. HMAC의 본질은 각 요청이 사용자가 누구인지 확인하기 위해 해시를 계산해야하지만 반환되는 실제 응답은 동일하므로 API 호출의 고기가 대단히 캐시 가능해야합니다.

무엇을하고 싶습니까? (그리고 나는 이것을 달성 할 수 있다고 가정하고 있습니다.) 어떻게 해야할지 모르겠지만, 인증 작업을 백엔드에 전달하는 것입니다. 어떻게 든 바니시에게 "네, 진행하고 이에 응답하십시오. 요청 "또는"아니오,이 요청에 응답하지 않음 "을 선택하고 바니시가 요청이 캐시에서 제공 될 수 있는지 여부를 결정하게합니다.

좀 더 이상적으로 뭔가를 할 것이고, 바니시가 인증 자체를 처리하거나 HMAC 처리를 백엔드보다 빠른 것으로 전달할 수 있습니다. 예를 들어, API는 클라이언트 암호/공개 키를 redis 캐시에 저장하고, Varnish는 실제로 Redis의 값을 사용하여 해시 자체를 계산할 수 있습니다.

+0

인증 작업을 내부적으로 두 개의 요청을 분배하는 백엔드로 전달하거나 인라인 C를 사용하여 바니시 내부에 HMAC를 구현할 수 있습니다. – NITEMAN

+0

답장을 보내 주셔서 감사합니다. @NITEMAN - Varnish를 처음 접했어. 성능/확장 성의 관점에서 "OK"일 것인가? 그리고 애플리케이션과 바니시간에 비밀 키/토큰 정보를 공유하기 위해 Redis와 같은 것을 사용한다고 언급했는데, 바니시 내부에 HMAC를 구현하는 것이 좋은 방법 인 것 같습니까? 다시 한 번 감사드립니다! –

+0

큰시 스템에서 중요한 C 코드를 인라인하는 경험이 없지만 이론 상으로는 잘 작동하고 확장되어야한다고 말하기는 어렵습니다. 퍼포먼스에 관심이 있다면 바니시 모듈을 작성하는 것이 좋습니다. – NITEMAN

답변

2

Varnish Modules를 사용하여 니스 VCL 코드 (니스 구성 언어)의 애호가 솔루션을 구현할 수 있어야한다 :

두 모듈 모두 modules directory에 나열된대로 프로덕션에 사용됩니다.

Varnish가 VCL에서 인증을 처리하는 경우 Varnish가 API 백엔드 응답을 캐시하고 인증 된 요청에 대해서만 전달하도록 할 수 있습니다. HMAC 구현이 요청 본문이 필요한 경우

: 그/그녀의 대답 Gridfire points out으로

은 니스 요청 본문에 액세스 할 수 없습니다. 그리고 우리는 백엔드/응용 프로그램의 HTTP 헤더에 전체 요청 본문을 보낼 수는 없습니다.

그러나 우리는 입니다.은 전체 요청 본문의 해시/다이제스트를 HTTP 헤더로 보냅니다. 백엔드에서의 해시 계산은 출력 생성 (markup | data | any)과 비교할 때 무시할 수 있어야합니다. AFAICT가/해시만큼이 방법에는 암호학/실용적 단점이있을 다이제스트 HMAC는 견고하고, 다이제스트 긴 (256bits 이상) 인 것이다. 성능 테스트는 평소대로 권고됩니다.

+0

나는이 두 가지를 모두 점검 할 것입니다. 고맙습니다! –

0

니스 쉽게 할 당신의 HMAC 구현이 해시의 일환으로 요청 본문을 사용하지 않는 VMOD의 이르 Bostad의 대답을 사용하여 HMAC. 니스 당신이 요청 본문에 대한 액세스 권한을 부여하지 않는 libvmod-bodyaccess은 일부 기능을 제공하지만 실제로 요청 본문을 얻는 방법을 발견했다.

요청 본문을 포함하는 헤더를 이론적으로 추가 할 수 있지만 이는 매우 나쁜 관행이며 중복 데이터로 HTTP 요청을 부 풀거나 헤더에 데이터 만 넣으려고하면 HTTP 요청 표준을 위반하게됩니다. 간단히 추천하지 마십시오.

대체 솔루션은 Nginx를 사용하는 것입니다. Nginx는 HTTPS (Varnish does not do SSL)를 사용하려는 경우 SSL 종결 자 역할을 할 수 있습니다. Nginx에는 Lua 스크립트를 실행하기 위해 module이 있습니다. (우분투/데비안 패키지 nginx-extras는 직접 컴파일하지 않아도이를 제공합니다) 모듈은 편리한 access_by_lua_file 지시어를 사용하여 스크립트의 결과에 따라 액세스를 허용하거나 차단합니다. Nginx here에 대한 HMAC 스크립트가 있습니다.

+0

"HMAC 구현에서 요청 본문을 해시의 일부로 사용하는 경우"가능한 한 가지 해결책을 생각해 볼 수 있습니다. 응용 프로그램이 본문의 해시를 계산하고 해시를 HTTP 헤더 (전체 본문 대신)로 반환하도록합니다. 그 방법에 대한 주요한 암호 학적/실용적인 단점이 있는지 나는 모른다. 긴 해시 (아마도 256 비트 이상)를 선택하는 것이 좋습니다. 긴 해시에는 성능 문제가있을 수 있으므로 테스트 및 벤치마킹이 필요합니다. –