Hydraによるsshパスワード攻撃の話、第3回です。
前々回は攻撃側、前回は守備側を取り上げましたが、今回は反省会です。
それでは守備側としてはどうすれば防御できたのか、対応策の考察です。
sshdの設定ファイル
sshdの設定は以下の2段階になっています。
- デフォルトの設定
- sshd_configで設定
1.は(恐らく)改編不可です。
なのでもしこれを変更したければ、2.で設定し直します。
そうすると1.に上書きされて2.の設定が有効となり、結果的に設定が変更されます。
デフォルトの設定
デフォルトのsshd設定を確認するコマンドは以下の通り。
sudo sshd -T -f /dev/null
結果は以下の通りです。
デフォルト設定その1
1行目、port(ポート番号) 22
6行目、Login Grace Time (ログイン時の猶予時間) 120秒
8行目、maxauthtries(最大試行回数) 6回
9行目、maxsessions(最大接続数) 10回
下から12行目、PubKey Authentication (公開鍵認証) yes
下から2行目、PasswordAuthentication (パスワード認証) yes
デフォルト設定その2
デフォルト設定その3
下から10行目: ” MaxStartups 10:30:100 ” の、
” 10 ” 、 ” 30 ” 、 ” 100 ” の意味は、
- 最初の10人は受付する。
- 11人目からは30%の確率で拒否する。(逆に言うと70%は受付する)
- 最大数は100人までとする。
という設定を表しています。
sshd_config
上記のデフォルト設定を上書き変更するファイルが、 ” sshd_config ” です。
この設定ファイルは、” /etc/ssh/sshd_config ” にあります。
下記コマンドで閲覧できます。(-n オプションで行番号を付けて例示しています。)
cat -n /etc/ssh/sshd_config
- このファイルを適当なテキストエディタで改編して(多分 ” sudo ” が必要)
- 保存して、
- ” systemctl restart sshd ” でsshdを再起動すれば設定を変更できます
以下はファイルの中身です。
先頭に # のある行はコメントアウトされている行で、無効な行です。
初期段階では殆どがコメントアウトされており、つまりは無効であり、デフォルト設定の方が生き残る設定となっています。
sshd_config その1
14行目 ポート番号:変更時は(#をはずして)この番号を変更します。
32行目 #LoginGraceTime 2m:ログイン時の猶予時間はここで変更(2mは2分=120秒)
35行目 #MaxAuthTrials:最大試行回数はここで変更
38行目 #PubkeyAuthentication yes:公開鍵認証の可否設定
sshd_config その2
57行目 #PasswordAuthentication yes:パスワードによる認証の可否
sshd_config その3
103行目 #MaxStartups 10:30:100 この3つの数字の意味は、
- 最初の10人は受付する。
- 11人目からは30%の確率で拒否する。(逆に言うと70%は受付する)
- 最大数は100人までとする。
を意味しており、この数字を変更設定することが出来ます。
守備側の防御力を高める対策
ポートの変更
設定ファイルの1行目のポート番号を変更することが出来ます。但しファイアウォールの設定変更(新たなポート番号も開放しておくこと)も同時に必要です。
ポートスキャンされると変更後のポート番号が露見して攻撃されてしまいますが、数多くのサーバーに対して22番ポートだけを決め打ちで攻撃するタイプの攻撃には有効な対策です。
パスワード解読の遅延工作
設定ファイルの103行目 MaxStartupsを例えば ” 2 ” にします。この場合、認証を同時に試行できる人数は2人に制限されます。
MaxStartupsの後の数字を(10 : 30 : 100)のように3つ組の数字とせず、単に1つの数字とした場合はその数字を最大同時試行人数として設定できます。
例えば14人を2人に制限すると解読までの時間が7倍かかる計算になります。
例えば4ヶ月を7倍すると2年4ヶ月となり、解読時間が長くなればなるほどその効果が上がります。
32行目LoginGraceTime、35行目MaxAuthTrialsも似たような遅延効果を得られます。
しかしこれらの変更は解読までの時間を遅延させるだけで、時間さえかければ最終的には解読されてしまいます。
公開鍵認証の設定とパスワード認証の禁止
PubkeyAuthentication yes :公開鍵認証の設定はデフォルトで既にyesとなっています。
公開鍵認証による接続を可能にした後で、
57行目 PasswordAuthentication :これを ” no ” とするとパスワード認証が出来なくなり、公開鍵認証のみ接続可能になります。
そうすればパスワードで認証しようとするhydraなどのonline password攻撃は無力となります。
公開鍵認証の設定
以下、鍵ペアの作り方と、配送の仕方、ssh公開鍵接続の仕方です。
鍵ペアの生成
下記コマンドで、 ” ~/.ssh ” ディレクトリに、2つの暗号鍵が生成されます。
ssh-keygen -t ed25519
あれこれ質問してきますが、今回はとりあえず全部パスしてます。
ed25519は暗号化方式(楕円曲線暗号)の一種であり、rsa暗号よりも堅牢のようです。
.sshディレクトリには、秘密鍵 ” id_ed25519 ” と公開鍵 ” id_25519.pub ” の2つが生成されています。
設定ファイルの作成
クライアント側に下記設定ファイルを作成します。
ファイル名 ~/.ssh/config
ファイルの内容
Host アクセス先名
Hostname サーバーのホスト名 or IPアドレス
Port ポート番号
IdentityFile ~/.ssh/id_ed25519
User ユーザ名
公開鍵のサーバーへの配送
クライアント側からサーバー側に公開鍵をコピーします。
ssh-copy-id -i ~/.ssh/id_ed25519.pub ユーザ名@サーバーIPアドレス(またはホスト名)
公開鍵の配送先
サーバー側の “~/.ssh/authorized_keys ” に保存されます。
鍵の中身はこんな感じです。
公開鍵によるssh接続
下記にて公開鍵を使って(パスワードなしで)ssh接続出来ます。
ssh -i id_ed25519 ユーザ名@サーバーIPアドレス(またはホスト名)
2回目からは ” ssh サーバーIPアドレス ” だけで、パスワードなしで接続できました。(ユーザ名はサーバー側とクライアント側で同じにしてあります)
パスワード認証の無効化
公開鍵による接続が成功すれば、サーバー側のパスワード認証を無効にしても支障無くなります。
これによりパスワードを用いてのssh接続を禁止出来ます。
以下は、サーバー側の操作です。
設定ファイルの書き換え
サーバーの ” /etc/ssh/sshd_config ” をテキストエディタで開き、
1例としてテキストエディタとしてmousepadで開いています。
57行目を、
PasswordAuthentication no と設定して保存します。
(変更前)
(変更後):57行目 先頭の#が取れて、最後が ” no ” に変わっています。
左から3つめのセーブアイコンで保存します。
sshd再起動
その後下記コマンドで、サーバー側のsshdを再起動すると新設定が有効になります。
systemctl restart sshd
なお、上記コマンドではパスワードを訊かれます。下記 ” sudo ” をつけるとパスワード不要になります。
sudo systemuctl restart sshd
設定ファイルチェック
本当に変更されているかどうかチェック。
cat /etc/ssh/sshd_config
確かに、 PasswordAuthentication は no になっています。
パスワード認証無効化後の攻撃実験
それでは実際に効果のほどを実験してみます。
sshによる接続
まずは普通にssh接続してみます。公開鍵認証の設定を行なっていますので普通に接続できます。
パスワードは不要です。
接続される側のログを見るとこんな感じ。1行目に公開鍵が表示されています。
hydraによる攻撃
攻撃開始後二十数秒で、「パスワード認証がサポートされていない」との失敗報告が返ってきました。
攻撃失敗です。
守備側の記録
hdraからの刺客の最初の1人(51942氏)を追い返したら、後に続く人々は最早誰もやってきてません。
まとめ
sshログイン設定を、パスワード認証を禁止して、公開鍵認証だけにすれば(当たり前だけど)Hydraによる攻撃をブロック出来ました。
コメント