GraphQL API – NGINX를 사용하여 보호 하세요.
개발자들은 점점 더 많이 GraphQL 을 사용하여 API를 구축하는 것을 선호하고 있습니다.
GraphQL은 여러 소스에서 데이터를 간편하게 검색하고 액세스 및 집계를 간소화하는 기능을 제공합니다. GraphQL을 사용하는 개발자는 단일 엔드포인트에서 하나의 POST 요청으로 여러 데이터 소스를 쿼리함으로써 필요한 데이터를 정확하게 요청할 수 있습니다.
이 접근 방식은 REST API 아키텍처에서 발생하는 쿼리 부족(필요한 데이터가 모두 포함되지 않은 요청) 또는 쿼리 초과(여러 엔드포인트로 이동하여 과도한 데이터를 수집하는 요청)와 같은 문제를 해결하는 데 도움이 됩니다.
GraphQL은 마이크로서비스 아키텍처에 최적화된 선택입니다.
이는 클라이언트가 필요한 데이터만 서비스나 데이터 소스에서 검색할 수 있도록 해주기 때문에 현대 비즈니스 환경에서 유연성과 민첩성을 강화하는 핵심 요소로 작용합니다.
GraphQL API는 더 높은 수준의 액세스와 유연성을 제공하지만, 이는 악의적인 공격자들에게 유혹적인 더 광범위한 공격 표면을 제공할 수도 있습니다.
비록 GraphQL이 상대적으로 새로운 기술이지만, 다른 API 아키텍처에서 발견되는 취약점과 유사한 문제를 많이 가지고 있습니다.
다행히도, 기존의 인프라와 도구를 활용하여 이러한 일반적인 위협으로부터 GraphQL API를 보호할 수 있습니다.
목차
1. GraphQL 튜토리얼 개요
2. 전제조건
3. NGINX Management Suite Security Monitoring 설치 및 구성
4. NGINX Unit 배포 및 Apollo GraphQL 서버 설치
5. NGINX Plus를 API Gateway로 배포하고 NGINX App Protect WAF 설치
6. GraphQL 구성 테스트
7. 결론
1. GraphQL 튜토리얼 개요
이 튜토리얼은 GraphQL API를 보호하고 관리하는 방법에 대한 이해를 높이는 데 도움이 됩니다. NGINX Plus를 사용하여 API Gateway를 구축하고 Apollo GraphQL 서버를 배포하는 방법을 설명합니다. 또한 NGINX App Protect WAF를 API Gateway에 배포하여 고급 보안을 제공하고 F5 NGINX Management Suite를 사용하여 WAF를 구성하고 잠재적인 위협을 모니터링하는 방법을 안내합니다. 이 설정을 통해 NGINX App Protect WAF를 사용하여 SQL 인젝션과 같은 공격을 탐지할 수 있습니다.
2. 전제조건
이 튜토리얼을 시작하기 전에 다음이 필요합니다.
- API Connectivity Stack의 30일 무료 체험판 (NGINX Plus, NGINX App Protect 및 NGINX Management Suite에 액세스하기 위해)
- Linux/Unix 또는 다른 호환 환경
- Linux 명령 줄에 대한 기본적인 이해도
- 텍스트 편집기 (Vi 또는 Vim)
- Curl
3. NGINX Management Suite Security Monitoring 설치 및 구성
NGINX Management Suite는 NGINX 인스턴스의 구성, 모니터링, 문제 해결 프로세스를 간편하게 만들기 위해 여러 고급 기능을 통합한 플랫폼입니다. 또한 API 관리와 거버넌스를 용이하게 하며, 애플리케이션 로드 밸런싱을 최적화하고 조직의 전반적인 보안을 강화합니다.
NGINX Management Suite에 대한 자세한 내용은 “NGINX Management Suite – 앱과 API 연결 및 확장” 포스트를 참조하세요.
4. NGINX Unit 배포 및 Apollo GraphQL 서버 설치
NGINX Unit는 가볍고 효율적인 런타임 애플리케이션으로, 속도나 민첩성을 희생하지 않고 높은 성능을 제공하는 조직에 이상적인 선택입니다. 이는 TLS 처리, 요청 라우팅 및 애플리케이션 코드 실행을 처리할 수 있는 오픈 소스 서버입니다. NGINX Unit에 대해 더 자세히 알아보려면 Key Features 페이지를 참조하십시오.
이 튜토리얼에서는 NGINX Unit에서 Node.js 웹 애플리케이션 프레임워크인 Express를 사용하여 Apollo GraphQL 서버를 구축하는 방법을 다룹니다. 현재 버전은 Apollo Server 4입니다.
NGINX Unit를 배포하고 Apollo GraphQL 서버를 설치하는 방법은 다음과 같습니다:
- 지원되는 운영 체제에서 NGINX Unit를 설치합니다.
- GitHub 저장소를 참고하여 Apollo GraphQL 서버를 빌드하고 Apollo GraphQL hello 앱을 생성합니다.
5. NGINX Plus를 API Gateway로 배포하고 NGINX App Protect WAF 설치
NGINX Plus 인스턴스를 배포할 적합한 환경을 선택하세요. 이 튜토리얼에서는 AWS Ubuntu 인스턴스를 사용하여 NGINX Plus를 사용한 API Gateway 리버스 프록시를 설정합니다. 그런 다음 API Gateway 앞에 NGINX App Protect WAF를 배포하여 추가 보안을 제공합니다.
NGINX Plus와 NGINX App Protect WAF를 설치하는 방법은 다음과 같습니다.
1. 지원되는 운영 체제에 NGINX Plus를 설치합니다.
2. NGINX JavaScript 모듈 (njs)를 설치합니다.
3. nginx.conf 디렉토리에 load_modules를 추가합니다.
load_module modules/ngx_http_js_module.so;
load_module modules/ngx_stream_js_module.so;
4. 지원되는 운영 체제에 NGINX App Protect WAF를 설치하세요.
5. nginx.conf 파일의 main context에 NGINX App Protect WAF 모듈을 추가하세요.
load_module modules/ngx_http_app_protect_module.so;
6. nginx.conf 파일의 http/server/location context에서 NGINX App Protect WAF를 활성화하세요.
app_protect_enable on;
7. /etc/app_protect/conf 디렉토리에 정책 구성을 생성하세요.
다음은 정책 구성의 예시입니다.
{
"name": "graphql_policy",
"template": {
"name": "POLICY_TEMPLATE_NGINX_BASE"
},
"applicationLanguage": "utf-8",
"caseInsensitive": false,
"enforcementMode": "blocking",
"blocking-settings": {
"violations": [
{
"name": "VIOL_GRAPHQL_FORMAT",
"alarm": true,
"block": false
},
{
"name": "VIOL_GRAPHQL_MALFORMED",
"alarm": true,
"block": false
},
{
"name": "VIOL_GRAPHQL_INTROSPECTION_QUERY",
"alarm": true,
"block": false
},
{
"name": "VIOL_GRAPHQL_ERROR_RESPONSE",
"alarm": true,
"block": false
}
]
}
8. 설정을 적용하기 위해 nginx.conf 파일에서 app_protect_policy_file 필드를 GraphQL 정책 이름으로 업데이트하세요. 파일을 업데이트한 후에는 NGINX를 다시 로드하여 GraphQL 설정을 적용하세요.
다음은 NGINX App Protect 정책이 포함된 nginx.conf 파일의 예시입니다.
user nginx;
worker_processes 4;
load_module modules/ngx_http_js_module.so;
load_module modules/ngx_stream_js_module.so;
load_module modules/ngx_http_app_protect_module.so;
error_log /var/log/nginx/error.log debug;
events {
worker_connections 65536;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen <port>;
server_name <name>;
app_protect_enable on;
app_protect_security_log_enable on; # This section enables the logging capability
app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # This is where the remote logger is defined in terms of: logging options (defined in the referenced file), log server IP, log server port
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;
default_type text/html;
proxy_pass http://<ip addr>:<port>$request_uri;#<ip addr> of Nginx unit
}
location /graphql {
client_max_body_size 0;
default_type text/html;
app_protect_policy_file "/etc/app_protect/conf/graphql_policy.json";
proxy_pass http://<ip addr>:<port>$$request_uri; #<ip addr> of Nginx unit
}
}
}
9. 다음 명령을 실행하여 NGINX Plus를 재시작하세요.
$ nginx -s reload
6. GraphQL 구성 테스트
다음 단계를 따라 구성을 테스트할 수 있습니다.
1. NGINX Unit 서버로 이동하여 다음 명령을 입력하여 Apollo GraphQL 애플리케이션을 시작하세요.
$ curl -X PUT --data-binary @demo.json --unix-socket
/var/run/control.unit.sock http://localhost/config
2. 성공적인 업데이트 후에는 리스너의 IP 주소와 포트에서 앱이 사용 가능한 것을 확인할 수 있어야 합니다.
{
"success": "Reconfiguration done."
}
3. Apollo GraphQL 서버에 액세스하려면 웹 브라우저를 열고 서버의 공용 IP 주소를 붙여넣으세요. 예를 들어: http://3..X.X.X:4003/graphql (이 예시는 포트 4003을 사용합니다).
4. 애플리케이션을 테스트하려면 올바른 쿼리를 입력하고 쿼리를 실행하세요.

