ベータ版OmniPMで運営していただける事業者を募集しています — 最初の12か月は50%オフ。申し込む

会社情報セキュリティ

運営事業者のデータは、その事業者だけのもの。データベースの1行単位まで。

OmniPMは、多くの運営事業者のパスポート、契約書、支払いの証憑、そしてオーナーの資金を、ひとつのプラットフォームで扱っています。それぞれをどのように分離し、何を暗号化し、誰が何を見られるのかを、具体的にご説明します。

通信の暗号化HTTPSのみ · HSTS preload
運営事業者の認証情報(保存時)AES-256-GCM
パスワードとコードbcrypt(cost 12)
本人確認書類・支払いの証憑非公開バケット · 1時間有効のリンク
リリース前のチェック11項目(データ分離の監査を含む)

運営事業者ごとのデータ分離

コードベースもデータベースもひとつ。すべての行に運営事業者を記録。誰のデータかを示せないリクエストは、推測せずに拒否します。

01

リクエスト

スタッフ、入居者、またはWebサイトが、セッションCookieかハッシュ化されたAPIキーでOmniPMを呼び出します。

session → operator_id
02

運営事業者の特定

セッションから運営事業者を特定し、リクエストの最後まで保持します。後続の処理が推測する必要はありません。

AsyncLocalStorage
03

データ層

すべての読み取りは絞り込まれ、すべての書き込みには運営事業者が記録されます。別の運営事業者を指定した書き込みはエラーになります。

where: { operatorId }
04

データベース側の安全装置

運営事業者の列は空にできません。別の運営事業者の親レコードの下に子レコードを作ろうとすると、トリガーが拒否します。

NOT NULL · triggers

生のSQLはファイル単位で許可リストに登録し、各クエリの絞り込み方法も記録しています。新たに追加されたものは監査で不合格になります。

データ分離のテストはテストスイートで実行しており、データ分離の監査は毎回のリリース前に行う11項目のチェックのひとつです。

セキュリティ対策を、わかりやすい言葉で。

ログイン、セッション、ファイル、決済、メッセージ、AIについて私たちが行っていること。監査担当者ではなく、運営事業者の方に向けて書いています。

ログイン

パスワードとワンタイムコードはハッシュ化した形でのみ保存します。コードの有効期限は10分で、5回間違えると使えなくなります。

セッション

ログイン状態は一定時間で自動的に切れ、ログアウト時には確実に終了します。無効化されたアカウントは即座に締め出されます。

運営事業者ごとの分離

データベースへのリクエストはすべて、ひとつの運営事業者に紐づきます。誰のデータかを示せないリクエストは拒否されます。

権限に応じたアクセス

現場スタッフは割り当てられた画面だけを利用できます。オーナーが見られるのは自分の建物だけで、入居者の連絡先や本人確認書類は見られません。

非公開ファイル

パスポート、本人確認書類、支払いの証憑は非公開ストレージに保管され、開けるのはスタッフか、1時間以内に失効するリンクだけです。

決済

カード番号は保存せず、ご利用の決済サービスが保持します。決済とメッセージングのキーは暗号化しています。

検証済みの通知

決済サービスやメッセージングサービスからの通知は、OmniPMが処理する前に署名を検証します。

AIのアクセス

入居者データへのAIのアクセスは初期設定でオフです。スタッフごとに付与する読み取り専用の権限で、参照はすべて記録されます。

権限とアクセス

見られるのは、業務に必要な情報だけ。それ以上は見せません。

オーナーが入居者の連絡先、本人確認書類、支払い状況を見ることはありません。業者にはログインなしで、リンクから1件の作業だけを共有します。無効化されたアカウントは、次のクリックで拒否されます。

ロール閲覧できる範囲ログイン方法
事務スタッフダッシュボード全体パスワードまたはメールで届くコード
清掃・現場スタッフ自分の訪問予定と作業(スマートフォンで)メールで届くコード
ハウスリーダー自分が住む建物の当番メールで届くコード
業者1件の作業:チェックリスト、写真、作業時間非公開リンク
オーナーオーナーポータルと自分の建物メールで届くコード
ゲスト・入居者チェックインリンクまたは入居者ポータルリンクのパスワードまたはコード

開発者の方へ

実装されている仕組みを、具体的に。

パスワードとコードbcrypt(cost 12)。ワンタイムコードは6桁で、有効期限10分、試行5回まで、1回限り有効です。
セッション署名付きJWTを、httpOnly・Secure・SameSite=LaxのCookieに格納します。有効期間はスタッフ24時間、入居者7日間で、ログアウト時にはサーバー側で失効させます。
保存時の認証情報決済、メッセージング、Google、電子署名の運営事業者用認証情報はAES-256-GCMで暗号化し、保存後は二度と表示しません。
通信とヘッダーHTTPSのみ(HSTS preload)。nosniff、フレーム・リファラーの各ポリシー、リクエストごとのnonceを使ったCSPを設定しています。
ファイル非公開バケットに保管します。開けるのは同じ運営事業者のスタッフセッション、または1時間有効なHMAC署名付きリンクのみです。
APIとWebhookAPIキーはSHA-256のハッシュでのみ保存し、権限範囲を限定でき、無効化も可能です。外部サービスからのペイロードは署名を検証します。
契約書署名用リンクには256ビットのトークンを付与し、ハッシュでのみ保存します。署名済みPDFには封印とタイムスタンプ(RFC 3161)を施します。
実行環境Dockerコンテナを非rootユーザーで実行します。マイグレーションは起動時に適用し、失敗した場合はデプロイをロールバックします。

データの委託先

OmniPMが利用しているサービスです。決済とメッセージングのアカウントはお客様ご自身のもので、お客様のキーで接続します。

RailwayアプリケーションのホスティングとPostgreSQLデータベース
Cloudflare R2非公開ファイルの保管:本人確認書類、写真、契約書
AnthropicAI:本人確認書類と支払いの確認、下書き、翻訳
Resendログインコードと通知メール
Square、PayPal、Wise決済(お客様ご自身のアカウント)
LINE、WhatsAppメッセージング(お客様ご自身のアカウント)
Googleカレンダー、スプレッドシート、ドライブ(連携した場合)
freee会計データの同期(連携した場合)

セキュリティのロードマップ

  • スタッフ向けの二要素認証
  • 本人確認書類の写真について、保存期間のルールを公開
  • 第三者による侵入テスト
  • AIとお客様のデータに関する方針の公開

脆弱性の報告

詳細と再現手順を添えて、security@omnipm.app までご連絡ください。

セキュリティ質問票へのご回答が必要ですか?お客様のチームと通話で、一つひとつご説明します。

ベータ版に申し込む