SSD Nodes Learn Hosting plans →
ガイド Matt Connor著者 Matt Connor

DeepSeek Harnessで入れるべきプラグイン5選

レンタルVPSの動作を変える5つのDeepSeek Harnessプラグインを紹介します。支出上限、ツール権限、インジェクション検知、永続メモリ、LANアクセスを扱います。

インストールする価値がある DeepSeek Harness プラグイン

DeepSeek Harness プラグインは、エージェントの権限で、料金を支払っているマシン上でエージェント内部に実行されるサードパーティーコードです。コミュニティーリストには20を超えるカテゴリと、1000を超えるエントリがあります。レンタルした仮想プライベートサーバー(VPS)で必要なのは5つです。支出上限には dsh-budget、ツールの実行制御には dsh-permission-rules、インジェクションと Secret のスキャンには dsh-defend、セッションをまたいで保持する事実には dsh-memory、認証方法を決めた後に限って dsh-web-lan-access を使います。

Harness は dsh です。これは DeepSeek のオープンソースエージェント Harness で、すべてをプラグインとして構成できるように設計されています。README では開発者向けプレビューと説明され、THERE WILL BE COMPATIBILITY-BREAKING CHANGES と警告されています。この事実が、以下のすべての選択を左右します。インストールするもののバージョンを固定し、アップグレードで動作しなくなる可能性を想定してください。また、内容を実際にすべて確認できる程度に構成を小さく保ってください。まだ Harness を実行していない場合は、まず VPS への DeepSeek Harness のインストールから始めて、ここに戻ってください。これらのプラグインが接続するエージェントループ、ツール、メモリの仕組みがまだ曖昧な場合は、先に 基本事項を確認することをお勧めします。各層の役割を理解しておくと、以下の選択を判断しやすくなります。

dsh がプラグインをインストールする仕組みと設定の配置先

dsh は Cordis プラグインから構成されるため、実行中のインスタンスは単一のプログラムではなく、プラグインのツリーです。プロファイルは、それらのプラグインを名前付きで組み合わせたものです。2 つのテンプレートは web と headless です。$DSH_HOME のデフォルト値は ~/.dsh で、プロファイルは $DSH_HOME/profiles/<name>/ に配置されます。ここには専用の package.json、dsh.profile マニフェスト、cordis.patch.yml が含まれます。

dsh plugin --profile web list
dsh plugin --profile web add dsh-budget
dsh plugin --profile web remove dsh-budget

使用できるソース形式は 4 つあります。npm パッケージ名だけを指定する形式、@towzai/dsh-memory のようなスコープ付き名前、github:PerryLink/dsh-budget#main のような GitHub 参照、link: または ./ を使うローカルパスです。GitHub 形式を使用してください。#main をコミットに置き換えれば、翌月も同じコードを取得できるためです。

dsh plugin --profile web add "github:PerryLink/dsh-budget#461d478"

レイヤーは固定された順序で適用されます。最初にプロファイルに記載された順序で各 bundle、次にプロファイルの cordis.patch.yml、その次にホームレベルの cordis.patch.yml、最後に存在する場合は --patch overlay が適用されます。後のレイヤーは、前のレイヤーが設定した内容を再構成したり削除したりできるため、順序が重要です。プラグインがインストール済みに見えるのに動作しない場合は、プロファイルの cordis.patch.yml を開き、2 点を確認してください。insert ブロックが存在することと、後のレイヤーで無効化されていないことです。

2026 年 8 月 17 日時点で、npm パッケージ @deepseek-ai/dsh は 0.1.0-rc.7 でした。一方、以下のプラグインは 0.1.0-rc 系列向けにビルドされています。dsh-permission-rules と dsh-defend は 0.1.0-rc.5 から 0.1.0-rc.6 までとの互換性を宣言し、dsh-budget は 0.1.0-rc.6 だけを宣言し、dsh-memory は ^0.1.0-rc.6 以降の peer range だけを設定し、dsh-web-lan-access は dsh のバージョンをまったく宣言していません。2026 年 10 月 10 日時点で、npm の latest tag は 0.2.0-rc.2 です。そのため、これらの pin を選んだ時点より現在の差は広がっています。この差はこのエコシステムでは通常の状態であり、プラグインの読み込みが停止する一般的な理由です。harness の更新速度が周囲のプラグインを上回るためです。harness は意図的にアップグレードし、プラグインを 1 つずつテストしてください。

