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

<?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="2222"/>
</service>

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のラッパーとして動作します。しかし、両方同時に使うと動作が理解出来なくなるので、やめた方が良いでしょう。
スポンサーリンク
スポンサーリンク:

フォローする