본문으로 건너뛰기

대규모 Rails 애플리케이션의 보안 관리: Shopify의 사례와 전략

RailsConf 2019 - Rails Security at Scale by Jack McCracken

작성자
발행일
2019년 05월 29일
https://www.youtube.com/watch?v=MpsrQKieytY

핵심 요약

  • 1 대규모 조직에서 소수의 보안 팀이 다수의 개발자를 관리하는 것은 불가능하므로 보안을 개발 문화에 내재화하고 기본적으로 안전한 시스템을 구축해야 합니다.
  • 2 html_safe와 같은 위험한 메서드 사용을 제한하고 activerecord-firewall과 같은 도구를 통해 실수로 인한 데이터 노출을 방지하는 기술적 가드레일을 마련해야 합니다.
  • 3 보안 교육을 해킹 배우기와 같은 흥미로운 워크숍이나 CTF 형식으로 제공하여 개발자들이 보안에 스스로 관심을 갖고 책임감을 느끼도록 유도하는 것이 핵심입니다.

도입

Shopify의 보안 엔지니어 Jack McCracken은 RailsConf 2019에서 급격히 성장하는 대규모 Rails 환경에서의 보안 관리 전략을 공유했습니다. Shopify는 수천 명의 직원과 수십만 명의 상인을 보유한 거대 플랫폼으로, 매일 수백 건의 배포가 이루어지는 복잡한 환경입니다. 이러한 규모에서 단 10명의 보안 팀원이 모든 코드를 감시하는 것은 물리적으로 불가능합니다. 따라서 Shopify는 보안을 단순한 규제가 아닌 시스템 설계와 기업 문화의 일부로 통합하는 방식을 택했습니다. 본 강연은 기술적 도구부터 문화적 접근까지, 대규모 서비스가 보안을 유지하기 위해 반드시 고려해야 할 세 가지 핵심 기둥을 제시합니다.

1. 기본적으로 안전한 설계 (Safe by Default)

대규모 환경에서는 개발자가 의식하지 않아도 보안이 유지되는 구조를 만드는 것이 중요합니다.

  • 위험한 메서드의 재정의: Rails의 html_safe는 문자열을 안전하게 만드는 것이 아니라 이스케이프를 생략하게 하여 XSS(Cross-Site Scripting) 취약점을 유발할 수 있습니다. Shopify는 이를 방지하기 위해 dangerously_output_as_html로 이름을 변경하여 개발자가 위험성을 인지하게 하고, RuboCop을 통해 html_safe 사용을 엄격히 제한합니다.
  • 자동화된 검사 도구: erb-lint를 사용하여 JavaScript 컨텍스트 내의 안전하지 않은 데이터 삽입을 감지합니다. 또한 CautionTapeBot을 활용하여 PR(Pull Request)에서 위험한 패턴이 발견되면 자동으로 보안 리뷰어를 할당하고 가이드를 제공합니다.
  • CSRF 방어: skip_before_action :verify_authenticity_token과 같이 보안 설정을 해제하는 패턴을 봇으로 감시하고, 표준적인 protect_from_forgery 사용을 권장합니다.

2. 실수를 치명적이지 않게 만들기 (Fail-Safe Systems)

개발자의 실수가 곧바로 대규모 데이터 유출로 이어지지 않도록 보호 계층을 구축해야 합니다.

  • IDOR 방어: IDOR(Insecure Direct Object Reference)는 사용자가 권한 없는 객체 ID에 접근할 때 발생합니다. Shopify는 activerecord-firewall이라는 오픈소스 젬을 개발하여 모델 수준에서 현재 사용자의 소유권을 강제로 확인합니다. 이를 통해 권한 없는 접근 시 시스템이 자동으로 차단하며, 이는 테스트 코드의 정확성을 높이는 부수적인 효과도 가져옵니다.
  • Watchtower 스캔: GraphQL, Sidekiq, Graphical 등 외부에 실수로 노출되기 쉬운 엔드포인트를 주기적으로 스캔하여 200 OK 응답이 발생하는지 모니터링합니다.
  • 버그 바운티 프로그램: 아무리 완벽한 시스템도 취약점이 있을 수 있습니다. HackerOne을 통해 외부 보안 연구원들에게 보상을 제공함으로써 SSRF(Server-Side Request Forgery)와 같은 복잡한 취약점을 사전에 발견하고 수정합니다.

3. 보안 문화와 교육 (Making Security Cool)

보안은 강요되는 것이 아니라 개발자가 스스로 실천하고 싶은 흥미로운 분야가 되어야 합니다.

  • Learn to Hack 워크숍: 지루한 규정 교육 대신 실제 취약점을 공격해보는 워크숍을 운영합니다. Google의 ‘Gruyere’나 ‘Rails Goat’와 같은 취약한 애플리케이션을 활용하여 개발자들이 직접 해커의 관점에서 시스템을 바라보게 합니다.
  • CTF (Capture The Flag) 대회: 할로윈 해커페스트와 같은 이벤트를 통해 보안 문제를 풀고 깃발을 찾는 게임화된 교육을 실시합니다. 이는 개발자들의 참여도를 극적으로 높이며, 실제 서비스에서 발생했던 취약점을 문제로 만들어 교육 효과를 극대화합니다.
  • 공동 책임 의식: Shopify의 모든 개발자는 자신의 코드가 80만 명 이상의 상인들의 생계에 영향을 미친다는 책임감을 공유합니다. 보안 팀은 개발자를 감시하는 경찰이 아니라 그들이 안전하게 목표를 달성하도록 돕는 파트너 역할을 수행합니다.

결론

결론적으로 대규모 Rails 보안의 핵심은 자동화와 문화적 통합에 있습니다. Jack McCracken은 보안 도구가 개발자를 가르치려 들기보다 성인으로 대우하며 안전하게 작업할 수 있도록 도와야 한다고 강조합니다. 모든 실수를 막을 수는 없지만, 실수가 발생했을 때 시스템이 이를 방어할 수 있는 가드레일을 구축하고 개발자들이 보안을 즐거운 도전으로 받아들이게 함으로써 Shopify는 수백만 명의 비즈니스를 보호할 수 있었습니다. 이는 대규모 서비스를 운영하는 모든 팀에게 기술적 가드레일과 보안 문화 형성이라는 두 마리 토끼를 잡아야 한다는 중요한 시사점을 제공합니다.

댓글0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

0/1000
정중하고 건설적인 댓글을 작성해 주세요.