만료일 2021-04-06

2021년 4월 6일, 와일드카드 TLS 인증서가 예기치 않게 만료되었습니다. 인증서가 만료되는 문제가 발생한 것은 부끄럽지만, 저희가 이번 일을 통해 얻은 지식을 공유하여 다른 회사들이 자사 시스템을 개선할 수 있도록 돕는 것이 더 중요하다고 생각했습니다. 귀하나 귀하의 조직에서 인증서 모니터링을 사용하는 경우에는 이번 사고를 교훈 삼아 자사 시스템에 빈틈이 없는지 확인해보시길 권합니다.

만료된 인증서는 사실 에픽의 여러 내부 서비스에서 사용됩니다. 너무나 많은 곳에서요. 저희는 인증서 만료 여부를 모니터링하기 위해 최선을 다했으나, 인증서가 사용되는 곳을 모두 파악하지 못했습니다. 인증서가 만료된 다음 갱신되는 과정에서 중단 시간이 늘어나는 예상치 못한 일련의 사건이 발생했습니다. 본 게시글에는 이와 관련된 자세한 내용을 담았습니다.

ID 및 인증 시스템과 같은 핵심 구성 요소가 영향을 받았습니다. 이러한 서비스는 전체 생태계에 걸쳐 다른 많은 서비스와 관련되어 있으며, 다음과 같은 영향이 확인되거나 보고되었습니다.

  • 포트나이트, Rocket League, Houseparty, Epic Online Service, Epic Games Store를 포함하여 이 인증 형식을 사용하는 모든 제품에서 에픽 계정 로그인 실패
  • 모든 플랫폼의 실시간 게임 플레이 또는 서비스와의 연결 끊김
  • 에픽게임즈 런처에서 아이템 구매 실패
  • 에픽게임즈 런처에서 콘텐츠가 로드되지 않고 오프라인 모드로 작동하지 않는 예기치 않은 동작 발생
  • 언리얼 엔진 사이트를 포함하여 에픽게임즈 제품 및 마케팅 웹사이트를 사용할 수 없거나 성능이 저하됨
  • 에픽 직원의 문제 해결 또는 관리 능력에 영향을 미치는 여러 내부 툴 관련 문제 발생

본 게시글은 어떤 일이 일어났는지, 거기서 무엇을 배웠는지, 그리고 향후에 취할 조치에 대한 상세한 인사이트를 제공합니다.


어떤 일이 일어났나요?


세 가지 주요 사건이 순차적으로 발생했습니다.

  1. 만료된 인증서로 인해 내부 백엔드 서비스 간 호출 및 내부 관리 도구의 상당 부분이 중단되었습니다.
  2. 에픽게임즈 런처로 전송되는 트래픽이 예기치 않게 증가하여 에픽게임즈 런처의 서비스와 콘텐츠 배포 기능이 중단되었습니다.
  3. 잘못된 아티팩트 및 에셋을 참조하는 잘못된 버전의 Epic Games Store 웹사이트가 자동 스케일링의 일부로 배포되어 Epic Games Store 경험이 저하되었습니다.

 

1) 인증서 만료

한국 시간 4월 6일 오후 9시에 TLS 인증서가 만료되었습니다. 이 인증서는 에픽 백엔드 플랫폼에서 대량의 내부 전용 통신을 위해 사용되었습니다. 저희는 서비스 간 API 호출을 위한 백엔드 서비스와 내부 관리 도구 간에 TLS 암호화를 사용합니다. 이 인증서는 공용이 아닌 내부 DNS 영역을 위한 것입니다. 

한국 시간 오후 9시에 백엔드 시스템 간에 트래픽이 사실상 중단되었습니다. 6분 후인 오후 9시 6분에 사고가 보고되었고, 사고를 처리하기 시작했습니다. 여러 경보 장치가 작동하게 했지만, 회사 내의 모든 직원 역시 광범위하게 영향을 미치는 문제를 발견 시 항상 보고하도록 권장하고 있습니다. 각 사고는 사고 관리 프로세스를 시작하는 24x7 Live Ops 팀에서 분류합니다. 첫 번째 내부 보고서가 도착하자 사고 관리 툴 및 프로세스가 자동으로 Slack 채널을 만들어 관련 당사자들이 이 사고에 초대되거나 호출되었습니다.

