$name;

Sola's daily diary, commit logs, and all

インフラ独学初心者のMisskeyサーバー新春構築記

はじめに

2023年を迎え、早くも正月が過ぎようとしています。

昨年は、イーロン・マスク氏によるTwitterの買収劇や、その後の矢継ぎ早な運用改革が注目を集めました。
こうした動向を不安に感じてか、Twitter以外のSNSプラットフォームが注目を集める動きが見られました。なかでも、分散SNSプラットフォームとして知名度の高いMastodonに関心を寄せる人が多いようです。

筆者は2017年ごろから、分散SNSプラットフォームの一つであるMastodonを利用していますが、最近はMastodon以外のプラットフォームにも興味を持っていました。それが、今回サーバー構築を行ったMisskey(ミスキー)です。

Misskeyは、日本人のsyuilo(しゅいろ)氏により、2014年から開発が始められた分散SNSソフトウェアです。ActivityPubにより他の分散SNSプラットフォームとの相互通信機能をもつほか、マイクロブログの投稿以外にも、カスタマイズ可能なホーム画面、静的なWebページの作成機能など多彩な独自機能が搭載されていることが特徴で、日本語ドキュメントも開発陣が執筆しています。筆者もこの点を気に入ったことが、Misskeyに興味を持った最大の動機です。

サーバー構築の経緯

分散SNSの利用には、他人がホストしている既存のサーバー(インスタンス)にアカウントを作成する方法と、自らがサーバーをホストすると同時に自身のサーバーのユーザーになるという、2種類の方法があります。

Misskeyは他のSNSと比べると知名度がまだまだ低く、サーバーを選ぶ上での選択肢が比較的限られます。サービスの可用性や運営面での信頼性、サーバーの雰囲気など、筆者の要求を満たすサーバーが少ないと感じており、いずれは自身でMisskeyのサーバーをホストしたいと考えていました。

サーバーの構築には、フロントエンド、バックエンド、インフラで用いられる各種周辺技術に対する知識、およびセキュリティに関する深い理解が不可欠です。
筆者はLinuxやWebサーバーの独学を始めて1年あまりが経ったタイミングだったことから、サーバー構築を通して各種技術への理解を深めるにはちょうど良いタイミングであるとも感じました。

このような経緯で、まとまった時間が取れる年末年始を利用して、Misskeyサーバーを構築することにしました。

なお、筆者が今回構築したサーバーには下記のリンクからアクセスできます。

mi.hk-shuttle.net

サーバー構築において考慮したこと

今回のサーバー構築において、最も時間を掛けて考慮したことはセキュリティ対策です。

分散SNSソフトウェアは、世界中の各サーバーとリアルタイムで直接投稿を交換しあうことができる特徴があります。そのため、通常の個人運営のウェブサイトやブログと比較すると、ユニークビジター数が多く、世界中から多くのトラフィックが押し寄せることになります。その中には悪意のあるユーザーも含まれます。

一例として、世界最大のMisskeyサーバーである「misskey.io」においては、度重なるDDoS攻撃の被害を受けているようです。misskey.ioでは、DDoS攻撃をきっかけに大規模な障害が発生したケースがあると、2021年12月のブログ記事で明かされています。

blog.arkjp.net

このような事例を受け、筆者は、主なセキュリティリスクとしてDDoS攻撃を想定し、そのほかにもオリジンサーバーが受けうる攻撃例としてサーバーコンソールへの不正ログイン試行を想定することとしました。

そのほか、世界中の他のサーバーのユーザーの投稿が流れてくる過程で、国内法に違反するコンテンツの流入が想定されます。サーバー事業者からの即時契約解除や、最悪の場合は刑罰の対象となるおそれもあります。
こまめにサーバーのキャッシュを確認し、キャッシュの消去、ユーザーやドメインのブロックを行うなど、手間を惜しまず管理する必要がありそうです。

本サーバーが採用したセキュリティ対策

今回構築したサーバーでは、サーバーコンソールへの不正ログイン対策として「SSHポートの閉鎖」を行い、さらにDDoS攻撃の対策として「CDNの採用」および「CDN以外からのHTTP・HTTPSアクセスの禁止」を行いました。

SSHログイン対策

筆者が以前から契約していたVPSインスタンスでは、かねてより「rootログイン、デフォルトユーザー名でのログイン、デフォルトポート番号でのログイン、パスワードログイン」の4つを禁止し、強固な公開鍵認証の採用やポート番号の変更といったセキュリティ対策を施していました。

今回構築したサーバーでは、インターネット上から直接SSH接続を待ち受ける仕様を改めました。

