さくらの VPS のパケットフィルタリングを使った SSH ポート開放

以前は iptables にてフィルタリングしていたが、「さくらの VPS」コンソールにある「パケットフィルタリング機能」が拡張され、任意 IP アドレスのフィルタリング設定が可能となったため、SSH ポート開放の制御をそちらに寄せることにした。

手順

自分が接続しているマシンのネットワークIP(グローバルIP、ゲートウェイIP)を探す

AAA.BBB.CCC.DDD

さくらのVPSに接続

パケットフィルタの設定を追加(変更)

設定項目は以下。

  • フィルタの用途「カスタム」
  • プロトコル「TCP」
  • ポート番号「22」
  • 許可する送信元IPアドレス「AAA.BBB.CCC.DDD/32」
    (サブネット「/32」は、上記1つのIPアドレスのみ許可の意。「/32」とかアドレス範囲とか知りたい人は GGR)

この状態で Teraterm, WinSCP などから接続確認

問題なければ、これで終了。
かなり簡単になった。

メリット

  • GUI (Web) 上での設定なので、操作自体が簡単。

デメリット

  • GUI (Web) 上での設定が必須なので、手動作業。一連作業の自動化ができない。
  • パケットフィルタリングの機能自体による制約が生じる。
  • ログを残すような設定など iptables で可能なことができない。
  • カスタムフィルタリングは最大で10個までしか設定できない。
  • 個々のフィルタリングに対してコメントが残せないため、可読性が下がる。
    (間違えて別のパケットフィルタリングを上書きしてしまう恐れなど、ケアレスを誘発する恐れあり。
    まぁ iptables の場合は煩雑で失敗した場合のインパクトは同じような気がする。
    どっちもどっち。)

これらデメリットから、特にログが残せないなどの点については、企業によっては監査が通らない気がする。
その場合はこの設定簡略化そのものが採用できない。

注意

「パケットフィルタを利用しない」とか「SSHを『すべて許可する』」には、くれぐれも選択しないこと。
iptables で適切にフィルタリングをしているなら話は別だが、サーバが丸見えになってしまい、セキュリティ上のリスクが爆増する。

特にビギナーや素人

繋がらないからと言って、この辺りの操作をすると、「あっ」と言う間に何処かの大陸方面からサーバ乗っ取られて、踏み台にされて、さくらインターネットから「サーバー強制停止 ⇒ コンソール(コマンドライン)で対処するか、サーバ初期化するまでパケット全閉塞(実質利用できない)」を喰らうことになる。

少なくとも、SSH からの root 認証不可は絶対だし、鍵認証必須(パスワード認証不可)は強推奨。

【参考】

Web については、.htaccess にてドメインフィルタリングしている。
そのためパケットフィルタは、敢えて「すべて許可する」にしている。

接続元 IP が変更された際の iptables の SSH 設定変更

当方は、一般的なプロバイダーから接続している。
そのためルータを再起動するなどによって PPPoE を再確立した時点で、接続元の IP が変わってしまう。
この影響により、SSH 接続を制限しているサーバに対し、以下の作業を都度行う必要がある。

手順

自分が接続しているマシンのネットワーク  IP(グローバル IP、ゲートウェイ IP)を探す。

AAA.BBB.CCC.DDD

そのIPアドレスの WHOIS 情報を探す

次項は、再接続時の際に「偶然、以前に設定したセグメント内に入る」という可能性を考え、このような作業を追加としている。
個人的な「こだわり」の部分。

これは、全開放に比べたら極めて小さい穴だし、SSH 接続は鍵認証しかできないなど、他の部分でセキュリティレベルは上げるなどの処置を施している。
その点からして、リスクはカバーしてると思う。

あくまで参考程度とすること。十分考慮のうえ注意すること。
熟考せず無為に参考のまま設定すると、セキュリティ的にガバガバになるリスクがある。
参考にしての設定は、あくまで自己責任で。

登録情報からネットワーク IP アドレス(付与されている IP アドレス範囲)を探す。

