LoginSignup
3
2

More than 5 years have passed since last update.

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

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

作業開始

ファイアウォールに穴を開ける

cmd
netstat -nl | grep 49542

穴を開けたいポートがLISTENしていないことを確認します。
出力が名にもなければokです。

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:
/*===============================================================*/

現在のファイアウォール設定情報を確認します。

cmd
firewall-cmd --add-port=49542/tcp --zone=public --permanent
/*===============================================================*/
success
/*===============================================================*/

恒久的な設定でssh接続するためのポートを開けます。
--permanentが恒久的な設定をするためのオプションとなります。

cmd
firewall-cmd --reload
/*===============================================================*/
success
/*===============================================================*/

ファイアウォールの設定を適用します。

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設定ファイルの編集をする

cmd
cd /etc/ssh

sshの設定ファイルのあるディレクトリに移動しておきます。

cmd
pwd
/*===============================================================*/
/etc/ssh
/*===============================================================*/

現在のカレントディレクトリが/etc/sshであることを確認します。

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があることを確認します。

cmd
cp -vi --preserve=all ./sshd_config ./sshd_config.org
/*===============================================================*/
`./sshd_config' -> `./sshd_config.org'
/*===============================================================*/

ssh設定ファイルを弄る前にバックアップをとっておこう♪

cmd
vim sshd_config
  • ssh設定ファイルを弄っていきます。
  • Port 49542追加または変更。
  • PermitRootLogin no追加または変更。
  • diff結果を下にあるdiffの結果も参考にしてね♪
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
/*===============================================================*/

追加された箇所を表す。
削除された箇所を表す。

cmd
sshd -t
/*===============================================================*/
出力なし
/*===============================================================*/

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

cmd
systemctl restart sshd
/*===============================================================*/
出力なし
/*===============================================================*/

ssh設定ファイルの変更を適用するためにsshdサービスの再起動を行います。

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

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ポート22Connection refusedになることを確認する。
  • teratermポート49542rootログイン出来ない事を確認する。
    • Failed password for rootがログにでていればOK。
  • teratermポート49542一般ユーザログイン出来る事を確認する。
    • Accepted password for lpicstudy(一般ユーザ) がログに出ていればOK。

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

cmd
whoami
/*===============================================================*/
lpicstudy
/*===============================================================*/

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

cmd
su -
/*===============================================================*/
パスワード:
最終ログイン: 2018/08/29 (水) 17:11:37 JST日時 pts/0
/*===============================================================*/

一般ユーザからsuコマンドを使ってrootユーザになれるかの確認を行います。
suコマンドでrootになれない環境の場合は、sudo -iやsudo suを試してみて下さい。

cmd
whoami
/*===============================================================*/
root
/*===============================================================*/

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

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

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ゾーンに定義されている情報を
全て表示させるというコマンドです。

cmd
firewall-cmd --remove-port=22/tcp --zone=public --permanent
/*===============================================================*/
success
/*===============================================================*/

ファイアウォールのpublicゾーンから恒久的に22/tcp
削除します。恒久的なのでiptables saveみたいな感じです。

cmd
firewall-cmd --reload
/*===============================================================*/
success
/*===============================================================*/

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

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が削除されている事を確認します。

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となれば良い。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2