CentOS 7 で sshd のポートを変更する(firewalld, SELinuxの設定)
sshd をデフォルトポート(TCPの22番)で待ち受けていると、ログファイル(/var/log/secure)に大量のブルートフォースアタックのログが残ります。パスワード認証を無効にして公開鍵認証のみにしておけば、実際に侵入されることはまずないのですが、見ていて気分の良いものではありません。そんな理由で、sshdの待ち受けポートを変更している人も多いと思います。
最近セットアップした CentOS 7 でも同じ設定をしようとしたのですが、長らく使っていた iptables が firewalld に替わったため 1、その設定も必要になりました。また、今回から SELinux も有効にして運用しているので、そちらの設定も書いてみたいと思います。
## /etc/ssh/sshd_config の設定
まず、/etc/ssh/sshd_config の
Port 22
とあるところを、
Port 22
Port 2222
と変更します。ここではTCPの22番の代わりとして2222番を使うことにしていますが、ポリシーに合わせて適宜読み替えてください。
SELinux を有効にしている場合、この状態で sshd を再起動するとエラーになるので、次に SELinux の設定を変更します。
## SELinux の設定変更
SELinux のポリシーを変更するには、semanage コマンドを使います。デフォルトではインストールされていないかもしれないので、インストールされていない場合は yum でインストールします。
policycoreutils-pythonがインストールされているか確認:
$ rpm -q policycoreutils-python
上記コマンドが何も返さなかったら、yumでインストール(rootで実行):
# yum install policycoreutils-python
sshd の待ち受けポートとして、TCPの2222番を許可(rootで実行):
# semanage port -a -t ssh_port_t -p tcp 2222
TCP の2222番が追加されたことを確認する(rootで実行):
# semanage port -l| grep ssh
ssh_port_t tcp 2222, 22
## sshd の再起動
SELinuxの設定が変更出来たら、sshdを再起動します。
設定が間違っているなどの理由で sshd が起動して来ない可能性もあるので、新しいポートで無事に接続出来ることを確認するまで、作業中のターミナルからログアウトしてはいけません。また、作業はネットワークの安定した環境で行ないましょう。
CentOS 7 からは、デーモンの起動・終了に systemctl コマンドを使うようになりました。sshdを再起動するには、以下のようにします(rootで実行):
# systemctl restart sshd
無事に再起動されたことを、まずは ps コマンドで確認します:
$ ps axuww | grep sshd
root 23847 0.0 0.2 82788 2936 ? Ss Nov05 0:00 /usr/sbin/sshd -D
root 28994 0.0 0.4 131352 4812 ? Ss 14:18 0:00 sshd: koma2 [priv]
koma2 29008 0.0 0.2 131352 2292 ? S 14:18 0:00 sshd: koma2@pts/0
この “/usr/sbin/sshd -D” という行があれば大丈夫です(他の2つは、現在ログインしているセッション)。
次に、TCPの2222番ポートで待ち受けているかも確認しましょう:
$ ss -t -l -n
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:2222 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 :::2222 :::*
LISTEN 0 128 :::22 :::*
## firewalld の設定
最後に firewalld の設定です。外部からTCPの2222番へのアクセスを許可します。
まず、下記のような内容で /etc/firewalld/services/ssh-alt.xml というファイルを作成します。これは /usr/lib/firewalld/services/ssh.xml をコピーして、”port=22″ の部分を “port=2222” に変更したものです。
firewalld をリロードし、追加したサービス(ssh-alt)を読み込ませます:
# firewall-cmd –reload
サービスを追加:
# firewall-cmd –add-service=ssh-alt
# firewall-cmd –permanent –add-service=ssh-alt
サービスが追加されたことを確認:
# firewall-cmd –list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ssh ssh-alt
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
念の為リロードして、permanent設定が効いていることを再確認:
# firewall-cmd –reload
# firewall-cmd –list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ssh ssh-alt
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
この状態で外部から TCP の2222番にアクセス出来るはずなので、sshで接続して確認してみましょう。
確認出来たら、firewalld のサービスから ssh を削除します:
# firewalld-cmd –remove-service=ssh
# firewalld-cmd –permanent –remove-service=ssh
# firewalld-cmd –reload
# firewalld-cmd –list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ssh-alt
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
再度外部からssh接続し、TCPの22番に接続**出来ない**ことを確認します。
## 再度 /etc/ssh/sshd_config の設定
/etc/ssh/sshd_configを編集し、”Port 22″ を削除します。
#Port 22
Port 2222
そして、再び sshd を再起動します。
# systemctl reload sshd
参考:
Notes:
- iptables自体がなくなったわけではなく、firewalld は iptablesのラッパーとして動作します。しかし、両方同時に使うと動作が理解出来なくなるので、やめた方が良いでしょう。 ↩