오후 9시 12분에 인증서가 만료되었음을 확인했으며, 이 인증서가 문제의 원인일 가능성이 매우 높다고 판단하여 갱신 절차를 시작했습니다. 오후 9시 37분에 인증서가 재발급되었고 업데이트된 인증서가 백엔드 서비스로 제공되기 시작했습니다. 이후 5분~15분 동안 로드 밸런서에서 관리 인터페이스와 함께 복구된 서비스 간 HTTPS 호출과 내부 엔드포인트에 새 인증서를 자동으로 배포하기 시작했습니다.

이 사고를 분류했던 Live Ops 팀도 이 단계에서 직원들과 소통하고 적절한 인력을 참여시키며 사고를 관리하고 있었습니다. 오후 9시 38분에 Slack에서 협력하던 사람들을 조정하기 위해 Zoom 회의를 시작했습니다. Slack은 좋은 소통 도구이지만, 긴급한 상황에서는 음성이나 비디오를 통한 실시간 소통이 가장 좋습니다. 이 사고에 대한 업데이트는 툴 및 프로세스를 통해 내부 이해 관계자에게 정기적으로 전송되어 모든 사람이 현재 진행 중인 최신 상황을 확인할 수 있도록 했습니다. 이 시점에는 다양한 제품과 팀의 지원센터, 커뮤니티, 엔지니어링 및 프로덕션에서 25명 이상의 사람들이 이 문제에 직접 참여하고 작업했습니다.

하나의 마이크로서비스에 대한 분당 요청 수를 나타내는 그래프 - 인증서 중단으로 인해 감소하고 전체 복구 시 증가

 

원인 제공 요인


내부 서비스 간 통신을 위한 DNS 영역은 저희 인증서 모니터링 서비스에서 적극적으로 모니터링하지 않았습니다. 이는 저희의 실수입니다. 저희 인증서 모니터링 서비스가 개별 엔드포인트나 인증서가 아닌 전체 DNS 네임스페이스를 사용했고 이 내부 영역에 대한 구성이 누락되었습니다. 이후 이 격차를 해결하는 새로운 모니터링 솔루션으로 이 영역을 옮겼습니다. 이 사고가 발생하기 전에 여러 계정에서 AWS Config를 전체적으로 활성화 및 구성하는 프로젝트도 시작했습니다. 전체적으로 이 설정을 사용하면 AWS Config 규칙을 쉽게 추가하여 인증서 만료에 대한 심층 방어 경고를 사용할 수 있습니다

이 내부 인증서에 대해 자동 갱신이 활성화되지 않았으며, 이를 수행하는 데 필요한 작업을 올해 초에 파악했을 때는 우선 순위가 정해지지 않았습니다. 자동 갱신을 용이하게 하는 적절한 시스템과 서비스를 보유하고 있지만, 이러한 기능을 사용하기 위한 마이그레이션은 이 사고 이전에 완료되지 않았습니다. 기존 모니터링 시스템을 통해 인증서 만료의 위험으로부터 실제보다 더 안전하게 보호받고 있다고 생각했습니다. 이 인증서 및 기타 인증서를 자동 갱신으로 전환하는 작업을 수행할 예정입니다. 그동안 모든 인증서에 대한 수동 검사를 완료했습니다.

사용된 서비스 간 와일드카드 인증서는 수백 개의 서로 다른 프로덕션 서비스에 걸쳐 설치되었으며, 이로 인해 그 영향이 매우 광범위했습니다. 이 인증서를 관리하기 위해 AWS ACM(AWS Certificate Manager)을 사용하므로 수백 개의 프로덕션 서비스에서 인증서를 몇 분 만에 갱신하고 신속하게 적용할 수 있었습니다. 만료 문제는 AWS ACM 자체와는 관련이 없지만, 저희의 자체 인증서 관리와는 관련이 있습니다. 인증서의 영향 반경을 분리하고 AWS ACM에서 인증서를 사용할 수 있도록 프로세스를 업데이트할 예정입니다.

 

