Fail2banでownCloudへのブルートフォースアタックを阻止する

ownCloudへのブルートフォースアタックは、TOTPによる2段階認証を導入することで制限が可能です。

ただし、それぞれのアカウントで 2段階認証の設定をしなければならないので、すべてのアカウント対してログイン画面へのブルートフォースアタックを完全に防ぐことは難しいです。
2段階認証を設定しない人とかたぶんいるでしょうし。

今回は、複数回のログイン試行の失敗ログを検知し、動的に一定時間システムへのアクセス制限を行う方法について、まとめてみます。

ちなみに、派生版の Nextcloud には、複数回のログイン試行があった際に、接続をブロックする機能が既に実装されていますので、この対策は必要ないかもしれません。

“Fail2banでownCloudへのブルートフォースアタックを阻止する” の続きを読む

Nextcloudのファイル自動削除機能(Retention)の動作について

Nextcloudのファイル自動削除機能を使ってみましたので、分かったことなどをメモします。

ファイルの自動削除機能は、Retention アプリを有効にすることにより、管理画面から設定が可能です。

ownCloudでは、Enterprise Edition (有償版)で使える機能のようです。

Nextcloud側にはまだドキュメントが用意されていないようですが、ownCloudのEnterprise版のマニュアルを参照すると、少し機能説明が載っています。
ただし、Nextcloudでもまったく同じ仕様で実装されているかはわかりません。

ownCloud | Advanced File Tagging With the Workflow App (Enterprise only)

マニュアルをみる感じでは、TagBase と UserBase のモードがあるらしいですが、今回は TagBase の動作について確認します。

タグベースモードの仕様について

ある特定のシステムタグが付与されたファイルが存在する場合、タグに対して設定した経過時間を過ぎた時に、そのタグが付与されたファイルが削除される仕組みです。

ファイルへのシステムタグの付与は、オートタギング機能か、手動で設定をする必要があります。

下記は、Nextcloud 11.0.1 時点での確認できた挙動です。

  • ファイルの削除タイミングはおそらく日ごとに1回
  • ファイルの経過時間の判定は、mtime を見ている
  • ファイルの更新が行われると mtime も更新されるため期限とならずに削除されない
  • 削除されたファイルはゴミ箱(アプリ)へ保存されずに異次元へと消える
  • 削除されたファイルのログは残らない(cronの実行ジョブのみ)

また、バグというか仕様上仕方がないというか、Retention のルールを削除する前に、ルールを設定中のシステムタグを削除してしまうと、retention の jobは消えずに残ってしまうため、バックグラウンドジョブ実行の度に、そんなシステムタグは存在しないというエラーが出力され続けるようになります。

この場合は、直接データベースを操作して oc_jobs テーブル内のキューを削除する必要があります。

タイムスタンプの仕様について

もう1点残念な仕様がありまして、Nextcloudや、ownCloudはファイルのタイムスタンプに、mtime を参照しています。

atime … 最終アクセス日時 (access time)
mtime … 最終変更日時 (modify time)
ctime … 最終ステータス変更日時 (change time)

mtime は、ファイルを変更した時に更新されます。
正確には write(2) または truncate(2) した場合に変更されるようです。

たとえば、Windows端末などから、Nextcloudへファイルを追加した時は、mtime は更新されません。

Windowsで10ヶ月前に更新されたファイルをアップロードした場合は、Nextcloud上でも10ヶ月前のファイルです。
(これはバックエンドにファイルサーバを接続した時を考慮した仕様だと思います。)

このファイルに Retentionアプリで、1ヶ月の有効期限を設定した場合、次回のチェックのタイミングでファイルは異次元へと旅立ちます。

ファイル名の変更(rename)やパーミッションの変更(chmod)などでも mtime は更新されないようなので、ファイルの期限(時限)設定の使いかたには少しコツが必要そうです。

テキストエディタで直接編集を行えば、タイムスタンプ(mtime)は更新されます。

NextcloudでのWEBログイン時に、2要素認証(Two Factor Authentication)を使ってみる

