なんとなく書いてみます。
Linux などのシステムを管理する際、ssh でアクセスすることが非常に多いかと思います。
ssh は便利ではありますが、乗っ取られたら終わり、という側面も持っています。
secure shell というぐらいあって、高度なセキュリティによって通信内容などは保護されています。
さらに、ユーザー名とパスワードでという従来よくあった方法ではなく、鍵を利用した暗号化通信を行うこともできるので、非常に頑丈であり乗っ取るのは難しいです。
しかし、これはあくまでも、理想というか、きちんとセキュリティを理解して設定・管理した場合の話です。
鍵方式でなくても ssh は利用できますし、というか初期設定では、ユーザー名とパスワードで認証する設定になっている場合がほとんどではないかと。
んで、そんな甘いサーバーに力ずくで侵入しようとする輩もいます。
適当なユーザー名とパスワードで、片っ端から try していく...
特に、英単語辞書などを使って、それっぽいユーザー名で login を繰り返す。
こういう手法を、ブルートフォースアタック (Brute force attack) というのは、まあみなさんご存知かと。
たぶん、公開サーバーでインターネットから常時 ssh を接続できるようにしている場合は、一度は経験したことがあるかと。
一度やられると、ひっきりなしにやってくるわけですがw
今回は、実際にうちのサーバーに仕掛けてきた攻撃をいろいろ見てみようかと。
1. ブルートフォースアタックの一例
まず、ブルートフォースアタックが仕掛けられると、どのような形跡が残るか見てみましょう。
もし、secure ログを見て、このようなメッセージが連続的に出力されている場合、それはブルートフォースアタックの可能性が高いです。
Nov 30 06:46:30 server sshd[1145]: Invalid user hogehoge from ***.***.***.***
Nov 30 06:46:30 server sshd[1149]: input_userauth_request: invalid user hogehoge
ログイン試行回数は、相手の根気にもよりますが、場合によっては数時間続く場合もあります。
出力されるログの量は、半端ないことになります...
こんなログが延々と続くようになったら、末期症状ですw
また、logwatch を導入している場合は、さらに簡単な方法があります。
ログを見なくても、ある程度そこからブルートフォースアタックが仕掛けられたかどうか、推測することができます。
このように、11: ByeBye などが、ぱない回数が出力されていた場合、それはブルートフォースアタックによる可能性が高いです。
--------------------- SSHD Begin ------------------------
Received disconnect:
11: Bye Bye : 18151 Time(s)
2: disconnected by server request : 3 Time(s)**Unmatched Entries**
reverse mapping checking getaddrinfo for 220-98-147.jasatel.net.id failed - POSSIBLE BREAK-IN ATTEMPT! : 1719 time(s)
channel 3: open failed: administratively prohibited: : 1 time(s)---------------------- SSHD End -------------------------
2. 対策その1 -危険なユーザー名-
しかし、これらの攻撃は、鍵方式で運用している場合、ほとんど気にする必要はありません。
放置で、全く問題ないのです。
なぜなら、彼らは id と pass しか使ってこないので、鍵方式のみを許可している場合は、絶対にログインできないのです。
しかし、どうしてもパスワード方式でのログインを許可しなければならない時があるかもしれません。
それは決して推薦される方法ではありませんが、やむを得ずというときはあります。
根本的な対策は、探られずらいユーザー名とパスワードを指定することです。
攻撃者は、辞書に載っている単語を利用して、ユーザー名やパスワードを探り当ててきます。
そのため、それらをランダムな文字列に設定しておけば、一応安心安全というわけです。
ですが、そうもいかない場合もあるでしょう。
なので、参考になるかどうかはわかりませんが、サーバーに仕掛けられたブルートフォースアタックで使用されたユーザー名を、リストアップしてみました。
危険なユーザーリスト、とでもいった方がよいでしょうか。
かなり適当ですがこのようなスクリプトを使用して、抜き出しました。
cat /var/log/secure* | grep sshd | grep "Invalid user" | cut -f 4 -d : | cut -f 4 -d ' ' | sort | uniq -c | sort -n -r -k 1
"試行回数 ユーザー名" のような形式になっています。
1911 test
1638 admin
1259 a
1167 guest
578 user
477 oracle
383 123456
359 password
346 info
328 tester
.
.
.
たとえ、鍵方式で利用していたとしても、このリストで上位に出てくるようなユーザー名は使用しないほうが無難です。
なぜなら、ブルートフォースアタックは ssh に限ったことではなく、その他パスワード方式でアクセスするようなものであれば、何でも通用するからです。
幸い、アクセスはほぼ海外からのものなので、日本語に由来する単語はほとんど使われていません。
そのため、日本人である場合、自分の名前+α などは、かなり安全なユーザー名となることでしょう。
しかし、油断は禁物です。
絶対に安心、というものはあり得ないことを頭に置いておくとよいでしょう。
3. 対策その2 -IPアドレス制限-
ユーザー名やパスワードを難解なものにしようという対策を前述しましたが、もし片っ端からユーザー名やパスワードを探られた場合、これは意味をなさなくなります。
(実際には、とてつもないパターンの数になるので、不可能に近いことではありますが)
そのため、実際には ssh で接続できる発信元を制限することが、さらに重要になってきます。
あり得ない接続元 (例えば海外など) からの接続を遮断することで、攻撃者はログインを試行することすらできなくなります。
また、これは鍵方式で ssh を運用している場合でも、無駄なアクセスを減らすことができるので、是非やっておきたい対策の一つと言えるでしょう。
まずは、自分がどこから ssh でシステムにログインするかを把握する必要があります。
たとえば、LAN 内の特定の PC からしか ssh 接続はしないという場合は、その PC の IP のみを許可すればいいことになります。
これには、/etc/hosts.deny と /etc/hosts.allow を利用します。
[hosts.deny]
sshd: ALL
[hosts.allow]
sshd: 192.168.10.1
sshd: 192.168.0.0/255.255.255.0
などとすることで、192.168.10.1 と 192.168.0.* からのアクセス以外を遮断することができます。
ローカルからしか利用しない場合は簡単ですが、実際はインターネットから利用する場合も多いかと思います。
その場合は、遮断・許可の指定が難しいかと思います。
前述したように、ブルートフォースアタックを仕掛けてくる発信元は、大半が海外からのものです。
日本からのアクセスも存在しますが、少数派です。
そのため、日本の IP からのアクセス以外を遮断することで、攻撃のリスクをかなり減らすことが可能です。
こちらから、日本の IP アドレスの割り当てリストを入手することが可能です。
定期的に、こちらから IP アドレスのリストを入手し、hosts.allow に加えてあげることで、日本からのアクセス以外を遮断することができます。
設定方法は、リンク先のサイトにもある程度解説されています。
うちでは、このようなスクリプトを cron を使い weekly で動かしています。
#!/bin/bash
echo "sshd: 192.168.0.0/255.255.255.0" > /etc/hosts.allow
echo "sshd: 192.168.10.0/255.255.255.0" >> /etc/hosts.allow
wget -q http://nami.jp/ipv4bycc/mask.txt.gz
gunzip mask.txt.gz
sed -n 's/^JP\t/sshd: /p' mask.txt >> /etc/hosts.allow
rm -rf mask.txt
実際に、この対策を実行して JP 以外からの接続が遮断された場合、このようなログが出力されます。
Dec 4 05:56:29 server sshd[5095]: refused connect from ::ffff:200.55.1.162 (::ffff:200.55.1.162)
Dec 4 06:03:54 server sshd[7935]: refused connect from ::ffff:200.55.1.162 (::ffff:200.55.1.162)
Dec 5 01:36:54 server sshd[19506]: refused connect from ::ffff:221.10.254.81 (::ffff:221.10.254.81)
Dec 5 02:24:19 server sshd[8992]: refused connect from ::ffff:66.63.191.180 (::ffff:66.63.191.180)
Dec 5 02:27:07 server sshd[10080]: refused connect from ::ffff:66.63.191.180 (::ffff:66.63.191.180)
最後に...
一通り、ブルートフォースアタックに関して語ってみましたが、僕はそこまで詳しいわけではありませんw
なぜ語ろうと思ったかは、お察しください。
まあ、うちはまだましな方だと思いますが...
もし、このような方法もあるよ、と主張したい方は、コメントなどからどうぞ。
追記...
もっとまともな対策など、参考にどうぞ。


