sshでrootユーザログインできなくしよう♪

- 目的
 - ssh接続で管理者ユーザrootでログインを出来なくし、 一般ユーザでログイン後rootに昇格することで、root権限乗っ取りなどを低減することができる。
- ゴール
 - sshポート番号を変更し、変更したポート番号でアクセスすることが出来る。
 - ssh接続で目的が達成する事ができる。
- 得られる知見
 - ssh設定の変更の仕方や各種コマンドの使い方が分かる。
- 前提条件
 - 一般ユーザ作成済である事。

---
## 作業開始
### ファイアウォールに穴を開ける
```command:cmd
netstat -nl | grep 49542
```
穴を開けたいポートがLISTENしていないことを確認します。
出力が名にもなければokです。

```command:cmd
firewall-cmd --list-all --permanent
/*===============================================================*/
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh dhcpv6-client http squid https
  ports: 22/tcp 9090/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
/*===============================================================*/
```
現在のファイアウォール設定情報を確認します。

```command:cmd
firewall-cmd --add-port=49542/tcp --zone=public --permanent
/*===============================================================*/
success
/*===============================================================*/
```
恒久的な設定でssh接続するためのポートを開けます。
**--permanent**が恒久的な設定をするためのオプションとなります。

```command:cmd
firewall-cmd --reload
/*===============================================================*/
success
/*===============================================================*/
```
ファイアウォールの設定を適用します。

```command:cmd
firewall-cmd --list-all --permanent
/*===============================================================*/
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh dhcpv6-client http squid https
  ports: 22/tcp 9090/tcp 49542/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
/*===============================================================*/
```
ファイアウォールの設定に**49542/tcp**が追加されていれば正常です。

### ssh設定ファイルの編集をする

```command:cmd
cd /etc/ssh
```
sshの設定ファイルのあるディレクトリに移動しておきます。


```command:cmd
pwd
/*===============================================================*/
/etc/ssh
/*===============================================================*/
```
現在のカレントディレクトリが**/etc/ssh**であることを確認します。


```command:cmd
ls -F
/*===============================================================*/
moduli  ssh_config  ssh_host_ecdsa_key  ssh_host_ecdsa_key.pub  ssh_host_ed25519_key  ssh_host_ed25519_key.pub  ssh_host_rsa_key  ssh_host_rsa_key.pub  sshd_config
/*===============================================================*/
```
**sshd_config**があることを確認します。


```command:cmd
cp -vi --preserve=all ./sshd_config ./sshd_config.org
/*===============================================================*/
`./sshd_config' -> `./sshd_config.org'
/*===============================================================*/
```
ssh設定ファイルを弄る前にバックアップをとっておこう♪


```command:cmd
vim sshd_config
```
- ssh設定ファイルを弄っていきます。
- **Port 49542**追加または変更。
- **PermitRootLogin no**追加または変更。
- **diff結果**を下にあるdiffの結果も参考にしてね♪

```command:cmd
diff -u ./sshd_config.org ./sshd_config
/*===============================================================*/
--- ./sshd_config.org   2018-04-12 00:14:05.000000000 +0900
+++ ./sshd_config       2018-08-29 16:43:28.574848586 +0900
@@ -13,8 +13,8 @@
 # If you want to change the port on a SELinux system, you have to tell
 # SELinux about this change.
 # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
-#
-#Port 22
+# default 22 から 49542 へ変更
+Port 49542
 #AddressFamily any
 #ListenAddress 0.0.0.0
 #ListenAddress ::
@@ -35,7 +35,8 @@
 # Authentication:

 #LoginGraceTime 2m
-#PermitRootLogin yes
+# ssh 接続時に root ユーザでログイン出来なくする
+PermitRootLogin no
 #StrictModes yes
 #MaxAuthTries 6
 #MaxSessions 10