2) 에픽게임즈 런처 서비스로의 트래픽 증가

대부분의 서비스가 인증서 갱신 직후 복구되었지만, 에픽게임즈 런처 서비스는 사실상 사용할 수 없었습니다.

오후 9시 46분에 인증서를 발급한 이후 요청률이 급증하여 에픽게임즈 런처 클라이언트를 지원하는 핵심 백엔드 서비스인 에픽게임즈 런처 서비스가 압도되었습니다. 요청률이 증가한 이유는 클라이언트의 예기치 않은 재시도 로직 때문이며 이 현상은 실패 시나리오에서만 볼 수 있습니다. 수년간 에픽게임즈 런처에서 많은 복원 작업을 수행했지만, 이러한 요청률 급증 사례는 예상치 못한 일이었습니다. 호스트의 연결 추적 제한에 도달했고 패킷이 플릿에서 드롭되었기 때문에 백엔드 애플리케이션 플릿이 250% 증가했음에도 불구하고 복구가 더욱 어려워졌습니다. 에픽게임즈 런처 서비스에서 연쇄적인 장애와 완전한 중단이 발생했으며 복구하기 위해 트래픽을 백엔드로 제한한 다음, 시스템에 트래픽을 점진적으로 다시 추가하는 동시에 연결 추적 제한을 늘려야 했습니다.

에픽게임즈 런처 클라이언트의 대규모 풋프린트는 에픽게임즈 런처 백엔드 서비스에 대한 수천만 개의 연결을 생성했으며 에픽게임즈 런처 시스템의 구성 요소는 부하로 인해 성능이 저하되었습니다. 복구하려면 백엔드로 가는 트래픽을 줄여야 했습니다. 일반적으로 이 서비스에 사용할 수 있는 버스트 용량이 있지만, 서비스가 중단이 시작될 때 관찰된 28배 부하조차 처리할 수 없었습니다.

에픽게임즈 런처 백엔드 로드 밸런서에 대한 분당 요청 수 그래프. 트래픽은 처음에 28배 증가했고 4월 7일 오전 12시 12분에 최종 버스트는 정상 비율의 40배였습니다.


요청 수가 평소의 28배를 넘었지만, 에픽게임즈 런처 백엔드 서비스에 대한 많은 수의 순 연결로 인해 사용 가능한 연결 추적 공간이 소진되어 패킷 손실이 발생하고 궁극적으로 백엔드 노드의 연결이 저하되었습니다. 백엔드 연결 부하가 정상 비율보다 3200배 증가했습니다. TCP 연결의 증가는 요청 양보다 훨씬 많았습니다.

에픽게임즈 런처 백엔드 로드 밸런서에 대한 분당 새 연결 수 그래프 - 정상 피크에 비해 연결이 3200배 증가

 

원인 제공 요인


만료된 TLS 인증서로 인해 중단이 발생하여 런처 클라이언트에서 예기치 않은 동작이 발생하게 되었습니다. 조사 결과, 클라이언트 재시도가 예상했던 지수 백오프 대신 선형 재시도 로직을 사용한 것으로 드러났습니다. 예상치 못한 추가 버그로 인해 수백만 개의 에픽게임즈 런처 클라이언트의 요청 패턴이 성공적인 응답을 수신할 때까지 지속적으로 그리고 끝없이 재시도했습니다. 클라이언트 설치 기반에서 이 두 가지 버그가 의도하지 않은, 그리고 예기치 않은 호출 패턴을 만들었습니다. 저희는 사실상 클라이언트에 의해 디도스 공격을 받았고, 에픽게임즈 런처 업데이트에서 이러한 버그를 수정하기 위해 긴급히 노력하고 있습니다. 

