ハードコードされた認証情報

ソースコードに埋め込まれた認証情報

説明

ユーザー名、パスワード、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)

解説:

  • 変更前: 接続文字列にデータベースの認証情報が埋め込まれています。
  • 変更後: 完全な接続文字列を環境変数から取得します。

参考資料