ownCloud Infinite Scale(oCIS)を試してみる

https://owncloud.dev/ocis
↑だいたいここに全部書いてある

oCISとは

bewCloudには入門できなかったのでownCloud Infinite Scaleの門戸を叩いてみる

構築

どういうのを想像してるのか

  • Google Driveっぽい操作性のファイルストレージ
  • 誰かをワークスペースに招待したり、Google Driveライクに権限管理が出来る
  • 任意の第三者が閲覧できるパスワード付きURLを発行できる
  • シングルインスタンスでざっくり動く

シングルインスタンス、マルチコンテナで構成します

$ cd ~/ocis
$ mkdir ocis-config && mkdir ocis-data && mkdir thumbnails
$ touch .env
$ touch docker-compose.yml
$ ls -a .
.  ..  docker-compose.yml  .env  ocis-config  ocis-data  thumbnails

こんなフォルダ構成にしておく。

services:
  ocis:
    # https://hub.docker.com/r/owncloud/ocis/tags
    image: owncloud/ocis:7.1.2
    user: 1000:1000
    ports:
      - 127.0.0.1:9200:9200
    entrypoint:
      - /bin/sh
    command: ["-c", "ocis init || true; ocis server"]
    environment:
      OCIS_URL: ${OCIS_URL}
      OCIS_LOG_LEVEL: error
      PROXY_TLS: false
      OCIS_INSECURE: true
      PROXY_ENABLE_BASIC_AUTH: false
      IDM_ADMIN_PASSWORD: ${IDM_ADMIN_PASSWORD} # 管理者はadmin:${IDM_ADMIN_PASSWORD}でログインできる
      # まだ読解できてない。コンテナはGRPCをリッスンする?
      SETTINGS_GRPC_ADDR: 0.0.0.0:9191
      GATEWAY_GRPC_ADDR: 0.0.0.0:9142
      STORAGE_USERS_DATA_GATEWAY_URL: http://localhost:9200/data
      THUMBNAILS_FILESYSTEMSTORAGE_ROOT: /var/lib/ocis-thumbnails
    volumes:
      - ./ocis-config:/etc/ocis
      - ./ocis-data:/var/lib/ocis
      - ./thumbnails:/var/lib/ocis-thumbnails
    logging:
      driver: "local"
    restart: always

docker-compose.ymlはこんな感じ(.envで変数は適宜いい感じにしてあげる)
後はTLS終端のNginxからリバースプロキシで127.0.0.1:9200に向けて開放してあげれば良い。

環境変数はモジュールごとのリファレンスは存在するが見通しは悪い()ので、一旦適当に立ち上げてから困ったときに書き換えてゆく位が良いと思う
※OCIS_URL, IDM_ADMIN_PASSWORDあたりは自分で決めたほうが良さそう

というのも、「やんごとない理由で生成AIをストレージに保管するハメになった。ただしNSFWコンテンツも含まれるのでおいそれとGoogle Driveに上げられないハメ。」という話をいくつか爆死例も含めて聞いていたため、最小構成でのオンプレ共有ストレージのソリューションは知っておく必要があった。

ただまあこっそりやるにしろグローバルに環境を開放する場合はそれなりにセキュアな構成にしなければならないので、oCISがどのような構成を取ることができて、どのようにすれば安全に運用できるか、といった所は研究が必要なイメージ。

  • 快適に使う事を目的とするなら自宅サーバーに置くかどうかは検討した方がいい
    • 用途や使用者が見積もれるならそれでもいい
  • 永続化については戦略を考えたほうがいい
    • ファイルの実体がパスベースではなくハッシュ的なIDで索引とセットになったデータの組み合わせになっているので、DBを消失するとデータを復元するのが難しそう
    • つまりDB(索引)とファイルの実体群は同期していなければならないので、厳密に考えるとリカバリー戦略上、どこかに定期バックアップしていても復元オペレーションが100%うまくいくとは言えない
      • 「深夜はまあ使わないでしょう」みたいな考えがあるなら外付けのディスクに置くので良い
    • ファイルにガンガン書き込むからストレージに悪そう
      • それはそう
  • 悪意のある任意の参加者が児ポ画像を突っ込んで公開リンクを設定して110番すると自宅に警察が来る
    • この手のサービスをセルフホストで提供する相手は利害関係者に留める等の工夫は必要
    • RBACでカスタムロールを作って不審な人は共有リンクを作れなくするとか、OIDCで認可を得るタイミングでそのユーザーの権限を参照するなどの方法で穴を塞ぐことはできそう

ドメインと1.5万円のミニPC+300円くらいの毎月の電気代を払えばストレージを運用できる。メモリもあまり使わないらしいので、本格的に使うのも良いかも

セキュリティについて

  • デフォルト、というかコンテナレベルでは認証APIのブルートフォースアタック対策が無かったりするのでOIDC認証を入れるとかリバースプロキシ(Nginx)でレートリミットを制限するとかしなきゃだめ。それかすべてのリクエストをBasic認証必須にして攻撃者に察知されにくいようにする。
    • リッスンするポートを80/443以外のポートで待ち受けるようにしたりとか
  • 個人レベルだったら上記の対策でいいと思うし、組織で使うならGoogleのOIDCをIdPとして使うのがバランス良いはず。

※参考: https://doc.owncloud.com/ocis/next/security/security.html