公開鍵認証を使ったブルートフォースアタック対策
その昔、brute forceアタックされるのが恐ろしかったので、自宅サーバーの sshd は、22 以外の適当なポートにしてました。んが、しかし、sshd のポート変えると、Xming とかが動かなかったりして(port 22以外でXming使う方法がわからん)なにげに不便。そこで、公開鍵認証のみで ssh 接続できるようにしたときのメモ。
公開鍵認証とは、公開鍵と秘密鍵を作成し、サーバー側に公開鍵を置いてログイン時に秘密鍵を用いて認証を行うやり方です。簡単に手順を書くと、↓こんな感じ。
local> ssh-keygen -t dsa # SSH 2 DSA 鍵作成&パスフレーズ入力 local> scp ~/.ssh/id_dsa.pub server:~/temp/ # サーバーの~/temp/に公開鍵をコピー local> ssh server # サーバーにログイン server> cat temp/id_rsa.pub >> ./ssh/authorized_keys # 公開鍵を追加 server> exit local> eval `ssh-agent` # ssh-agent を起動 local> ssh-add # 秘密鍵を読み込む local> ssh server # serverにログインしてみたら Enter passphrase for key '/home/hoge/.ssh/id_dsa': # パスフレーズを聞かれるようになった
local は、手元のマシン、server は、リモートログインしたいマシンと置き換えてください。ここまでで、公開鍵認証は出来ている状態であるとします。
次に、パスワード認証を禁止にします。/etc/ssh/sshd_config を以下のように修正します。
PermitRootLogin no # root でのリモートログインは当然禁止 PasswordAuthentication no # パスワード認証による ssh アクセスは禁止 PubkeyAuthentication yes # 公開鍵認証を許可 RhostsAuthentication no # rhost認証を禁止 ChallengeResponseAuthentication no # チャレンジレスポンス認証を無効 UserPAM no # PAMによる認証を無効
ちなみにPAMとは、Pluggable Authentication Modules 略で、さまざまなUNIXで利用されているユーザー認証の仕組みのことです。詳しくは、User Authentication HOWTOを参照してください。
設定を修正したら、
sudo /usr/sbin/sshd -t
して、設定が正しいかテストをします。間違いが無ければ、
sudo /etc/rc.d/sshd restart
として sshd を再起動します。以上で、ssh を使ったパスワード認証はできなくなりました。これで外部から侵入されることはないでしょう、、、鍵が漏れない限り。しかしこのままでは、アタックされると sshd に負荷がかかってログが膨れ上がってイヤンなのは変わらないので、やっぱりちゃんパケットフィルタしないとダメですな・・・。
追記:
Brute Force Attack対策について、とてもよくまとまってるサイトを見つけました。
- 特定IPアドレスのみからのアクセスを許可し、他は全拒否する
- sshd の listen port を 22/tcp から他の任意の port に変更する
- sshd.conf の Port 22 を 22 以外の任意の数字に変更
- もしくはport 22 に knockd を使う
- パスワードによる認証を禁止する (PasswordAuthentication no, ChallengeResponseAuthentication no)
- 総当たり攻撃の防御スクリプトを導入する。
- ログから攻撃を検知し、libwrap や iptables, ipf 等で拒否
- iptables の機能を使って同じIP空の連続アクセスを自動拒否
このエントリは、上記のリンク先に書かれてある「3. パスワードによる認証を禁止する」の手順を書いたものです。