「rootへの直接アクセスの禁止」と「公開鍵認証の設定」をしっかり行えば不正にSSHアクセスをされてしまうという心配はほとんどありません。
しかし、サーバを公開してみるとすぐに海外のIPアドレスからの接続が失敗したというログを目の当たりにするでしょう。
そうそう破られる事はないと分かっていても、心臓に悪いです。
このため、SSH接続を行うポートをデフォルトの22番ポートから別のポートに変えたいと思います。
イメージとしては、常に不審者がうろついている正門を埋め立てて、代わりに裏口を作ってそこで出入りする感じです。
※この設定を行う前に、お使いのSSHクライアントがポート番号の指定に対応しているか確認してください。
この記事で行うこと
1. ファイアウォールの設定変更(新しいポート番号での接続許可)
ファイアウォール(Firewall)については以前の記事を確認してください。
上記の記事に従って変更先のポートを番号で指定して許可する方法でも問題ないです。
しかし、今回は新たにserviceを作成してそれを許可してみましょう。
これによって後々ファイアウォールの設定を確認したときに、何のためにこの番号を開けていたのか忘れるといった事がなくなります。(SSHの場合は普段から使うので忘れることはそうそうないと思いますが)
まず、 /usr/lib/firewalld/services/
にある、ssh.xml
を同じディレクトリにコピーします。
コピー先は同じディレクトリにしてください。コピー時のファイル名は自分が分かりやすいように付けてください。今回は new-ssh.xml
とします。
[root@localhost ~]# cp /usr/lib/firewalld/services/ssh.xml /usr/lib/firewalld/services/new-ssh.xml
そして、このコピーしたファイルを開くと以下のように設定の中身が表示されます。
SSH Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.
- shortタグ:サービス名(簡潔なサービスの説明)
- descriptionタグ:サービスの詳細(詳しいサービスの説明)
- portタグ:実際に開放するポートの指定
今回はあくまでもSSHに使うポートなので、shortタグとdescriptionタグは変えません。
portタグのport番号だけ22から好きな数字に変えてください。(1024~65535以下に設定してください)
今回は普段記事を公開する時間にあやかって1200と設定します。
設定後は以下のようになります。
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="1200"/> </service>
次に、この新たなサービスを認識させるためにファイアウォールの再読み込みを行います。
[root@localhost ~]# firewall-cmd --reload
そして、新たに追加したサービスを許可するようにします。このとき、指定する名前は、shortタグの中身ではなく、ファイル名となります。
[root@localhost ~]# firewall-cmd --add-service=new-ssh --permanent success [root@localhost ~]# firewall-cmd --reload success
追加した後は反映されているか確認をしましょう。
[root@localhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: enp3s0 sources: services: new-ssh ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
2. SSH設定の変更
※これ以降、絶対に途中で作業を止めずに最後まで行ってください。途中で止めた場合SSHで接続ができなくなる可能性があります。
無事にファイアウォールが開いたら、次はSSH側の設定を変更します。
rootへの直接のアクセスを禁止したとき同様に /etc/ssh/sshd_config
を編集します。
編集する箇所は以下です。「-」は削除する行(変更前)、「+」は追加する行(変更後)となります。例では1200になっていますが、この数字はファイアウォールの設定の時と同じ番号に設定してください。
- #Port 22 + Port 1200
編集が終わったらSSHを再起動しましょう。
次に、SELinuxの設定です。
SELinuxは詳しくはまた別途解説しますが、万が一悪意のある人に侵入されてもなるべく好き勝手できないように抑えてくれるアプリケーションです。
これがあるのでポート番号の変更をする際はSELinuxに「別のポート番号でSSH接続しますよ。これは悪意のある人物が勝手に変えてる訳じゃないですよ」って教える必要があります。
以下のコマンドとなります。
[root@localhost ~]# semanage port -a -t ssh_port_t -p tcp 1200
- semanage : SELinuxの設定変更を行うためのコマンドです。SELinux Managerの略だと思います。
- port : ポートに関係する設定を変えるコマンドです。他にもユーザの設定など色々な設定があります。
- -a : 新しいルールを追加(add)する事を指定するオプションです。
- -t ssh_port_t : 追加するルールのタイプを指定します。今回はsshのポートを指定しています。
- -p tcp : プロトコルを指定しています。SSHはTCP接続なので、tcpを指定しています。
- 1200 : ポート番号を指定しています。例では1200を指定していますが、ファイアウォールの設定やSSHの設定で指定した番号と同じ番号を指定してください。
もし、ちゃんとSELinuxに設定が反映されているか気になる場合は以下のコマンドを使ってみてください。
[root@localhost ~]# semanage port -l | grep ssh_port_t
- -l : 設定の一覧を表示するオプション
- | : (パイプ)この記号以前に記載されているコマンドの結果を受けてこの記号以降に記載されているコマンドを実行する。そのうち詳しく解説するかもです。
- grep : 指定されたテキストを含む行を抜き出す。今回は
ssh_port_t
を抜き出しています。
SELinuxにも伝え終えたところで、SSHを再起動して設定を反映させます。
# systemctl restart sshd
次に、今接続しているSSHは絶対に切らずに新しく接続して変更後のポート番号に繋がることを確認します。
接続ができない場合、3カ所に設定したポート番号(ファイアウォール、SSH、SELinux)に違いがないかを確認してもう一度設定し直してみてください。
3. ファイアウォールの設定変更(22番ポートでの接続禁止)
新しいポート番号で接続できるようになったら、今度は22番ポートを閉じるようにファイアウォールの設定を変更しましょう。
現時点で22番ポートが開いていても、SSHがこのポート番号を使っていないため、アクセスすることはできません。
しかし、今は大丈夫でもこの先何かの間違いでこのポート番号を通じて不正なアクセスを許すことになるかもしれません。
面倒でもリスクを下げるために使わないポートは必ず閉じるようにしましょう。
特段新しいこともないので設定から確認まで一気に記載します。
[root@localhost ~]# firewall-cmd --remove-service=ssh --permanent success [root@localhost ~]# firewall-cmd --reload success [root@localhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: enp3s0 sources: services: new-ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
ちなみに、SELinuxの方はシステムの既定である22番ポートを消すことはできないできないようです。このため、確実にファイアウォールの方で遮断するようにしましょう。
まとめ
今回はSSHのポート変更の方法について説明しました。
序文でも述べたように実際はこの設定を行わなくても前回までの設定さえしっかり行えば不正なアクセスを受ける可能性は低いです。
なので、一度ポート番号の変更までは行わずにサーバを公開してみるのも良いかもしれません。
実際に大量のアクセス失敗の履歴を見ると、セキュリティに対する意識が高まること請け合いです。(もし本当にやるなら必ずrootでのアクセス禁止と公開鍵認証の設定は漏れなく行うようにしてくださいね)