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” に変更したものです。



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.

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:

  1. iptables自体がなくなったわけではなく、firewalld は iptablesのラッパーとして動作します。しかし、両方同時に使うと動作が理解出来なくなるので、やめた方が良いでしょう。
スポンサーリンク
スポンサーリンク:

フォローする