説明
パスワード、APIキー、認証トークンをアプリケーションコードに直接含めると、コードの流出時に漏えいするおそれがあります。
想定される影響
- シークレットの漏えい: ソースコードからシークレットを取得される可能性があります。
- アカウントの乗っ取り: 漏えいした値でアカウントにアクセスされるおそれがあります。
- APIの悪用: 漏えいしたAPIキーでサービスを悪用される可能性があります。
対処方法
- シークレットをコードに埋め込まず、環境変数で渡します。
- HashiCorp VaultやAWS Secrets Managerなどのシークレット管理サービスを使用します。
- コードレビューや監査で、シークレットの埋め込みを確認します。
漏えいしたシークレットは失効させ、新しい値に置き換えてください。環境変数もアクセスを制限し、値をログに出力しないよう管理します。
例
Django
変更前
python
# Djangoのシークレットのハードコード
SECRET_KEY = 'your-hardcoded-secret-key'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
}
}
変更後
python
# 環境変数で渡すDjangoのシークレット
import os
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.getenv('DB_NAME'),
'USER': os.getenv('DB_USER'),
'PASSWORD': os.getenv('DB_PASSWORD'),
'HOST': os.getenv('DB_HOST'),
'PORT': os.getenv('DB_PORT'),
}
}
解説:
- 変更前:
SECRET_KEYとデータベースのパスワードがソースに埋め込まれています。 - 変更後: シークレットを環境変数から取得し、ソースには保存しません。
Flask
変更前
python
# Flaskのシークレットのハードコード
class Config:
SECRET_KEY = 'your-hardcoded-secret-key'
SQLALCHEMY_DATABASE_URI = 'postgresql://myuser:mypassword@localhost/mydatabase'
変更後
python
# 環境変数で渡すFlaskのシークレット
import os
class Config:
SECRET_KEY = os.getenv('FLASK_SECRET_KEY')
SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL')
解説:
- 変更前:
SECRET_KEYとデータベースURI内の認証情報がソースに埋め込まれています。 - 変更後: シークレットを環境変数から取得し、ソースには保存しません。
FastAPI
変更前
python
# FastAPIのセッション用シークレットのハードコード
from fastapi import FastAPI
from starlette.middleware.sessions import SessionMiddleware
app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key='your-hardcoded-secret-key', https_only=True)
変更後
python
# 環境変数で渡すFastAPIのセッション用シークレット
from fastapi import FastAPI
from starlette.middleware.sessions import SessionMiddleware
import os
app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key=os.environ['FASTAPI_SECRET_KEY'], https_only=True)
解説:
- 変更前: セッションミドルウェアの
secret_keyがソースに埋め込まれています。 - 変更後: セッション用のシークレットを環境変数から取得します。
参考資料
- OWASP: 機密データの漏えい
- CWE: CWE-798: 認証情報のハードコード