サーバーを立てたらやること!(攻撃対策)
2018/05/30 21:41
サーバーを立てたらまずやることが「セキュリティ対策」です。
今回は記事を書くにあたって、わざとやっていませんでした。ログを取るためです。
サーバーを立てた場合、必ずそのサーバーへ接続しなければいけませんよね。
その方法がSSH。
コンソールを開いてSSHコマンド使ってサーバーへ接続します。
で、何もしないまま(デフォルトのまま)で運用すると攻撃を受けている可能性が大です。
初心者にありがちです。
ただ、今回は検証のためわざと何も対策してませんでした。結果・・・
$ grep 'Failed password' /var/log/secure* | grep 'Apr' | wc -l
4113
$ grep 'Failed password' /var/log/secure* | grep 'May' | wc -l
335831
おっおぅ・・・
このサーバーは4月下旬から借りているのですが、既に4000件くらい攻撃されていますね・・・
そして今月は30万件www ちょw多すぎだろw
3~5秒間隔で攻撃されていました。
まぁハッキングしても今は大した情報ないけどねw
大事な部分は暗号化してるし。
で、ちょっと気になるのがどんなユーザー名で総当たりしてきているのか?です。
$ grep 'Failed password for invalid user' /var/log/secure* | cut -d ' ' -f 11 | sort -n | uniq -c | sort -nr
6411 user
2056 admin
713 test
587 support
451 postgres
328 pi
326 oracle
296 ftpuser
295 ubnt
255 ubuntu
237 git
169 guest
167 nagios
149 hadoop
137 deploy
129 tomcat
116 user1
114 testuser
114 centos
108 hduser
107 ts3
103 bot
...
長くなるので、カウントが100を超えているものだけをリストアップしています。
「user」が圧倒的に多いですね。みんな、そんなにユーザー名決めるの面倒なんでしょうかね?w
そいうやパスワードで一番多いのは、「password」なんだそうな・・・
やっぱり名前を決めるのってみんな面倒なんですかねw
そういや、プログラム書いているときはファイル名だったり、クラス名はすげーなやむよね。SEあるあるだね。
ちなみに、ユーザー名をrootにした攻撃は・・・
$ grep 'Failed password for root from' /var/log/secure* | wc -l
307944
30万件w
ほとんどがrootに対して攻撃してきます。
まぁroot権限あれば何でもできますからね。
IPをリストアップすると・・・
$ grep 'Failed password for root from' /var/log/secure* | cut -d ' ' -f 11 | sort -n | uniq -c | sort -nr
113182 from
43186 58.242.83.39
19388 218.87.109.151
14285 58.218.201.181
13597 42.7.26.88
13312 42.7.26.15
10994 58.242.83.26
10082 42.7.26.60
8603 42.7.26.16
6802 61.177.172.63
6082 182.100.67.235
5564 58.242.83.35
5266 182.100.67.60
4278 218.65.30.43
4020 61.177.172.5
3790 42.7.26.49
3565 118.212.143.43
3223 218.65.30.124
2977 42.7.26.91
2856 58.218.201.189
2773 118.212.143.47
1663 222.186.52.123
1603 61.177.172.57
1475 116.12.218.210
553 182.100.67.133
305 61.177.172.42
268 61.177.172.86
227 193.201.224.232
138 103.99.2.212
115 35.200.111.188
115 183.96.119.200
すごいですね・・・同じサーバーから4万件以上も・・・完全に意図的で悪質ですね・・・
なぜ「from」がリストアップされるのかがいまいちわからん・・・ログってフォーマット決まってるんじゃないの?ムムッ
じゃあ、対策について書こう。いろいろ対策方法があるが代表的なのは以下。
1.rootによるログインを禁止
2.ポートを変更
3.fail2banというツールを導入する
4.パスワード認証から公開鍵認証に変える
最低限やっておくべきは、1と2ですかね。
理由は以下
・rootさえ守れればまぁあとからなんとでもなる
・ポートは好きに設定できるし、65535番まであるので、これを変更するだけでも十分攻撃を防げる
※ただしウェルノウンポートは設定できない
https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7
可能であれば4の公開鍵認証方式にするとなおいい。
パスワードの総当たり攻撃を防げるので、一番楽でセキュリティも高くできる!
ただ、デメリットは鍵をなくさないようにしないといけないこと・・・
Dropboxにでも入れておこうか。。。
では対策をしていきます!
今回は2のポート変更と4の公開鍵認証方式で対策します!
まず、自分のPC(クライアント)側で秘密鍵と公開鍵を生成します。
※Windowsの場合はGitをインストールするとついてきます(もしくはSourceTreeとか)
以前まではRSAで作ってたけど、どうやらもう古いらしい。
なので今回はEd25519で作ってみる。
$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/user/.ssh/id_ed25519): <- どこに保存するか?
Created directory '/user/.ssh'.
Enter passphrase (empty for no passphrase): <- パスフレーズ(鍵自体のパスワード。なくてもOK)
Enter same passphrase again: <- もう一度入力
Your identification has been saved in /user/.ssh/id_ed25519. <- 秘密鍵が作られた
Your public key has been saved in /user/.ssh/id_ed25519.pub. <- 公開鍵が作られた
↑できた。
そしたら次にSCPコマンドを使ってサーバーに公開鍵を転送する。
フォーマットは $ scp 公開鍵のパス リモートユーザー名@ホスト(or IP):ディレクトリ
$ scp id_ed25519.pub user@loootus.com:/user/.ssh/
転送が完了したので、authorized_keysへ登録する。
$ ssh-copy-id user@loootus.com
登録できた!
では公開鍵でログインしてみる。
$ ssh -i id_ed25519 user@loootus.com
ログインできた!
ではここからリモートPC(サーバー)側でパスワード認証を切ってみる。
$ vi /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
保存したら、sshdを再起動します。
$ systemctl restart sshd
パスワード認証ができるか試します。できなければ成功です!
じゃあ最後にポート変更します。が、その前にファイアウォールの確認をしておきます。
$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-03-23 13:27:35 JST; 1 years 0 months ago
active(running)になってますね。
$ firewall-cmd --list-all
services: ssh dhcpv6-client http https
sshがありますね!当たり前ですが・・・
設定を変更していきます。
「/usr/lib/firewalld/services/」配下にデフォルトの設定ファイルがあるのでそれを「/etc/firewalld/services/」配下にコピーして変更します。
$ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-xxxx.xml
xxxxにはポート番号をつけとくとわかりやすいです。
$ vi /etc/firewalld/services/ssh-xxxx.xml
<port protocol="tcp" port="xxxx"/>
こんな感じでポート番号を修正します。
で、以下のようにしてファイアウォールに追加します。
$ firewall-cmd --permanent --add-service=ssh-xxxx
次に元のSSHの設定を削除します。
$ firewall-cmd --permanent --remove-service=ssh
完了したのでリロードします。
$ firewall-cmd --reload
あとは接続確認を行うのみですが、誤って今接続しているターミナルは絶対に切らないでください!
必ず新規にターミナルを立ち上げて接続確認を行ってください!
もし接続できなかったら・・・詰みます。
ちなみに1と2をやっただけでも、効果はあります(既に別サーバーで実証済み)
まぁ大事なデータがあるサーバーとかは踏み台サーバーを用意して、その踏み台サーバー経由からポートフォワーディングしてアクセスするのが一番いいんですがね。
そこまで個人サーバーではやりたくないので・・・
ではまた!