踏み台サーバとは ― 内部のサーバへ安全に入る中継の仕組み
踏み台
踏み台サーバとは、内部のサーバへ入るときに経由する中継用のサーバ
踏み台サーバは、内部のサーバへ入るときに必ず経由する中継用のサーバです。手順書に「踏み台サーバにSSHしてから作業する」と書いてあれば、そのシステムの内部のサーバにはインターネットから直接入れません。ジャンプサーバやBastionとも呼び、クラウドの構成図に Bastion と書かれた1台があれば、たいていこのサーバを指します。
データベースのように外へ公開しないサーバでも、更新や調査のために担当者は接続します。その経路をサーバごとに開けると、攻撃者が狙える場所がサーバの数だけ増えます。踏み台サーバを置けば、外から入れる場所が1台になり、守る対象がはっきりします。置き場所、通信の絞り方、SSHでの接続方法、踏み台を置かない方式の順に説明します。
Bastion はもともと、強く守ったホストを指す言葉です。NISTのSP 800-123は、bastion host を、防御を特に強め、機能を最小限にしたホストと説明しています。いまのクラウドの文書では、外からの接続を受けて内部へ中継するサーバをこの名前で呼ぶことが多く、Google Cloudの文書も同じ意味で使っています。
なぜ踏み台サーバが必要か:外から入れる場所を1台に絞る
踏み台サーバの効果は、内部のサーバを外から見えなくしたまま、管理の接続だけを通せることです。DMZは公開するサーバを区画で分ける仕組みで、踏み台サーバは担当者の通り道を1本にまとめる仕組みです。1本にまとめると、次の3つの対策を1か所で行えます。
- 接続元の制限:会社のIPアドレスなど、決まった場所からだけ接続を受け付ける
- 認証:公開鍵や多要素認証を、踏み台サーバへの接続で必ず通す
- 記録:誰がいつ接続したかを、踏み台サーバのログに集める
NISTのSP 800-123も、サーバの遠隔管理では、強い認証と、管理に使える端末の制限を求めています。インターネットからファイアウォールを越えて管理することは、VPNのような強い仕組みを使わない限り許可しないよう書いています。踏み台サーバは、この強い認証と接続元の制限を1か所にまとめて行う作り方の1つです。
踏み台サーバの構成:公開側に1台置き、内部は非公開にする
クラウドでは、ネットワークを公開側と非公開側のサブネットに分けます。踏み台サーバは、インターネットから届く公開側に置きます。WebサーバやDBサーバは非公開側に置き、グローバルIPアドレスを持たせません。サブネットの分け方はAmazon VPCの記事で確かめられます。
配置だけでは足りず、ファイアウォールの規則で接続の相手も絞ります。規則は次の3か所に書きます。
| 設定する | 許可する | 相手 |
|---|---|---|
| 踏み台サーバの | SSH | 会社や |
| 踏み台サーバの | SSH | 内部サーバの |
| 内部サーバの | SSH | 踏み台サーバだけ |
AWSのセキュリティグループのように、IPアドレスの代わりに踏み台サーバのグループを相手に指定できる仕組みもあります。踏み台サーバを作り直してIPアドレスが変わっても、規則を書き換えずに済みます。Windowsのサーバなら、SSHの22番の代わりにリモートデスクトップの3389番を同じように絞ります。
押してみる:規則を変えると、どの接続が止まるか
次の図で2つの規則を選ぶと、前の図の構成のどの接続が止まるかが分かります。最初の状態は、どちらも広く開けた設定です。
- 担当者の
PCから 通る接続元を踏み台サーバへ 問わないので 通ります。 - 外部の
攻撃者から 届くログインの踏み台サーバへ 画面まで 届きます。 この 先を 守るのは 認証だけです。 - 外部の
攻撃者から 止まる内部サーバには内部サーバへ 直接 グローバルIPアドレスが 無いので、 規則の 設定に 関わらず 届きません。 - 乗っ取られた
Webサーバから 届く同じDBサーバの 22番へ ネットワークの 中なので 届きます。 1台が 乗っ取られると、 隣の サーバも 狙われます。 - 担当者の
PCから 通る踏み台サーバも踏み台サーバ経由で DBサーバへ 同じ ネットワークの 中に あるので 通ります。
- 担当者の
PCから 通る接続元を踏み台サーバへ 問わないので 通ります。 - 外部の
攻撃者から 届くログインの踏み台サーバへ 画面まで 届きます。 この 先を 守るのは 認証だけです。 - 外部の
攻撃者から 止まる内部サーバには内部サーバへ 直接 グローバルIPアドレスが 無いので、 規則の 設定に 関わらず 届きません。 - 乗っ取られた
Webサーバから 止まる接続元がDBサーバの 22番へ 踏み台サーバではないので 止まります。 乗っ取られた サーバから、 SSHで 隣へ 移れません。 - 担当者の
PCから 通るDBサーバから踏み台サーバ経由で DBサーバへ 見ると 接続元は 踏み台サーバなので 通ります。
- 担当者の
PCから 通る会社の踏み台サーバへ IPアドレスから 接続するので、 許可の 範囲に 入ります。 - 外部の
攻撃者から 止まる接続元が踏み台サーバへ 許可の 範囲に 入らないので、 ログインの 画面にも たどり着けません。 - 外部の
攻撃者から 止まる内部サーバには内部サーバへ 直接 グローバルIPアドレスが 無いので、 規則の 設定に 関わらず 届きません。 - 乗っ取られた
Webサーバから 届く同じDBサーバの 22番へ ネットワークの 中なので 届きます。 1台が 乗っ取られると、 隣の サーバも 狙われます。 - 担当者の
PCから 通る踏み台サーバも踏み台サーバ経由で DBサーバへ 同じ ネットワークの 中に あるので 通ります。
- 担当者の
PCから 通る会社の踏み台サーバへ IPアドレスから 接続するので、 許可の 範囲に 入ります。 - 外部の
攻撃者から 止まる接続元が踏み台サーバへ 許可の 範囲に 入らないので、 ログインの 画面にも たどり着けません。 - 外部の
攻撃者から 止まる内部サーバには内部サーバへ 直接 グローバルIPアドレスが 無いので、 規則の 設定に 関わらず 届きません。 - 乗っ取られた
Webサーバから 止まる接続元がDBサーバの 22番へ 踏み台サーバではないので 止まります。 乗っ取られた サーバから、 SSHで 隣へ 移れません。 - 担当者の
PCから 通るDBサーバから踏み台サーバ経由で DBサーバへ 見ると 接続元は 踏み台サーバなので 通ります。
内部サーバの規則を絞る効果は、外からの攻撃より、中に入られたあとに表れます。隣のサーバからの接続を止めておくと、1台の被害が次のサーバへ広がりにくくなります。
SSHで踏み台を経由する方法:ProxyJumpとポートフォワーディング
いちばん素朴な方法は、踏み台サーバにSSHでログインし、そこからもう一度 ssh を打つやり方です。ただしこの方法では、内部サーバ用の秘密鍵を踏み台サーバに置くことになります。踏み台サーバが乗っ取られると、その鍵も一緒に奪われます。そこで、手元のPCから1回のコマンドで経由する方法を使います。
ProxyJumpで内部のサーバへ接続する
OpenSSHでは、-J を付けると踏み台サーバを経由して接続できます。自分のPCのターミナルで次のように打ちます。
$ ssh -J ops@bastion.example.com ops@10.0.2.20 # bastion.example.com は踏み台サーバ、10.0.2.20 は内部のDBサーバです。 # 鍵はどちらも手元のものを使います。
SSHはまず踏み台サーバへ接続し、そこから内部サーバまでのTCPの転送を作ります。その転送の中を通して、手元のPCと内部サーバが直接SSHでつながります。2本目のSSHは手元のPCで暗号化されるので、踏み台サーバは中身を読めません。内部サーバへの認証も手元のPCで行うので、内部サーバ用の秘密鍵を踏み台サーバに置かずに済みます。
毎回 -J を打つ代わりに、設定ファイルに書いておくこともできます。次のように書くと、ssh db の一言で同じ接続になります。この設定は、ファイルを運ぶ scp や sftp にも効きます。
Host bastion
HostName bastion.example.com
User ops
Host db
HostName 10.0.2.20
User ops
ProxyJump bastion接続先によっては、踏み台サーバが2段になっていることもあります。-J にはカンマで区切って複数の踏み台を書けるので、手動でログインを重ねずに済みます。
ポートフォワーディングでデータベースへ接続する
SSHではなく、手元のツールからデータベースへ接続したいこともあります。このときはSSHの記事で説明した -L のポートフォワーディングを使います。次の例は、手元の15432番を、DBサーバのPostgreSQLの5432番につなぎます。
$ ssh -N -L 15432:10.0.2.20:5432 ops@bastion.example.com # -N はリモートのコマンドを実行せず、転送だけを行う指定です。 # この間、手元のツールは localhost の 15432番 へ接続します。
ProxyJumpと違い、この方法でSSHの暗号化があるのは手元のPCと踏み台サーバの間だけです。踏み台サーバからDBサーバまでは、データベース自身の通信のまま流れます。この区間も守りたいときは、データベースの接続にTLSを使います。踏み台サーバの送信とDBサーバの受信の両方の規則で、5432番の許可も必要です。
踏み台サーバの運用で守ること
踏み台サーバは、インターネットから届く場所にあり、内部へ接続できる1台です。乗っ取られると影響が内部全体に及ぶので、外から狙われる前提で運用します。
- 秘密鍵を踏み台サーバに置かない。ProxyJumpなら置かずに済みます
- 共有のアカウントを使わない。人ごとに分けると、ログから誰の接続かが分かります
- パスワードのログインを止める。OpenSSHの既定では許可なので、PasswordAuthentication を no にして、公開鍵や多要素認証に絞ります
- SSH以外のサービスやソフトを入れず、OSの更新を続ける。データも踏み台サーバには保存しません
- 転送先を絞る。OpenSSHの PermitOpen で、転送できる宛先を内部の決まったサーバに限れます
- 使うときだけ起動する。止めている間は狙われず、起動時間で課金されるサーバなら費用も減ります
- ログを別の場所へ送る。乗っ取られるとログを消されることがあるので、Syslogなどで外へ運びます
ProxyJumpにも注意点があります。踏み台サーバに残るのは接続の記録で、内部サーバで打ったコマンドは残りません。操作まで記録したいときは、内部サーバ側でも記録を取るか、セッションを記録する製品やサービスを使います。
秘密鍵を踏み台サーバに置かない別の方法として、ssh -A のエージェント転送もあります。OpenSSHの文書は、この機能を慎重に使うよう注意しています。転送中は、踏み台サーバの管理者権限を取った攻撃者が、鍵の中身は取れなくても、その鍵で別のサーバへ認証できるためです。踏み台を経由するだけなら、ProxyJumpで足ります。
踏み台を置かない方式:VPNとクラウドの接続サービス
踏み台サーバは、サーバを1台増やして運用し続ける方式です。同じことを、踏み台サーバなしで行う方式もあります。代表はVPNと、クラウド事業者の接続サービスです。
| 方式 | 外に | 運用する | 向く |
|---|---|---|---|
| 踏み台サーバ | SSHを | 利用者が | クラウドの |
| VPN | VPNの | 利用者か、 | 管理の |
| クラウドの | 事業者の | 事業者。 | クラウドの |
VPNは、担当者のPCを社内やクラウドのネットワークにつなぐ方式です。つないだあとは内部のアドレスへ接続できるので、踏み台サーバを通さずに済みます。その分、VPNに入った端末から届く範囲を、ファイアウォールで絞っておきます。
接続サービスは、クラウド事業者のIDと権限で接続を認める方式です。SSHのポートをインターネットに向けず、サーバを外部から見えないままにできます。主要なクラウドには、次のサービスがあります。
- AWSのSession Manager:サーバのエージェントがAWSへHTTPSでつなぐので、受信のポートもSSHの鍵も要りません
- Azure Bastion:事業者が運用する踏み台のサービスです。TLSの443番で接続でき、VMにグローバルIPアドレスは要りません
- Google CloudのIAP TCP転送:暗号化されたトンネルでVMへ接続します。ファイアウォールで、IAPのアドレス範囲からの受信だけを許可します
クラウドのサーバを管理するだけなら、サーバを1台持たずに済む接続サービスを先に検討します。Google Cloudの文書も、踏み台サーバは、セッションの記録などの事情でIAPを使えないときの選択肢として挙げています。ただし記録できる範囲はサービスごとに違います。Session Managerは、SSHやポートフォワーディングを通したセッションの操作を記録できません。Azure Bastionでセッションを録画するには、上位のPremiumが必要です。
画面だけを手元へ転送して、データを持ち出させない方法もあります。社内の業務で使う方式は、シンクライアントとVDIの記事で比べています。
攻撃に使われる「踏み台」との違い
「踏み台」という言葉は、攻撃の説明にも出てきます。不正アクセスの話で出てくる踏み台は、攻撃者が乗っ取り、別の標的を攻撃するための中継に使う機器です。踏み台サーバは管理者が用意し、担当者の接続を中継します。中継という仕組みは同じでも、誰が何のために使うかが違います。
この2つはつながっています。踏み台サーバが乗っ取られると、そのまま攻撃の踏み台になり、内部のサーバへの攻撃に使われます。ニュースで「踏み台にされた」と書かれていれば、攻撃の中継に使われたという意味です。
参考にした資料
- NIST SP 800-123「Guide to General Server Security」(2008年7月)
- OpenSSH「ssh(1)」
- OpenSSH「ssh_config(5)」
- OpenSSH「sshd_config(5)」
- AWS「Launching an Elastic Beanstalk application in a VPC with bastion hosts」
- AWS「AWS Systems Manager Session Manager」
- AWS「Session Manager prerequisites」
- Microsoft「What is Azure Bastion?」
- Microsoft「Record Bastion sessions」
- Google Cloud「Connect to VMs using a bastion host」
- Google Cloud「Choose a connection option for internal-only VMs」
- Google Cloud「Using IAP for TCP forwarding」
練習問題(全5問)
正解:外から
踏み台サーバは、
正解:踏み台サーバ
接続元を
正解:手元の
OpenSSHは
正解:踏み台サーバまでは
SSHで
正解:踏み台サーバは
同じ
選んでから「採点する」を押すと、解説つきで答え合わせができます。