5. 개인이 쿼리에 SQL 인젝션을 입력하는 상황을 고려해 보겠습니다. 이 경우, NGINX App Protect WAF가 Apollo GraphQL 서버를 보호하고 공격의 성격을 설명하는 지원 ID를 생성합니다.
$ 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>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 7313092578494613509<br><br><ahref='javascript:history.back();'>[GoBack]</a></body><html>
6. 공격의 세부 정보를 확인하려면 /var/log/app_protect/security.log에 위치한 NGINX Plus 인스턴스의 로그를 참조하세요.
attack_type="Non-browser Client,Abuse of Functionality,SQL-Injection,Other Application Activity,HTTP Parser Attack",blocking_exception_reason="N/A",date_time="2023-07-05 21:22:38",dest_port="4003",ip_client="99.187.244.63",is_truncated="false",method="POST",policy_name="graphql_policy",protocol="HTTP",request_status="blocked",response_code="0",severity="Critical",sig_cves="N/A,N/A",sig_ids="200002147,200002476",sig_names="SQL-INJ expressions like ""or 1=1"" (3),SQL-INJ expressions like ""or 1=1"" (6) (Parameter)",sig_set_names="{SQL Injection Signatures},{SQL Injection Signatures}",src_port="64257",sub_violations="HTTP protocol compliance failed:Host header contains IP address",support_id="7313092578494613509",
7. NGINX Management Security Monitoring 모듈에서는 인스턴스의 데이터를 모니터링하고 잠재적인 위협을 검토할 수 있으며, 필요에 따라 정책을 조정하여 최적의 보호를 제공할 수 있습니다.


7. 결론
이 튜토리얼에서는 NGINX Unit에 Apollo GraphQL 서버를 설정하고, NGINX Plus를 API 게이트웨이로 배포하고, NGINX App Protect WAF를 API Gateway 앞에서 GraphQL API를 보호하는 방법을 배웠습니다.
또한 NGINX Management Suite Security Monitoring을 사용하여 GraphQL API가 손상되기 전에 일반적인 고급 위협을 식별하고 차단할 수 있습니다. 이 간단한 아키텍처는 인증 및 권한 부여 누락, 인젝션 공격, 제한 없는 리소스 소비 등을 포함한 일반적인 API 취약점으로부터 GraphQL API를 보호합니다.
NGINX Plus의 30일 무료 체험판을 사용하여 NGINX를 지금 바로 테스트해 보세요.
아래 뉴스레터를 구독하고 NGINX와 NGINX STORE의 최신 정보들을 빠르게 전달 받아보세요.
댓글을 달려면 로그인해야 합니다.