본문으로 건너뛰기
프로젝트 목록

Woori FIS · AWS · Security

우리금융그룹 AWS 클라우드 보안 아키텍처

다중 AWS 계정의 망분리 요건을 서브넷과 방화벽 구조로 옮기고, 보안 구성을 Terraform 코드 한 벌로 표준화했습니다.

역할
Cloud Security Engineer · 정보보안부 네트워크보안팀
기간
2026.02 – 2026.10
CSP
AWS
규모
다중 AWS 계정
핵심 기술
Terraform · AWS Network Firewall · AWS WAF · AWS Shield Standard · GuardDuty · Security Hub · Splunk · Python
5
Splunk SIEM/SOAR로 연동한 보안 서비스
3
망분리를 옮긴 설계 원칙
1
다중 AWS 계정에 적용하는 Terraform 코드

한눈에 보기

DMZPrivate인터넷ShieldStandardCloudFront /WAF웹 공격 필터링ALBDMZ 서브넷NetworkFirewallVPC 경로의 방화벽VPC 워크로드공인 IP 없음아웃바운드: 허용 대상만Terraform 코드 한 벌다중 AWS 계정에 같은 기준으로 적용
이 구성을 Terraform 코드 한 벌로 정의해 다중 AWS 계정에 같은 기준으로 적용합니다.

문제

그룹사들이 퍼블릭 클라우드를 처음 도입하는 단계에 Terraform이 없었고, 계정마다 담당자에 따라 보안 설정이 달랐습니다. 망분리 규정을 문서로만 지키기도 어려웠습니다.

접근

망분리(중요도가 다른 네트워크를 나눠 외부 위협이 내부로 바로 들어오지 못하게 하는 금융권 통제) 요건을 DMZ·Private 서브넷 분리, 백엔드 공인 IP 금지, 허용된 대상으로만 아웃바운드라는 세 원칙으로 옮겼습니다. WAF, Network Firewall, Shield Standard 구성을 Terraform으로 정의해 모든 계정에 같은 코드를 적용하고, GuardDuty와 Security Hub까지 Splunk SIEM/SOAR로 연동했습니다.

결과

계정이 늘어나도 같은 보안 기준이 코드로 반복되어 담당자별 정책 편차가 사라졌습니다. 다중 AWS 계정의 통신 구성은 Python 파이프라인으로 자동 수집·분석해 반복 가능한 점검이 됐습니다. IAM 권한도 Terraform으로 정의해 과도한 권한을 구조적으로 막았습니다.

자세히 보기

GuardDutySecurity HubWAFNetwork FirewallShieldSplunk SIEM로그를 한곳에서 분석SOAR 대응정해진 절차로 대응
Splunk 기반 SOAR로 대응 절차까지 연결합니다.
계정계정계정담당자별로 다른 정책Terraform 코드 한 벌Network Firewall · WAF · Shield같은 코드, 모든 계정에 같은 기준
계정이 늘어나도 같은 기준이 코드로 반복됩니다.

통신 범위 계산 (관련 공개 저장소 pf-09)

이 코드가 하는 일: 규칙의 CIDR로 덮이지 않는 대역을 계산합니다. 이 프로젝트의 운영 코드가 아니라 관련 공개 저장소의 코드입니다.

def uncovered_networks(
    targets: Iterable[ipaddress.IPv4Network], rule_cidrs: Iterable[str]
) -> list[ipaddress.IPv4Network]:
    """The parts of the targets that no rule reaches."""
    remaining = list(targets)
    for cidr in rule_cidrs:
        try:
            rule = ipaddress.IPv4Network(cidr, strict=False)
        except ValueError:
            continue
        next_round: list[ipaddress.IPv4Network] = []
        for network in remaining:
            if network.subnet_of(rule):
                continue
            if rule.subnet_of(network):
                next_round.extend(network.address_exclude(rule))
            else:
                next_round.append(network)
        remaining = next_round
    return remaining

배운 점

보안 구성이 코드가 되면 계정별 차이가 코드 차이로 보입니다. 설정을 일일이 비교하지 않아도 어디가 다른지 바로 알 수 있습니다.

다음에 개선할 점

Shield는 Standard 범위로 운영했습니다. 다음에는 코드로 정의한 기준이 계정마다 실제로 지켜지는지 점검까지 자동화하고 싶습니다.

관련 현장 노트

Open to work · 클라우드 인프라/보안