클라우드프론트(cloudfront) IP 방화벽 설정하기
이게 월 5천원짜리 였던가 그렇습니다
PHP를 이용해서 IP를 설정하는 기능입니다. 아래 보시면 바로 아시는 분도 있겠지만 컴포저와 더불어 PHP는 7버전대에서 이용했습니다. 이런 기능이 필요한 이유는 서버단에선 클라우드프론트를 통해서 들어오는 IP를 차단하기 난해한 부분이 있습니다.
PHP를 통해서는 전달되는 IP 설정을 하여 차단이 가능 합니다. 힌색 화면이 나오거나 아니면 다른 페이지로 보내는것이 가능합니다. 그런데 시스템 차원에선 클라우드프론트는 캐쉬서버로서 웹서버로 들어오기 때문에 클라우드프론트 IP를 차단 할 수는 없습니다. PHP에서 전달되는 IP를 알아 처리하는것과는 다른 문제이기 때문입니다.
https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.WAFV2.WAFV2Client.html
https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-wafv2-2019-07-29.html#getwebacl
https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-cloudfront-2020-05-31.html
<?php
require 'vendor/autoload.php';
use Aws\WAFV2;
use Aws\WAFV2\Exception;
use Aws\WAFV2\WAFV2Client;
# 클라우드프론트는 us-east-1 으로 지정해야 한다.
$aParm = Array();
$aParm['region'] = 'us-east-1';
$aParm['version'] = '2019-07-29';
$aParm['credentials']['key'] = 'key';
$aParm['credentials']['secret'] = 'secret/cmMuZ591a66K2Sb';
$clientWafv2 = new Aws\WAFV2\WAFV2Client($aParm);
# 기존것은 id와 LockToken를 알려면 목록을 불러 와야 한다.
$aParm = Array();
$aParm['Scope'] = 'CLOUDFRONT --region=us-east-1';
$aParm['Scope'] = 'CLOUDFRONT'; // 쉘에선 위 처럼 리전이 들어가야 하는데. 여기선 들어가면 오히려 오류가 발생 한다.
$oResult = $clientWafv2->listIPSets($aParm);
$aResult = $oResult->toArray();
print_r($aResult);
$aIPSet = Array();
$aKeys = Array_keys($aResult);
for($ii=0; $ii<count($aKeys); $ii++)
{
$key = $aKeys[$ii];
if($key=='IPSets' )
{
$aKeys2 = Array_keys($aResult[$key]); //print_r($aKeys2); Exit;
for($jj=0; $jj<count($aKeys2); $jj++)
{
$key2 = $aKeys2[$jj];
$ipset_name = $aResult[$key][$key2]['Name']; //print_r($aResult[$key][$key2]); Exit;
$aIPSet[$ipset_name]['Name'] = $aResult[$key][$key2]['Name'];
$aIPSet[$ipset_name]['Id'] = $aResult[$key][$key2]['Id'];
$aIPSet[$ipset_name]['Description']= $aResult[$key][$key2]['Description'];
$aIPSet[$ipset_name]['LockToken'] = $aResult[$key][$key2]['LockToken'];
$aIPSet[$ipset_name]['ARN'] = $aResult[$key][$key2]['ARN'];
}
}
}
print_r($aIPSet);
# 아래 테스트 결과 잘 된다. 특정 ip만 삭제하고 변경하거나 하는 것은 있는지 별도 찾아 봐야 한다.
# https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-wafv2-2019-07-29.html#updateipset
$ipset_name = 'testip';
$aParms = Array();
$aParms['Name'] = $aIPSet[$ipset_name]['Name'];
$aParms['Id'] = $aIPSet[$ipset_name]['Id'];
$aParms['LockToken'] = $aIPSet[$ipset_name]['LockToken'];
$aParms['Scope'] = 'CLOUDFRONT';
$aParms['Addresses'] = Array('5.5.5.0/24','1.1.1.0/24','192.168.10.32/32');
$oResult = $clientWafv2->updateIPSet($aParms);
$aResult = $oResult->toArray();
print_r($aResult);