Firefox SendのS3連携機能を試してみた

最近プライベートでちょっとしたファイルのやりとりをする時はFirefox Sendを使うようにしていて、なんとなくリポジトリを眺めているとS3と連携して保存することが出来るのを知ったので、自前のAWS環境でFirefox Sendのサーバーを構築してみたいと思います。
2020.05.07

どうも、もこ@札幌オフィスです。

最近プライベートでちょっとしたファイルのやりとりをする時はFirefox Sendを使うようにしていて、なんとなくリポジトリを眺めているとS3と連携して保存することが出来るのを知ったので、自前のAWS環境でFirefox Sendのサーバーを構築してみたいと思います。

作る物

Firefox SendはオープンソースでストレージとしてS3を利用することが出来るので、フロントをEC2、S3をアップロードしたファイルのストレージとして扱う設定をしてあげます。

https://github.com/mozilla/send

EC2上でFirefoxSendを設定

まずはじめに、インスタンスのSecurityGroupとIAMの設定をします。

Firefox Sendでは 1443 をデフォルトポートとして利用するため、こちらを解放してあげます。

IAMロールはリソースで利用するバケットを絞ってあげると良いでしょう。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [ "arn:aws:s3:::[利用するバケット名]", "arn:aws:s3:::[利用するバケット名]/*" ]
        }
    ]
}

続きまして、EC2上にNode.js 12.xを用意してFirefox Sendをclone、npmでパッケージのインストールをします。

$ git clone https://github.com/mozilla/send
$ cd send
$ npm install

インストールが正常に完了したら、 server/config.js で保存先となるS3のバケットを指定します。

const conf = convict({
  s3_bucket: {
    format: String,
    default: '保存するバケットを指定',
    env: 'S3_BUCKET'
  },
  ...
});

デフォルトでは匿名ユーザーで1GBまでしかアップロードできない設定になっているため、 anon_max_file_size を書き換えることで緩和してあげます。

  max_file_size: {
    format: Number,
    default: 1024 * 1024 * 1024 * 2.5,
    env: 'MAX_FILE_SIZE'
  },
  anon_max_file_size: {
    format: Number,
    default: 1024 * 1024 * 1024 * 2.5, // * 2.5を追加
    env: 'ANON_MAX_FILE_SIZE'
  },

Security Group、IAM、コンフィグの設定がおわったら、ビルドしてからサーバーを実行します。

$ npm run build
$ npm run prod

サーバーにアクセスできれば完了です!簡単ですね。

S3 のファイルの中身を見てみる

試しに適当なファイルをアップロードして、S3に配置されるオブジェクトを見てみます。

どうやら、 アップロードした後に発行されるURLの /downloads/:id/#fragment のid部分に1- をつけたファイルが配置されているようで、ファイルは暗号化されているため、保存されているオブジェクトへのアクセス権限があっても中身を見ることが出来ません。

あまり意味が無いように思えますが、S3の設定からServerSide Encryption(AES256)を有効にするとS3側で2重に暗号化することも出来ます。

まとめ

Firefox Sendを使うことでEnd-to-End暗号でセキュアにファイルのやりとりができ、オープンソースかつ自前で運用することも出来るため、Firefox Sendの上限である2.5GB以内のファイルをやりとりするときは、へたなアップローダーを利用するよりFirefox Sendを使っていこうと改めて思いました。

ファイルにパスワードをつけたり、ダウンロード回数指定、ダウンロード可能期間を指定することも出来るので、ZIPにパスワードをつけてメールで添付する時代も終わりになれば良いですね。

※今回はS3連携を試してみたいため自前でサーバーを建てましたが、コンプライアンス要件などの特殊な理由が無ければ、send.firefox.com を使えばいいと思います。

Firefox Sendの暗号化の仕組みは下記のリンクで解説されているので、気になった方は是非見てみてください!

https://github.com/mozilla/send/blob/master/docs/encryption.md