セキュリティ
何がネットワークの外に出るか(何も出ません)、どのポートが開いているか、シークレットはどこにあるか、そしてやる価値のあるハードニング。
何がネットワークの外に出るか
当社の都合でネットワークの外に出るものは、何もありません。
ライセンス検証は、ビルドに埋め込まれた公開鍵に対するローカルの署名検証です。一度もオンラインになったことのないインスタンスも、まったく同じように動きます。
レコード、ドキュメント、添付ファイル、エージェントとの会話は、お客様のインフラに留まります。無効化すべきテレメトリ設定はありません — 送るテレメトリが存在しないからです。
例外はお客様自身が外部に向けて設定したもの — 外部 S3 エンドポイント、SMTP サーバー、LLM API などのエージェントプロバイダーです。それらはお客様の選択であり、それぞれがデータの出口になり得ます。エアギャップ構成では単にそれらを設定しません。
ポート
| ポート | 公開 | 説明 |
|---|---|---|
3000/tcp | はい、これがアプリ | 前段に TLS を置く |
Postgres 5432 | いいえ | コンテナネットワーク内のみ |
SeaweedFS 8333 | はい、オブジェクトストレージ | ブラウザが添付ファイルを直接取得するため到達可能である必要あり — 同じく TLS の後ろに置く |
SeaweedFS 9333 | いいえ | コンテナネットワーク内のみ |
公開ポートは 2 つで、どちらも同じリバースプロキシの後ろに置きます。オブジェクトストレージを公開するのは、製品がストレージ URL をブラウザに渡すためです(アップロードは presigned PUT、ダウンロードはリダイレクト。Busabase Cloud で S3 に対して行うのと同じ形)。アクセス制御は署名付き URL と認証情報によるもので、「到達できないこと」に依存していません。
これ以外は何も公開しないでください — 特に「ちょっとデータベースを見たいから」と -p 5432:5432 を足すのはやめましょう。docker compose exec postgres psql を使ってください。
シークレットの所在
| シークレット | 場所 | 備考 |
|---|---|---|
| Postgres パスワード | .env(Compose)または /data/.credentials(オールインワン) | 生成されるもので、イメージには焼き込まれません |
| オブジェクトストレージのキー | .env と seaweed-s3.json | 2 ファイル、一致必須 — init.sh が担当します |
| セッション署名鍵 | BETTER_AUTH_SECRET | 漏れると誰でもログイン済みセッションを偽造できます |
これらはすべてデプロイごとに生成されます。同じイメージを pull した 2 社がシークレットを共有することはなく、当社もお客様のシークレットを知ることはありません。
/data/.credentials は 600 です。init.sh が書く .env も 600、backup.sh の出力も 600 になります。これらを持ち回るときはパーミッションを維持してください。
特に注意すべきは BETTER_AUTH_SECRET です。データベースのパスワードが漏れても悪用にはデータベースへの到達が必要ですが、セッション署名鍵はログインページに到達できる場所ならどこからでも使えます。共有ドキュメント・チャット・git リポジトリに一度でも入ったことがあるならローテーションしてください — 既存セッションはすべて無効になりますが、それが目的です。
最小権限
Compose 構成のアプリコンテナは非 root ユーザーで動きます。オールインワンイメージはコンテナ内で root で動きます — supervisord がデータベースプロセスのために postgres へ権限を落とす必要があるためです。アプリ自体は公開ポート経由でしか到達できません。
ポリシーでコンテナ内 root が禁止されている場合は Compose 構成を使ってください。正直なところ、今日オールインワンを rootless にするフラグはありません。
やる価値のあるハードニング
- プロキシで TLS を終端し、
APP_URLをhttps://のアドレスにする。セッション cookie はAPP_URLに従うので、これは見た目の問題ではなくセキュリティ設定です。 - ポート 3000 に到達できる相手をファイアウォールで制限し、プロキシのみに絞る。
.envと/data/.credentialsを本番と同等以上の保護下にバックアップする。SYSTEM_ADMIN_EMAILを実在する監視されたアドレスに設定し、既定値のままにしない。BETTER_AUTH_SECRETは漏洩が疑われた時点でローテーションする(全員がログアウトされることを受け入れて)。
監査
Premium はレコードとドキュメントの変更履歴を保持し、システム管理コンソールから監査ログをエクスポートできます。これがカバーするのは「Busabase の中で誰が何を変えたか」です。ホストレベルのアクセスはカバーしません — docker exec でコンテナに入れる人は、ここに書かれたすべての統制を迂回しているので、ホストへのシェルアクセスこそが本当の信頼境界だと考えてください。