信頼する前にプラグインを読む

dsh プラグインはハーネスからサンドボックス化されていません。Cordis ツリーと同じプロセスに、同じオペレーティングシステムユーザーとして読み込まれ、同じモデル認証情報と同じ作業ツリーにアクセスできます。プラグインのインストールは、sudo を付けて他人のスクリプトを実行することに近く、ブラウザー拡張機能を追加するのとは異なります。これは Claude Code プラグインが提起するものと同じ信頼性の問題です。答えも同じで、コードを読むか、インストールしないことです。

確認する項目は、次の4つです。

  • どの拡張ポイントを利用するか。 tools/pre-execute は、すべてのツール呼び出しを監視してブロックできることを意味します。agent/pre-step は、メッセージを監視できることを意味します。webServer.tapIndex は、ブラウザーに配信されるページを書き換えられることを意味します。これらのいずれも利用しないプラグインにできることはほとんどありません。すべてを利用するプラグインは、セキュリティ境界そのものです。
  • ネットワーク通信を行うか。 ソース内で fetch、http、およびハードコードされたホスト名を検索します。利用状況を外部へ送信するコストメーターは、利用パターンをどこかへ送っています。
  • 認証情報を読み取るか。 credentials.* またはプロバイダーキーに触れる処理には、README に明確な理由が必要です。
  • ライセンスと最終コミット日時。 毎週変化するエコシステムで、ライセンスがなく、数か月間更新されていないプラグインは、運用上のリスクになります。

その後、ブランチではなくコミットを指定してインストールし、インストーラーが cordis.patch.yml に書き込んだ挿入ブロックを読みます。このブロックには、プラグイン ID と登録した設定が記載されています。これは、追加した内容を最も簡潔かつ正確に説明するものです。ハーネスで可能な範囲では、AI エージェントから Secret を遠ざける方法に従い、プロバイダーキーをプラグインからアクセスできない場所に保管します。

dsh-budget: エージェントが一晩中使い続けるのを止めるには

VPS 上のエージェントは、無人で実行します。そこに配置する目的はそれですが、同時にリスクでもあります。dsh-budget はモデル、セッション、日ごとにトークン数と推定コストを計測し、それらの合計に対して上限を適用します。

dsh plugin --profile web add "github:PerryLink/dsh-budget#461d478"

デフォルト値は余裕を持たせてあります。セッションあたり 10 USD、1日あたり 50、1か月あたり 500 です。資金のあるチームには適しています。しかし個人サーバーでは、暴走したループが上限に達する前に処理を完了できるほど高い設定です。そのため、初日に下げてください。

グラフdsh-budget default caps and a lower starting point for one small VPS (USD)
このグラフのデータ
[
  {
    "label": "Per session",
    "plugin_default_usd": 10,
    "suggested_start_usd": 2
  },
  {
    "label": "Per day",
    "plugin_default_usd": 50,
    "suggested_start_usd": 5
  },
  {
    "label": "Per month",
    "plugin_default_usd": 500,
    "suggested_start_usd": 40
  }
]

推奨列は、1台のマシンを1人の運用者が使う場合の開始点です。公表された基準値ではありません。実際の1か月分の使用量を見て、必要なら引き上げてください。月間上限を 40 USD、セッション上限を 2 にすると、早い段階で明確に失敗します。ツールの使用量を把握している途中では、この動作が望ましいです。

- id: budget
  config:
    budgets:
      session: 2
      daily: 5
      monthly: 40
    warnRatio: 0.8
    overLimit: block

マシンの動作を変える設定は overLimit です。デフォルトは alert で、警告を表示しながら支出を続けます。つまり、初期状態ではこのプラグインはダッシュボードとして動作します。block に設定すると、上限に達した時点で harness が以降のモデル呼び出しを拒否します。そのため、夜間のジョブは朝まで課金を続けずに停止します。degrade は3番目のモードです。degradation マップにある、より安価なモデルの名前を示す案内とともに呼び出しをブロックします。ジョブを完了させる必要はあるものの、最良のモデルまでは必要ない場合に適しています。warnRatio のデフォルトは 0.8 なので、上限の80パーセントに達した時点で通知されます。

