Security Audit Skill
概要
OWASP Top 10、インジェクション防止、認証・認可のセキュリティ専門知識。
OWASP Top 10(2021)
1. Broken Access Control
問題: ユーザーが権限外のリソースにアクセスできる
対策:
- •最小権限の原則
- •各リクエストで認可チェック
- •IDベースのアクセス制御(ユーザーIDがリソース所有者か確認)
python
def get_user_data(user_id: int, current_user: User):
if current_user.id != user_id and not current_user.is_admin:
raise PermissionError("Access denied")
return db.get_user(user_id)
2. Cryptographic Failures
問題: 暗号化の不備(平文保存、弱い暗号化)
対策:
- •パスワードはハッシュ化(bcrypt、Argon2)
- •HTTPS必須
- •機密データは暗号化して保存
python
from passlib.hash import bcrypt
# パスワードハッシュ化
hashed = bcrypt.hash("password")
# 検証
bcrypt.verify("password", hashed) # True
3. Injection
問題: SQLインジェクション、コマンドインジェクション
対策:
- •プリペアドステートメント使用
- •ORM使用(SQLAlchemy、Django ORMなど)
- •入力バリデーション
python
# ❌ 危険
query = f"SELECT * FROM users WHERE email = '{email}'"
# ✅ 安全
query = "SELECT * FROM users WHERE email = %s"
cursor.execute(query, (email,))
# ✅ ORM使用
user = db.query(User).filter(User.email == email).first()
4. Insecure Design
問題: 設計段階でのセキュリティ考慮不足
対策:
- •セキュアバイデザイン
- •脅威モデリング
- •セキュリティレビュー
5. Security Misconfiguration
問題: デフォルト設定、不要な機能有効
対策:
- •デフォルトパスワード変更
- •不要な機能無効化
- •エラーメッセージで情報漏洩しない
python
# ❌ 危険(本番環境でDEBUG=True)
DEBUG = True
# ✅ 安全
DEBUG = os.getenv("DEBUG", "False") == "True"
6. Vulnerable Components
問題: 古いライブラリの脆弱性
対策:
- •定期的なアップデート
- •依存関係スキャン(Dependabot、Snyk)
- •セキュリティアドバイザリ監視
7. Identification and Authentication Failures
問題: 弱い認証、セッション管理の不備
対策:
- •パスワードポリシー(長さ、複雑さ)
- •多要素認証(MFA)
- •セッションタイムアウト
- •ブルートフォース対策(レート制限)
python
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = verify_token(token)
if not user:
raise HTTPException(status_code=401, detail="Invalid token")
return user
8. Software and Data Integrity Failures
問題: コード・データの改ざん
対策:
- •署名検証
- •CI/CDパイプラインのセキュリティ
- •チェックサム検証
9. Security Logging and Monitoring Failures
問題: ログ・監視不足
対策:
- •セキュリティイベントのログ記録
- •異常検知
- •インシデント対応プラン
python
import logging
logger = logging.getLogger(__name__)
def login(username: str, password: str):
user = authenticate(username, password)
if user:
logger.info(f"Successful login: {username}")
return user
else:
logger.warning(f"Failed login attempt: {username}")
raise AuthenticationError()
10. Server-Side Request Forgery (SSRF)
問題: サーバーが攻撃者の指定したURLにアクセス
対策:
- •URLホワイトリスト
- •内部IPアドレスへのアクセス禁止
- •リダイレクト無効化
XSS(Cross-Site Scripting)防止
python
from markupsafe import escape
# ❌ 危険
html = f"<div>{user_input}</div>"
# ✅ 安全(エスケープ)
html = f"<div>{escape(user_input)}</div>"
CSRF(Cross-Site Request Forgery)防止
python
# FastAPI/Starlette例 from starlette.middleware.csrf import CSRFMiddleware app.add_middleware(CSRFMiddleware, secret="your-secret")
レート制限
python
from fastapi_limiter import FastAPILimiter
from fastapi_limiter.depends import RateLimiter
@app.post("/login", dependencies=[Depends(RateLimiter(times=5, seconds=60))])
async def login(username: str, password: str):
# 1分間に5回まで
pass
セキュリティヘッダー
python
@app.middleware("http")
async def add_security_headers(request, call_next):
response = await call_next(request)
response.headers["X-Content-Type-Options"] = "nosniff"
response.headers["X-Frame-Options"] = "DENY"
response.headers["Content-Security-Policy"] = "default-src 'self'"
return response
セキュリティチェックリスト
- • 入力バリデーション(すべての入力)
- • SQLインジェクション対策(プリペアドステートメント)
- • XSS対策(エスケープ、CSP)
- • CSRF対策(トークン検証)
- • 認証・認可(各リクエストで確認)
- • パスワードハッシュ化(bcrypt、Argon2)
- • HTTPS必須
- • セキュリティヘッダー設定
- • レート制限
- • ログ記録
- • 依存関係の脆弱性スキャン