sshのポートを変更してみる

## 勉強前イメージ

sshの設定とか変更するだけで行けそう感

## 調査

### 概要

今回使用するのはほぼまっさらなCentOS7です。
そちらのサーバのsshのポートを22番ポートから22222番ポートに変更していきたいと思います。

進め方は以下になります。

1. 現在のsshの確認
2. SELinuxの設定の変更
3. firewallの設定の変更
4. sshdの設定の変更
5. 22222ポートでsshログインできることを確認
6. 22番ポートの無効の設定
7. 22番ポートでのログイン不可の確認

### 1. 現在のsshの確認

今回のsshのポートを変更する先、 `192.168.119.10` のサーバに明示的に22番ポートを使用してsshしてみました。
特に問題なくログイン出来ました。
どっちもホスト名がlocalホストになっててわかりずらくてすみません...

```
[root@localhost ~]# ssh -p 22 root@192.168.119.10
root@192.168.119.10's password: 
Last login: Wed Dec  9 21:31:12 2020 from 192.168.119.244
[root@localhost ~]# 
```

### 2. SELinuxの設定の変更

まずSELinuxについてなに？って方は [こちら](https://qiita.com/miyuki_samitani/items/afecc0cb7733eff71bf8) をご覧ください

- SELinuxが有効になっていることを確認

`getenforce` コマンドを使用します。

```
getenforce
```

出力される内容は以下になります。
enforcing ... SElinux有効且つ、ルール以外の動作があれば止める
permissive ... SElinux有効且つ、ルール以外の動作があっても、止めずにログに記録のみ行う
disabled ... SElinux無効

今回出力されたのは `Enforcing` なので、ルール外の動作があれば止められるようになっています。

```
[root@localhost ~]# getenforce 
Enforcing
```

- SELinuxのルールでsshのポート設定を確認する

SELinuxのルールを変更するには `semanage` コマンドを使用します。
入っていない方は以下からインストールしてください
`yum install policycoreutils-python`

また、 `semanage port -l` コマンドで全ポート設定が見れるので、sshでgrepかけて確認を行います

```
[root@localhost ~]# semanage port -l | grep ssh
ssh_port_t                     tcp      22
```

確認するとsshは22番ポートで受ける設定にっているようです。

- SELinuxのルールでsshのポート設定を22番ポートから22222番ポートに変更する

今はSELinuxの設定上、誰も使用していません。

```
[root@localhost ~]# semanage port -l | grep 22222
[root@localhost ~]# 
```

ssh_port_t の設定のポートに22222番ポートを追加しました

```
semanage port -a -t ssh_port_t -p tcp 22222
```

以下のように、ssh_port_tに22222番ポートの設定が追加されました。

```
[root@localhost ~]# semanage port -l | grep ssh
ssh_port_t                     tcp      22222, 22
```


### 3. firewallの設定の変更

- firewallの起動を確認

以下のようにfirewallも有効化されています。

```
[root@localhost ~]# systemctl is-active firewalld
active
```

- firewallの設定を確認

`firewall-cmd --list-all` でfirewallの設定を確認することが出来ます。
`services: dhcpv6-client ssh` と記載があり、TCP 22番ポートが開いてることがわかります。
ここに22222番ポートを追加します。

```
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

- firewallの22222番ポートを開ける

```
[root@localhost ~]# firewall-cmd --add-port=22222/tcp  --permanent --zone=public
success
```

- firewallの設定をreloadします

```
[root@localhost ~]# firewall-cmd --reload
success
```

- 設定後のfirewallの設定を確認

再度 `firewall-cmd --list-all` コマンドで設定を確認します。
`ports: 22222/tcp` と記載されており、ポートが開いたことが確認できました。

```
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources: 
  services: dhcpv6-client ssh
  ports: 22222/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

### 4. sshdの設定の変更

- 現在のsshdのポートの設定の確認

sshdの設定は `/etc/ssh/sshd_confi` に記載されています。
Portの欄を見ると、コメントアウトされているのでデフォルトの22番ポートで通信がされています。

```
[root@localhost ~]# cat /etc/ssh/sshd_config | grep "Port "
#Port 22
```

- sshdのポートの設定を変更

Portの設定に明示的に22番と22222ポートを追加して記載しました。

```
vi /etc/ssh/sshd_config
==========
Port 22
Port 22222
==========
```

- sshdの再起動

```
systemctl restart sshd
```

### 5. 22222ポートでsshログインできることを確認

今回は、`192.168.119.10` のサーバでは上記で行ったように22番ポートと22222番ポートでsshログイン出来る設定にしたので、
どちらもログインできることを確認します。

```
[root@localhost ~]# ssh -p 22 root@192.168.119.10
root@192.168.119.10's password: 
Last login: Wed Dec  9 21:48:18 2020 from 192.168.119.244
[root@localhost ~]# 
```

```
[root@localhost ~]# ssh -p 22222 root@192.168.119.10
root@192.168.119.10's password: 
Last login: Wed Dec  9 22:08:08 2020 from 192.168.119.244
[root@localhost ~]# 
```

22番ポートでも22222番ポートでも問題なくログインすることが出来ました。

### 6. 22番ポートの無効の設定

22222番ポートでsshログインできるようになったので、22番ポートが不要になりました。
ですので、firewall,sshdの設定から22番ポートの設定を削除します。

※SELinuxから削除しない理由としましては、定義されているため消すことが出来ないのです。

```
[root@localhost ~]# semanage port --delete --type ssh_port_t --proto tcp 22
ValueError: ポート tcp/22 はポリシーに定義されているため、削除できません
```

#### firewallの設定から削除

- 削除前の確認

`firewall-cmd --list-all` コマンドで確認します。
`services: dhcpv6-client ssh` とあり、sshがtcp/22番ポートが許可されていることがわかります。

```
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources: 
  services: dhcpv6-client ssh
  ports: 22222/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

- 削除

```
firewall-cmd --permanent --remove-service=ssh
```

上記のコマンドで以下のように削除が成功しました

```
[root@localhost ~]# firewall-cmd --permanent --remove-service=ssh
success
```

- firewallの設定をreloadします

```
[root@localhost ~]# firewall-cmd --reload
success
```

- 削除後の確認

同じように、 `firewall-cmd --list-all` コマンドで確認します。
先程まで `services` にsshの記載がありましたが、設定を削除したことにより記載が削除されました。

```
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources: 
  services: dhcpv6-client
  ports: 22222/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

#### sshdの設定から削除

- 現在のsshdのポートの設定の確認

sshdの設定は `/etc/ssh/sshd_confi` に記載されています。
Portの欄を見ると、明示的に22番ポートが記載されているので22番ポートのみ設定を削除します

```
[root@localhost ~]# cat /etc/ssh/sshd_config | grep "^Port "
Port 22
Port 22222 
```

- sshdのポートの設定を変更

Portの設定に明示的に22番と22222ポートを追加して記載しました。

```
vi /etc/ssh/sshd_config
==========
削除
Port 22
==========
```

- 削除後の設定の確認

22番ポートの記載を削除したので22222番ポートのみになりました。

```
[root@localhost ~]# cat /etc/ssh/sshd_config | grep "^Port "
Port 22222 
```

- sshdの再起動

```
systemctl restart sshd
```

### 7. 22番ポートでのログイン不可の確認

以下のように22番ポートでは拒否されました。

```
[root@localhost ~]# ssh -p 22 root@192.168.119.10
ssh: connect to host 192.168.119.10 port 22: No route to host
```

引き続き設定がされている22222番ポートではログインすることが出来ました。

```
[root@localhost ~]# ssh -p 22222 root@192.168.119.10
root@192.168.119.10's password: 
Last login: Wed Dec  9 22:26:31 2020 from 192.168.119.244
[root@localhost ~]# 
```

## 勉強後イメージ

SELinuxの設定変更実ははじめて....
sshの設定自体は楽なんだけど、firewallとSELinuxがめんどうだなーって感じ。
SELinuxの22番ポートの設定消せないのはじめて知った

## 参考

- [semanageコマンドが使えない](https://www.solima.net/centos7/archives/145)
- [ssh のデフォルトポート(TCPの22番)の修正](https://www.smiyasaka.com/CentOS7.0_server22.html)
- [【すぐわかる】CentOSのポート開放のやり方](https://eng-entrance.com/linux-centos-port)
- [SELinuxとFirewallを有効にしたまま443でsshを受けるように設定する](https://qiita.com/yamada-hakase/items/9121be88c94f79e6cc65)
- [CentOS 7 で sshd のポートを変更する(firewalld, SELinuxの設定)](http://lovepeers.org/2014/11/21/centos7-sshd/)
- [CentOS 7 で sshd のポート番号を変更する方法](https://weblabo.oscasierra.net/openssh-sshd-centos7-change-port/)
- [sshのポート番号変更方法](https://qiita.com/hana_shin/items/4a90fa66e2d77324912c)