Tomorrow Will Be A Better Day

Published

- 4 min read

sshの接続ポート番号を変更することで、意図しない不正アクセスを防ぐ方法

img of sshの接続ポート番号を変更することで、意図しない不正アクセスを防ぐ方法

検証背景

EC2を建てて、ssh接続するポート番号を22のデフォルトにしておくと、
以下の様な不正アクセスを試みるログが残ることがある。

   Nov  8 09:25:43 ip-xxx-xx-x-xxx sshd[2210]: Invalid user admin from xxx.xxx.xxx.xxx
Nov  8 09:25:43 ip-xxx-xx-x-xxx sshd[2210]: input_userauth_request: invalid user admin [preauth]
Nov  8 09:25:43 ip-xxx-xx-x-xxx sshd[2210]: Received disconnect from xxx.xxx.xxx.xxx: 11: Bye Bye [preauth]

こうした不正アクセスを防ぐため、sshのポート番号を変更するだけでも効果があるとのことで、実際に1週間ほどEC2を放置してみた。

検証環境

  • OS : Ubuntu14.04
  • Instance Type : t2.micro

設定内容

そのため、/etc/ssh/sshd_config の下記の部分を書き換え、service ssh restart を行う。

   # What ports, IPs and protocols we listen for
Port 22
   # What ports, IPs and protocols we listen for
Port 10022
  • [Tips]

sshを再起動するときは、いったん22と10022の両方をセキュリティグループに登録しておき、新しいセッションで10022に接続できることを確認した後、
sshを再起動したセッションを閉じる方が混乱せずにすむ

結果

注)個人検証のために、SSHの接続を一時的に全許可するだけのハニーポットを準備したときの結果です。
ホスト名などが外に漏れているサーバであれば、これが数万数十万件の規模で不正アクセスがきます。

不正アクセス件数

PORT不正アクセス数
22(default)}1835
100220
200220

ポート番号を変更するだけで、見事に不正アクセス数がなくなった。
#他の運用中サーバでも、1700~2200ぐらいは不正アクセスを試みた記録が残っている

  • ユーザごとの不正アクセス件数

不正アクセスを試みようとしている主なユーザは、以下のようなユーザであった。
test,admin,guestなどは結構作りがちだが、パスワード認証とかだと破られる可能性があるので、注意しておいた方がよさげ。

回数(10回以上のものを抜粋)ユーザ
151test
143admin
75nagios
63guest
54zabbix
32user
24ubnt
24apache
21tomcat
20zxin10
20oracle
16hadoop
14postgres
14git
13weblogic
13web
13pi
13ftpuser
12zhaowei
12mysql
12ftp
11informix

対応方針

AWSのデザインパターンの一つ、CDP:OnDemand Bastionパターンを使う。

必要なタイミングで踏み台サーバを起動する

可能であれば、これが一番やりやすい方針だと思うけど、
OnDemand Bastionについて基本的なところおさらいを見ていると、やはり踏み台サーバを常時稼動させておきたいという要件も出てくる。

踏み台サーバのポートだけ変更しておく

下図のような構成で、踏み台サーバだけsshのポート番号を変更しておけば、
不正アクセスも防げ、かつVPC内部のssh接続はデフォルトの22ポートが利用できる。

bastion

appサーバに接続する際は、~/.ssh/configに以下のような定義を記載しておく。

   Host bastion.test
  HostName [bastion.testのPublic IP]
  User ubuntu
  Port 10022
  Identityfile ~/.ssh/test.pem
Host app.test
  User ubuntu
  Port 22
  Identityfile ~/.ssh/test.pem
  ProxyCommand ssh bastion.test -W [app.testのPrivate IP]:22

この状態で、$ssh app.testと接続すれば、bastion.test経由でapp.testまでsshでログイン可能となる。