개발자들은 API를 구축하는 선호하는 방법으로 GraphQL을 점점 더 많이 받아들이고 있습니다. GraphQL은 여러 소스에서 데이터를 검색하는 과정을 간소화하여 데이터 접근과 집계를 효율화합니다. GraphQL을 사용하는 개발자는 단일 엔드포인트에서 하나의 POST 요청으로 여러 데이터 소스를 쿼리함으로써 다양한 소스에서 필요한 데이터를 정확하게 요청할 수 있습니다. 이러한 접근 방식은 REST API 아키텍처에서 발생할 수 있는 제약을 해결하는 데 도움이 됩니다. 제약으로 인해 쿼리 부족(필요한 모든 데이터가 부족한 요청)이나 쿼리 과잉(여러 엔드포인트로 요청이 전송되어 과도한 데이터 수집)과 같은 문제가 발생할 수 있습니다.
GraphQL은 클라이언트가 각 서비스나 데이터 소스에서 필수 데이터만 검색할 수 있도록 해주므로, 마이크로서비스 아키텍처에 최적의 선택입니다. 이는 현대 비즈니스 환경에서 성공하는 데 중요한 요소인 높은 유연성과 민첩성을 촉진합니다.
GraphQL API는 더 높은 수준의 접근성과 유연성을 제공하므로 악의적인 행위자에게 유혹적인 더 광범위한 공격 표면도 제공합니다. GraphQL은 비교적 새로운 기술이기는 하지만 다른 API 아키텍처에서 발견되는 많은 취약점에 여전히 취약합니다. 다행히 기존 인프라와 도구 중 일부를 활용하여 GraphQL API를 이러한 일반적인 위협으로부터 보호할 수 있습니다.
이 튜토리얼은 GraphQL API를 제공하고 보호하는 방법을 이해하는 데 도움이 됩니다. F5 NGINX Plus를 API 게이트웨이로 사용하여 F5 NGINX Unit 에 Apollo GraphQL 서버를 배포하는 방법을 보여드리겠습니다. 또한, 고급 보안을 위해 API 게이트웨이에 F5 NGINX App Protect WAF를 배포하는 방법과 F5 NGINX Management Suite를 사용하여 WAF를 구성하고 잠재적 위협을 모니터링하는 방법을 보여드립니다. 이 설정을 사용하면 NGINX App Protect WAF를 사용하여 SQL 주입과 같은 공격을 감지할 수도 있습니다.
튜토리얼을 완료하려면 다음 섹션의 단계를 따르세요.
이 튜토리얼을 시작하기 전에 다음이 필요합니다.
NGINX 관리 제품군은 여러 고급 기능을 하나의 단일 플랫폼으로 통합하여 NGINX 인스턴스의 구성, 모니터링 및 문제 해결 프로세스를 단순화합니다. 또한 API 관리 및 거버넌스를 용이하게 하고, 애플리케이션 부하 분산을 최적화하며, 조직의 전반적인 보안을 강화합니다.
NGINX Management Suite를 설치하고 구성하려면 다음 단계를 따르세요.
NGINX Unit 은 가벼운 디자인으로 효율적이고 간소화된 런타임 애플리케이션으로, 속도나 민첩성을 저하시키지 않으면서도 고성능을 추구하는 조직에 이상적인 선택입니다. TLS를 처리하고, 라우팅 요청을 처리하고, 애플리케이션 코드를 실행할 수 있는 오픈소스 서버입니다. NGINX Unit에 대한 자세한 내용은 주요 기능 페이지에서 확인할 수 있습니다.
이 튜토리얼에서는 NGINX Unit에서 Node.js 웹 애플리케이션 프레임워크 인 Express를 사용합니다. 이는 Apollo GraphQL 서버를 구성하는 데 필요한 광범위한 기능을 제공합니다. 이 글을 쓰는 시점에서 최신 버전은 Apollo Server 4입니다.
다음 단계에 따라 NGINX Unit을 배포하고 Apollo GraphQL 서버를 설치하세요.
NGINX Plus 인스턴스를 배포하기에 적합한 환경을 선택하세요. 이 튜토리얼에서는 AWS Ubuntu 인스턴스를 사용하고 NGINX Plus를 사용하여 API 게이트웨이 역방향 프록시를 설정합니다. 그런 다음 보안을 강화하기 위해 API 게이트웨이 앞에 NGINX App Protect WAF를 배포합니다.
NGINX Plus 및 NGINX App Protect WAF를 설치하려면 다음 지침을 따르세요.
load_modules를
추가합니다. 로드_모듈 모듈/ngx_http_js_module.so; 로드_모듈 모듈/ngx_stream_js_module.so;
로드_모듈 모듈/ngx_http_app_protect_module.so;
app_protect_enable 켜짐;
/etc/app_protect/conf 디렉토리에 GraphQL 정책 구성을 만듭니다. NGINX App Protect WAF 정책을 생성하는 방법에 대한 자세한 내용은 관련 지침을 참조하세요.
다음은 GraphQL 정책 구성의 예입니다.
{ "name": "graphql_policy",
"template": {
"name": "POLICY_TEMPLATE_NGINX_BASE"
},
"applicationLanguage": "utf-8",
"caseInsensitive": false,
"enforcementMode": "차단",
"차단 설정": {
"위반": [
{
"이름": "VIOL_GRAPHQL_FORMAT",
"알람": 참,
"블록": 거짓
},
{
"이름": "VIOL_GRAPHQL_MALFORMED",
"알람": 참,
"블록": 거짓
},
{
"이름": "VIOL_GRAPHQL_INTROSPECTION_QUERY",
"알람": 참,
"블록": 거짓
},
{
"이름": "VIOL_GRAPHQL_ERROR_RESPONSE",
"알람": 참,
'차단': 거짓
}
]
}
GraphQL 설정을 적용하려면 nginx.conf 파일에서 app_protect_policy_file
필드를 GraphQL 정책 이름으로 업데이트합니다. 파일을 업데이트한 후 NGINX를 다시 로드하여 GraphQL 설정을 적용합니다.
다음은 NGINX App Protect 정책이 포함된 nginx.conf 파일의 예입니다.
사용자 nginx; 작업자 프로세스 4;
모듈 로드 모듈/ngx_http_js_module.so;
모듈 로드 모듈/ngx_stream_js_module.so;
모듈 로드 모듈/ngx_http_app_protect_module.so;
오류 로그 /var/log/nginx/error.log 디버그;
이벤트 {
작업자 연결 65536;
}
http {
/etc/nginx/mime.types를 포함합니다.
기본 유형 애플리케이션/옥텟 스트림;
전송 파일 켜짐;
keepalive_timeout 65;
서버 {
수신 <포트>;
서버 이름 <이름>;
app_protect_enable 켜짐;
app_protect_security_log_enable 켜짐; # 이 섹션에서는 로깅 기능을 활성화합니다.
app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # 원격 로거는 로깅 옵션(참조 파일에서 정의됨), 로그 서버 IP, 로그 서버 포트 등의 관점에서 정의됩니다.
app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/security.log;
proxy_http_version 1.1;
location / {
client_max_body_size 0;
기본 유형 text/html;
proxy_pass http://<ip 주소>:<포트>$request_uri;#Nginx 유닛의 <ip 주소>
}
위치 /graphql {
클라이언트_최대_몸_크기 0;
기본_유형 텍스트/html;
app_protect_policy_file "/etc/app_protect/conf/graphql_policy.json";
proxy_pass http://<ip 주소>:<포트>$$request_uri; #Nginx 유닛의 <ip 주소>
}
}
}
$ nginx -s 다시 로드
이제 다음 단계에 따라 구성을 테스트할 수 있습니다.
$ curl -X PUT --data-binary @demo.json --unix-소켓 /var/run/control.unit.sock http://localhost/config
{ "성공": "재구성 완료."
}
$ curl -X POST http://3.X.X.X:4003/graphql/ -H "Content-Type:application/json" -d '{"query": "query {hello OR 1=1;} "}'
<html><head><title>요청이 거부되었습니다.</title></head><body>요청한 URL이 거부되었습니다. 관리자에게 문의하세요.<br><br>귀하의 지원 ID는 다음과 같습니다. 7313092578494613509<br><br><ahref='javascript:history.back();'>[뒤로 돌아가기]</a></body><html>
공격 유형="비브라우저 클라이언트, 기능 남용, SQL 주입, 기타 애플리케이션 활동, HTTP 파서 공격", 차단 예외 이유="N/A", 날짜 시간="2023-07-05 21:22:38", 대상 포트="4003", ip_client="99.187.244.63", is_truncated="false", 메서드="POST", 정책 이름="graphql_policy", 프로토콜="HTTP", 요청 상태="차단됨", 응답 코드="0", 심각도="중요", sig_cves="N/A,N/A", sig_ids="200002147,200002476", sig_names="SQL-INJ 표현식(예: ""or 1=1"")(3), SQL-INJ 표현식 ""또는 1=1"" (6) (매개변수)", sig_set_names="{SQL 주입 서명},{SQL 주입 서명}", src_port="64257", sub_violations="HTTP 프로토콜 준수 실패: 호스트 헤더에 IP 주소가 포함되어 있음", support_id="7313092578494613509 ",
이 튜토리얼에서는 NGINX Unit에 Apollo GraphQL 서버를 설정하는 방법, NGINX Plus를 API 게이트웨이로 배포하는 방법, API 게이트웨이 앞에 있는 NGINX App Protect WAF로 GraphQL API를 보호하는 방법을 알아보았습니다.
NGINX Management Suite Security Monitoring을 사용하면 GraphQL API가 손상되기 전에 일반적인 고급 위협을 식별하고 차단할 수도 있습니다. 이 간단한 아키텍처는 인증 및 권한 부여 누락, 주입 공격, 제한 없는 리소스 소비 등 가장 흔한 API 취약점으로부터 GraphQL API를 방어합니다.
NGINX Plus, NGINX App Protect, NGINX Management Suite가 포함된 API Connectivity Stack의 30일 무료 평가판을 통해 오늘 NGINX를 테스트해 보세요.
"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."