メドピア開発者ブログ

集合知により医療を再発明しようと邁進しているヘルステックカンパニーのエンジニアブログです。読者に有用な情報発信ができるよう心がけたいので応援のほどよろしくお願いします。

NextCloudを導入してみた

皆様こんにちは。
今回は、社外の取引先様等に重要な情報を安心して受け渡しするツールが決まってなかったので、NextCloudを導入してみたエントリーとなります。

以下、これまでの課題となります。

  • 手渡しとか郵送はコストが掛かりすぎてしまう
  • メールは平文のため危険、添付ファイルを暗号化してパスワードは別メールにて送信も危険となる
  • 各種インターネットサービスは適切に管理されてるか監督が難しい、機能が多すぎて誤操作と脆弱性が心配、受け取り側がアカウントを作成して頂かなければいけない場合等々

NextCloudとは、ファイルホスティングサービスを構築するための、PHPJavascriptで書かれたオープンソースソフトウェアとなります。機能的に似たようなサービスとして比較されるのはdropboxとなります。元々ownCloudという名前で開発されていたのですが、方針の食い違いによりフォークされてNextCloudとなったようです。

要件

はじめに、要件のまとめとなります。

  • 弊社社員ユーザーが認証され、オフィスからブラウザーでアクセスしてファイルをアップロードできる
  • アップロードされたファイルは暗号化され、アップロードした社員と指定された(取引先様などの)社外ユーザだけがアクセスできる
  • (取引先様などの)社外ユーザは認証され、ブラウザーでアクセスして復号されたファイルをダウンロードできる
  • ファイルのダウンロードは指定された日数をすぎると無効になる

構成

下記、構成の詳細となります。

Amazon Elastic Load Balancing

  • ポート443:インターネットからのアクセス(SSL)を受け入れ、nginxにフォワードします
  • ポート8000:オフィスからのアクセスを受け入れ、nextcloudにフォワードします

Amazon EC2

nginx・fail2ban

https://nextcloud.hogehoge.co.jp/index.php/s/IWpva4t3FoYgnkSのようなNextCloudのURLリンクでの共有で、ブラウザーでアクセスされるURLリンクのパスだけをプロキシして、NextCloudに投げます。nginxのコンフィグファイルの内容は以下となります。

server {
    【省略】
    # /index.php/heartbeat
    # /index.php/s/*
    # /index.php/s/*/authenticate
    # /index.php/s/*/download
    # /index.php/core/js/*.js
    # /index.php/apps/files_sharing/ajax/publicpreview.php
    # /core/img/*
    # /core/css/*.css
    # /core/fonts/*.woff
    # /core/js/*.js
    # /core/vendor/*.css
    # /core/vendor/*.js
    # /apps/encryption/*.js
    # /apps/files/*.js
    # /apps/files_sharing/*.css
    # /apps/files_sharing/*.js
    #
    location ~* ^(/index\.php/(heartbeat|s/[A-Za-z0-9]+(/authenticate|/download)?|core/js/.+\.js|apps/files_sharing/ajax/publicpreview\.php)|/core/(img/.+|css/.+\.css|fonts/.+\.woff|js/.+\.js|vendor/.+\.(css|js))|/apps/(encryption/.+\.js|files/.+\.js|files_sharing/.+\.(css|js)))$ {
        proxy_pass http://nextcloud;
        proxy_set_header Host $http_host;
    }
}

これで共有されたファイルがブラウザーでダウンロードできるギリギリのパスだけを許可となります。それと、fail2banでnginxに来たアクセスを監視して、不自然なアクセスが有ればブロックとなります。

NextCloud

NextCloudで行った設定は下記となります。ブラウザーにて管理者のアイパスでログインし、管理画面から設定が可能となります。

  • 共有
    • URLリンクでの共有を許可する
      • 常にパスワード保護を有効にする
      • 有効期限のデフォルト値を設定する
  • 暗号化
    • サーバーサイド暗号化
      • サーバーサイド暗号化を有効にする
  • 追加設定
    • Password policy
      • Minimal length
      • Forbid common passwords
      • Enforce upper and lower case characters
      • Enforce numeric characters
      • Enforce special characters

この画面にて、ユーザーがパスワードを忘れてしまった場合に、ファイルを復元するためのリカバリキーを設定できるのですが、このNextCloudはあくまで一時的なファイル置き場のため、リカバリキーの漏えいのリスクを心配してあえて設定しません。それと、アプリの管理画面から不要と思われる大量のプラグインを無効化しました。NextCloudは、モバイル・デスクトップクライアントからアクセスできたり、外部ストレージに接続できたり、リッチなファイル閲覧・編集など、豊富な機能が特徴の一つですが、要件以外の機能は、リスクを減らすため徹底して排除となります。

Amazon RDS

NextCloudからログインする普通のMySQLデータベースとなります。

利用シナリオ

利用時のシナリオとなります。

【社員ユーザー】
①会社のパソコンのブラウザーでhttps://nextcloud.example.com:8000/を開きます
②IDとパスワードを入力してログインします
③画面内の「+」をクリックし「アップロード」を押下します
④ダイアログボックスで、アップロードするファイルを選択します
⑤共有するファイルの「共有アイコン」を押下します
⑥「URLで共有」をチェックします
⑦「URLによる共有のパスワード」を入力します
⑧表示されたURLリンクを共有先にメールで通知します
⑨パスワードをメール以外の安全な方法で共有先に通知します

【受け取り側ユーザー】
①通知されたURLリンクをブラウザーで開きます
②通知されたパスワードを入力してログインします
③ファイルをダウンロードします

Amazon EC2インスタンスのアップデート

yum-cron-securityパッケージをインストールしておくことで、自動的に1日1回、インストール済みのパッケージにセキュリティーアップデートがないかチェックされ、有れば、自動的にインストールとなります。それで、システムにトラブルが起きる可能性も有りますが、社内用ツール&一時的ファイル置き場ということで割り切ります。 カーネルがアップデートされてたら、再起動が必要なので、こちらからお借りしたスクリプトで実施となります。

おまけ

https://nextcloud.com/security/advisories/ のページの情報を監視して、更新があったら、対応します。

以上となります。

弊社にてNextCloudを導入した件について紹介させて頂きました。導入後は社内のニーズに対し、取り急ぎこのツールに誘導できるようになりました。


是非読者になってください(ง `ω´)ง


メドピアでは一緒に働く仲間を募集しています。 ご応募をお待ちしております!

■募集ポジションはこちら

https://medpeer.co.jp/recruit/entry/

■開発環境はこちら

https://medpeer.co.jp/recruit/workplace/development.html