NextCloud の暗号化について

先に結論 : レンタルサーバー単体で運用するなら、サーバーサイドの暗号化は不要。エンドツーエンド暗号化がベストだが、若干挙動が不安定なのでしんどい。
暗号化の種類
NextCloud には、以下の暗号化方法がある。
- サーバーサイド暗号化 (マスターキー)
- サーバーサイド暗号化 (ユーザーキー)
- エンドツーエンド暗号化
また、それ以外に通信経路や保存媒体に対しての暗号化もあるはずだ。
- TLS (SSL)
- ディスクの暗号化
実際のところ、どれか 1 つをやれば良いというわけでもないし、全部をやれば良いというわけでもない。それぞれの手法はそれぞれのベクトルからの攻撃に耐性があるだけで、万能ではない。
実際にデータが脅かされるケース想定して、何が対策に効果的かを考える
通信経路への侵害
通信経路が暗号化されていない場合、悪意のある人間がダウンロード・アップロードしているファイルを盗聴することができる。例えば、公衆 Wi-Fi や偽アクセスポイントなどで通信すると、このようなリスクがある。
これについては、通信経路を暗号化することで解決する。それにあたるのが TLS (SSL) で、要はインストールした NextCloud に HTTPS から始まる URL でアクセスできるのであれば問題ない。また、NextCloud では HSTS を設定することが推奨されていて、ヘッダーがないと警告が出る。
物理的な保存媒体への侵害
データが保存されている保存媒体があるとして、それが物理的に盗まれてしまった場合、そこからデータを抜き出すことができる。
これについては、ディスク自体を暗号化することで解決する。Windows でいうと BitLocker、Linux でいうと LUKS などに相当する。
とはいえ、レンタルサーバーにおいては、自分でディスクを暗号化する・しないを選べないし、暗号化されているかも分からない (公開されていない) ことが多いだろう。
ちなみに、これは NextCloud のデータがあるサーバーだけの問題ではなく、データが同期されているクライアントも対象である。例えば、サーバーでディスクが暗号化されていたとしても、手元にある PC でディスクが暗号化されていない場合、その PC や保存媒体が盗まれると、もれなくデータも抜き取られてしまう。
信頼できない管理者やサーバー管理者による侵害

珍しい話だと思うが、信用できない NextCloud の管理者が運用してるサーバーにデータを保存するとした場合、管理者はデータを閲覧する事ができる。
または、レンタルサーバーなどにおいては、実際にやるかどうかはおいておいて、管理権限を持つ人がデータを見たり編集できたりするであろう。もしかするとサーバーの利用規約などを振りかざして、ファイルを勝手に消したり加工したりするかもしれない。
このような場合は、エンドツーエンド暗号化で解決する。エンドツーエンド暗号化では、クライアントで暗号化をして、サーバーにデータを送信する。暗号化したファイルを復元するには、復元に必要な鍵を持っている人しかできない。そのため、エンドツーエンド暗号化を行った場合、管理者やレンタルサーバー業者は鍵を知らないので、ファイルを復号することは不可能だ。
「サーバーサイド暗号化でもいいのでは?」と思う人もいるかもしれないが、サーバーサイド暗号化では、復号に必要な鍵をサーバーに保存しているので、管理者やレンタルサーバー業者は鍵を使用して復号することができる。そのため、暗号化の意味がない。
ソフトウェアの脆弱性によりファイルを読むことができる場合
NextCloud やそれ以外のソフトウェアに脆弱性があるとしたら、どうだろうか?
脆弱性の種類にもよるが、サーバーサイド暗号化では、サーバーで復号もするので復号後のデータを取得することが可能である。また、任意のファイルをダウンロードできてしまうような脆弱性であれば、復号に必要な鍵も取得することができると考えられる。ただ、ストレージ
この場合も、役に立つのはエンドツーエンド暗号化しかない。また、脆弱性については、パッチを当てたりワークアラウンドを実行したりすることが何よりも重要である。
まとめ
「サーバーサイド暗号化」はごく少数の使い方でしか役に立たない!
サーバーサイド暗号化は、悪意のある管理者やレンタルサーバー業者による侵害・脆弱性には全く役に立たないのだ。
じゃあ、サーバーサイド暗号化はいつ役に立つのかというと、それは NextCloud のサーバーとは別の外部ストレージに保存するときだ。
NextCloud は外部ストレージを使用することができるのだが、このときにサーバーサイド暗号化を使用すると、外部ストレージに暗号化されたデータを置きながら、NextCloud 本体があるサーバーに鍵を置いて保存できる。これにより、外部ストレージが侵害された場合に、データが復元できないようになる。
サーバーサイド暗号化は万能ではなく、どちらかというと「エンドツーエンド暗号化」が良いとされている。エンドツーエンド暗号化の場合、クライアント以外に保存されているデータは、復号することが不可能である。
かといって、エンドツーエンド暗号化も微妙だ、という話

エンドツーエンド暗号化が最強なのだが、これにはデメリットもある。
- 原則として、ブラウザからファイルのアップデート・ダウンロードができない。
- 写真のギャラリーなどに載らない。
- よくバグる。
本当に良くバグる。自分は全てのフォルダをエンドツーエンド暗号化する運用を試みたが、以下の不具合に巻き込まれて断念している。
- 同期に失敗する。
- 暗号化を解除するのに失敗してフォルダの削除ができなくなる。
- 巨大なファイルがあると同期に失敗する。
- iPhone や Android アプリでもエンドツーエンド暗号化を設定しようとするとエラーになる。
- とにかく同期に失敗する。
ということで、僕はエンドツーエンド暗号化を全面的に使うのはやめていて、とりあえずもっともセンシティブにならないといけないフォルダだけ有効にしている。
全てのファイルに対してエンドツーエンド暗号化しているのが一番理想なのではあるが、ぜひ一度試してみて、「これは厳しそう」と感じたらしんどさに合わせて変えてみてほしい。