【CentOS7】SSHのセキュリティ設定/firewall

## 概要
CentOS7でSSHを使用するにあたり、最低限必要なセキュリティ設定の内容を記述します。（学習ログ）
その中でも今回は、前回`sshd_config`に追加したポートを`firewall-cmd`で追加、解放する手順を記述していきます。
※ローカルマシンはmacOSを使用しています。

**他記事に関して**
[【CentOS7】SSH公開鍵認証設定/鍵生成〜サーバーへの転送](https://qiita.com/MitsukiYamauchi/items/a03de5713c894834a8f1)
[【ContOS7】SSHのセキュリティ設定/sshd_config](https://qiita.com/MitsukiYamauchi/items/50ef7db5657cd74dc700)

## 新しく追加したSSHのポート番号を解放する
まずは、以下のコマンドで、デフォルトゾーンの設定を出力してみます。
```shell
sudo firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
`services: dhcpv6-client ssh`の箇所が、現在解放されているSSHのポート（デフォルト：22番）の状態です。
こちらに、新たに追加したポート番号を追加し、変更後のポート番号でsshログインできるようにします。

### ssh.xmlのコピー、編集
まず、既存のfirewallに対するsshの設定が記述された、`ssh.xml`をコピーします。
```shell
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-49152.xml
```
※ファイル名の「49152」は、前回sshd_configに追加した新しいポート番号になります。
まだsshd_configの設定を終えていない方は、前回の記事 [【ContOS7】SSHのセキュリティ設定/sshd_config](https://qiita.com/MitsukiYamauchi/items/50ef7db5657cd74dc700) をご参照ください。

**(注)** `/usr/lib/firewalld/`以下にはシステムデフォルトの設定ファイルが置かれているため、こちらは基本的にはいじってはいけません。
設定を変更する際には必ず、`/etc/firewalld/`にコピーしてから編集するようにしてください。
`/etc/firewalld/`以下にファイルが存在する場合は、それによってシステム設定が上書きされます。
参考記事：[CentOS7のfirewalldでsshのポート番号を変更する方法](https://qiita.com/DQNEO/items/5780d81b2e0af4cc1544)

### 設定ファイルの編集
先ほどコピーしてきた`ssh-49152.xml`ファイルを編集します。
以下のように修正してください。
```shell
sudo vim /etc/firewalld/services/ssh-49152.xml
```
```xml
(編集前) 
<?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="22"/>
</service>

（編集後）
<?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="49152"/>　←ここを修正
</service>
```

編集が完了したら、vimを保存して終了します。 `:wq`

### firewallの設定を反映させる
```shell
# リロード
sudo firewall-cmd --reload
success

# 設定の反映(ここで追加したポート番号「49152」をfirewallに追加します)
sudo firewall-cmd --permanent --add-service=ssh-49152
success

sudo firewall-cmd --reload
success
```

変更後の状態を確認
```shell
sudo firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh ssh-49152 ←追加されていればOK
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

### 動作確認
追加したポート番号でsshログインできるか確認します。
万が一設定がミスっていたなどの理由でログインできなかった時のために、別タブで動作確認することをオススメします。
```shell
ssh -p 49152 -i ~/.ssh/{key_name} {user_name}@{ip_address}
```
ここでログインに失敗した方はもう一度firewallの設定を見直してみてください。
それでもダメならsshd_configの設定も見直すことをオススメします。
[【ContOS7】SSHのセキュリティ設定/sshd_config](https://qiita.com/MitsukiYamauchi/items/50ef7db5657cd74dc700)

### デフォルトのポート番号を削除する
#### sshd_config
変更後のポート番号でsshログインできることが確認できたら、次はデフォルトのポート番号を閉じる設定に映ります。
まずは`sshd_config`に残っている設定を削除します。
```shell
sudo vim /etc/ssh/sshd_config
```
```ssh
# （変更前）
Port 22
Port 49152

# （変更後）
Port 49152
```
sshd_configファイルの反映
```shell
sudo systemctl restart sshd
```

#### firewall
次に、firewallの設定から、デフォルトのポート番号を削除します。
まずは現在の設定内容を確認します。
```shell
sudo firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh ssh-49152
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

以下のコマンドでデフォルトのポート番号（ssh）を削除します。
```shell
sudo firewall-cmd --permanent --remove-service=ssh
success
```
確認
```shell
sudo firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh-49152 ←sshが消えていることを確認
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

## 終わり
以上になります。
一応ログアウト後に、22番ポートでsshログインできないこと。および、変更後のポート番号でログインできることの動作確認を行うようにしてください。

## 参考・関連記事
[【CentOS7】SSH公開鍵認証設定/鍵生成〜サーバーへの転送](https://qiita.com/MitsukiYamauchi/items/a03de5713c894834a8f1)
[【ContOS7】SSHのセキュリティ設定/sshd_config](https://qiita.com/MitsukiYamauchi/items/50ef7db5657cd74dc700)

[CentOS7のfirewalldでsshのポート番号を変更する方法](https://qiita.com/DQNEO/items/5780d81b2e0af4cc1544)
[CentOS 7 firewalld よく使うコマンド](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e)