학교에서 자유학기제의 일환으로 IP 카메라의 취약점을 탐구하는 과제를 진행하고 있다.
개념 실증용으로 라즈베리파이에 USB 카메라를 연결하여 간이 IP 카메라를 만들었고, 통신 프로토콜로는 자주 사용되는 것으로 보이는 RTSP를 사용하기로 했다.
다만 RTSP는 암호화된 프로토콜이 아니기 때문에 중간에서 정보를 탈취당할 수 있다. RTSPS(RTSP Over SSL)이라는 좋은 친구가 있는 것 같지만, 우선 떠올릴 수 있는 방법이었던 SSH 터널링을 이용한 RTSP Over SSH... 형태로 보안 연결을 시도해 보았다.
Real Ttime Streaming Protocol의 줄임말로 오디오, 비디오 등의 미디어 서버를 원격으로 제어하는 프로토콜이다.
RTSP로 실제 미디어 데이터를 전송하지는 않고, 대부분 RTP: Real-time Transport Protocol을 별도로 사용하여 미디어 데이터를 전송한다고 한다.
RTSP에는 세션 개념이 존재한다. 요청자는 고유한 ID를 가지며 PLAY, PAUSE 등의 명령어를 사용하여 미디어 서버를 제어한다.
리눅스에서 RTSP 서버는 mediaMTX로 쉽게 구축할 수 있다. 라즈베리파이는 arm 아키텍처고, 글 작성 시점 기준 최신 버전은 1.6.0이다.
$ wget https://github.com/bluenviron/mediamtx/releases/download/v1.6.0/mediamtx_v1.6.0_linux_armv7.tar.gz
$ tar -xzvf mediamtx_v1.6.0_linux_armv7.tar.gz
$ rtspServer={your-ip}:rtsp://{your-ip}:8554/stream ./rtsp-simple-server &
단 세 줄로 RTSP 서버를 구축할 수 있다. 이제 VLC와 같은 미디어 플레이어에서 RTSP 프로토콜로 서버에 접속할 수 있다.
다만 아직 미디어 스트림은 설정하지 않았으므로 FFmpeg같은 라이브러리로 카메라 디바이스를 미디어 스트림으로 변환하고, 이걸 RTSP 서버에 붙여줘야 한다.
$ ffmpeg -f v4l2 -framerate 24 -video_size 640x480 -i /dev/{camera_device} -f rtsp -rtsp_transport tcp rtsp://{your-ip}:8554/stream
라즈베리파이 컴퓨팅 성능의 한계인지 나의 한계인지 영상이 상당히 끊겨 보였다. 테스트 용도로 사용할 것이므로 일단 넘어갔다...
SSH는 Secure SHell의 약자로 암호화된 쉘이다. 근데 이것이 SSH를 통해 포트를 포워드하는데 쓸 수도 있고, 이걸 SSH 포트포워딩 또는 SSH 터널링이라 일컽는다.
SSH 터널링을 통해 암호화되지 않은 프로토콜을 안전하게 사용할 수 있다.
서버 쪽에서는 SSH 서버만 설치해두면 되고, 클라이언트 쪽에서 다음 명령어를 사용하면 된다.
$ ssh {port}:localhost:8554 {username}@{server-ip}