SSH 키 입력 난독화, 게임 서버 성능에 치명타!

by DD
4개월 전
조회수 20

SSH는 키 입력 시 키스트로크 타이밍 난독화(Keystroke Timing Obfuscation)를 위해 불필요한 패킷을 전송하여 성능 저하를 유발함

게임 서버 개발자는 SSH를 통해 게임을 운영하던 중, CPU 사용량 50% 감소라는 예상치 못한 결과를 발견함

tcpdump 분석을 통해 36바이트 패킷이 20ms 간격으로 전송되는 현상을 확인하고, 원인을 추적함

키 입력 난독화(Keystroke Obfuscation) 기능을 비활성화하거나, go-crypto 라이브러리를 수정하여 문제를 해결함

SSH 키 입력 난독화(Keystroke Obfuscation)의 원리

SSH는 보안 강화를 위해 키 입력 타이밍(Keystroke Timing)을 숨기는 키 입력 난독화(Keystroke Obfuscation) 기능을 사용한다. 이는 사용자의 키 입력 간격을 분석하여 입력 내용을 추론하려는 공격을 방지하기 위함이다. 기술적으로 보면, 키 입력을 할 때마다 36바이트 크기의 'chaff' 패킷을 추가로 전송하여 실제 키 입력 시점을 숨긴다. 하지만, 이 기능은 게임 서버와 같이 낮은 지연 시간(Low Latency)이 중요한 환경에서는 불필요한 오버헤드를 발생시킨다.

성능 저하 문제의 발견과 분석

게임 서버 개발자는 SSH를 통해 게임을 운영하던 중, 테스트 환경에서 CPU 사용량 50% 감소라는 예상치 못한 결과를 발견했다. 이는 게임 데이터 전송 오류로 인해 발생한 것으로, tcpdump를 사용하여 네트워크 트래픽을 분석한 결과, 키 입력 시 20ms 간격으로 36바이트 크기의 패킷이 다량 전송되는 것을 확인했다. 이러한 현상은 SSH의 키 입력 난독화(Keystroke Obfuscation) 기능으로 인해 발생하며, 게임 서버의 성능 저하를 유발하는 주요 원인으로 작용했다.

문제 해결을 위한 다양한 시도

개발자는 SSH 클라이언트 설정에서 ObscureKeystrokeTiming=no 옵션을 사용하여 키 입력 난독화 기능을 비활성화하는 방법을 시도했다. 하지만, 이는 사용자에게 추가적인 설정을 요구하는 불편함이 있었다. 더 나아가, Go의 SSH 라이브러리에서 [email protected] 확장을 사용하지 않도록 코드를 수정하여, 서버 측에서 키 입력 난독화 기능을 제어하는 방법을 모색했다. 이 과정에서 LLM을 활용하여 문제 해결에 필요한 정보를 얻고, 코드 변경을 용이하게 수행했다.

LLM(Large Language Model)을 활용한 디버깅 경험

저자는 LLM을 활용하여 문제 해결 과정을 가속화하고, 기술적 통찰력을 얻었다고 언급한다. 특히, tcpdump 분석 결과를 LLM에 제공하여 문제의 원인을 파악하고, 해결 방안을 모색하는 데 도움을 받았다. LLM은 복잡한 네트워크 트래픽 데이터를 분석하고, 관련 기술 정보를 제공하는 데 유용하게 활용되었다. 하지만, LLM의 답변이 항상 정확하지는 않으며, 개발자의 비판적 사고와 검증이 필요하다는 점을 강조한다.

성능 개선 결과 및 향후 과제

Go SSH 라이브러리 수정 후, CPU 사용량이 29.90%에서 11.64%로, 시스템 콜(System Calls) 시간이 3.10초에서 0.66초로, 암호화(Crypto) 시간이 1.6초에서 0.11초로 감소하는 등, 괄목할 만한 성능 개선을 이루었다. 하지만, 라이브러리 포킹(Forking)에 따른 유지보수 부담과 보안 취약점 발생 가능성에 대한 고민이 필요하다. 또한, SSH 키 입력 난독화 기능의 필요성과 게임 서버 성능 간의 균형을 맞추기 위한 추가적인 연구가 필요하다.

Why does SSH send 100 packets per keystroke?