中級向け

n8nを外に公開するときの守り

VPS で動かした n8n を Web に開いたとき、外から何に届くのかを確かめました。ログイン画面・Webhook・承認リンク・MCP の入口は誰でも届くこと、5678番は閉じていたこと、アカウントを作る順番、バックアップに入っている暗号の鍵まで。試していない守りも書いています。

動作確認: — n8n 2.41.6 / ConoHa VPS 1GB / Ubuntu 24.04

自分のパソコンで動かしている n8n は、外から見えません。 VPS に置いて、LINE の通知やスマホの承認ボタンを動かすには、外から届くようにする必要があります。 同時に、誰でも届く場所に、自分の n8n が出ていくことにもなります。

VPS に n8n を入れる手順で作った n8n(ConoHa VPS 1GB、n8n 2.41.6)を Web に開いて、 外から何に届くかを確かめました。この記事は、そこで分かったことと、公開前に確かめたいことをまとめたものです。

試したのは、検証用の使い捨ての n8n です。本番の認証情報は入れていません。 セキュリティの専門家による検査ではないので、「ここまで確かめた」と「確かめていない」を分けて書きます。

外から届くもの

ConoHa のセキュリティグループに IPv4v6-SSH と IPv4v6-Web を付けた状態です。

インターネット誰でも22 番 SSH鍵がないと入れない80・443 番Caddy → n8n へ全部渡す5678 番 n8n 本体届かない(閉じている)外から見えるもの・ログイン画面(エディタ)・Webhook の URL・承認・フォームのリンク・MCP の入口守りは n8n 自身の認証だけ
ConoHa の n8n テンプレートに IPv4v6-SSH と IPv4v6-Web を付けた状態。5678 番は、セキュリティグループが 80・443 しか通さないので閉じている。
入口 外から 確かめ方
22番(SSH) 届く。鍵がないと入れない サーバーの設定を見た(パスワードでのログインは無効、鍵だけ)
80・443番(Web) 届く。http は https に切り替わる 外から https に接続した
5678番(n8n 本体) 届かない 外から接続して、応答がないことを確かめた

注意したいのは、80・443番に届いたものを、Caddy がすべて n8n に渡すことです(テンプレートの設定を読んで確認しました)。 そのため、次のものが、インターネットのどこからでも届きます。

  • n8n のログイン画面(エディタ)
  • Webhook の URL
  • 承認・フォームのリンク
  • MCP の入口

n8n に届く手前で守ってくれるものは、ありません。守りは、n8n 自身の認証だけです。

順番:アカウントを作ってから、外に開く

n8n は、最初にアクセスした人が、オーナーのアカウントを作る作りです。 アカウントを作る前に Web に開くと、先に見つけた人がオーナーになれます。

筆者の環境では、パスワードを忘れて、アカウントを作り直せる状態にしました(n8n user-management:reset)。 その直後、n8n の画面は「最初のアカウントを作る」状態に戻りました。ここでも、同じことが起きます。

  • 申し込んだら、セキュリティグループは SSH だけにしておく
  • SSH のトンネルで手元から開いて、アカウントを作る
  • そのあとで、Web を足す
  • アカウントを作り直すときは、先に Web を外す(外す手順そのものは試していません)

手順はVPS に n8n を入れる手順に書いています。

5678番が閉じていたのは、ConoHa の設定のおかげ

テンプレートは、Ubuntu のファイアウォール(ufw)で、22・80・443だけを許可しています。 ところが、n8n の Docker の設定は、5678:5678 として、5678番を全体に向けて公開する形でした。 Docker は、ufw を通り越してポートを開くことがあります。

今回、外から5678番に届かなかったのは、ConoHa のセキュリティグループが、80と443しか通していないためでした。 つまり、守っていたのは、サーバーの中のファイアウォールではなく、ConoHa 側の設定です。

Webhook と承認リンクは、URL を知っていれば誰でも開ける

外から届く入口のうち、ログインが要らないものがあります。

  • Webhook の URL:検証用に作った Webhook に、ログインしていない状態で外から接続すると、そのまま応答が返りました。n8n のログインは、Webhook には関係しません
  • 承認・フォームのリンク:Send and Wait や Wait ノードの待機フォームのリンクは、スマホで、ログインなしで開けました。2.41 のリンクには、64桁の署名(?signature=…)が付いていました

