SSHトンネルで安全に管理画面へアクセスする
先日、あるWebアプリをVPS上で動かすことになりました。
今回はDockerを使って運用する構成です。
この構成では、外部公開用のポートとは別に
管理画面用のポートも用意されています。
管理画面は社内の人間しか利用しないため、
セキュリティ面を考えて、インターネット上には公開しない方針にしました。
SSHトンネルを使ってアクセスします。
SSHトンネルとは
ChatGPTに聞いてみると
SSH接続を使って「暗号化された専用の通路」を作る仕組み
とのことです。
SSHでVPSにログインできる人だけが、その通路を使ってアクセスできるようになります。
経緯
最初はいつも通り、管理画面にはBasic認証をかければいいか、といった気持ちでした。
普段はApacheを入口にして、外からのアクセスをいったんApacheが受け取り、
そこからアプリ本体へ転送する構成だからです。
このやり方だと、Apache側で
– Basic認証
– IP制限
などの制限をかけやすく、管理画面を守りやすいです。
しかしApacheを経由させる構成にすると、その先の管理画面のログインが正常に動作せず、
エラーになってしまいました。
調べてみると、管理画面はログイン時に「どのURLからアクセスしてきたか」などをチェックしているようで、Apacheを挟むことでその情報が変わってしまい、弾かれてしまうようでした。
そのため、管理画面はインターネットに公開せず、SSHトンネルを使って必要な人だけがアクセスする構成に切り替えました。
SSHトンネルでのアクセス方法
ここでは、管理画面が 3333 番ポートで動いている想定です。
1. Dockerのポート公開を調整する
まず、docker-compose.yml の ports を以下のようにします。
ports:
- "127.0.0.1:3333:3333"
- "0.0.0.0:5580:5580"この設定のポイントは
• 管理画面(3333)は VPS の localhost からしかアクセスできない
• 外部公開用(5580)はインターネットに公開する
つまり、管理画面のポートは外部から直接アクセスできない状態になります。
2. SSHトンネルを張る
ローカルPCから以下を実行します。
ssh -N -L 3333:127.0.0.1:3333 user@your-vps-ipこのコマンドは、
• 自分のPCの localhost:3333
• VPSの 127.0.0.1:3333
をトンネルでつなぐ、という意味です。
3. ブラウザでアクセスする
トンネルを張った状態で、ブラウザで以下にアクセスします。
https://127.0.0.1:3333これで、管理画面が表示されます。
※管理画面側がTLSで動いているため、ローカルアクセスも https になります。
4. SSHトンネルを閉じる
管理画面での作業が終わったら、SSHトンネルを張っているターミナルで
Ctrl + C
を押して終了します。
(補足)バックグラウンドで起動した場合
もし -f オプションを付けてバックグラウンドで起動している場合は、Ctrl + C では止められません。
その場合は、SSHプロセスを終了してトンネルを閉じます。
pkill -f "ssh -N -L 3333"この方法のメリット
SSHトンネルにすると、管理画面が外部に公開されないため
• ポートスキャンされても管理画面が見えない
• 攻撃対象になりにくい
• Basic認証やIP制限を無理に頑張らなくていい
というメリットがあります。
まとめ
結果的にBasic認証よりセキュアになったので、この方法を採用してよかったです。
このカテゴリの最新記事
2025.02.27
2023.10.02
2023.04.07
2025.07.14