技術者になりたい何か

技術者になりたい何かの覚書的な何かです

sshdへのアタックログをみてみよう&対策しよう

ちょっと外出先からssh自宅サーバに繋いで色々したいときとか多くて、
ルータのport転送とか使って外からssh接続できるようにしました。
したら毎日のsshへのブルートフォースがすごいことになってた。

■教訓


外部からアクセスできるsshサーバで、rootログイン許可は即刻やめるべき。
外部からアクセスできるsshサーバで、パスワード認証はできるだけやめるべき。
外部からアクセスできるsshサーバで、デフォルトポート(22)での運用はできるだけやめるべき。
外部からアクセスできるsshサーバでは、fail2banとかiptablesでアクセス制限かけたほうがいい。

sshへの攻撃者はどのようにアクセスしてくるのか。


Debianなので、ログは/var/log/auth.logに出ます。(CentOSなら/var/log/secure)
というわけでログから調べますよっと。

ログイン失敗のログの一部


Dec 6 18:45:41 tminserver sshd[5876]: Failed password for root from 42.7.26.91 port 22754 ssh2
Dec 6 18:45:44 tminserver sshd[5876]: Failed password for root from 42.7.26.91 port 22754 ssh2
Dec 6 18:45:46 tminserver sshd[5876]: Failed password for root from 42.7.26.91 port 22754 ssh2
Dec 6 18:45:49 tminserver sshd[5876]: Failed password for root from 42.7.26.91 port 22754 ssh2
Dec 6 18:45:58 tminserver sshd[5878]: Failed password for root from 42.7.26.91 port 49250 ssh2
Dec 6 18:46:00 tminserver sshd[5878]: Failed password for root from 42.7.26.91 port 49250 ssh2
Dec 6 18:46:03 tminserver sshd[5878]: Failed password for root from 42.7.26.91 port 49250 ssh2
Dec 6 18:46:06 tminserver sshd[5878]: Failed password for root from 42.7.26.91 port 49250 ssh2
Dec 6 18:46:09 tminserver sshd[5878]: Failed password for root from 42.7.26.91 port 49250 ssh2
Dec 6 18:46:11 tminserver sshd[5878]: Failed password for root from 42.7.26.91 port 49250 ssh2

ちなみに件数

$ sudo grep 'Failed password' /var/log/auth.log | grep 'Dec 1' | wc -l
0
$ sudo grep 'Failed password' /var/log/auth.log | grep 'Dec 2' | wc -l
6572
$ sudo grep 'Failed password' /var/log/auth.log | grep 'Dec 3' | wc -l
14007
$ sudo grep 'Failed password' /var/log/auth.log | grep 'Dec 4' | wc -l
21951
$ sudo grep 'Failed password' /var/log/auth.log | grep 'Dec 5' | wc -l
12345
$ sudo grep 'Failed password' /var/log/auth.log | grep 'Dec 6' | wc -l
23431
tmin@tminserver:~$ sudo grep 'Failed password' /var/log/auth.log | grep 'Dec 7' | wc -l
5261

20000超とか来てますね。

圧倒的に多いのはrootで入ろうとしてFailed password(パスワード認証失敗)

root以外は何が多いかなっということで、Failed password forで出てるエラーログからユーザーのカラム抜き出して集計。

$ sudo grep 'Failed password' /var/log/auth.log | grep 'Dec' | cut -d ' ' -f 10 | sort -n | uniq -c | sort -nr
82233 root
1266 invalid
19
11 mysql
9 sync
9 postfix
9 man
5 uucp
4 sshd
4 nobody
2 backup
1 sys


圧倒的にroot多し。他にはプロセス名とかでありそうなのを打ち込んでるのが少々。

invalid は存在しないユーザ名打ち込んでエラーになってるので別途集計。

該当ログはこんな感じ

$ sudo grep 'Failed password' /var/log/auth.log | grep 'Dec' | grep 'invalid' | more
Dec 2 20:10:03 tminserver sshd[17682]: Failed password for invalid user 0101 from 5.188.10.156 port 46964 ssh2
Dec 2 20:10:18 tminserver sshd[17687]: Failed password for invalid user 0 from 5.188.10.156 port 49623 ssh2
Dec 2 20:10:29 tminserver sshd[17689]: Failed password for invalid user 1234 from 5.188.10.156 port 47647 ssh2
Dec 2 20:10:59 tminserver sshd[17697]: Failed password for invalid user admin from 5.188.10.156 port 50191 ssh2
Dec 2 20:11:02 tminserver sshd[17697]: Failed password for invalid user admin from 5.188.10.156 port 50191 ssh2
Dec 2 20:11:06 tminserver sshd[17697]: Failed password for invalid user admin from 5.188.10.156 port 50191 ssh2
Dec 2 20:11:09 tminserver sshd[17697]: Failed password for invalid user admin from 5.188.10.156 port 50191 ssh2
Dec 2 20:11:11 tminserver sshd[17697]: Failed password for invalid user admin from 5.188.10.156 port 50191 ssh2

ユーザ名のカラム抜き出して集計。