注意すべき制限が2つあります。コストは組み込みの価格表と、指定した価格を統合した表から計算されます。メンテナーは、組み込み価格が変動すると警告しています。prices はデフォルトで空です。固定したコミット 461d478 では、どちらの表にもないモデルに対するフォールバックである defaultPrice は、入力トークン100万あたり1.0 USD、出力トークン100万あたり3.0です。一方、2026年10月10日に確認した現在の main では、デフォルトが0で、モデルは価格未設定として表示されます。使用するモデルの実際の価格を入力してください。そうしないと、ダッシュボードは計測値に見せかけた推測になります。

2つ目の制限です。461d478 では、プラグインはセッションのイベントストリームから実行中のプロセス内で集計します。そのため、harness を再起動すると合計値がリセットされます。クラッシュループや、dsh を再起動する supervisor によって、日次上限もリセットされます。現在の main は、デフォルトで日次および月次のバケットを永続化し(persistence.enabled: true、10秒ごとにスナップショットを取得)、起動時に復元します。したがって、harness がストレージドメインを提供する場合、そこでの再起動によって日次または月次の上限が消えることはありません。ストレージドメインがない場合、集計はプロセス内に限定されます。main は 0.2 harness 系列も対象とするため、固定バージョンを変更する場合は harness も変更する必要があります。いずれの場合も、dsh-budget は自分のジョブに対するガードレールとして扱ってください。実際の上限として、プロバイダーアカウントにも支出上限を設定します。これは VPS 上の AI エージェントのコストを管理する という、より広い議論につながります。

日常の操作では、概要に /budget、モデル別の内訳に /budget models、処理を継続すると決めた後にブロックを解除するには /budget unblock <scope> を使用します。

dsh-permission-rules: 決して実行してはならないツール呼び出しはどれか

dsh-permission-rules は tools/pre-execute のウォーターフォールに宣言型ルールを配置するため、ツールの実行前にルールが評価されます。アクションは3種類あります。allow は呼び出しを通過させ、deny は呼び出しをブロックしてモデルが読める理由を返し、ask は公式の承認経路へルーティングします。

dsh plugin --profile web add "github:PerryLink/dsh-permission-rules#b30b4fb"

ルールは、セッションの作業ディレクトリを基準とする .dsh/rules.yaml に置きます。ファイルシステムのルートに向かって上位ディレクトリを検索するためのグローバルな fallbackPath と、任意の searchUp も使用できます。マッチング対象には、ツール名の glob、パラメータのキーと値の glob、ワークスペースを基準とするパスの glob、main や subagent などのエージェントセレクター、ネットワークターゲットが含まれます。

rules:
  - match: { tools: [bash], params: { command: "rm -rf*" } }
    action: deny
    reason: "No recursive deletes"
  - match: { tools: [edit, write], paths: ["**/.env*", "**/secrets/**"] }
    action: ask
    reason: "Secret files need confirmation"
  - match: { tools: ["mcp__*"] }
    action: ask
    reason: "MCP tools need confirmation"

評価は最初に一致したルールを採用するため、上位に広範な allow があると、その下にあるすべての限定的なルールが意図せず無効になります。拒否ルールを先に記述し、許可ルールを最後に記述してください。ツール名の glob は mcp__* にも適用されます。これにより、ハーネス自体ではなく Model Context Protocol (MCP) サーバーから提供されたツールも制御できます。これは、VPS で MCP サーバーを実行する場合に重要になります。

計画時には、次の動作を考慮してください。ask には応答者が必要です。headless プロファイルでは監視している人がいない場合があり、応答のない ask は誰かが現れるまで待機しません。応答者が構成されていなければ、ハーネスの承認チェーンはフェイルクローズし、呼び出しは拒否されます。したがって、無人のホストでは ask ルールが、意図せず記述した deny と同じ動作になります。決して承認しない処理には deny を使用し、目の前で操作するプロファイルには ask を使用してください。無人環境で承認を機能させるには、実際に応答できる経路が必要です。詳しくは、承認による AI エージェントのアクション制御で説明します。

dsh-defend: プロンプトインジェクションと漏えいした Secret への対策

dsh-defend は3つの時点でスキャンします。agent/pre-step 上の受信メッセージ、破壊的な削除に対するガードを含む tools/pre-execute 上のツール引数、そして tools/post-execute 上のツール結果です。最後のスキャンが重要です。Web ページから取得したコンテンツを、モデルがそれに基づいて処理する前に検査できるためです。

