Linux8Weeks02-02 SSHの待ち受けポート番号を変更

標準のSSHサーバーのポートは22番を使っています。サーバーサイドエンジニアであれば誰もが知っていることで、攻撃する側も当然知っています。

弟子1
そもそもポート番号の意味が分かっていません。

塾長
「サーバーが家」だとしたら、「ポート番号は扉」とイメージしたらいいと思います。

弟子1
家の入り口ということですか?

塾長
そうですね。厳密に言うと出入り口なんですが、扉って家にもいくつかありますよね。サーバーの場合、SSHは22番の扉、Webは80番と443番の扉というように予め決められていて、それぞれの役割が異なります。

弟子1
あっ、そっか!SSHはサーバーの中に入れるけど、Webページは見たり書き込んだりするだけですね。

塾長
だから攻撃者は22番が開いているサーバーを見つけて、絶えずログインできないか試しています。

今回の講座では、SSHサーバーの待ち受けるポート番号を変更して、扉を見つけにくくしようという内容になっています。

攻撃者の目的

ブロンズメンバーになる前までのあなたのサーバーは、格好の攻撃対象でした。

攻撃者はあなたのサーバーの存在を知って、

22番ポートは開いてるし、アクセス制限はかかっていない。侵入して面白い情報があればいただき、無ければ気づかれないようにして悪事の踏み台にしてやろう。

と企んでいます。

踏み台にする理由

弟子1
踏み台にする理由って何ですか?

塾長
足がつかないようにすることが最大の理由です。このニュース知ってますか?塾長もマリオットの会員で被害者なんですけど…

弟子1
僕がマンツーマンでsu塾を受けたあのホテルのことですか!?

塾長
そうです… 例えば弟子1さんが、このような攻撃をするとしたら、自宅からしますか?

弟子1
考えたことなかったけど、自宅からはすぐにバレそうなのでやらないと思います。

塾長
そうですね。IPアドレスを調べれば管理している組織がわかりますし、攻撃された日時にそのIPアドレスを使っていた会員を特定するのは技術的には簡単です。

見ず知らずの誰かが管理するサーバーを踏み台にして攻撃すれば、そのサーバーが隠れ蓑となります。

弟子1
それでも、踏み台になったサーバーのログを見れば誰がやったか分かるんじゃないですか?

塾長
rootで侵入されてしまえば、ログインしていることも、ログインしたこともバレないようにすることができます。

あなたのサーバーが悪用されれば、あなたは被害者と加害者を請け負うことになります。だから、許可された人以外がログインできない仕組みを作っていく必要があります。

 

TCP Wrapper設定後の/var/log/secure

ところで、今日の /var/log/secure はいかがですか?

Faild password は無くなった?

TCP Wrapperの設定をしてから、少なくとも「Failed password」と書き込まれることは無くなった、もしくは激減していると思います。

refused connect

その代わり、「refused connect」という内容のログが増えたのではないでしょうか?

grep “refused connect” /var/log/secure

Failed password と refused connect の違い

「Failed password」と「refused connect」は、どちらもログインを許していませんが、意味合いが全く違います。

「Failed password」はパスワードが合っているかシステムが確認しています。

つまり「俺はrootだ。入れてくれ」と扉越しに頼み、家の中の人が「だったら合言葉を言え」と会話をしています。そのうち合言葉を言い当てて中に入ることができるかもしれません。

一方の「refused connect」は外に門番がいて、許可された場所からの訪問者以外は会話さえさせてもらえず門前払いです。

前置きが随分長くなってしまいましたが、SSHサーバーのポート番号を変更すれば、扉を隠すことと同じことなので、「refused connect」さえも書き込まれなくなります。それでは動画をご覧ください。

 

動画講座 Linux8Weeks02-02 SSHサーバーのポート番号を変更

 

ファイアウォールの設定

あなたのサーバーは、もともとファイアウォールが有効になっていて、今はSSHサーバーが使う22番ポートのみ開いています。

今回はSSHサーバーのポートを10022番に変更するので、ファイアウォールにもその設定をする必要があります。

10022番ポートを通過できるようにファイアウォールに設定していないと、攻撃者どころか自分でもSSHログインできなくなってしまいますので注意してくださいね。

 

firewall-cmdで10022番ポートを開ける

ファイアウォールの設定は、以下のようにfirewall-cmdを使います。

firewall-cmdコマンド

firewall-cmd –add-port=10022/tcp –permanent

動画でもお伝えしたように、「–permanent」を指定しなかった場合、一時的にという意味になります。サーバーを再起動した場合、SSHは10022番ポートで待ち受けているのにファイアウォールで遮断されてしまいます。必ず「–permanent」をつけてください。

次に、設定を反映させるために、以下のコマンドでfirewalldをリロードさせます。

firewall-cmd –reload

 

SSHサーバーのポートを22から10022に変更

SSHサーバーの設定ファイルは、/etc/ssh/sshd_config です。ssh_config というファイルが同じディレクトリにあるので間違えないようにしてください。

sshd_configのバックアップ

まず最初に、カレントディレクトリを /etc/ssh に移って、

cd /etc/ssh

sshd_config をコピーしてバックアップを取りましょう。

cpコマンドの「-p」オプション

コピーはcpコマンドを使います。現在のsshd_configはオリジナルファイルです。パーミッションやタイムスタンプをそのまま引き継ぎたいので、cpコマンドに「-p」オプションをつけてコピーします。

