Cloudflare 방화벽 예외처리하기

  • Post Author:
  • Post Category:칼럼
  • Post Comments:1 Comment
  • Post last modified:March 10, 2020
This entry is part 3 of 13 in the series Cloud Security


unsplash-logoErik Mclean

Cloud Native의 시대니까 요새는 어떤 써드파티 서비스와 연동해도 동적으로 변화는 환경에 맞춰야 한다. 예를 들어 New Relic Synthetics의 서버군이 항상 동일한 IP 주소를 사용하면 너무나 일이 쉽겠지만 그들도 다른 클라우드 서비스에 의존하다 보니 IP 주소는 불시에 바뀔 수 있다.

Their IP addresses are subject to change without warning. New Relic updates these JSON listings daily, sometimes multiple times an hour:

그러니 주기적으로 상대측 서버 주소를 확인해서 변경사항을 반영해야 한다. Cloudflare의 경우 RESTful API 명세가 상당히 깔끔하기 때문에 자동화하는데 큰 어려움은 없다.

curl --silent https://s3.amazonaws.com/nr-synthetics-assets/nat-ip-dnsname/production/ip.json |jq '. []' | jq -s add | jq -r  '.[]' | xargs -I {} curl --silent -X POST "https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/firewall/access_rules/rules" \
 -H "X-Auth-Email: ${CF_API_EMAIL}" \
 -H "X-Auth-Key: ${CF_API_KEY}" \
 -H "Content-Type: application/json" \
 --data '{"mode":"whitelist","configuration":{"target":"ip","value":"{}"},"notes":"New Relic Synthetics"}' | (jq 'select(.errors[] .message | contains("duplicate")) | "OK"' || jq 'select(.success == true) | "OK"')  | grep "OK" || echo "FAIL"

  • CF_API_EMAIL: Cloudflare 계정
  • CF_API_KEY : API 키
  • CF_ACCOUNT_ID: 조작할 방화벽을 소유한 계정 아이디

한 줄이면 된다!

물론 이 코드는 지나치게 단순한 편이라 개선할 부분도 여럿 있다. 우선 계정 아이디는 간단한 curl 명령 한 줄이면 자동으로 찾을 수 있다. 또한 상대측 서버가 목록에서 빠진 경우 우리측 방화벽에서도 제거해주는 편이 낫다. 이 또한 Cloudflare 방화벽에 등록된 주소 목록과 New Relic 측이 제공하는 주소 목록을 상호대조하면 간단히 구할 수 있다.

이왕하는 김에 Pingdom의 Probe 서버 주소도 방화벽에 등록해보자. IPv4 주소와 IPv6 주소를 나눠서 제공한다는 점만 제외하고 New Relic의 경우와 크게 다르지 않다.

(curl --silent https://my.pingdom.com/probes/ipv4; curl --silent https://my.pingdom.com/probes/ipv6) | awk NF | xargs -I {} curl --silent -X POST "https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/firewall/access_rules/rules" \
     -H "X-Auth-Email: ${CF_API_EMAIL}" \
     -H "X-Auth-Key: ${CF_API_KEY}" \
     -H "Content-Type: application/json" \
     --data '{"mode":"whitelist","configuration":{"target":"ip","value":"{}"},"notes":"Pingdom Probe"}' | (jq 'select(.errors[] .message | contains("duplicate")) | "OK"' || jq 'select(.success == true) | "OK"')  | grep "OK" || echo "FAIL"

Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
follow me
  • @hellodhlyn 아니 누가???
    15 hours ago
  • 남자다움과 멍청한 건 엄밀히 달라. 남들까지 위험한 상황에 몰아넣지 말라구
    1 day ago
  • 보더콜리가 횡단보도에서 헛짖었다. 뭔가 흥미로운 걸 발견한 모양인데 갑작스러우니 나를 포함해 여러 사람이 놀랐다. 그런데 그 놀라움이 멎쩍었을까? 옆에 있는 20대 초반 남자애가 개에게 위협적으로 소리를 지… https://t.co/8LL7OfX6mr
    1 day ago
Buy me a coffeeBuy me a coffee
×
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
Latest Posts