この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
どうも、もこ@札幌オフィスです。
最近プライベートでちょっとしたファイルのやりとりをする時は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