基本認証による HTTP サーバーの構成
このステップでは、以前にインストールした HTTP サーバーの基本認証を構成します。基本認証は、クライアントが各リクエストでユーザー名とパスワードを送信するシンプルな方法です。これにより、Hydra を使用してブルートフォース(総当たり)攻撃を試みることで、後でテストするセキュリティレイヤーが作成されます。これは、弱いパスワードが危険である理由を示しています。
- まず、保護された Web サーバーをセットアップする正しいディレクトリにいることを確認します。
cd ~/project/http_server
htpasswd
ユーティリティを使用してパスワードファイルを作成します。このツールは apache2-utils
パッケージ(LabEx VM にはすでにインストールされています)に付属しており、基本認証用のパスワードファイルの管理に役立ちます。
htpasswd -c .htpasswd admin
プロンプトが表示されたら、パスワードとして password123
を入力します。ここでは、単純なパスワードがどれほど簡単にクラックされるかを示すために、意図的に弱いパスワードを使用しています。
- 次に、基本認証で HTTP コンテンツを提供する Python スクリプトを作成します。このスクリプトは、アクセスを許可する前にクレデンシャル(credential)を確認します。
nano auth_server.py
- 次の Python コードを貼り付けます。これにより、次のカスタム HTTP サーバーが作成されます。
- 基本認証を必要とする
.htpasswd
ファイルに対してクレデンシャルを検証する
- 認証に成功した場合にのみコンテンツを提供する
from http.server import HTTPServer, BaseHTTPRequestHandler
import base64
class AuthHandler(BaseHTTPRequestHandler):
def do_GET(self):
auth_header = self.headers.get('Authorization')
if not auth_header or not auth_header.startswith('Basic '):
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b'Authentication required')
return
auth_decoded = base64.b64decode(auth_header[6:]).decode('utf-8')
username, password = auth_decoded.split(':', 1)
if username == 'admin' and password == 'password123':
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
with open('index.html', 'rb') as f:
self.wfile.write(f.read())
else:
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
self.end_headers()
self.wfile.write(b'Authentication failed')
if __name__ == '__main__':
server_address = ('', 8000)
httpd = HTTPServer(server_address, AuthHandler)
print("Server running on port 8000...")
httpd.serve_forever()
- ファイルを保存し(nano で Ctrl+O、Enter、Ctrl+X)、認証のない以前の HTTP サーバーを停止します。
pkill -f "python3 -m http.server"
- 新しい認証された HTTP サーバーをバックグラウンドで起動します。
python3 auth_server.py &
- クレデンシャルなしでサーバーにアクセスしようとして、認証をテストしましょう。
curl -v http://localhost:8000
401 Unauthorized レスポンスが表示されるはずです。これは、認証が機能していることを意味します。
- 次に、以前に設定した正しいクレデンシャルでアクセスしてみてください。
curl -v -u admin:password123 http://localhost:8000
index.html
ファイルから HTML コンテンツが表示され、認証が正しく機能していることが証明されるはずです。
サーバーは基本認証で適切に保護され、次のステップでのブルートフォース攻撃(総当たり攻撃)のデモンストレーションの準備ができました。このセットアップは、Web サーバーが基本認証を使用する実際のシナリオを模倣し、その仕組みと潜在的な脆弱性の両方を示しています。