$ sudo grep 'Failed password' /var/log/auth.log | grep 'Dec' | grep 'invalid' | cut -d ' ' -f 12 | sort -n | uniq -c | sort -nr
489 admin
53 user
44 ubnt
36 test
36 pi
32 support
26 service
26 ftp
26
24 ftpuser
23 guest
20 1234
14 user1
13 super
13 adm
13 111111
12 operator
12 default
11 sysadmin
10 webmaster
10 tomcat
10 scan
10 postgres
10 manager
10 git
10 fax
10 apache
10 a
10 22
9 www
9 report
9 nagios
9 matsumoto
9 auction
8 0
7 usuario
7 mother
7 monitor
7 123321
6 api
6 administrator
6 123
5 testuser
4 plcmspip
4 client
4 anonymous
4 PlcmSpIp
3 master
3 cisco
3 Management
2 telecomadmin
2 sysadm
2 supervisor
2 raspberry
2 osmc
2 agent
2 Operator
1 zabbix
1 webadmin
1 vyatta
1 vt100
1 volition
1 vcr
1 username
1 ubuntu
1 ubadmin
1 ts3
1 telecom
1 telco
1 tech
1 target
1 system
1 svn
1 svin
1 superman
1 student
1 storwatch
1 steve
1 steam
1 shop
1 setup
1 security
1 sales
1 router
1 rcust
1 rapport
1 radware
1 public
1 print2000
1 poll
1 pizza
1 patrol
1 oracle
1 nt
1 naadmin
1 mtcl
1 mtch
1 mike
1 media
1 mark
1 mailman
1 library
1 jenkins
1 installer
1 init
1 info
1 hscroot
1 helpdesk
1 halt
1 ftptest
1 enrique
1 engineer
1 echo
1 e250
1 dvs
1 draytek
1 disttech
1 demo
1 david
1 daniel
1 bob
1 bill
1 am
1 adfexc
1 adam
1 acc
1 aaa
1 VTech
1 VNC
1 User
1 USERID
1 Sweex
1 SYSDBA
1 SYSADM
1 RSBCMON
1 Polycom
1 PSEAdmin
1 PRODDTA
1 NAU
1 Manager
1 MANAGER
1 HELLO
1 D-Link
1 Cisco
1 Administrator
1 Admin
1 ADMN
1 ;ccrusr
1 3comcso
1 266344
1 1502
1 12345
1 1111
1 0000

adminが頭一つ抜けてて、あとはuserとかありそうなユーザ名orプロセス名だったり。


ここまでの傾向から対策。

rootログイン禁止するだけで9割方防げる。
ユーザ名adminは次にやばい。(俺のサーバでは使ってない)
どうせport22への総当りなので、sshdを動かすport変更すればこれまたほとんど無くなる。
ここまでやっても0にはならないと思われるので、セキュリティ重視しなきゃな環境ならば、
パスワード認証やめて鍵認証とかにすれば、ユーザ名とポートがバレててもパスワード破られることがない。


■対策1 rootログインの禁止


簡単。効果はそこそこ。上記ログでダントツだったrootのログインが不可なので。
デメリットは自分もrootログインできなくなることくらいだが、そもそもいきなりrootで入って作業するとかリテラシーどうなの?ってかんじなので。
これで困る人は自分のやり方を考え直したほうがいいです。

/etc/ssh/sshd_configの設定でrootログインを禁止する。

$ sudo emacs /etc/ssh/sshd_config
PermitRootLogin yes →PermitRootLogin no

保存したらsshd再起動

$ sudo systemctl restart sshd

これでユーザrootで接続してみてログインできなければおk。


■対策2 ポート変更


簡単。効果は高め。これだけで多分普通のサーバならほとんど攻撃がなくなると思われ。
待受ポートがバレたらあれだけど、多分攻撃者は自動攻撃スクリプトかなんかを踏み台PCで実行してることがほとんどなため、
圧倒的に22番ポートへの攻撃が多い。無差別爆撃はまず22番への攻撃でしょう。

/etc/ssh/sshd_configの設定で待受ポートを変更

下の例では20022にしてるけど、ウェルノウンポート以外ならなんでもよい。
ウェルノウンポートでも使ってなくて使う予定もないならいいと思いますが。

$ sudo emacs /etc/ssh/sshd_config

Port 22 →Port 20022

 保存したらsshd再起動

$ sudo systemctl restart sshd

これで22番ポートに接続して繋がらず、かつ20022でつながればおk。

■対策3 パスワード認証切って公開鍵認証のみにする


難易度普通。少しめんどい。
パスワード認証切るので、パスワード総当たり攻撃は全て防げる。
デメリットは鍵持ってない端末から入れなくなること。

めんどいから今回はやってない。
とはいえVPSの方はこれにしてます。

設定はこんな感じ

mypace75.blog92.fc2.com

■対策4 fail2ban で攻撃回数に達したIPをbanする


結構難しいかも。設定も結構めんどい。
数回攻撃でアクセス自体拒否できるので、効果は大きい。
ないと思うけど一発目でアクセス成功、っていう攻撃には対処不可。
あと自分も間違えたら弾かれるので、自分が使う可能性があるIPは除外IPに入れとくのが良い。

設定した回数失敗したら攻撃とみなして該当IPをiptablesと連動してアクセス制限かける。
このあたりの説明がわかりやすいです。

さくらの VPS で CentOS fail2ban の設定 – TACKY.BIZ

ちなみにfail2banは設定によってssh不正アクセス以外の監視にも使えるので、
wordpressのログイン画面へのアクセスの監視とか、apache.htaccessへのアクセス監視とか、色々応用が効きます。
近いうちにちゃんと試す( ・`ω・´)

■対策5 firewallで海外からのアクセス弾く


攻撃元IPは中国がダントツ。
iptablesとかで日本IP以外のアクセス弾けばほとんど防げると思われ。
ただこれだと日本のIPからの攻撃の場合はどうしようもない。


■まとめ


外部からssh接続できるってだけのサーバでもこれだけの攻撃にさらされるので、
ローカル以外で使うsshサーバは何らかの対策はしときましょう。
(数日間なんの対策もしてませんでしたすみません)

あと怪しいなってときはlastとかwで見たことないとこからのアクセスがないかチェックした方がいいと思われ。