dsh plugin --profile web add "github:PerryLink/dsh-defend#7ba3427"

デフォルト設定は厳格というより慎重です。detection.injectionAction、detection.jailbreakAction、detection.secretAction はすべて ask で、detection.secretBlockCritical は true です。そのため、他の設定に関係なく、critical な Secret はブロックされます。無人運用するホストでは、必要なアクションを block に変更してください。誰にも確認できない状態で ask しても、それは意思決定ではありません。

監査設計は評価できます。defend/detection イベントには、rule id、family、category、severity、decision、スキャン結果の情報が記録されますが、一致したテキストは記録されません。Secret は種類だけが記録されます。そのため、監査ログを有効にしても、保護しようとしていた認証情報のコピーが別に作られることはありません。

この機能で得られる効果を明確に理解してください。検出はルールベースであり、README にも、未知の表現や複数段階の攻撃は検出をすり抜ける可能性があると明記されています。明らかな攻撃の発生率を下げる機能です。信頼できないコンテンツをエージェントに処理させても安全になるわけではありません。そのため、下位層の権限ルールは維持してください。

dsh-memory: エージェントは明日何を記憶しているか

dsh-memoryと呼ばれるプラグインは2つあります。インストールコマンドを入力する前に、この点を確認してください。明示的な source を指定してインストールし、読んだものと同じプラグインを選びます。

小規模なサーバーで使うなら、SQLite 版を推奨します。memoryとして登録され、すべてのプロファイルで共有するデータベースファイルを$DSH_HOME/memory/memory.dbに1つ保持し、memory_write、memory_search、memory_forgetを提供します。検索は、保存したテキストとタグをキーワードで検索します。embedding サービス、API key、追加プロセスは不要です。

dsh plugin --profile web add "github:ben7am1n/dsh-memory#def7c6a"

変更する設定は少数です。データベースファイルにはpath、注入する未固定メモリーの件数にはpromptRecentCount(デフォルトは10)、レンダリング予算にはpromptMaxChars(デフォルトは2000)を指定します。node:sqliteに依存していますが、Node 22 と 24 では現在も experimental とされています。そのため、Node のアップグレードは問題ないと決めつけず、テスト対象にしてください。

メモリーがマシンに与える実際の影響は次のとおりです。注入されたメモリーは、すべてのターンで system prompt に含まれます。promptMaxCharsはレンダリングされるセクションの上限であり、固定量ではありません。ただし、保存したメモリーがこの上限まで埋まると、2000 文字の予算によって、すべてのリクエストに毎回、追加の入力トークンが数百個発生します。これは請求額に直接影響します。そのため、dsh-budgetをdsh-memoryより先にサーバーへ導入する価値があります。promptMaxCharsは小さく保ち、ファイルを増え続けさせずにmemory_forgetで整理してください。

もう一方のビルドはメモリーを YAML ファイルに保存し、自動的な prompt 注入を伴う embedding 検索を実行します。インストールにはdsh plugin --profile web add github:towzai/dsh-memoryを使用します。embedding 検索には、ローカルの ollama インスタンスと embedding model が必要です。デフォルトはqwen3-embedding:0.6bで、DSH_MEMORY_EMBED_MODELで変更できます。ollama がない場合は、キーワードのみの検索にフォールバックします。意味検索の再現率は、キーワード検索より高くなります。一方で、2つ目のサービスと、同じサーバー上に常駐する model weights も必要になります。小規模なプランでは、これはサーバーを借りた本来の作業に使えるメモリーを消費します。RAM に余裕がある場合に選択してください。再現率と常駐コストの一般的なトレードオフについては、エージェント向けのローカルメモリーで説明しています。

dsh-web-lan-access: Web UI は loopback の外部で待ち受けるべきか

npx @deepseek-ai/dsh web は 127.0.0.1:3080 でインターフェースを提供します。ブラウザーではセキュアコンテキストでのみ crypto.randomUUID() を公開するため、別のマシンから同じページを通常の HTTP で読み込むと失敗します。dsh-web-lan-access は webServer.tapIndex を利用して小さな polyfill を挿入し、この問題を解決します。また、サーバーの bind 先を 0.0.0.0 に変更します。