署名は、n8n が作ったリンクかどうかを確かめるためのものです。誰が押したかは確かめません (Send and Wait の使い方)。 メールを転送したり、複数人が見るアドレスに送ったりすると、見た人なら誰でも押せます。

Webhook に送られてくるものが、本当に相手のサービスからなのかを確かめたいときは、署名の検証や認証をワークフローに入れます。 たとえば、LINE の通知は、受け取った内容の署名を確かめる作りにしました(LINE対応自動化ワークフロー)。 Webhook ノードには、Authentication という設定があります(Basic・Header・JWT)。ただし、筆者はこの設定を試していません(Webhookノードの使い方の記事も None で検証しています)。

MCP の入口が、外に見えている

MCP の入口(/mcp-server/http)も、外から届きます。ログインしていない状態では、401(認証が必要)が返りました。

  • 使っていないなら、n8n の Settings の「Instance-level MCP」を無効にしておくのが安全です(無効にした状態で、入口が閉じることまでは確かめていません)
  • 使うなら、許可した Claude Code は、そのアカウントでできる操作を、MCP の入口を通して行えます。ツールの一覧には、ワークフローの作成と実行のほか、認証情報の一覧やコミュニティノードの追加もありました(VPS の n8n に MCP でつなぐ)

試していない守り

次のものは、確かめていません。公開する前に、自分の環境で調べてください。

  • ログイン画面への総当たり(パスワードを何度も試される)への対策。 n8n 側にどんな制限があるかは、確かめていません。パスワードは、長いものにしてください
  • ConoHa のセキュリティグループで、Web を自分の IP アドレスだけに絞ること。 IPv4v6-Web は、誰からでも通します。絞ったグループを作れば、ログイン画面を外に見せない形にできるはずですが、試していません。その場合、LINE のように外のサービスから届く Webhook も止まります
  • Caddy で、Webhook のパスだけを通し、管理画面を隠すこと。 テンプレートの Caddy は、全部を n8n に渡します。パスで分ける設定は、試していません
  • サーバー自体の更新(Ubuntu の更新)
  • n8n の脆弱性への対応。 テンプレートは latest のイメージを使っています。バージョンが固定されていません。更新の手順も、試していません

暗号の鍵と、パスワードの扱い

  • バックアップに、認証情報を読むための鍵が入っています。 ボリュームを丸ごと保存すると、鍵も入ります(手順の記事)。そのファイルを持っている人は、認証情報を全部読めます
  • パスワードを忘れても、メールでは直せません。 メールの設定がないためです。パスワードはパスワード管理のアプリに保存してください
  • テンプレートが、/root/n8n-info.txt に、ユーザー n8n-user のパスワードを、そのまま(平文で)書きます。 中身は、ここには載せません。このファイルの権限は確かめていません。不要なら、消すか、中身を控えて別の場所にしまってください
  • SSH は、パスワードでのログインが無効で、鍵だけです。ただし、root で入れる設定です。鍵のファイル(.pem)は、無くすと入れなくなり、盗まれると誰でも入れます

公開する前の確認

確認すること このサーバーでは
アカウントを作ってから、外に開いたか 作ってから開いた
5678番に、外から届かないか 届かなかった
使っていない MCP の入口を、閉じているか 試していない
Webhook に、認証か署名の検証が付いているか 検証用なので付けていない
パスワードは、長くて、保存してあるか 長いものを保存した
バックアップは、鍵ごと安全な場所にあるか サーバーの中だけ
本番の認証情報を、置いていないか 置いていない(ダミーのみ)

確認していないこと

  • n8n の脆弱性や、攻撃を受けたときの動きは、確かめていません。この記事は、外から届くものの一覧と、順番の注意で、安全を保証するものではありません
  • VPS は ConoHa の1GB だけです。ほかの会社のサーバーでは、セキュリティグループの代わりの仕組みが違います
  • n8n Cloud の守りは、この記事の対象外です

次に読む

次に読む