Cloudflare Zero Trust Tunnelというサービスを利用し、エッジサーバーとオリジンサーバーとの間で、SSHのためにトンネルを張っています。SSHクライアントはCloudflareに対してまずアクセスを試み、Cloudflare側で認証されたクライアントからのみ、エッジサーバーに対してSSH接続要求を行える仕様としています。
エッジサーバーとの接続はコマンドライン上で行えます。OpenSSH Clientのコンフィグファイルに「ProxyCommand」を設定して自動化しました。短いコマンドを打つだけで、オリジンサーバーへSSHできます。

この構成の利点は、インターネット上のTCP443番ポートを宛先とした通信が行える環境であれば、どのような環境からもSSH接続ができる点にあります。
以前の筆者のSSHセキュリティ対策では、所属大学のネットワーク内からSSH接続ができませんでしたが、今回の手法では、学内からもSSH接続が可能になりました。

CDNの採用

CDNコンテンツ配信ネットワーク)は、Webサーバーへの接続要求をプロキシし、キャッシングによるパフォーマンスの向上と、オリジンサーバーのIPアドレスを秘匿化することによるセキュリティの向上を図るクラウドサービスです。

CDNを採用することにより、通常の名前解決ではオリジンサーバーのIPアドレスを引くことができなくなり、オリジンサーバーを発見しにくくなります。また、コンテンツのキャッシングやWAFにより、DDoS攻撃に対する耐性が向上します。

Misskeyの公式ドキュメントにおいては、Cloudflareの利用が強く推奨されています。Cloudflareには無料プランもあり、個人で利用するうえではほとんど費用の負担が発生しないことから、筆者もCloudflareを採用しました。

misskey-hub.net

CDN以外からのオリジンサーバーへのアクセスの禁止

CDNを採用したとしても、仮にオリジンサーバーがインターネット上のすべてのIPアドレス範囲からのHTTPリクエストを受け付けていた場合、オリジンサーバーのIPアドレスが漏洩した際に容易にサーバーの正体がバレてしまいます。

これを防止するために、ufwを使用して簡易的にCDN以外からのHTTPリクエストを弾くように設定しています。
前述のSSHログイン対策と合わせることで、仮にオリジンサーバーに対しポートスキャンを行ったとしても、CDN以外からはいかなるポートも開放されていないように見えるため、最低限のセキュリティ対策として暫定的に機能すると考え、今回はこのような設定を採用しました。

Misskey本体のセットアップ

今回のサーバー構築で最も頭を抱えたのがMisskey本体のセットアップ作業です。

公式ドキュメントでは、Gitリポジトリをcloneし、環境に合わせて設定ファイルを編集したあと、Dockerイメージをビルドする方法が推奨されています。

筆者の環境では、Dockerイメージのビルドに何度も失敗し、技術力の不足によりトラブルシューティングもできなかったことから、ついには自力でのビルドを諦め、Docker Hubに公開されている既製のDockerイメージをpullする方法を採用しました。幸いなことに、Misskey開発者により積極的にDockerイメージが公開されており、最近のバージョンのDockerイメージを容易に入手できました。

misskey/misskey - Docker Image | Docker Hub

その後も、必要なコンフィグファイルを指定のディレクトリに入れ忘れるなど、様々な凡ミスに時間を費やしましたが、無事に2023年1月4日20時56分に、Misskeyにアクセスできる状態となりました。

構築の準備作業は2022年の大晦日の夜から始めたので、作業開始から構築完了までに5日ほどを要したことになります。

セットアップにおける留意事項

Misskey本体のDockerイメージを初めて立ち上げた後、管理者のアカウントを作成するまでの間、誰でも自由に管理者アカウントを作成できる脆弱な状態です。管理者アカウントの作成が完了するまでの間は、正規の管理者以外にアクセスされてはなりません。

構築後の諸作業

Misskeyの構築後は、Webフロントエンドが不具合なく正常に動作するかを確認したり、他のサーバーとの間で正常な通信が行えることを確認しました。メール配信の設定、Webプッシュ通知の設定、reCAPTCHAのサイトキー発行などもこのタイミングで行いました。

構築後に見つかった不具合としては、Webフロントエンドの動作に必要なWebSocketが正常に動作していないというものがありました。リバースプロキシであるnginxの設定ファイルが正しく書けていなかったことが原因で、すぐに解決できました。

構築後に行う作業については、以下に紹介する記事が大いに役立ちました。

hide.ac

Misskeyサーバーの構築を行った感想と今後の見通し

Misskeyサーバーの構築を通して、昨今のネットワーク技術やWeb技術、セキュリティ対策などを広く学習することができ、自身の技術力に資するものとなりました。
Misskeyや分散SNSの周辺技術についてはまだまだ知識が浅いため、運用を通じて勉強していければと考えています。

今後の予定としては、サーバー上のデータベースの自動バックアップや、オリジンサーバーとエッジサーバーとの間の通信路のさらなるセキュリティ向上を考えています。

将来的には、今回構築したMisskeyサーバーに身内や知人等を招き入れたり、一般の方々でもアカウント作成ができるようにしたいと構想中です。