インストールする前に、付属の警告を確認してください。ここで引用しているコミット時点の e27e909 では、README によると、0.0.0.0 に bind すると、同じローカルエリアネットワーク(LAN)上の誰でも認証なしで agent に到達できます。サーバーが public IP address を持つ場合は、インターネット全体から到達可能になります。ただし、機密性の高いメソッドの短い一覧(settings.*、credentials.*、llm.discoverModels)は loopback に固定され、remote origin からは 403 を返します。この仕様は変更されています。2026 年 10 月 10 日に確認した現在の harness build では、ブラウザーを認証します。表示された URL の launch token を signed session cookie と交換し、その cookie をすべての Host API route と stream が要求します。plugin の現在の README は trustedHosts を本人確認ではなく Origin/Host fence と説明しています。また、0.0.0.0 に bind すると、到達可能なすべての interface で認証面が公開されるとしています。さらに現在の build では、認証済みの remote page に対して Host-backed settings を有効にするため、サインイン済みの remote browser は Host settings にも到達できます。リスクがなくなったのではなく、移動しただけです。port に到達できる人は login を調査できます。表示された URL 自体が credential であり、通常の HTTP ではその token がネットワーク上を平文で通過します。

ほとんどの場合、この plugin は必要ありません。代わりに SSH で port を forward してください。

ssh -N -L 3080:127.0.0.1:3080 you@your-server

次に、ローカルの browser で http://127.0.0.1:3080 を開きます。harness は loopback でのみ待ち受けるため、外部には何も公開されません。また、browser は 127.0.0.1 を secure origin として扱うため、crypto.randomUUID() が利用可能で、polyfill も必要ありません。1 つの command だけで済み、plugin も新たな攻撃面もありません。

forward では対応できない場合に限り、plugin をインストールしてください。たとえば、同じネットワーク上の phone から UI にアクセスする必要がある場合です。その場合は、private network interface の背後で bind し、その interface だけを許可する firewall rule を維持してください。また、trustedHosts の下に、web-runtime entry で使用する名前を一覧にしてください。実際の multi-user access には dsh-passwords があります。これは subuser permissions、subuser ごとの hourly token quota と daily time quota、Let's Encrypt による自動 TLS(transport layer security)certificate、暗号化された audit log を追加します。これは plugin ではなく platform として評価してください。ports 80 と 443 を必要とし、独自の installer を提供します。また、文書化された quick path では、ネットワークから shell script を直接 bash に pipe します。npm install -g dsh-passwords の後に dsh-passwords install を実行する方法を推奨します。そうすれば、実行前に code が保存された disk 上で内容を確認できます。

プラグインを正しく削除する方法

アンインストールは 2 つの手順で行います。2 つ目を省略する人が多くいます。

dsh plugin --profile web remove dsh-budget
dsh plugin --profile web list

list にそのプラグインが表示されなくなっていることを確認します。次に $DSH_HOME/profiles/web/cordis.patch.yml を開き、そのプラグイン名を含む残りの insert ブロックをすべて削除します。このエントリによってプラグインがツリーに読み込まれるためです。ハーネスを再起動してツリーを再構築します。すでに読み込まれたプラグインは、再起動するまで読み込まれたままです。最後に、データはコードより長く残ることに注意してください。アンインストールしても $DSH_HOME/memory/memory.db と .dsh/rules.yaml は残ります。データも削除する場合は、手動で削除してください。

読む対象と確認時期

ここで参照しているのはすべてブランチではなくコミットです。main は、この記事を読む時点では別のコードになっているためです。すべてを 17 August 2026 に読み、その日に npm 上の harness 自体は 0.1.0-rc.7 でした。上記で説明したデフォルトと動作は、primary source と照合して 10 October 2026 に再確認しました。その時点で npm の latest タグは 0.2.0-rc.2 でした。

