2011/05/25

SSHdのポートは何番に変更すべきか

通常、企業のサーバはデータセンターに設置されていて、SSHで接続できるのは限られたIPアドレスからのみ、あるいは、そもそも外部のネットワークからSSH接続が許可されていないものです。しかし、小規模な場合はレンタルサーバ数台や、最近では安価なVPSを数台という構成で運用しているところもあるでしょう。

レンタルサーバやVPSで運用する場合、ネットワークの入り口:ゲートウェイから全てのパケットが入ってきますので、サーバ毎にFirewallを設定する必要があります。OpenBSDであればpf, FreeBSDであればipfw, Linuxであればiptablesを使いますね。

この記事は、SSHdを動かす際に標準の22番ポート以外のポートでListenさせる時の話です。簡単に言うとSSHdをListenさせるポート番号の決め方の紹介です。

22番ポート以外を選ぶ理由

SSHdを22番ポート以外でListenさせる理由は、リモートログインする基点が固定IPアドレスではないという状況下で22番ポートへの侵入を目的とするアタックを回避するという点でしょう。認証を破られない為という事ではなく、SSHdが接続拒否に使うCPUリソースの節約、ゴミのような認証失敗のログを減らすという観点に基づいてのポート番号変更です。

VPN経由で内部からしかリモートログインできない、特定のIPアドレスからのみリモートログイン出来る、という場合はFirewallがしっかり22番ポートを守ってくれるので、わざわざほかのポート番号に変更する必要性はないかもしれません。

22番以外も狙われる事がある

僕が管理しているサーバの一つに2222番ポートでSSHdがListenしているサーバがありました。2222は安易に決めたポート番号なのですが、ログを見るとアタックされている事が判明しました。公開鍵でしか入れないので侵入される事はありませんが、22→2222というポート番号の変更は、侵入する側からすれば想定の範囲内であるのかもしれません。

侵入する側の立場に立ってみると22番以外を叩いてみるというのは効率の悪い事でしょうし、そのサーバの2222番ポートも狙われたのは偶然かもしれませんが、予想しやすいポート番号出ある事にかわりはないので変更する事にしました。

適当なポート番号に変えるといっても、思いつきで決めたポート番号は忘れてしまうかもしれません。~/.ssh/configに書いておいても別の端末からログインする時に困るかもしれません。忘れにくい数値を組み合わせて計算で求められる数値を新しいポート番号にしておくと、忘れても計算すればなんとかなります。

幾つか忘れにくい数値を使った例を書いてみます。

変更候補1: サーバのIPアドレスから計算

IPv4アドレスは32ビットの10進数で表記できます。例えばサーバのIPアドレスが192.0.2.169であれば次のコマンドで10進数の値に変換できます。

% echo '192.0.2.169' | awk -F. '{ print $1*2^24 + $2*2^16 + $3*2^8 + $4}' ⏎
3221226153

% ping 3221226153 ⏎
PING 3221226153 (192.0.2.169): 56 data bytes
...

出てきた数値は3221226153です。pingを打ってみると元のIPアドレスが表示されます。あとは出てきた数値を何か覚えやすい数値で割って65535以下になるようにするとよいでしょう。例えば誕生日、僕の誕生日は四月九日なので0409=409で割ってみます。

% echo '3221226153 / 409' | bc  ⏎
7875858
% echo '3221226153 / 409 / 409' | bc ⏎
19256
% grep 19256 /etc/services

409で割っただけでは大きすぎるのでもう一度409で割りました。出てきた19256は/etc/servicesで定義されていないポート番号なので大丈夫です。Well-Knownポート(〜1023番)は避けた方がよいですが、仮に何かのサービス用ポート番号と被った数値が出てきても、そのサーバでListenしていない&&使う予定がないポート番号であれば問題ないでしょう。

変更候補2: 日付・記念日から算出する

安直ですが自分の誕生日や家族の誕生日、結婚記念日、会社の創立記念日、必ずCDを買うアーティストの誕生日など忘れにくい日付を数値として使うのもよい考えです。複数台のサーバがある場合、サーバ毎にポート番号が違うと管理しづらいかもしれませんので、管理するサーバを適当なグループに分けてポート番号を設定するとよいでしょう。

変更候補3: ドメイン名を計算で数値化

% echo bouncehammer.jp | perl -nle 'map { $x+=ord $_ } split(q//,$_); print $x' ⏎
1534
% echo '1534 * 22' | bc ⏎
33748

ホストに割り当てたドメインを数値化(ASCIIコードを全部足す)すると、関係するサーバ毎にポート番号がうまい具合に決められます。数値化した結果が小さな数字であればSSHなので22を掛けてそこそこの大きさの数値にするとよいでしょう。

まとめ

他には電話番号下四桁や郵便番号を使って計算してもよいでしょう。πeつまらない数字を使うのもアリです。変更したポート番号は/etc/motdに数値と数式を書いておくとログインする度に確認も出来ます。

% cat /etc/motd ⏎
                                                            _         _       
__      ____      ____      _______  ____ _ _ __ ___  _ __ | | ___   (_)_ __  
\ \ /\ / /\ \ /\ / /\ \ /\ / / _ \ \/ / _` | '_ ` _ \| '_ \| |/ _ \  | | '_ \ 
 \ V  V /  \ V  V /  \ V  V /  __/>  < (_| | | | | | | |_) | |  __/_ | | |_) |
  \_/\_/    \_/\_/    \_/\_(_)___/_/\_\__,_|_| |_| |_| .__/|_|\___(_)/ | .__/ 
                                                     |_|           |__/|_|    

 hostname = www.example.jp
 opensshd = 18999 = int(domain * mybirthday / 22);



0 件のコメント:

コメントを投稿