VPSでいろいろ試す際に短いID & 短いパスワードの一般ユーザーを作って1週間ほど放置していたら、さっくりとログインされて不正アクセスの踏み台に使われてしまったようで、VPS事業者経由で警告メールが届いてしまいました。さすがインターネッツは怖いなと思ったわけですが、このままじゃマズいので一般的な侵入対策を勉強して導入しました。
なお、侵入されたサーバーはテストアカウントに侵入されただけだと思いますが不安なので消して、以降は新規作成したVPSでやっています。
原因と対策
どうやら以下のような認識でいないとダメなようです。
- sudoersでなくても短いID & passwordはダメ
- 辞書攻撃されるので類推可能な単語を使うpasswordはダメ
- sshポート番号がデフォルトの22番のままなのもダメ
- rootログインが可能なままなのもダメ
- 要らないポートは閉じておくべき
- ポートサーチ対策もあった方が良い
短いパスワードは論外なんですが、単語の組み合わせから成るパスワードは長いパスワードでも辞書攻撃を受けると短いのと変わらなくなるのでログインされてしまうようです。rootユーザーを乗っ取れば何でも出来るようになるのもみんな知っているのでrootログイン可能なままだといつかはログインされてしまうのでroot権限をもつ別のアカウントを作ってrootログインを禁止すべきですし、sshポートがデフォルトで22番なのも知られているのでそのままだと攻撃の頻度が増してしまいます。
ちなみにsshを22番ポートのままにしとくとどれぐらいヤバイかは5分放置してlastbコマンドするとすぐ分かります。5分で144回ノックされてます。それなりに桁数が多いパスワードを置いてあるrootであってもそのうちやられちゃいそうです。
というわけで、以下のような対策を行いました。
1. 鍵認証に変更してパスワードログインを無効にする
2. sshポート番号を変更する
3. rootログインを無効にする
4. ufwでfirewallを設定する
実施環境
Windows10 + teraterm
VPS: ubuntu18.04
sudoユーザーを作成する
rootでログインしてSUDOが実行できるユーザーアカウントを作ります。既に作ってある場合は不要です。以下でhogeというユーザーを作れます。
adduser hoge
なお、間違って作成したアカウントhogeをadduserで作成したフォルダごと消去するには以下を実行します。
sudo userdel -r hoge
hogeというユーザーを%sudoグループに追加してsudoが実行出来るようにします。
sudo usermod -aG sudo hoge
グループに追加できたか確認しておきます。
# id hoge
uid=1000(hoge) gid=1004(hoge) groups=1004(hoge).27(sudo)
最後に.27(sudo)とあるので追加できているようですので、一旦ログアウトします。
exit
再度tera termを実行して次は作成したアカウントhogeでログインします。
1. 鍵認証に変更してパスワードログインを無効にする
鍵認証を設定していきます。鍵認証を設定したい相手サーバーにsudoユーザーでログインして、メニューバーの設定から「SSH鍵生成」を選択します。鍵生成メニューが開きますのでデフォルトのままRSA 2048ビットで生成します。鍵だけでパスフレーズなしにも出来ますが一応パスフレーズも設定しておきます。
生成した鍵ファイルをメニューの下にある公開鍵の保存ボタン、秘密鍵の保存ボタンを押して保存先を指定することで鍵を保存できます。ほんとはProgram Files(x86)/teratermに置きたいんですが、teratermから直接置くことができないので、一旦デスクトップやマイドキュメントに保存します。
保存した鍵ファイル2つをc:\Program Files(x86)\teratermに移動します。
保存した鍵のうち、公開鍵の方(標準だとid_rsa.pub)をteratermにドラッグ&ドロップすればログインしているサーバーにアップロードできます。選択肢が出てきますがSSH接続であるSCPを選びましょう。
鍵がちゃんとあるか確認してみます。
$ ls
id_rsa.pub
ありました。このファイルの内容を~/.ssh/authorized_keysに置けば鍵認証できるようになります。まず、~/.ssh/ディレクトリがあるか確認してみましょう。
$ ls -d ~/.ssh
/home/hoge/.ssh
ディレクトリがあったようです。ない場合は以下でディレクトリを作ります。
$ mkdir ~/.ssh
$ sudo chmod 700 .ssh
続いて、id_rsa.pubの内容をauthorized_keysにコピーします。
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
$ sudo chmod 644 ~/.ssh/authorized_keys
これで鍵認証できるようになった筈ですから、teratermを一旦exitしてから再度起動します。下のように、RSA鍵を使うにチェックを入れて、秘密鍵のパスを指定します。パスフレーズは鍵を作ったときに入力した文字列です。OKをクリックすればSSH接続でログインできる筈。
ssh接続権限についての設定ファイルは/etc/ssh/sshd_configになります。これを書き換えてパスワード認証を無効にします。
sudo vim /etc/ssh/sshd_config
PasswordAuthentication yes
PasswordAuthentication no
sshdを再起動するまで反映されませんが、同じファイルをまだ変更しますのでこのまま続けていきます。
2. sshポート番号を変更する
上記と同様に/etc/ssh/sshd_configを書き換えます。
sshdのポート番号がデフォルトで22番になってますので10行目ぐらいに以下のような記載があります。これを予約されてない49152~65535番のどこかに変更します。下では50100番に変更しています。
sudo vim /etc/ssh/sshd_config
sshdのポート番号がデフォルトで22番になってますので10行目ぐらいに以下のような記載があります。これを予約されてない49152~65535番のどこかに変更します。下では50100番に変更しています。
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
#Port 50100
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
3. rootログインを無効にする
上記と同様に/etc/ssh/sshd_configを書き換えます。
PermitRootLogin yes
PermitRootLogin no
以下でsshdの設定ファイルの変更を反映します。
$ service ssh restart
4. ufwでfirewallを設定する
標準でfirewall機能がありますが、デフォルトでは無効になっています。また、ポートの設定などもされていないので、必要なポートだけ開けるよう設定して有効にします。
htmlポート(80番)、htmlsポート(443番)を許可します。htmlとhtmlsを使わないようなら許可しないままでも大丈夫です。
$ sudo ufw allow 80
$ sudo ufw allow 443
sshポート(上で設定したポート番号)は高頻度でログインしようとしたらブロックするようにします。
$ sudo ufw limit 50100
使わなくなった22番ポートを明示的にブロックし、allowされてないポートもデフォルトでブロックする。
$ sudo ufw deny 22
$ sudo ufw default deny
最後にufwを有効にして完成です。
$ sudo ufw enable
statusを確認しておきます。
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22 DENY Anywhere
50100 LIMIT Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
1234 ALLOW Anywhere
22 (v6) DENY Anywhere (v6)
50100 (v6) LIMIT Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
1234 (v6) ALLOW Anywhere (v6)
正しく設定できたようなので作業中のターミナルを開いたままで、別のterminalでログインできるか確認しておきます。もしsshポートを間違って設定していたら二度とsshログインできなくなっちゃいますから必ず確認するようにしましょう。
これで最低限の対策は取れたと思います。