利便性をなるべく損なわずということを意識したら
指定時間内にx回認証に失敗したらそのIPアドレスを規制するという方法が一番いいのでは・・・?
ブルートフォースアタックなら有効な手段だと思うけどだめかな・・・
おお、何となく期待していた答え一号。
だけど、それをどうやって実現するかがよくわからんw
確か、設定でなんかそんな項目があったようななかったような。
まあ、1000回も認証間違えるようなアホはどこにもいないと思うので、かなり有効な手段ですよねぇ。
ちなみに、某氏からはポート変更が一番という意見があったりw
上のシェルスクリプトみたくログから試行回数とか時間当たりを拾ってきて判定して条件に当てはまれば
/etc/hosts.denyに追記って処理をすればいいと思う
返信にラグが発生していて、すいません...
やっぱり、いろいろと面倒なことしなきゃいけないんですね。
まあ、セキュリティを考えれば、面倒なことなんてないですが。
う~ん...
こんにちは
うちも数日前久々にポートを開けたんですけど,今日ログみたらPOSSIBLE BREAK-IN ATTEMPT!の嵐.
鍵認証しか許していませんけど,気付かなくてログが増大するのもシャクなので,うまく制御できないかと検索してたらここに来ました.
たしかiptablesにはログを動的に制約するような事ができた気がしますけど,選択的にパケットを捨てたりできないんですかね?
本来ならSSHDに似た機能があればいいんですけど…
すみません,調べてみたところ,sshdで対処できるようです.sshd_configに:
MaxStartups 10:30:60
みたいに書くようです.
うちのサイトでもしばらくこれで試してみます.
http://www.itmedia.co.jp/help/tips/linux/l0541.html
この辺が参考になりますかね?
やっぱり、ありましたよねこういうオプション。
コメント、ありがとうございました。
ぜひ、こちらも導入してみようかと思います。
MaxStartupsは同時並行のアクセスを制限するもののようで,ひとつのサイトからの連続アタックには対処できないみたいです.
ログを監視してアタックだったらiptablesでパケットを捨てる,というソフト sshguard を導入したところ,うまくいきました.検索すれば導入方法などヒットしますので参考になればとおもいます.
一応当方Debian sidの場合の設定は私のブログに書きました.なぜかここへのトラックバックができなかったので,コメントで失礼します.
>MaxStartupsは同時並行のアクセスを制限するもの
なるほど。そういうことでしたか。
なかなか分かりづらいですね。
ブログの方は読ませていただきました。
CentOS では、sshguard がリポジトリになく、ソースからと言うのが、個人的には結構面倒ですがw
うちの場合は、今のところ日本以外からのアクセス遮断で、とりあえずほぼ弾けているので、必要性が出てきたら参考ににしたいと思います。
> トラックバックできない...
いろんな人から言われるのですが、原因がよく分からないです。
エラーメッセージとか、分かるのいいのですが...
スパムが多すぎて、うまく行かないんですかね...
スパムトラックバックに分類されていた訳ではないようですし。
アカウントロックアウトといいます。
アカウントロックアウトっていうは、Windows Server で使われてるみたいですね。
回数制限自体がロックアウトではないと思います。
素直にアカウント制限を英語にしたら、そうなるのかもしれませんが、ssh 周りではあまり聞かない用語ですね...