- 目的
- ssh接続で管理者ユーザrootでログインを出来なくし、 一般ユーザでログイン後rootに昇格することで、root権限乗っ取りなどを低減することができる。
- ゴール
- sshポート番号を変更し、変更したポート番号でアクセスすることが出来る。
- ssh接続で目的が達成する事ができる。
- 得られる知見
- ssh設定の変更の仕方や各種コマンドの使い方が分かる。
- 前提条件
- 一般ユーザ作成済である事。
作業開始
ファイアウォールに穴を開ける
netstat -nl | grep 49542
穴を開けたいポートがLISTENしていないことを確認します。
出力が名にもなければokです。
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:
/*===============================================================*/
現在のファイアウォール設定情報を確認します。
firewall-cmd --add-port=49542/tcp --zone=public --permanent
/*===============================================================*/
success
/*===============================================================*/
恒久的な設定でssh接続するためのポートを開けます。
--permanentが恒久的な設定をするためのオプションとなります。
firewall-cmd --reload
/*===============================================================*/
success
/*===============================================================*/
ファイアウォールの設定を適用します。
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設定ファイルの編集をする
cd /etc/ssh
sshの設定ファイルのあるディレクトリに移動しておきます。
pwd
/*===============================================================*/
/etc/ssh
/*===============================================================*/
現在のカレントディレクトリが**/etc/ssh**であることを確認します。
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があることを確認します。
cp -vi --preserve=all ./sshd_config ./sshd_config.org
/*===============================================================*/
`./sshd_config' -> `./sshd_config.org'
/*===============================================================*/
ssh設定ファイルを弄る前にバックアップをとっておこう♪
vim sshd_config
- ssh設定ファイルを弄っていきます。
- Port 49542追加または変更。
- PermitRootLogin no追加または変更。
- diff結果を下にあるdiffの結果も参考にしてね♪
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
/*===============================================================*/
+が追加された箇所を表す。
-が削除された箇所を表す。
sshd -t
/*===============================================================*/
出力なし
/*===============================================================*/
変更を加えたssh設定ファイルに誤りがないかを確認します。
誤りが無ければ、何も出力されず何か問題がある場合には
エラー文が出力されます。
systemctl restart sshd
/*===============================================================*/
出力なし
/*===============================================================*/
ssh設定ファイルの変更を適用するためにsshdサービスの再起動を行います。
警告
** 現在ssh接続している画面は、他のユーザでログインが出来る**
** ことが確認できるまで絶対に終了しないで下さい。**
** 最悪の場合、端末コンソールから直接ログインして操作することになります。**
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コマンド
で垂れ流しにし、見た結果です。
whoami
/*===============================================================*/
lpicstudy
/*===============================================================*/
whoamiコマンドで現在ログインしているユーザ名を確認できるので
出力がrootではない一般ユーザになっていれば成功です。
su -
/*===============================================================*/
パスワード:
最終ログイン: 2018/08/29 (水) 17:11:37 JST日時 pts/0
/*===============================================================*/
一般ユーザからsuコマンドを使ってrootユーザになれるかの確認を行います。
suコマンドでrootになれない環境の場合は、sudo -iやsudo suを試してみて下さい。
whoami
/*===============================================================*/
root
/*===============================================================*/
一般ユーザでログイン後、rootに昇格出来る事を確認します。
出力がrootになっていれば成功です。
ファイアウォールから既存22ポートを削除する
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ゾーンに定義されている情報を
全て表示させるというコマンドです。
firewall-cmd --remove-port=22/tcp --zone=public --permanent
/*===============================================================*/
success
/*===============================================================*/
ファイアウォールのpublicゾーンから恒久的に22/tcpを
削除します。恒久的なのでiptables saveみたいな感じです。
firewall-cmd --reload
/*===============================================================*/
success
/*===============================================================*/
先ほど削除したルールを適用させるためにファイアウォール設定を再読み込みします。
出力にsuccessとでれば成功です。
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が削除されている事を確認します。
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ファイル配下にぶち込めば使えます。
-
参考文献