この候補一覧の基になった正確なコミット
  • 17 August 2026 時点の f2918fb における コミュニティプラグイン一覧。意図的に 1 回だけリンクしています。これはディレクトリであり、推奨一覧ではありません。
  • 17 August 2026 時点の 461d478 における dsh-budget。Apache 2.0。dsh 0.1.0-rc.6、Node 22.19 または 24 以降を宣言しています。
  • 17 August 2026 時点の b30b4fb における dsh-permission-rules。Apache 2.0。dsh 0.1.0-rc.5 から 0.1.0-rc.6 を宣言しています。
  • 17 August 2026 時点の 7ba3427 における dsh-defend。Apache 2.0。dsh 0.1.0-rc.5 から 0.1.0-rc.6 を宣言しています。
  • 13 August 2026 時点の def7c6a における dsh-memory。MIT。SQLite ビルドです。dsh の互換性フィールドはなく、^0.1.0-rc.6 以降の peer range のみを指定しています。
  • 16 August 2026 時点の e27e909 における dsh-web-lan-access。MIT。dsh の互換性フィールドはありません。

コマンドをコピーする前に、これらの固定先を再確認してください。developer preview のエコシステムでは、日付と結び付いたバージョン番号だけが意味を持ちます。

FAQ

VPS に最初にインストールすべき DeepSeek Harness プラグインはどれですか?

何よりも先に dsh-budget と dsh-permission-rules をインストールしてください。overLimit: block を設定すると、無人実行が一晩中費用を使い続けることを防げます。.dsh/rules.yaml ファイルを使うと、承認していないツール呼び出しを停止できます。エージェントが公開 Web から情報を読むようになったら dsh-defend を追加し、すべてのセッションに同じコンテキストを貼り付けていることに気付いたら dsh-memory を追加してください。テーマとステータスチップは省略します。これらはマシンの動作を変えずに、エージェントの権限で実行されるコードを追加するだけです。

dsh プラグインは harness からサンドボックス化されていますか?

いいえ。プラグインは harness と同じ Cordis ツリーに、同じプロセス内で、同じオペレーティングシステムユーザーとして読み込まれます。モデルの認証情報と作業ツリーも共有します。tools/pre-execute にフックするプラグインはすべてのツール呼び出しを確認し、ブロックできます。agent/pre-step にフックするプラグインはメッセージを確認できます。そのため、ソースを読み、ライセンスと最終コミット日を確認してください。ブランチではなくコミットを指定してインストールし、コードが実行中に変更されないようにします。

dsh-budget はエージェントを実際に停止しますか。それとも警告だけですか?

overLimit によって異なります。デフォルトは alert です。warnRatio に達すると警告しますが、支出は継続します。block は上限に達すると追加のモデル呼び出しを拒否し、/budget unblock <scope> は続行を選択したときに上限を解除します。degrade は、degradation マップからより安価なモデルを指定した案内を表示してブロックします。制限もあります。固定されたコミット 461d478 では、合計値は実行中のプロセス内で集計されます。そのため harness を再起動するとリセットされ、再起動ループによって日次上限を回避できます。現在の main は、デフォルトで日次および月次のバケットを再起動後も保持します。いずれの場合も、実際の上限としてプロバイダーアカウントに利用上限を設定してください。

dsh プラグインを完全に削除するにはどうすればよいですか?

dsh plugin --profile web remove <package-name> を実行し、dsh plugin --profile web list で確認します。次に $DSH_HOME/profiles/web/cordis.patch.yml を開き、そのプラグインの残った insert ブロックを削除してください。このエントリによってプラグインが読み込まれるためです。harness を再起動して、プラグインツリーを再構築します。プラグインがディスクに書き込んだデータは残ります。$DSH_HOME/memory/memory.db と .dsh/rules.yaml は、手動で削除するまでアンインストール後も保持されます。

dsh Web UI をネットワーク経由で公開しても安全ですか?

単独では安全ではありません。dsh web は 127.0.0.1:3080 で待ち受け、dsh-web-lan-access によってそのバインド先が 0.0.0.0 に変更されます。ここで示したコミット時点の README には、同じネットワーク上の誰でも認証なしでエージェントに接続できるようになると記載されていました。ループバックに固定されていたのは settings.*、credentials.*、llm.discoverModels だけです。2026 年 10 月 10 日に確認した現在の harness ビルドでは、出力された URL の起動トークンと署名付きセッション Cookie によってブラウザーセッションを認証します。ただし、ログイン画面はすべてのインターフェースで公開され、平文の HTTP URL ではそのトークンが暗号化されずに送信されます。SSH ポートフォワード、ssh -N -L 3080:127.0.0.1:3080 you@your-server、またはプライベートネットワークインターフェースとファイアウォールルールを組み合わせてポートを保護してください。外部から到達可能なものの前段には TLS を配置してください。