外に開く前提で、
作っています。

配信のサーバーは、インターネットからの接続を受け、外部のサービスにも自分から接続します。守るべき所が多いので、SENCA では守りを 5 つの面に分けて組み立てています。誰が使えるか、何を見せるか、何を守るか、どこへつなぐか、壊れたときにどうするか、です。

Layer 1of 5

誰が使えるか

  • API トークン

    senca_ で始まる 32 バイトの乱数です。サーバーには SHA-256 のハッシュ値だけを保存し、照合は処理時間から中身を推測されない方法(定数時間の比較)で行います。トークンの値が返るのは、作成したときだけです。

  • 8 種類の権限

    stream:read・stream:write・publish・subscribe・recording:read・recording:delete・tenant:admin・node:admin の 8 種類です。ほかのトークンには、自分が持っている権限しか与えられません。

  • テナント

    どのテナントの操作かは、認証の情報から決まります。要求の本文に書いた値は使いません。ほかのテナントの資源を指定すると、404 が返ります。

  • JWT

    自社の認証の仕組みが発行した JWT を使えます。検証には、手元に置いた JWKS(公開鍵の一覧)を使います。使える署名の方式は EdDSA・ES256・RS256(2048 ビット以上)で、none と HS 系は使えません。

  • 最初の管理者トークン

    初めて起動したときに作り、パーミッション 0600 のファイルに書き出します。既定のパスワードはありません。

Layer 2of 5

何を見せるか

  • ストリームキー

    sk_ で始まる乱数です。ハッシュ値だけを保存します。再発行すると、古い鍵は使えなくなります。WHIP では、期限付きの publish 権限のトークンをキーの代わりに使えます。

  • 署名付きの再生 URL

    HMAC-SHA256 の署名と期限(既定 300 秒)が付いた URL です。期限が切れたものや署名が合わないものは 403 になります。ライブ、VOD、RTMP・RTSP での再生、WHEP、MoQ で使います。

  • ルームの参加トークン

    Ed25519 で署名した、JWT と互換のあるトークンです(既定の有効期間は 600 秒)。参加してよいかを自社のサーバーに問い合わせる Webhook も使えます。

  • エンドツーエンド暗号化のルーム

    エンドツーエンドで暗号化したルームでは、サーバーが中身を処理する操作(合成・字幕・静止画など)を 422 で断ります。

Layer 3of 5

何を守るか

  • シークレットの暗号化

    AES-256-GCM で暗号化して保存し、API からは読み出せません。テナントと ID を暗号に結び付けているので、暗号文を別の資源へ移しても復号できません。

  • クラスターの鍵

    クラスターシークレットから HKDF-SHA256 で作った鍵で、データを暗号化する鍵を包み、全ノードへ複製します。コントロールプレーンのデータを写しただけでは、シークレットを復号できません。

  • 秘密をログに出さない

    ストリームキー・トークン・API キーは、ログ・エラーの応答・監査ログに出しません。二重実行を防ぐために保存しておく応答からも取り除きます。

  • データディレクトリ

    鍵とトークンのファイルは 0600 にします。control/ のディレクトリは、起動するたびに 0700 にします。

Layer 4of 5

どこへつなぐか

  • 外部への接続の制限

    取りに行く入力(pull)・送信・字幕・クラウド連携・Webhook の宛先は、名前を IP アドレスに変換した後で確かめます。ループバック、リンクローカル(クラウドのメタデータのアドレスを含む)、プライベートアドレスへは、許可した範囲にだけつなぎます。

  • ノード間の mTLS

    Raft と中継の通信を、クラスター用の認証局の証明書で互いに確かめ合う TLS にできます。ノードの認証には、クラスターシークレットも使います。

  • HTTPS・RTMPS・QUIC

    TLS 1.3 で受け付けます。使える鍵は ECDSA P-256・RSA・Ed25519 です。

Layer 5of 5

壊れたときに

  • コーデックの隔離

    外部のコーデックのライブラリは別のプロセスで動かし、seccomp-BPF でネットワーク・プログラムの実行・ptrace などを禁止します。Landlock で /dev 以外への書き込みを禁止し、rlimit で使える資源を制限します。

  • 異常の切り離し

    別プロセスが異常終了したり、応答しなくなったり、おかしな結果を返したりしても、失敗するのはその処理だけで、別プロセスは起動し直されます。ノード本体は止まりません。

  • 厳密な読み取り

    信頼できない入力(RTMP・TS・MP4・HTTP・SDP・RTP など)を読み取るとき、異常終了(panic)、終わらない処理、際限のないメモリの確保が起きたら、脆弱性として扱います。

  • 要求の数の上限

    IP アドレスごと・トークンごとの要求の数、認証に失敗した回数、新しい接続の数に上限を設けています。上限を超えると 429 を返します。

  • 監査ログ

    状態を変える操作について、誰が(トークン ID や JWT の sub)・いつ・何に対して行ったかを、1 行に 1 つの JSON で記録します。

使う前に知っておきたいこと

  • 通信の方式は、SENCA 自身で実装しています。TLS・DTLS・SRTP・SRT の暗号化と、QUIC の接続の手順・データを暗号化して運ぶ部分が SENCA の実装です。暗号の計算には、検証されたライブラリを使っています。
  • 署名付き URL は、知っている人なら期限まで使えます。URL を視聴者ごとに結び付けたり、取り消したりする仕組みはありません。期限は短くし、必要になるたびに発行してください。
  • 再生 URL の署名に使う鍵は、コントロールプレーンのデータに入っています。データディレクトリとバックアップは、専用のユーザーで動かすなどして守ってください。
  • 修正は、最新の版に対して行います。古い版への修正の取り込みや、対応までの時間は保証していません。最新の版に上げてお使いください。

脆弱性の報告

公開の issue には書かず、
非公開でお知らせください。

GitHub の非公開の脆弱性報告(Private vulnerability reporting)をお使いください。報告の内容は、報告した方と開発者にだけ見えます。実際のストリームキーやトークンは書かず、別の文字に置き換えてください。

設定の詳しい手順は、ドキュメントのセキュリティのページにあります。

次のページ 導入