バイナンス API キーの漏洩は、アカウントハック被害の主な原因トップ3に入ります。コードの GitHub への誤プッシュ、スクリーンショットのSNS投稿、プレーンテキストでの JSON 保存、退職した従業員による持ち出しなどがその典型です。セキュリティの核心は、「コード内にキーを記述しない」、「静的ストレージでは暗号化する」、「プロセス起動時にのみ復号してロードする」、「定期的にローテーションする」 の4点にあります。本記事では、6つの主流な保存方法と完全なコードサンプルを解説します。設定前に、バイナンス公式サイトの API 管理で適切な権限を持つキーを作成してください。スマホからは バイナンス公式アプリ をダウンロードすることで、作成済みのキー一覧をいつでも確認できます。本記事では、漏洩の根本原因、環境変数、キー管理ツール、クラウド Secrets、ローテーション戦略、IP ホワイトリスト連携、監査ログ、緊急対応の8つのステップで進めます。
1. なぜプレーンテキスト保存=資産ゼロになるのか
よくある漏洩経路の統計(コミュニティ調査)
| 経路 | 割合 | 典型的な事例 |
|---|---|---|
| コードを GitHub/GitLab にプッシュ | 35% | .env を gitignore に含め忘れ、AWS/Binance 両方のキーを紛失 |
| チャットツール(Slack等)でのスクリーンショット | 20% | デバッグ時にキーが表示された画面を共有 |
| クラウドストレージ上的プレーンテキスト | 15% | iCloud/Google Drive がリスト型攻撃に遭う |
| 退職者の持ち出し | 12% | 企業内にキーローテーションのフローが存在しない |
| 公共 WiFi での中間者攻撃 | 8% | HTTP リクエストが傍受される(バイナンスは HTTPS なので通常は影響なし) |
| Docker イメージからの漏洩 | 5% | Dockerfile 内に ENV BINANCE_SECRET=... と記述し Hub にプッシュ |
| その他 | 5% | — |
GitHub 上では、ボット(trufflehog や gitleaks など)が 24時間 365日、バイナンス API キーの正規表現をスキャンしています。漏洩から出金されるまで、通常わずか 5〜15 分 です。
バイナンス API キーの特徴
API Key 形式:64文字の16進数
例: X1uKq3... (64 chars)
Secret 形式:64文字の16進数
正規表現:[A-Za-z0-9]{64}
キーとシークレットが漏洩すると、攻撃者は直接 /sapi/v1/capital/withdraw/apply を呼び出して出金できます(出金権限が有効な場合)。たとえ出金権限が無効でも、マイナーな通貨ペアの価格を吊り上げて自分の注文とぶつけることで、資産を洗浄(ロンダリング)されるリスクがあります。
2. 方案A:環境変数(最も基本的)
設定方法
# ~/.zshrc または ~/.bashrc
export BINANCE_API_KEY="X1uKq3...64文字"
export BINANCE_API_SECRET="abcDef...64文字"
# 反映
source ~/.zshrc
# 確認
echo $BINANCE_API_KEY | head -c 8
Python でのロード
import os
import sys
API_KEY = os.getenv('BINANCE_API_KEY')
API_SECRET = os.getenv('BINANCE_API_SECRET')
if not API_KEY or not API_SECRET:
print('ERROR: Missing BINANCE_API_KEY / BINANCE_API_SECRET')
sys.exit(1)
# 使用例
from binance.client import Client
client = Client(API_KEY, API_SECRET)
Node.js でのロード
const API_KEY = process.env.BINANCE_API_KEY;
const API_SECRET = process.env.BINANCE_API_SECRET;
if (!API_KEY || !API_SECRET) {
console.error('Missing Binance credentials');
process.exit(1);
}
const Binance = require('node-binance-api');
const client = new Binance().options({
APIKEY: API_KEY,
APISECRET: API_SECRET,
});
メリットとリスク
メリット:依存関係がなく、すぐに使える。
リスク:env コマンドですべての変数が表示される。コンテナログに env が含まれる可能性がある。子プロセスに環境が引き継がれる。ローカルでの開発には適していますが、本番環境では推奨されません。
3. 方案B:dotenv + gitignore
ディレクトリ構造
/project
.env <- 実際のキー、絶対にコミットしない
.env.example <- テンプレート、プレースホルダー
.gitignore
requirements.txt
strategy.py
.env の内容
BINANCE_API_KEY=X1uKq3...64文字
BINANCE_API_SECRET=abcDef...64文字
BINANCE_SUB_ALPHA_KEY=yyy...
BINANCE_SUB_ALPHA_SECRET=zzz...
.gitignore に含めるべきもの
.env
.env.*
!.env.example
*.pem
*.key
secrets/
credentials.json
node_modules/
__pycache__/
Python dotenv の使用
from dotenv import load_dotenv
load_dotenv()
import os
API_KEY = os.getenv('BINANCE_API_KEY')
GitHub にプッシュする前に、git status を実行して .env が "untracked files" にあり、staged に入っていないことを確認してください。
pre-commit フックによる漏洩防止
pre-commit フレームワークと gitleaks を導入します:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks:
- id: gitleaks
pre-commit install を実行すると、毎回の git commit 時に diff 内に API キー形式がないかスキャンされ、ヒットした場合はコミットがブロックされます。
4. 方案C:オペレーティングシステムのキーチェーン
macOS Keychain
# 保存
security add-generic-password \
-a binance \
-s binance-api-key \
-w "X1uKq3..."
# 読み取り
security find-generic-password \
-a binance \
-s binance-api-key \
-w
Python での読み取り:
import subprocess
def get_secret(name):
result = subprocess.run(
['security', 'find-generic-password', '-a', 'binance', '-s', name, '-w'],
capture_output=True, text=True
)
return result.stdout.strip()
API_KEY = get_secret('binance-api-key')
API_SECRET = get_secret('binance-api-secret')
Windows Credential Manager
# 保存
cmdkey /generic:BinanceAPIKey /user:binance /pass:X1uKq3...
# PowerShell SecretManagement モジュールを使うとより便利
Install-Module Microsoft.PowerShell.SecretManagement
Register-SecretVault -Name BinanceVault -ModuleName Microsoft.PowerShell.SecretStore
Set-Secret -Name BinanceApiKey -Secret "X1uKq3..."
Linux libsecret / keyring
pip install keyring
import keyring
keyring.set_password('binance', 'api-key', 'X1uKq3...')
API_KEY = keyring.get_password('binance', 'api-key')
システムキーチェーンの利点は、OS のログイン状態によって保護され、スクリーンロック後は再認証が必要になる点です。
5. 方案D:クラウドSecrets Manager(本番環境推奨)
AWS Secrets Manager
- コンソールで Secret を作成:Name =
prod/binance/main - Value = JSON:
{
"api_key": "X1uKq3...",
"api_secret": "abcDef...",
"created": "2026-04-14",
"rotation_days": 90
}
- IAM Role のバインド:
ec2-binance-botインスタンスロールのみがsecretsmanager:GetSecretValueを実行可能にします。
Python での読み取り:
import boto3
import json
sm = boto3.client('secretsmanager', region_name='ap-northeast-1')
resp = sm.get_secret_value(SecretId='prod/binance/main')
secrets = json.loads(resp['SecretString'])
API_KEY = secrets['api_key']
API_SECRET = secrets['api_secret']
コスト:$0.40/Secret/月 + $0.05/1万リクエスト。
HashiCorp Vault
# 書き込み
vault kv put secret/binance/main \
api_key="X1uKq3..." \
api_secret="abcDef..."
# 読み取り
vault kv get -format=json secret/binance/main
Python での読み取り:
import hvac
client = hvac.Client(url='https://vault.company.com:8200', token=os.getenv('VAULT_TOKEN'))
resp = client.secrets.kv.v2.read_secret_version(path='binance/main')
API_KEY = resp['data']['data']['api_key']
API_SECRET = resp['data']['data']['api_secret']
GCP Secret Manager / Azure Key Vault
コンセプトは同じです:作成 → IAM 権限付与 → SDK で読み取り。利用しているクラウドベンダーのものを選んでください。
6. キーローテーション戦略
ローテーションの頻度
| シナリオ | 頻度 |
|---|---|
| 本番環境のクオンツ戦略 | 90日ごと |
| テストネット / デモトレード | 180日ごと |
| サードパーティツール(TradingView等) | 60日ごと |
| 漏洩の疑いがある場合 | 即時(数時間以内) |
| 従業員の退職 | 24時間以内 |
ダウンタイムなしのローテーションフロー
Day 0 T+0h APIキー #2(新)を作成
Day 0 T+1h #2 を Secrets Manager に書き込む
Day 0 T+2h サービスのローリングアップデートを実行、#2 に切り替え
Day 0 T+3h 新しいキーの正常動作を確認
Day 0 T+24h バイナンス側で旧キー #1 を削除
新旧 2つのキーを 24時間併用することで、切り替え時の未完了注文などへの影響を防ぎ、スムーズな移行が可能です。
7. IP ホワイトリストとの連携
API キーを適切に保存するだけでは不十分です。必ず IP ホワイトリストを紐付けてください。
設定ステップ
- API管理 → 該当キーの編集 → 制限を編集 (Edit Restrictions)
- 信頼できるIPのみにアクセスを制限 (Restrict access to trusted IPs only) を選択
- サーバーのパブリック IPv4/IPv6 を入力(最大30個)
- 保存 → 2FA 認証
一般的な IP リスト例
# EC2 東京インスタンス
54.248.xxx.xxx
54.248.xxx.yyy
# Google Cloud 台湾
35.194.xxx.xxx
# 自宅/オフィス(開発時のみ)
公共の動的IP(非推奨、VPNの固定IPの方が安定)
# IPv6
2406:da18:xxxx::1
ホワイトリスト未設定のリスク
IP ホワイトリストを紐付けない場合、バイナンスはすべての IP からの呼び出しを許可してしまいます。キーが漏洩すれば、世界中どこからでもアクセス可能です。IP ホワイトリストを設定することで、影響範囲を「全世界」から「特定の IP 段」にまで縮小できます。たとえキーが GitHub に公開されても、攻撃者のネットワークからはアクセスできません。
8. 監査ログと緊急対応
定期的な監査
バイナンスの API 管理ページでは、キーごとに以下が表示されます:
- Last used: 最後に使用された時間
- Last IP: 最後に呼び出した IP
- Total calls (24h): 24時間の呼び出し回数
Last IP が自分のサーバーのものでない場合や、呼び出し回数が突然 10倍に跳ね上がっている場合は、異常が疑われます。
緊急対応チェックリスト
0-5 min: API管理 → 漏洩の疑いがあるすべてのキーを削除
5-15 min: Secrets Manager/Vault 内で新しいキーに差し替え
15-30 min: すべての実行中サービスが正常か確認
30-60 min: 最近 24時間の取引履歴 / 出金履歴を確認
60-120 min: 異常な操作があれば、カスタマーサポートに連絡しアカウントを凍結
よくある質問 FAQ
Q1: API キーを CI/CD の環境変数に入れてもいいですか?
A: 可能ですが、GitHub Actions Secrets や GitLab CI Variables にプレーンテキストで保存することは推奨されません。CI が OIDC や IAM Role を通じて動的に Secrets Manager から取得する方法がより安全です。
Q2: Docker コンテナに安全に API キーを注入するには?
A: 3つの方法があります:① Docker secret(Swarm/K8s secret)を使う、② 起動時に docker run -e でホストの環境変数から注入する(ホスト自体は Secrets Manager で復号)、③ Sidecar パターンで別のコンテナが Vault agent を実行し一時トークンを生成する。Dockerfile に ENV を直接書くのは避けてください。
Q3: クライアントソフト(デスクトップ版クオンツツール)でキーを安全に保存するには?
A: OS ネイティブのキーチェーン(Keychain/Credential Manager/libsecret)を使用し、ソフト起動時にシステムログインを要求してください。独自に AES 暗号化したファイルを作成すると、バグによる脆弱性が生じやすくなります。
Q4: GitHub にプッシュしたキーを、コミット履歴から削除すれば安全ですか?
A: 安全ではありません。GitHub のコミット履歴は reflog などで復元可能です。ボットは漏洩から 5分以内にキーをキャプチャします。直ちに:① バイナンスで漏洩したキーを削除、② 资产状況を確認、③ git filter-repo や bfg-repo-cleaner で履歴を完全に消去、④ 他の関連資格情報もローテーションしてください。
Q5: キーが漏洩したか判断するには?
A: 3つのサインがあります:① バイナンスの Last IP が自分のものではない、② 取引履歴に身に覚えのない注文がある、③ 登録メールアドレスに「APIキーの頻繁な呼び出し」というリスク通知が届く。いずれかを発見したら直ちにキーを削除してください。
引き続き閲覧:カテゴリナビ に戻り、「API連携」カテゴリで署名やレート制限などのチュートリアルをご覧ください。