pile·
보안·AWS KoreaAWS Korea Tech·

AWS IoT Core를 활용한, ‘우아한형제들’의 실외배달 로봇과 클라우드 리소스의 안전한 연결 구축기

우아한형제들의 실외배달 로봇 딜리가 AWS IoT Core 에 붙는 구조를 3단계로 풀어낸 글이다. 관리자 개입 없는 자동 등록, 로봇 간 완전 격리, 영구 키 없는 클라우드 리소스 접근이 각각 Fleet Provisioning, IoT Policy, Credential Provider 로 대응된다.

핵심 포인트
  • 제로 터치 등록을 위해 공통 클레임 인증서를 미리 심고, 첫 연결 때 개별 Device Certificate 를 발급받게 했다
  • Pre-Provisioning Hook 의 Lambda 로 시리얼 중복·비정상 등록을 걸러 2단계 검증을 만들었다
  • Policy 에서 토픽을 자기 ClientId 하위로 묶어 로봇 A 가 로봇 B 데이터에 닿을 수 없게 했다
  • CONNECT 시 인증서에 붙은 Thing 이름과 ClientId 가 일치할 때만 연결을 허용해 ClientId 도용을 막았다
  • 로봇이 S3·DynamoDB·CloudWatch 에 직접 붙되 영구 키를 두지 않도록 Role Alias 로 1시간짜리 임시 자격증명을 발급한다
상세 정리
  • 문제 1: 수백 대 규모에서 사람이 등록을 붙잡으면 확장이 안 되지만, 자동화하면 무단 연결 위험이 생긴다
  • 문제 2: 중앙은 모든 로봇 데이터를 모아야 하는데 로봇끼리는 서로를 못 봐야 하는 모순이 있다
  • 문제 3: 로봇은 개별 자율주행 주체이면서 동시에 배달 군체의 일부라 경로·지도를 실시간 공유해야 한다
  • 등록 방식: Provisioning by Claim 으로 출고 시 클레임 인증서를 탑재하고 첫 연결에서 교체한다
  • 템플릿 동작: RobotId 와 Serial 을 받아 Thing 과 Certificate 를 만들고 Thing Group 에 자동 편입한다
  • 재등록 보호: OverrideSettings 를 DO_NOTHING 으로 두어 재등록 시 기존 속성이 덮이지 않게 했다
  • 클레임 정책 범위: 인증서 생성 토픽과 프로비저닝 템플릿 토픽에 대한 Connect 권한만 주어 등록 외 행위를 차단했다
  • 격리 강제: Policy 조건에 AWS 가 검증하는 값을 써서 인증서와 ClientId 의 결합을 서버 측에서 확인한다
  • 수집 통합: 모든 로봇의 telemetry 토픽을 와일드카드 하나로 받는 단일 IoT Rule 로 묶었다
  • 비용 최적화: Rule 을 여러 백엔드 연결 대신 하나로 합치고 SQL 필터로 필요한 필드만 통과시켜 메시지 비용을 줄였다
  • 백엔드 연결: SQS 로 포워딩해 백엔드가 pull 방식으로 받게 하여 트래픽 급증을 흡수한다
  • 임시 자격증명 흐름: Device Certificate 로 mTLS 인증 후 credentials 엔드포인트를 호출하면 STS 가 1시간 유효 키를 준다
  • 최소 권한: S3 Role 은 특정 버킷 PutObject 만, CloudWatch Role 은 로그 그룹 생성과 이벤트 기록만, DynamoDB Role 은 읽기만 갖는다
왜 읽나대수가 늘어나는 디바이스 플릿을 운영하며 등록 자동화와 테넌트 격리를 동시에 만족시켜야 하는 팀에게 IoT Core 구성의 실제 조합을 보여준다.
AWS Korea
AWS Korea Tech 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 보안·gitlab-engGitLab Blog·

    Serena MCP 에이전트의 치명적 원격 코드 실행 취약점 분석

    GitLab 보안팀이 AI 코딩 에이전트 Serena(월 PyPI 다운로드 13.6만 건)에서 치명적 원격 코드 실행 취약점을 발견했다. Jinja2 비샌드박스 환경과 신뢰 모델의 미검사 경로가 결합해 개발자가 악의적 저장소를 열기만 해도 코드가 실행된다. serena-agent 1.7.0에서 SandboxedEnvironment 교체로 수정 완료됐다.

    요약 이어보기
    #mcp#security#rce+2