이 부분에 대한 흥미로운 원인 제공 요인은 초기의 중단 기간입니다. 중단이 오래 지속될수록 더 많은 클라이언트가 잘못된 재시도 로직을 사용하고 백엔드를 계속 호출할 가능성이 높아집니다. 초기 중단 시간이 짧았다면 시스템에 과부하를 일으키기 위해 지속적인 재시도 호출을 수행하는 클라이언트가 충분히 축적되지 않았을 수 있으며, 그 시간 동안의 중단만이 문제였을 것입니다. 호출 패턴 변경을 통해 이 문제를 해결할 예정입니다.

연결 추적에 대한 경고는 잘 파악하지 못했습니다. 이 경고는 에픽게임즈 런처 서비스에 사고가 일어나는 중에 발생했으며, 여러 팀이 이 경고의 의미를 잘 알고 있었지만 경고 설명과 알림이 명확하지 않았으며, 이 상태가 내부 Redis 클러스터와의 연결을 포함하여 이러한 호스트가 수행하는 모든 연결에도 패킷 손실을 야기한다는 것을 알지 못했습니다. Redis 클러스터와의 연결이 저하되면 어떤 일이 일어날 수 있는지 조사하는 팀에게는 매우 힘든 시간이었습니다. 캐싱 메커니즘이 원인의 일부인 것으로 의심되었습니다. 이는 나중에 수십만 개의 연결을 사용하면서 연결 추적 테이블이 가득 차서 생긴 패킷 손실로 발생한 것으로 확인되었습니다. 사건 발생 후, 연결 추적 제한을 노드당 백만 개 이상으로 높였지만, 인프라에서의 연결 추적 증가는 즉각적으로 이루어지지 않아 시간이 좀 걸렸습니다. 이 문제가 해결될 때까지 주요 네트워킹 문제가 발생한다는 점을 명확히 하기 위해 경고를 업데이트할 예정입니다. 

확장으로 인해 새 노드가 연결 추적 제한에 즉시 도달했습니다. 플릿이 연결로 과부하되어 심각한 패킷 손실을 초래했기 때문에, 플릿으로 전송되는 전체 트래픽을 줄이고 허용된 트래픽을 천천히 증가시켜야 했습니다. 먼저 AWS WAF(Web Application Firewall)를 사용하여 인바운드 트래픽의 하위 집합으로 제한하려고 했지만 구성에서 충분한 트래픽을 제한하지 않았습니다. 이는 AWS WAF의 문제가 아니라 저희의 자체 지정된 규칙 집합에서 발생한 문제였습니다. 그런 다음 시간 관계상 AWS 로드 밸런서 대상 가중치를 사용하여 일부 트래픽을 이동시켰으며, 이는 연결 추적 제한의 증가와 함께 궁극적으로 성공적이었습니다. 이 시나리오에서 WAF를 사용함으로써 에픽게임즈 런처 서비스의 복구가 지연되었지만 AWS의 잘못은 아닙니다. 저희는 AWS WAF, 로드 밸런서 대상 가중치 또는 기타 AWS 기술을 사용하여 이와 같은 중요한 상황에서 손실된 트래픽을 긴급하게 로드하는 표준 프로세스를 개발할 예정입니다.

 

3) Epic Games Store 웹사이트 잘못된 에셋

오전 12시 12분에 인증서를 갱신하고 에픽게임즈 런처 서비스를 복구한 후, Epic Games Store를 호출하는 모든 클라이언트의 차단을 해제했습니다. 중단 기간이 길었기 때문에 Epic Games Store에 콘텐츠를 요청하는 클라이언트가 평소보다 훨씬 더 많았고, 자연스럽게 스케일 업되기 시작했습니다. 오전 12시 30분에 남아 있는 영향을 평가하기 시작했습니다.

