説明
ユーザー名、パスワード、APIキーなどの認証情報をソースコードに直接埋め込むと、コードの流出時に認証情報も漏えいするおそれがあります。
想定される影響
- 認証情報の漏えい: 漏えいした認証情報で不正にアクセスされる可能性があります。
- 権限の悪用: 認証情報に管理者権限がある場合、システムを変更されるおそれがあります。
- データの漏えい: 機密情報が漏えいする可能性があります。
対処方法
- 認証情報をコードに埋め込まず、環境変数で渡します。
- 保護されたシークレットストアで認証情報を管理します。
- 必要に応じて認証情報を更新し、不要なものは失効させます。
漏えいした認証情報は失効させ、新しい値に置き換えてください。以下の DATABASE_URL には、デプロイ環境で管理する完全な接続文字列を設定します。
例
Django
変更前
python
# Djangoのハードコードされた認証情報
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
}
}
変更後
python
# 環境変数から取得するDjangoの認証情報
import os
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'),
}
}
解説:
- 変更前: データベースの認証情報がソースに含まれ、コードとともに漏えいするおそれがあります。
- 変更後: 認証情報をソースに含めず、環境変数で渡します。
Flask
変更前
python
# Flaskのハードコードされた認証情報
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://myuser:mypassword@localhost/mydatabase'
変更後
python
# 環境変数から取得するFlaskの認証情報
import os
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URL']
解説:
- 変更前: 接続文字列にデータベースの認証情報が埋め込まれています。
- 変更後: 完全な接続文字列を環境変数から取得します。
FastAPI
変更前
python
# FastAPIのハードコードされた認証情報
DATABASE_URL = "postgresql://myuser:mypassword@localhost/mydatabase"
@app.on_event("startup")
async def startup():
app.state.pool = await asyncpg.create_pool(DATABASE_URL)
変更後
python
# 環境変数から取得するFastAPIの認証情報
import os
DATABASE_URL = os.environ['DATABASE_URL']
@app.on_event("startup")
async def startup():
app.state.pool = await asyncpg.create_pool(DATABASE_URL)
解説:
- 変更前: 接続文字列にデータベースの認証情報が埋め込まれています。
- 変更後: 完全な接続文字列を環境変数から取得します。
参考資料
- OWASP: ハードコードされた認証情報
- CWE: CWE-798: ハードコードされた認証情報