Nextcloud 11 での Webログイン時に、2要素認証によるログインを行うように設定してみます。

  1. Nextcloud での 2要素認証について
  2. Nextcloud 11.0.2 時点では、認証の種類は次の2つが対応しているようです。

    • Two Factor TOTP Provider (ソフトウェアトークン)
    • Two Factor U2F (ハードウェアのトークン)

    ハードウェアトークンというのは、下記のようなUSBデバイスを使って認証を行う方式のようです。
    ハードウェア方式は、また別途やり方を調べてみたいと思います。

    今回はソフトウェアトークンの設定方法についてまとめます。

    TOTP というのは、時間ベースで発行されるトークンです。

    発行されたトークンは、一定時間を過ぎると無効となり、また新しいトークンが生成される方式です。
    一定時間有効なので、一度きりの使用では無効にならず、時間内であれば何度でも使用が可能です。

    ※Nextcloud 11 では、30秒毎にトークンの表示が切り替わりますが、
     トークン自体は、約2分程度有効なようでした。

    では、設定していきます。

    2要素認証を導入される方は、Nextcloudをそれなりに使い込んでいるかと思いますので、細かい手順については割愛します。

  3. 必要なアプリを有効にする
  4. アプリの追加画面(アプリストア)=> 認証タブから、
    twofactor_totp アプリ: 1.1.0 を有効にします。

    また、twofactor_backupcodes: 1.0.0 が
    有効になっていることも確認します。(デフォルトで有効)

  5. 第2因子バックアップコードの生成(保険)
  6. まず、個人画面(settings/personal)=> 第2因子バックアップコードから、バックアップコードを生成しておきます。

    スマートフォンの破損や紛失などで、2要素認証が行えなくなった時にも、バックアップコードでログインすることが可能です。

    ただし印刷や手帳などに書き留めておくなどの保管が必要です。
    バックアップコードは一度に10個表示され、それぞれ1度の使用で無効化されていきます。

    バックアップコードが不要な場合は、この手順は必要ありません。

    またバックアップコードよる認証を無効にしたい場合は、
    twofactor_backupcodes アプリを無効にすればよいです。

  7. TOTP認証を有効にする
  8. 次に、個人画面(settings/personal)、TOTP second-factor auth にて、TOTP有効化にチェックします。

    TOTPが有効になると、設定用のQRコードが表示されます。

    設定用のQRコードは、一度しか表示されないので、QRコードが消えてしまった場合は、
    TOTPの無効化 => 有効化 を再度試します。

    TOTP2要素認証の設定

  9. TOTP対応アプリでQRコードを読み取る
  10. TOTP対応アプリで設定用QRコードを読み取ります。

    スマートフォンの場合は、Google Playストア(Android)や、App Store(iOS)などで、
    「TOTP認証」と入力すれば、対応アプリがたくさん出てきますので、お好きなものをどうぞ。

    自分は、IIJ SmartKey を使ってみました。

    TOTP対応アプリ

    TOTP対応アプリでQRコードを読み込み設定を保存すると、
    30秒ごとに数字6桁のトークンが表示されますので、
    この数字を Nextcloudのログイン時に入力します。

    IIJ SmartKeyによるトークン表示

    通常のユーザアカウント名とパスワードでの認証後、
    TOTPトークンによる追加認証の画面が表示されます。

    TOTP2要素認証画面

    トークンを間違えたり、トークンの有効期限が過ぎると、認証エラーとなります。

    TOTP2要素認証エラー

  11. バックアップコードによるログイン
  12. 何らかの理由により、2要素認証によるログインができなくなった場合、
    第2因子バックアップコードによるログインも可能です。
    コードは一度の使用で無効化されます。

    バックアップコードによるログイン

  13. 管理者操作による救済方法
  14. ユーザが2段階認証に必要なパスコードを取得できず、
    バックアップコードによるログインも不可能となった場合には、
    管理者による操作で、対象アカウントの2段階認証を無効にすることができます。

    occ コマンドの twofactorauth を実行します。

    sudo -u apache ./occ twofactorauth:disable testuser
    

    再度、対象ユーザの2段階認証の設定を行いたい場合は、
    occコマンドにて有効化する必要があります。

    sudo -u nginx ./occ twofactorauth:enable testuser