- CrowdStrike 사고 같은 대형 보안 사건 뒤에는 “인터넷에 연결하지 말았어야 한다”는 반응이 나오지만, 많은 업무 시스템은 정보 교환이 핵심 기능이라 단순 차단으로 해결되지 않음
- 항공 예약·스케줄링 시스템처럼 조직과 지역 경계를 넘는 시스템은 전화와 전신을 대체한 통신 인프라에 가까워, 네트워킹을 제거하면 본래 가치도 함께 사라짐
- “인터넷에 연결되지 않음”은 단일 장비, 엄격한 에어갭, 데이터 다이오드, 사설 WAN, VPN 터널, 제한적 라우팅, AWS private VPC까지 포함할 수 있어 위협 모델이 크게 달라짐
- 오프라인 또는 제한 연결 환경에서는 OS 업데이트, 패키지 관리자, 내부 저장소, TLS 신뢰 저장소, 클라우드 라이선스, 콘텐츠 업데이트, Docker 이미지 처리까지 모두 시간과 비용을 밀어 올림
- 더 많은 시스템에 제한적 네트워크 정책을 적용하고 오프라인 운영을 고려해 소프트웨어를 만들 수는 있지만, 현재 소프트웨어 생태계는 여전히 인터넷 연결을 기본값으로 삼고 있음
“인터넷에 연결하지 말라”는 말의 한계
- 대형 보안 사고가 뉴스가 될 때마다 “이런 시스템은 인터넷에 연결되어 있으면 안 된다”는 반응이 반복됨
- 이 판단은 보안과 안정성 측면에서 직관적 매력이 있지만, 실제로 그렇게 운영되는 환경은 많지 않음
- 핵심 문제는 “인터넷에 연결하지 않는다”는 말만으로는 실제 설계, 운영 비용, 위협 모델을 충분히 특정할 수 없다는 점임
현대 업무 시스템은 통신 장치에 가까움
- 추상적으로 컴퓨터는 계산을 통해 가치를 만들 수 있지만, 산업 현장의 시스템은 계산보다 정보기술의 성격이 강함
- 정보기술은 정보를 입력받고 출력해야 하며, 과거처럼 운영자가 테이프를 넣는 방식은 실시간 통신보다 비싸고 느림
- 현대 업무용 컴퓨터는 대부분 통신 장치로 기능함
- 다른 업무 시스템과 연결되지 않고 가치를 만드는 시스템은 많지 않음
- 이런 연결은 조직 경계와 지리적 경계를 넘는 경우가 많음
- 항공 예약·스케줄링 시스템은 전화와 전신을 대체한 시스템에서 출발했으며, 네트워크가 기능 자체에 포함됨
유지보수와 운영에도 네트워크가 필요함
- 실시간 통신이 업무 목적에 필수적이지 않은 시스템도 네트워크 연결이 운영상 큰 가치를 가짐
- 인터넷 연결이 없으면 소프트웨어 업데이트를 어떻게 가져올지, 시스템을 어떻게 모니터링할지부터 막힘
- 시스템이 “완성”되어 업데이트나 실시간 모니터링이 필요 없다고 정해도, 비즈니스 요구사항은 시간이 지나며 바뀜
- 네트워크 연결은 이런 변경을 처리하는 비용을 크게 낮춤
“인터넷 미연결”에는 여러 수준이 있음
- “인터넷에 연결되지 않았다”는 상태는 단일한 의미가 아니라 여러 구현 방식의 묶음임
- 가능한 형태는 완전 단절부터 제한적 연결까지 넓게 분포함
- 네트워크 연결이 전혀 없는 단일 장비
- 사설 LAN 외에는 연결이 없고 보안 경계를 데이터가 넘지 않는 엄격한 에어갭
- DVD-R로 데이터를 보안 경계 안으로 반입하는 에어갭
- cross-domain solution 또는 data diode로 낮은 보안 네트워크에서 높은 보안 네트워크로 데이터를 이동하는 구조
- NSA 인증이 없는 cross-domain solution을 쓰는 구조
- 사설 광역망도 여러 단계로 나뉨
- 완전히 독립된 물리 인프라와 변조 방지 조치를 갖춘 사설 WAN
- 공유 덕트, leased dark fiber, lit fiber의 wavelength를 쓰는 형태
- MPLS 기반 virtual private ethernet
- 암호화와 인증을 갖춘 터널링 기반 virtual private ethernet
- 공용 통신망 위의 사설 트래픽도 “미연결”으로 불리는 경우가 있음
- 인터넷 같은 common-carrier network 위에서 하드웨어 장비가 암호화·인증 터널을 구성하는 형태
- NSA 인증이 없는 장비를 쓰는 형태
- 운영체제 네트워크 스택을 낮은 수준에서 설정해 터널 우회를 막는 검증된 소프트웨어 터널
- 검증 수준이 낮은 소프트웨어 터널
- WireGuard와 iptables 스크립트를 조합한 형태
- 제한적 인터넷 연결도 같은 말로 묶임
- 정책 기반 라우팅 등으로 극히 좁은 트래픽 흐름만 허용하는 사설 네트워크
- 허용 흐름이 오래된 Jira 티켓에 남아 있고 일부는 “동작하게 하려고” 추가된 구조
- 아웃바운드는 비교적 관대하고 인바운드는 엄격한 방화벽 기반 구조
- 클라우드 환경에서도 범위가 흔들림
- 외부 라우팅이 없는 AWS private VPC
- PrivateLink 등으로 다른 private VPC와 통신하는 VPC
- 연결된 일부 VPC가 인터넷과 라우팅되는 구조
- NAT Gateway와 Internet Gateway가 있지만 security group을 양방향으로 엄격히 설정한 구조
- 이런 형태들은 모두 “인터넷에 연결되지 않음”으로 불린 사례가 있지만, 공격 표면과 위험은 각각 다름
- 항공 예약 시스템을 “인터넷에 연결하지 말라”고 할 때 완전 무네트워크 상태를 뜻하지 않는다면, 실제로는 중간 단계 중 하나를 뜻하며 각 단계마다 실무 고려사항이 달라짐
오프라인 환경은 비용과 일정을 크게 늘림
- 인터넷 연결이 없거나 강하게 제한된 네트워크에서 소프트웨어를 운영하면 일정과 비용 추정이 크게 늘어남
- AWS private VPC 같은 약한 형태는 대략 3~5배로 잡을 수 있음
- 완전 단절에 가까운 강한 형태는 10배에서 훨씬 더 커질 수 있음
- 거의 전체 소프트웨어 생태계가 인터넷 연결을 전제로 설계되어 있음
- 운영체제는 온라인 서버에서 업데이트를 가져오려 함
- 유료 OS 벤더는 사설망 내부 업데이트 인프라를 별도 유료 라이선스로 제공할 수 있음
- 무료 OS는 직접 해결할 수 있지만 최신 기술을 쓰면 큰 번거로움이 생길 수 있음
- 개발과 배포 과정에서는 여러 패키지 관리자와 내부 저장소 문제가 반복됨
- 패키지 관리자마다 사설 내부 저장소 지원 수준이 다름
- 여러 패키지 관리자, 호출 방식, 실행 환경이 조합되며 복잡도가 커짐
- 내부 서비스의 TLS 인증서도 반복적인 작업을 만듦
- 사설망 내부 서비스는 대중적 CA의 루트 프로그램에 포함된 인증서를 쓰지 않는 경우가 많음
- JRE처럼 별도 trust store를 가진 구성 요소가 있고, 일부 기술 스택에서는 라이브러리에 따라 동작이 달라짐
- 운영체제 trust store가 있어도 각 도구가 자체 저장소를 쓰면 별도 조정이 필요함
- 클라우드 라이선스와 entitlement 확인도 장애물이 됨
- 일부 소프트웨어는 클라우드 라이선스 확인을 위해 외부에 접속하려 함
- 우회 방법은 대규모 방화벽 예외 추가부터 맞춤형 라이선스 체계 발급까지 다양하고 시간이 걸릴 수 있음
- 오프라인 콘텐츠 업데이트는 벤더 프로세스만으로도 복잡해질 수 있음
- 한 엔터프라이즈 소프트웨어 사례에서는 오래된 고객 지원 포털과 별도 entitlement 포털을 거쳐야 했음
- 계정 개설과 에스컬레이션에 3개월 이상이 걸렸고, 최종 포털에는 유효하지 않은 TLS 인증서가 있었음
- 문서화된 업데이트 적용 절차가 더 이상 동작하지 않아 엔지니어와 긴 이메일 교환이 필요했음
- 1년 라이선스에 5자리 금액을 지불했지만 사용 준비 과정에서 거의 만료됐고, 연장 라이선스 발급 지연으로 CI 파이프라인 중단이 발생함
- 오프라인 운영의 어려움은 개별 작업 하나가 불가능해서가 아니라, 모든 작업이 조금씩 더 어려워지는 death by a thousand cuts에 가까움
- 오프라인 환경을 고려하지 않은 제품은 임시 스크립트와 땜질로 대응하는 경우가 많고, 그 기술 부채는 오프라인 환경을 운영하는 고객에게 넘어감
- Red Hat은 이 영역에 비교적 잘 대응하지만, 절약한 시간만큼 비용을 현금으로 지불하게 됨
이런 환경은 드물고 특정 산업에 집중됨
- 강한 형태의 비인터넷 연결 환경은 주로 국방·정보기관에서 보임
- 일부 은행도 강한 네트워크 분리 관행을 갖고 있음
- 국방, 정보기관, 은행은 비용이 높고 시간이 오래 걸리는 산업으로도 알려져 있으며, 이런 운영 방식과 무관하지 않음
- 약한 형태의 제한 연결 환경은 주로 금융과 의료 같은 고규제 산업에 많음
- 보안을 매우 중시해 네트워크를 강하게 잠그는 일반 소프트웨어 회사도 가끔 있음
지금 할 수 있는 실용적 대응
- 더 적은 시스템이 인터넷에 연결되는 방향 자체가 나쁜 생각은 아님
- 다만 현재 소프트웨어 산업은 인터넷이 없거나 제한된 환경에서 편하게 운영되도록 준비되어 있지 않음
- 현실적인 대응은 완전 단절을 외치는 것보다 제한적 연결과 오프라인 대응성을 늘리는 쪽에 가까움
-
네트워크 정책을 최대한 제한하기
- 가능한 많은 시스템에 제한적 네트워크 정책을 적용해야 함
- 클라우드 제공자는 과거보다 이런 구성을 쉽게 만들고 있음
- AWS에서는 실용적인 비인터넷 라우팅 환경을 운영하는 것이 아주 쉽지는 않지만 불가능할 만큼 어렵지도 않음
- AWS managed service 범위 안에 머무르면 대체로 고통이 적지만, 비용은 발생함
-
오프라인 환경을 고려해 소프트웨어 만들기
- 외부로 접속해야 하는 기능은 가능하면 비활성화할 수 있어야 함
- 비활성화가 어렵다면 사용할 endpoint를 고객이 바꿀 수 있어야 함
- endpoint를 바꿀 수 있게 한다면 고객이 자체 endpoint를 운영할 수 있는 방법도 필요함
- 단순 정적 파일이면 nginx와 디렉터리 정도로 쉽게 제공 가능함
- API라면 내부 구현을 고객에게 배포해야 할 수 있고 유지보수 부담이 생김
-
TLS와 의존성 가정 줄이기
- 오프라인 환경에서는 다른 서비스에 연결한다는 작은 가정들이 복잡해짐
- Let’s Encrypt에 접속할 수 있다고 가정하면 안 됨
- 오프라인 환경은 거의 항상 내부 인증기관을 수반함
- system trust store를 사용해야 함
- 배포 시점에 요구사항이나 의존성을 가져오지 않아야 함
- Docker는 패키지를 자기완결적으로 만들겠다는 장점이 있었지만, npm 저장소 등에 접속하지 못하면 시작하지 못하는 컨테이너도 있음
- Docker 컨테이너마다 TLS trust store를 수정해야 하는 경우가 있어, 오프라인 환경에서는 Docker가 오히려 관리를 더 어렵게 만들 수 있음
CrowdStrike 사고와 인터넷 연결의 관계
- CrowdStrike 사고에 대해 “왜 인터넷에 연결되어 있었나”라는 반응이 여러 번 나왔지만, 인터넷 연결 여부는 당시 발생한 문제와 거의 직교함
- CrowdStrike 콘텐츠 업데이트는 이상적인 환경이라면 오프라인 환경에도 신속히 제공되어야 하는 종류의 업데이트임
- 실제 강한 오프라인 환경에서는 내부 CrowdStrike 업데이트 미러가 며칠, 몇 주, 몇 달, 몇 년씩 뒤처질 수 있음
- 그런 지연이 문제를 피하게 만들 수는 있지만, 이는 두 가지 잘못이 겹쳐 우연히 맞아떨어지는 상황에 가까움