처음에는 모든 것이 정상으로 보였으나, Epic Games Store의 레이아웃 문제와 오류에 대한 내부 보고서를 받기 시작했으며 이러한 사항들은 저희가 확인하고 재현할 수 있었습니다. 자세한 내용을 조사한 후, 웹 클라이언트(사용자가 epicgames.com을 탐색하는 것이 Epic Games Store와 어떻게 상호작용 하는지)가 CDN에는 없는 고유 에셋 ID를 불러오려고 한다는 것을 발견했습니다. 플릿 전반에 걸쳐 이미 배포된 컨테이너 버전을 확인한 바 모든 버전이 동일했지만, 정말 그렇다면 어떻게 동일한 애플리케이션 버전이 다른 고정 에셋 값을 반환할 수 있었을까요? 

무언가가 잘못되고 있었던 것입니다. 이때가 이번 사고에서 무척이나 혼란스러운 시점이었고, 결국에는 저희가 사용할 수 있었던 신호(예를 들어 배포된 버전)가 허위 신호인 것으로 나타났습니다. Epic Games Store 백엔드의 스케일링을 저희 CDN상의 403 증가와 연관시킬 수 있었고, 이로써 새로운 인스턴스들에 대해 좀 더 자세하게 조사하게 되었습니다. 새로운 인스턴스의 콘텐츠를 로컬로 컬링한 후, 반환되는 콘텐츠가 유효하지 않다는 것을 발견하게 되었습니다. 컨테이너가 전날 생성된 새 CI/CD 워크플로우로 예기치 않게 푸시하는 것까지 추적했으며, 그 외에는 저희가 이번 사고 중 이 시점까지 맞닥뜨렸던 모든 상황과는 아예 연관이 없었습니다. 이러한 결과는 놀라웠지만 이 사실을 발견하고 난 후에 저희는 컨테이너 버전을 이전 버전으로 신속하게 되돌리고, 유효하지 않은 인스턴스를 종료하고, 트래픽을 복구할 수 있었습니다.

이러한 문제는 이 기간 중 진행된 대형 확장 작업 중 언제라도 나타날 수도 있었지만, 저희는 통상적으로 플릿 전반에 걸쳐 헤드룸을 충분히 두기 때문에 에픽게임즈 런처 트래픽으로 인한 Epic Games Store의 대형 확장 전에는 나타나지 않았던 것입니다.

 

원인 제공 요인


인증서 중단이 에픽게임즈 런처 문제를 초래했으며, 복구된 후에는 Epic Games Store에 과도한 양의 요청이 생성되었고, 바로 이 상황이 Epic Games Store 시스템의 스케일 업으로 이어졌습니다. 이러한 스케일 업은 예상한 바였고 환영할 일입니다.

애플리케이션 플릿 전반에 걸쳐 버전 상태에 대한 신호 및 데이터로 인해 저희는 플릿 배포가 일관적으로 수행되었다고 오인했습니다. 그래서 저희 버저닝 계획을 변경하여 향후 이러한 잘못된 진단을 방지할 수 있도록 했습니다.

최근 Epic Games Store CI/CD 파이프라인에 가한 변경 사항들에는 애플리케이션 아티팩트를 예기치 않게 업데이트한 잘못된 구성이 포함되었습니다. 이는 저희 CI/CD 파이프라인을 조정하며 바로 잡았으며, 예기치 않은 변경 사항들도 되돌렸습니다. 변경된 버저닝 계획으로 이러한 상황이 다시 발생하지 않도록 방지할 것입니다.


타임라인(한국 시간 기준)

  • 오후 9시 - 내부 인증서 만료됨
  • 오후 9시 6분 - 사고가 보고되고 사고 관리를 시작
  • 오후 9시 15분 - 첫 번째 대고객 메시지 준비됨
  • 오후 9시 21분 - 다수 팀으로부터 대형 서비스 실패 확인
  • 오후 9시 25분 - 인증서 재발급 절차 시작 확인
  • 오후 9시 37분 - 재발급을 위해 인증서 확인
  • 오후 9시 46분 - 일부 서비스 복구 확인
  • 오후 9시 54분 - 연결 추적이 에픽게임즈 런처 서비스 문제로 발견됨
  • 오후 10시 41분 - 에픽게임즈 런처 서비스 노드 재시작됨
  • 오전 12시 5분 - 연결 추적 제한이 에픽게임즈 런처 서비스를 위해 증가됨
  • 오전 12시 12분 - 에픽게임즈 런처 서비스 복구의 첫 번째 조짐
  • 오전 12시 34분 - Epic Games Store 웹 서비스 확장
  • 오전 12시 59분 - Epic Games Store상에서 누락된 에셋에 대한 첫 번째 보고
  • 오전 1시 57분 - Epic Games Store 웹 서비스의 버전 불일치 문제 발견됨
  • 오전 2시 22분 - Epic Games Store 웹 서비스 버전 수정됨
  • 오전 2시 35분 - 완전 복구


