この投稿は、知ってほしい技術 Advent Calendar 2022の6日目の記事です。
WireGuardは、いわゆる「メッシュ型」VPNと呼ばれるもので、Linuxカーネル内のモジュールとして提供されていますが、WindowsやmacOSでも使うことができます。
従来型のVPNでは、すべての利用者がひとつのVPNサーバーに一度接続して、VPNサーバーの先にあるプライベートネットワークにつながることを想定しています。
従来型のVPNは、「境界防御」とよばれるネットワークセキュリティを前提としています。
一方、メッシュ型のVPNでは、個々のコンピュータごとにピアトゥピアでネットワークを張ります。
Wireguardでは必ずコンピュータ同士を公開鍵暗号で認証しあい、認証が成功してはじめてピアを成立させる仕組みになっています。ピアが成立したコンピュータ同士ではグローバルなインターネットから切り離されたIPネットワークを作ることができ、そこにSSH通信など守るべき重要な通信を移行できます。
実際、筆者が管理しているサーバーの一部では、WireGuardを使ってプライベートネットワークを構築し、そのプライベートネットワーク上のSSHしか待受しないようにファイアウォールを設定していますので、インターネットからSSHポートを探そうと思っても、そもそも22/tcpが開いていない、というふうになっています。以下はMastodon.Tokyoのホストに対してnmap
をかけてみた結果ですが、22/tcpやその他SSHっぽいポートが開いていないことが分かります。しかし、実際にはWireGuardで張ったVPN経由でSSHログインは可能です。
h12o@******** ~ % nmap mastodon.tokyo Starting Nmap 7.93 ( https://nmap.org ) at 2022-12-** **:** JST Nmap scan report for mastodon.tokyo (172.105.195.43) Host is up (0.029s latency). Other addresses for mastodon.tokyo (not scanned): 2400:8902::f03c:92ff:feff:7345 rDNS record for 172.105.195.43: ubuntu-7345.1f5fc.net Not shown: 997 filtered tcp ports (no-response) PORT STATE SERVICE 25/tcp open smtp 80/tcp open http 443/tcp open https Nmap done: 1 IP address (1 host up) scanned in 42.58 seconds
ただし、WireGuardは、ホストとピアごとに設定を自分で書いていかなければならない難点があります。
[Interface] PrivateKey = ******************************************** ListenPort = 51820 Address = 10.***.***.***/32, fd**:****:****:****:****:****:****:****/128 [Peer] PublicKey = ******************************************** AllowedIPs = 10.***.***.***/32, fd**:****:****:****:****:****:****:****/128 Endpoint = ubuntu-7345.1f5fc.net:51820 PersistentKeepalive = 30
Tailscaleは、そのWireGuardの設定を集約して自動化するSaaSサービスです。
Googleアカウント・Microsoftアカウント・Githubアカウントがあれば、Tailscaleアカウントを作ることができます。そして、ひとりだけで運用するのであれば無料枠で使えるというものです。
すなわち、先に書いたようなホストの秘密鍵とネットワークの設定、ピアごとの公開鍵の交換とネットワークの制御が不要、ということになります。そして、リスクベースの認証(不審な通信に対してはTailscaleアカウントによる再認証をかける)も実装されています。この機能は、Tailscaleネットワーク中にマルウェアに感染してしまったホストがいたとしても、不審な通信を見分けて弾くことができるということを意味しています。つまり、自分のアカウントを守ることができれば、ネットワークのセキュリティを守ることもできてしまいます。ここまでくるともはや、個人で導入できる非常に安価なゼロトラスト・ネットワーク、とすら言えます。
なお、先に「筆者が管理しているサーバーの一部では、WireGuardを使ってプライベートネットワークを構築し」と書きましたが、残りのネットワークはどうしているかというと、Tailscaleで同じことをしています。
WireGuardは一度ピアを張ってしまうとリスクベース認証をする仕組みがないので(それでも、自分のシェルアカウントやSSH鍵ペアを守ることができればSSHログインによる横展開(ラテラル・ムーブメント)は防げます)、Tailscaleのように「ゼロトラスト」とまでは呼べません。そこで、「Tailscaleを使えるようならTailscale、難しければWireGuard」というふうに、私は考えています。
ちなみに、Mastodon.TokyoでTailscaleを使わないのは、Mastodon Server Covenant準拠と関係があります。Mastodon Server Covenantでは、最低もうひとりが緊急時にシェルアクセスができる体制を作ることが定められています。TailscaleでMastodon Server Covenant準拠を達成しようとするとその分の費用がかかってしまうので私の負担が増えてしまいます。