ハードコードされたシークレット

アプリケーションコードに埋め込まれたシークレット

説明

パスワード、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 がソースに埋め込まれています。
  • 変更後: セッション用のシークレットを環境変数から取得します。

参考資料