ブルートフォースアタックとは
簡単に言うとパスワード認証を通すために何回もidとpwを試してログイン認証を突破する攻撃手法です。
この攻撃手法は単純な実施方法ですが、定義しているパスワードが強力なものであっても時間とコンピュータリソースさえあれば攻撃者に突破される事が可能です。
昨今ではクラウドサーバーやレンタルサーバーなど誰でもサーバーを立ち上げやすくなっているので要注意です。
Ubuntuでの対策
サーバー側の設定です。
ブルートフォースアタックをさせないためにPWでのログインではなく鍵認証でのログインのみを有効にすることがベストな対策です。(むしろやらないと駄目です。)
Ubuntuでの対策はSSHファイルを編集します。
sudo nano /etc/ssh/sshd_config
ファイル内で以下の行をコメントアウト。
やりたいことはパスワードによるSSH接続を許可するかどうかを制御
#PasswordAuthentication yes
ファイル内で以下の行を追記。
やりたいことはパスワードが空の場合でもSSH接続を制御
※上記のPasswordAuthenticationで制御しているので必須ではない。むしろ不要かも。
PermitEmptyPasswords no
最後にsshサービスの再起動。
sudo systemctl restart sshd
Laravelでの対策
アプリケーション側での設定です。
Laravelでは、既存のファイルを編集することで対策可能です。
app/Http/Requests/Auth/LoginRequest.phpを編集。
ログイン回数の設定
tooManyAttemptsの引数:ログイン試行回数の設定
public function ensureIsNotRateLimited(): void
{
if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
return;
}
event(new Lockout($this));
$seconds = RateLimiter::availableIn($this->throttleKey());
throw ValidationException::withMessages([
'email' => trans('auth.throttle', [
'seconds' => $seconds,
'minutes' => ceil($seconds / 60),
]),
]);
}
ログイン停止時間の設定
RateLimiter::hitの引数:停止時間の設定
※秒数指定。10分なら600。
public function authenticate(): void
{
if (! Auth::guard($guard)->attempt(
[$credentials_key['id'] => $email, $credentials_key['pw'] => $password],
$remenber)
) {
RateLimiter::hit($this->throttleKey(),60);
throw ValidationException::withMessages([
'email' => trans('auth.failed'),
]);
}
}