なるべく広めの IP で SSH ポートを開くため。上位があるなら、なるべく広めに開ける。

AAA.BBB.CCC.EEE/FF

「さくらの VPS」コントロールパネルからコンソールに root ログイン

TeraTerm などで接続できない以上、仮想コンソールを使うしかない。

何番目に SSH 開放 IP アドレス(範囲)を突っ込むか探す。

この辺りは、手探りで探すしかない。
主に利用するコマンドは以下。

  • ルールの確認(設定コマンド原文)
# iptables -S
  • ルールの確認(設定順番号、表示整形)
# iptables -L --line-numbers

iptables の構成次第によって、追加(挿入)する場所が厳密な場合があったり、何も考えず、最後に追加すればよい場合など、そこは個々の構成に併せて考える。

iptables に追加(挿入)コマンド投入

  • 【例1】IP アドレスを範囲(サブネット単位)で SSH 開放する場合
# iptables -I INPUT 5 -s AAA.BBB.CCC.EEE/FF -p tcp
 -m state --state NEW -m tcp --dport 22 -j ACCEPT
  • 【例2】1つの接続元 IP アドレスだけ SSH 開放する場合
# iptables -I INPUT 5 -s AAA.BBB.CCC.DDD -p tcp
 -m state --state NEW -m tcp --dport 22 -j ACCEPT

この状態で Teraterm, WinSCP などから接続確認

TeraTerm などで、以前の通り接続できるか確認。
問題なければ、次項。

sysconfigに設定情報を保存

# service iptables save

念のため、ちゃんと保存されたかの確認もする。

# cat /etc/sysconfig/iptables

参考

【余談】将来こうしたい

ルーターの切断や再起動した時にしか必要のない作業とはいえ、毎回この設定をするのは、いちいち面倒。
なので、何かしらの自動化を考えている。

YAMAHA ルータに Poderosa でSSH接続する場合

本家のバージョン4.1.0 では、開発された時点でのSSHの暗号アルゴリズムが少ないので、NVR500に搭載されているSSHサーバの暗号アルゴリズムが解読できないみたい。

なので、オープンプロジェクト以降のバージョン4.3.0b以降~を使うのが良いかと。

Drobo FS の SSH 上から MAC アドレスを調べる方法

ルータを新調したので、DHCP の IP 静的割当を設定したのだが、Drobo FS の MAC アドレス探しがちょっと面倒だったので、備忘録。

まぁ Drobo FS 本体に貼られているラベルを見れば、MAC アドレスは判るんだけども、肝心のラベルが本体底面に貼られているので、引っ繰り返さないと確認できないのが難点。

我が家の場合、ラベルを確認するためには、Drobo FS の電源を切って、Drobo FS 本体が格納されているラックから引き剥がす必要があって、これがラックの場所とかの関係で、ちょっと大変。

ちなみに、IP アドレスとかサブネットとかは Drobo Dashboard から設定するものなので、そこから確認できるものの、MACアドレスは確認できない。(まぁ所詮米国製なので、こういうツールの「痒いところに手が届かない」のは、 米国の仕様(=御国柄と同意)。)

ということで、パソコンからは少し面倒ではあるが、Drobo FS の組み込み Linux にアクセスして調べることに。
という訳で以下手順。

1. DroboAppsから「dropbear」(SSHサーバ)をインストール

2. SSHクライアント(TeraTermProとかPoderosaとか)でDroboFSにSSHログイン。

ここでSSHの接続が確立できない場合は、DroboApps の挙動がおかしい可能性がある。
その場合は、Drobo Dashboard の管理者設定の「DroboApps を有効化」を一度切ってから、再度入れ直す。
ちなみに Drobo FS 再起動しても、接続は改善できない。必ず上記操作が必要。

3. ログインできたら、以下のコマンド実行

# /sbin/ifconfig
(ここにMACアドレスなどのネットワーク情報が表示される。)
#

(パスが通ってないので、最初に/sbin付けて、絶対パスでコマンド実行。)

これで本体をひっくり返さずに、MACアドレスの確認ができる。

とはいえ、とても面倒。