이제부터는 어떻게 되나요?

위의 섹션에서는 예기치 않은 상황과 4월 6일의 중단을 초래한 시나리오에 대해 다루었습니다. 저희가 다음 단계로 취할 조치와 원인 제공 요인에 대해서도 언급했으나, 여기서 다시 요약해보겠습니다. 

이러한 문제에 대한 근본적인 원인이 단 하나만 있는 것은 아닙니다. 기술적 요인 및 조직적 요인을 포함해 헤아릴 수 없이 많은 요인들이 이번 사건의 원인을 제공했습니다. 이번 중단의 범위와 기간은 저희 시스템에 있는 확연한 버그를 발견하게 해주었을 뿐만 아니라(이러한 버그는 앞으로 수정할 계획입니다), 이전에는 의심해 본 적 없는 내부 절차, 특히 인증서 관리를 관장하는 절차도 검토하게 해주었습니다. 

새 인증서 모니터링 시스템으로 이러한 상황에 즉시 대처하고, 기존의 알려진 인증서를 모두 감사했지만, 저희 인증서 모니터링의 격차가 있는지 더 심도 있게 검토하고 모든 AWS ACM 기반 인증서에 AWS Config 모니터링과 같은 사항을 향후 이용을 위해 추가할 예정입니다. 또한, 모든 특정 인증서의 영향 반경도 줄일 예정입니다.

에픽게임즈 런처 클라이언트의 호출 패턴을 심도 있게 검토하고 이 과정에서 발견한 버그를 신속하게 수정하며, 트래픽이 현저하게 증가된 상태에 대응하는 능력도 개선할 예정입니다. 이 플릿에 대한 연결 추적 테이블의 영구 증가로 주요 패킷 손실 없이 유사한 양의 부하를 취급할 수 있게 됩니다. 이번 일은 대형 플릿을 가동하고 있다면 연결 추적 테이블 제한을 점검하라는 조언이자 넷필터 기능을 활용한다면 주의하라는 신호가 될 것입니다. 또한, 클라이언트 내의 재시도 로직 점검 및 이러한 재시도 로직이 긴 시간 동안 중단된 후 전체적으로 어떻게 동작하는지도 점검하는 기회가 되시길 바랍니다.

Epic Games Store의 경우, 라이브 애플리케이션 객체 변경을 방지하는 수정본을 배포했습니다. 또한, 이 과정 중 저희가 알게 에셋 생성 시 버그도 수정했습니다.

이 사고 보고서가 4월 6일에 벌어진 상황에 관해 자세한 내용을 전달해 드렸길 바랍니다. 저희가 배운 점과 개선한 점들을 잘 설명하여, 이를 통해 다른 분들은 이와 유사한 상황을 피하실 수 있길 바랍니다.


저희와 함께해주세요!

본 게시물은 에픽의 Reliability Engineering 팀이 다른 환상적인 엔지니어링 팀들의 엄청난 도움을 받아 작성했습니다.

이런 유형의 문제에 관심이 있으신가요? 게임 및 게임 서비스에 대해 열정이 있으신가요? 에픽은 항상 유능한 인재를 찾고 있으며 모든 재능 방면에서 전 세계적으로 채용하고 있습니다. 채용에 관심이 있으시면 에픽게임즈 채용안내를 방문하세요.

본 게시물이 도움이 되었거나 흥미롭다고 생각하셨나요? [email protected]에서 의견을 나누어 주세요.