cp -p sshd_config sshd_config.org

 

sshd_configを編集

vi sshd_config

sshd_configの中に、「#Port 22」と書かれた行があります。

#(シャープ)はコメント行であることを意味しているので、この行の#を削除して、「22」を「10022」と書き換えてもいいのですし、yypで行を下にコピーしてから編集をしてもいいです。塾長は設定ファイルを編集するときは、いつも後者の方法でやります。

17 #Port 22
18 Port 10022

 

diffコマンドで編集箇所をチェック

サーバーサイドエンジニアは常にチェックすることを心がけてください。

ちょっとした操作、設定を変更しただけでサーバーの動作が変わってくるので、自分が何をしようとしているのか、この設定で間違い無いのか、必ずチェックするようにしてください。

diff sshd_config sshd_config.org

diffはdifferenceの略ですね。2つのファイルの違いを表示させるコマンドです。

18d17
< Port 10022

 

SSHサーバーの再起動

設定ファイルを書き換えただけでは、ポート番号は10022のままです。設定を反映させるためには、SSHサーバーを再起動させる必要があります。

systemctlコマンド

systemctl restart sshd

SSHを再起動しても、今ターミナルを使ってSSH接続しているものが切断されることはありません。

sshdの起動チェック

psコマンドとgrepコマンドを使ってsshdが問題なく起動していることを確認します。

psコマンド

ps aux | grep sshd

psコマンドは、現在の稼働中のプロセスを表示させるコマンドです。grepコマンドでsshdに関するプロセスだけを抽出させます。

root 2863 0.0 0.8 112812 4280 ? Ss 22:39 0:00 /usr/sbin/sshd -D

この表示から、sshdは22時39分に起動されたということが分かります。上記を表示した直後に、dateコマンドでサーバーの時刻を表示させてチェックするのもいいでしょう。

dateコマンド

date

dateコマンドで表示された時刻と、sshdが起動された時刻が近いものであれば、SSHサーバーは10022番ポートで起動しているはずですね。

netstatコマンド

10022番ポートでSSHサーバーが起動していることの確信を得たいので、netstatコマンドを使います。

netstat -nlap | grep 10022

netstatコマンドとgrepコマンドを使って、このようにsshdが10022番ポートで待ち受けしていることを確認することができます。

tcp  0 0 0.0.0.0:10022  0.0.0.0:* LISTEN 21665/sshd
tcp6  0 0 :::10022     :::*    LISTEN 21665/sshd

 

10022番ポートを使ってSSHログイン

ここまでの設定と確認が済んだら、10022番ポートでSSHログインできるか試してみましょう。

Windows RLoginの場合

RLoginを使っている人は、Socket Portをsshから10022に修正して接続してください。

Mac ターミナル

Macのターミナルを使っている人は、

ssh root@IPアドレス -p 10022

とすれば、指定したポート番号でログインできます。

10022番ポートでSSHログインできましたか? 今後の/var/log/secureログの書き込みがどのように変化するのか楽しみですね!

 

SSHサーバーデフォルトの22番ポートはどうする?

ファイアウォール上の設定は、今も22番ポートを通過できるようになっています。

でも待ち受けているSSHサーバーのポートが10022なので、サーバーは22番ポートでの応答はしません。ですからそのままでも問題はありません。

firewall-cmdコマンドで22番ポートを削除する方法

でも、使っていないポートをファイアウォールが通過させるのは気持ちが悪いという人は、

firewall-cmd –remove-service=ssh –zone=public –permanent

と入力して、

firewall-cmd –reload

sshの22番ポートを塞いでください。

 

firewall-cmdコマンドで22番ポートを追加する方法

念のために、復活の呪文も書いておきます。

firewall-cmd –add-service=ssh –zone=public –permanent

設定を反映させるために、

firewall-cmd –reload

をします。

 

Well-Known Ports

ここまでポート番号は扉に相当しますとお伝えしてきました。

ポート番号には定義されているWell-Known Portsというものがあります。TCP/IPの通信で使われるポート番号のうち、よく知られたサービスやプロトコルが利用する0から1023までを指します。

今回SSHサーバーに割り振ったものは、他のサービスで使用されることのないポート番号ということで、Well-Known Portsよりも大きい10022番ポートを選びました。

覚えておきたいポート番号

以下の表は、Well-Known Portの中でも特にメジャーなポート番号なので覚えておきましょう。

ポート番号 TCP/UDP サービス/プロトコル
20 TCP FTP (データ)
21 TCP FTP (制御)
22 TCP ssh (secure shell)
23 TCP Telnet
25 TCP SMTP
43 TCP WHOIS
53 UDP DNS
80 TCP HTTP
110 TCP POP3
123 UDP NTP(Network Time Protocol)
143 TCP IMAP2/4
443 TCP HTTPS
465 TCP SMTPS
587 TCP SMTP Message Submission
993 TCP IMAPS
995 TCP POP3S

 

塾長
次の講座では、rootでの直接ログインを禁止する設定をします。

関連記事

  1. Linux8Weeks04-01 MariaDBのインストール

  2. Linux8Weeks01-04 インターネットの名前解決の仕組み

  3. Linux8Weeks02-04 Webサーバー Apacheのインス…

  4. Linux8Weeks03-03 Apache2.4ソース版の設定

  5. Linux8Weeks03-05 ApacheバーチャルホストのSSL…

  6. Linux8Weeks04-02 PHP7.4のインストール