/*===============================================================*/
```
**＋**が**追加**された箇所を表す。
**－**が**削除**された箇所を表す。

```command:cmd
sshd -t
/*===============================================================*/
出力なし
/*===============================================================*/
```
変更を加えたssh設定ファイルに誤りがないかを確認します。
誤りが無ければ、何も出力されず何か問題がある場合には
エラー文が出力されます。


```command:cmd
systemctl restart sshd
/*===============================================================*/
出力なし
/*===============================================================*/
```
ssh設定ファイルの変更を適用するためにsshdサービスの再起動を行います。


**警告**
**　　　　現在ssh接続している画面は、他のユーザでログインが出来る**
**　　　　ことが確認できるまで絶対に終了しないで下さい。**
**　　　　最悪の場合、端末コンソールから直接ログインして操作することになります。**


```command:cmd
tailf /var/log/secure
/*===============================================================*/
Aug 29 17:00:06 hoge sshd[18674]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.238  user=root
Aug 29 17:00:08 hoge sshd[18674]: Failed password for root from 192.168.1.238 port 49931 ssh2
Aug 29 17:01:06 hoge sshd[18674]: Failed password for root from 192.168.1.238 port 49931 ssh2
Aug 29 17:01:18 hoge sshd[18674]: Received disconnect from 192.168.1.238 port 49931:11: authentication cancelled [preauth]
Aug 29 17:01:18 hoge sshd[18674]: Disconnected from 192.168.1.238 port 49931 [preauth]
Aug 29 17:01:18 hoge sshd[18674]: PAM 1 more authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.238  user=root
Aug 29 17:04:30 hoge sshd[18836]: Accepted password for lpicstudy from 192.168.1.238 port 49947 ssh2
Aug 29 17:04:31 hoge sshd[18836]: pam_unix(sshd:session): session opened for user lpicstudy by (uid=0)
/*===============================================================*/
```
- **teraterm**で**ポート22**で**Connection refused**になることを確認する。
- **teraterm**で**ポート49542**で**root**で**ログイン出来ない事**を確認する。
 - **Failed password for root**がログにでていればOK。
- **teraterm**で**ポート49542**で**一般ユーザ**で**ログイン出来る事**を確認する。
 - **Accepted password for lpicstudy(一般ユーザ)** がログに出ていればOK。

sshのログイン履歴が残るログファイル : **/var/log/secure**を**tailf**コマンド
で垂れ流しにし、見た結果です。


```command:cmd
whoami
/*===============================================================*/
lpicstudy
/*===============================================================*/
```
**whoami**コマンドで現在ログインしているユーザ名を確認できるので
出力が**rootではない一般ユーザ**になっていれば成功です。


```command:cmd
su -
/*===============================================================*/
パスワード:
最終ログイン: 2018/08/29 (水) 17:11:37 JST日時 pts/0
/*===============================================================*/
```
一般ユーザからsuコマンドを使ってrootユーザになれるかの確認を行います。
suコマンドでrootになれない環境の場合は、sudo -iやsudo suを試してみて下さい。


```command:cmd
whoami
/*===============================================================*/
root
/*===============================================================*/
```
一般ユーザでログイン後、rootに昇格出来る事を確認します。
出力が**root**になっていれば成功です。


### ファイアウォールから既存22ポートを削除する


```command:cmd
firewall-cmd --list-all --zone=public
/*===============================================================*/
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: wlan0
  sources:
  services: ssh dhcpv6-client http squid https
  ports: 22/tcp 9090/tcp 49542/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
/*===============================================================*/
```
先ほど追加した**49542/tcp**が追加されている事を確認します。
ファイアウォールのpublicゾーンに定義されている情報を
全て表示させるというコマンドです。


```command:cmd
firewall-cmd --remove-port=22/tcp --zone=public --permanent
/*===============================================================*/
success
/*===============================================================*/
```
ファイアウォールのpublicゾーンから恒久的に**22/tcp**を
削除します。恒久的なので**iptables save**みたいな感じです。


```command:cmd
firewall-cmd --reload
/*===============================================================*/
success
/*===============================================================*/
```
先ほど削除したルールを適用させるためにファイアウォール設定を再読み込みします。
出力に**success**とでれば成功です。


```command:cmd
firewall-cmd --list-all --zone=public
/*===============================================================*/
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: wlan0
  sources:
  services: ssh dhcpv6-client http squid https
  ports: 9090/tcp 49542/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
/*===============================================================*/
```
既存のsshポート**22/tcp**が削除されている事を確認します。


```command:cmd
C:\Users\hoge>portqry -n 192.168.1.110 -p tcp -e 22
/*===============================================================*/
Querying target system called:

 192.168.1.110

Attempting to resolve IP address to a name...

Failed to resolve IP address to name

querying...

TCP port 22 (ssh service): NOT LISTENING
/*===============================================================*/
```
**22 (ssh service): NOT LISTENING**となれば良い。

- **このportqryコマンド**は、**Windowsコマンドプロント**で使います。
- **詳しい使い方などは参考文献に書いていますのでそちらを参照して下さい。**
- **標準ではportqryコマンドは、入っていませんのでMicrosoftのサイト**
- **からダウンロードしてください。**
- **ダウンロードしたコマンドは、Windowsファイル配下にぶち込めば使えます。**


- **参考文献**
 - [Portqry.exe コマンド ライン ユーティリティの説明](
https://support.microsoft.com/ja-jp/help/310099/description-of-the-portqry-exe-command-line-utility)
 - [TCPやUDPにおけるポート番号の一覧 - Wikipedia](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7#%E5%8B%95%E7%9A%84%E3%83%BB%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88_%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7_(49152%E2%80%9365535))
 - [CentOS 7 firewalld よく使うコマンド - Qiita](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e)