Shikata Ga Nai

Private? There is no such things.

Basic認証(Basic Authentication)の基礎とリスクについてまとめてみた

Hello there, ('ω')ノ

Basic認証は、最も単純な認証方法の一つで、主にウェブサーバやAPIで利用されることがあります。しかし、セキュリティ上の問題が多く、現在では推奨されない方法です。


1. Basic認証とは?

Basic認証は、クライアントがサーバにアクセスする際にユーザ名パスワードを送信して認証を行う方法です。この情報は、HTTPリクエストのAuthorizationヘッダーにBase64でエンコードされて送信されます。

リクエスト例

以下はBasic認証のリクエスト例です:

GET /api/v2/list_resources
Authorization: Basic bWF1cmljaW86TXlQYXNzd29yZCNAIQo=
  • bWF1cmljaW86TXlQYXNzd29yZCNAIQo=:

    Base64エンコードされたユーザ名とパスワード(例: mauricio:MyPassword#@!)。


仕組み

  1. クライアントは、ユーザ名とパスワードをBase64エンコードしてAuthorizationヘッダーに追加。
  2. サーバは、Base64デコードを行い、資格情報を確認。
  3. 認証成功の場合:リクエストに応答。
  4. 認証失敗の場合:HTTPステータスコード401(Unauthorized)を返す。

2. Basic認証の問題点

2.1 平文でのエンコード

Base64は暗号化ではなく、単なるエンコード方式です。以下のように簡単にデコード可能です:

echo "bWF1cmljaW86TXlQYXNzd29yZCNAIQo=" | base64 --decode
# 出力: mauricio:MyPassword#@!

2.2 TLSがない場合の脆弱性

通信が暗号化されていない場合(TLS未使用)、以下のリスクが発生します:

  • パケットスニッフィング: ネットワークを監視するツール(例: Wireshark)で認証情報が平文で盗まれる。
  • 中間者攻撃(MiTM): 攻撃者が通信を傍受し、資格情報を収集。

2.3 認証情報の管理不備

サーバ側で認証情報を適切に管理していない場合、以下のリスクが発生します:

  • パスワードが暗号化されずに保存されている。
  • ハッシュやソルト(追加データ)の欠如により、パスワードが簡単に復元される。

3. Basic認証の判別方法

3.1 リクエストの解析

HTTPリクエストに以下のヘッダーが含まれている場合、Basic認証が使用されています:

Authorization: Basic <Base64エンコードされた資格情報>

3.2 サーバ応答の確認

サーバから返される以下のヘッダーでBasic認証を検出可能:

WWW-Authenticate: Basic realm="example"

3.3 ネットワークトラフィックの監視

Wiresharkなどのネットワーク監視ツールを使用して、認証情報を確認できます。特にTLSが未使用の場合、資格情報が容易に解析されます。


4. Basic認証に対する攻撃手法

4.1 パケットスニッフィング

通信が暗号化されていない場合、認証情報がネットワークトラフィックに平文で現れます。

4.2 ブルートフォース攻撃

攻撃者が資格情報を体系的に推測して認証を突破する。

4.3 フィッシング攻撃

ユーザを騙して認証情報を入力させる。


5. 推奨される代替手段

5.1 OAuth 2.0

トークンベースの認証を提供し、資格情報を直接共有する必要がありません。

5.2 APIキー

一意のキーを使用して、認証とアクセス制御を行います。

5.3 JSON Web Tokens (JWT)

自己完結型のトークンで、分散システムやマイクロサービスに適しています。


6. Basic認証を使用する場合の注意点

もしBasic認証を使用する必要がある場合は、以下を徹底してください:

  • 必ずTLSを使用: 通信を暗号化して資格情報を保護。
  • パスワードの暗号化: データベース内でパスワードをハッシュ化。
  • レートリミットを設定: ブルートフォース攻撃を防ぐ。

まとめ

Basic認証はシンプルで使いやすいですが、セキュリティ上のリスクが多いため、現代のAPI開発では避けるべき方法です。TLSの使用、代替手段への移行などを検討し、APIセキュリティを強化することが重要です。

Best regards, (^^ゞ