account-security について
ホスト型およびカスタム型の EC プラットフォームで、顧客アカウントを構築・監査するチーム向けのセキュリティスキルです。ログイン攻撃対策、MFA、ソーシャルログイン、アカウント乗っ取りリスクへの対応をプラットフォーム別に説明します。
主な機能
- 01プラットフォーム別のセキュリティガイド
- 02ブルートフォース対策とレート制限
- 03MFA の設定と実装
- 04ソーシャルログインの選択肢
- 05パスワードとセッションの保護
- 06アカウント乗っ取り通知の実践
活用シーン
- 01ストアのアカウント保護を監査
- 02WooCommerce にログイン攻撃対策を追加
- 03管理者や高価値顧客向け MFA の計画
- 04カスタムストアのセキュリティ制御の構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill account-securityインストール後、Claude Code で/account-securityを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/login-rate-limiting-and-brute-force-prot/criteria.jsontask.mdevals/password-hashing-breach-detection-and-mf/criteria.jsontask.mdevals/session-management-and-refresh-token-rot/criteria.jsontask.md詳細
アカウントセキュリティ
概要
顧客アカウントには、保存済みの支払い方法、ロイヤルティポイント、購入履歴、配送先住所が含まれているため、クレデンシャルスタッフィング攻撃やアカウント乗っ取りの格好の標的になります。効果的なアカウントセキュリティでは、ログインページでのブルートフォース攻撃対策、漏えいしたパスワードの検出、任意の多要素認証(MFA)、アカウント乗っ取りのパターンを検知する異常検知を組み合わせます。適切な対策はプラットフォームに大きく左右されます。Shopify ではほとんどのセキュリティ制御がプラットフォームレベルで管理されますが、WooCommerce では追加のプラグインが必要です。
このスキルを使用する場合
- 顧客アカウントシステムを一から構築するとき
- 既存のアカウントシステムにセキュリティ上の弱点がないか監査するとき
- クレデンシャルスタッフィング攻撃(分散した IP からの高いログイン失敗率)を確認したとき
- 高価値顧客向けに、任意または必須の追加レイヤーとして MFA を導入するとき
- パスワードより安全な代替手段として「Google/Apple でサインイン」を実装するとき
基本手順
ステップ 1:プラットフォームのセキュリティモデルを理解する
| プラットフォーム | プラットフォームが対応する内容 | 設定が必要な内容 |
|---|---|---|
| Shopify | SSL/TLS、ログイン時のブルートフォース攻撃対策、PCI 準拠、サーバー側のセキュリティ | 顧客アカウントの設定、電話番号認証を必須にするかどうか、Google/Apple サインイン用のソーシャルログインアプリ |
| WooCommerce | 基本的なログインフォームのみ | ブルートフォース攻撃対策、ログイン試行回数の制限、2FA、ログインセキュリティの監視に Wordfence(無料)をインストールする |
| BigCommerce | SSL/TLS、プラットフォームが管理するアカウントセキュリティ、基本的なブルートフォース攻撃対策 | 管理者ユーザー向けの二要素認証。顧客向けの 2FA にはアプリが必要 |
| カスタム/ヘッドレス | なし — すべてのセキュリティ制御を自分で構築します | レート制限、パスワードのハッシュ化、MFA、セッション管理、ATO 検知 |
ステップ 2:プラットフォーム別のアカウントセキュリティ設定
Shopify
Shopify では、顧客アカウントのセキュリティの大部分がプラットフォームレベルで管理されます。SSL、ブルートフォース攻撃の検知、パスワードのハッシュ化を自分で管理する必要はありません。
新しい顧客アカウントを有効にする(パスワードレスログイン): Shopify では、2 種類のアカウント方式を利用できます。
- 設定 → 顧客アカウントに移動します
- 新しい顧客アカウント(推奨):顧客はメールアドレスまたは電話番号に送信される 6 桁のワンタイムコードでログインします。盗難やブルートフォース攻撃の対象になるパスワードはありません
- 従来の顧客アカウント:従来型のメールアドレスとパスワードによるアカウントです
新しい顧客アカウント(パスワードレス)に切り替えることで、最も一般的な攻撃ベクトルであるクレデンシャルスタッフィングとブルートフォース攻撃を排除できます。
管理者アカウントの二段階認証:
- 設定 → ユーザーと権限に移動します
- ユーザーをクリックし、二段階認証を必須にするを有効にします
- Shopify では、管理者向けの 2FA に認証アプリ(TOTP)と SMS を利用できます
ソーシャルログイン(Google/Facebook/Apple): Shopify App Store からソーシャルログインアプリをインストールします。
- Oxi Social Login — Google、Facebook、Apple、LinkedIn に対応しています
- NDNAPPS Social Login — Google、Facebook、Apple に対応しています これらのアプリは、アカウント作成ページとログインページにソーシャルログインボタンを追加します。
不審な顧客アクティビティの検知: Shopify では、プログラムによる監視向けに顧客のログインイベントを公開していません。高度な監視には、注文に関する Shopify の不正行為分析を使用し、不正な購入と組み合わせてアカウント乗っ取りを検知します。
WooCommerce
WooCommerce に組み込まれているログインフォームには、レート制限、MFA、高度なセキュリティ機能がありません。これらはプラグインで追加する必要があります。
Wordfence Security をインストールする(無料、推奨):
- WordPress プラグインディレクトリから Wordfence Security をインストールして有効化します
- Wordfence → Login Security に移動します
- Brute Force Protection を有効にします:
- ログイン失敗が X 回に達したらロックアウトします(デフォルト:20 回)
- ロックアウト期間を設定します(デフォルト:4 時間)
- X 分間の失敗回数を集計します(デフォルト:5 分)
- 管理者ユーザーに対して Two-Factor Authentication を有効にします(Wordfence は認証アプリの TOTP に対応しています)
Limit Login Attempts Reloaded(レート制限のみを行う無料の代替手段):
- Limit Login Attempts Reloaded をインストールします
- 設定を行います:ログイン失敗 4 回でロックアウトし、20 分間ロックし、ロックアウトが 4 回発生したらメールで通知します
顧客向けの 2FA:
- miniOrange 2 Factor Authentication または WP 2FA プラグインをインストールします
- 顧客の 2FA を許可(または必須に)するよう設定します
- WP 2FA は TOTP(Google Authenticator、Authy)、メールコード、バックアップコードに対応しています
WooCommerce のソーシャルログイン: Nextend Social Login(無料/プレミアム)をインストールします。WooCommerce のログインページと登録ページで、Google、Facebook、Apple、Twitter/X によるサインインに対応しています。
漏えいしたパスワードの検出: WPassword をインストールするか、登録時やパスワード変更時に HaveIBeenPwned API を照合するカスタムチェックを実装します。
BigCommerce
管理者の二要素認証:
- Settings → Account Settings → Security に移動します
- Two-Step Verification を有効にします。BigCommerce は認証アプリと SMS に対応しています
顧客アカウントのセキュリティ: BigCommerce は顧客向けの 2FA を標準では提供していません。次の方法があります:
- Stencil(BigCommerce のストアフロントフレームワーク)を使用して、顧客ログインページにカスタムの認証ステップを追加します
- 顧客認証に ID プロバイダー(Auth0、Okta)を使用します。これにより、完全な MFA サポートと認証情報の監視が可能になります
BigCommerce の Google/ソーシャルサインイン: ソーシャル ID プロバイダーと BigCommerce の顧客ログイン API を連携します。Auth0 は BigCommerce との連携機能を備えた、すぐに利用できるソリューションを提供しています。
カスタム/ヘッドレス
カスタムストアフロントでは、各レイヤーにセキュリティ対策を実装してください。
ログインエンドポイントのレート制限:
import { Ratelimit } from '@upstash/ratelimit';
import { Redis } from '@upstash/redis';
const redis = Redis.fromEnv();
const ipLimiter = new Ratelimit({ redis, limiter: Ratelimit.slidingWindow(20, '15 m'), prefix: 'rl_login_ip' });
const accountLimiter = new Ratelimit({ redis, limiter: Ratelimit.slidingWindow(5, '15 m'), prefix: 'rl_login_email' });
export async function checkLoginRateLimit(ip: string, email: string) {
const [ipResult, accountResult] = await Promise.all([
ipLimiter.limit(ip),
accountLimiter.limit(email.toLowerCase()),
]);
if (!ipResult.success) throw new Error('TOO_MANY_REQUESTS_IP');
if (!accountResult.success) throw new Error('ACCOUNT_TEMPORARILY_LOCKED');
}
安全なパスワードハッシュ化(Argon2id):
import { hash, verify } from 'argon2';
export const hashPassword = (password: string) =>
hash(password, { type: 2 /* argon2id */, memoryCost: 65536, timeCost: 3, parallelism: 4 });
export const verifyPassword = (storedHash: string, password: string) =>
verify(storedHash, password);
TOTP ベースの MFA:
import { authenticator } from 'otplib';
export function generateMFASecret(): string {
return authenticator.generateSecret(32);
}
export function verifyTOTP(secret: string, token: string): boolean {
authenticator.options = { window: 1 }; // Allow ±30-second drift only
return authenticator.verify({ token, secret });
}
安全なセッション Cookie:
// Set session cookies with httpOnly, Secure, SameSite=Strict
response.cookies.set('session_token', token, {
httpOnly: true, // Not accessible to JavaScript — prevents XSS theft
secure: true, // HTTPS only
sameSite: 'strict', // CSRF protection
maxAge: 30 * 24 * 60 * 60,
path: '/',
});
アカウントに関する重要な変更をセキュリティアラートメールで通知する: 次の場合は、必ずメールで顧客に通知してください:
- パスワードが変更された場合
- メールアドレスが変更された場合
- 新しいデバイスまたは場所からログインした場合
- MFA が無効化された場合
ベストプラクティス
- 可能であればパスワードレスログインを使用します — Shopify の新しい顧客アカウントではワンタイムコードを使用するため、クレデンシャルスタッフィング攻撃の対象領域を完全になくせます
- 「ユーザーが見つかりません」と「パスワードが違います」には同じエラーを返します — どちらが誤っていたかを決して明かさないでください。これにより、ユーザー列挙を防止できます
- MFA を提供しますが、必須にするのは管理者と価値の高いアカウントのみにします — すべての顧客に MFA を必須にすると、利用を途中でやめる顧客が増えます。B2B、管理者、保存済みの支払い方法がある顧客に使用してください
- 機密性の高い変更があるたびに、セキュリティアラートメールを送信します — パスワード変更、メールアドレス変更、新しいデバイスからのログイン、MFA の変更があった場合は、確認済みの顧客メールアドレスにすぐ通知する必要があります
- 管理者の認証情報を四半期ごとに確認し、ローテーションします — 管理者アカウントが侵害されると、すべての顧客データが漏えいするおそれがあります
- より安全な代替手段としてソーシャルログイン(Google/Apple)を使用します — これらのプロバイダーがパスワードのセキュリティを管理し、独自の MFA を求める場合もあります
よくある落とし穴
| 問題 | 解決策 |
|---|---|
| WooCommerce のログインにレート制限がない | 稼働中の WooCommerce サイトには、直ちに Wordfence または Limit Login Attempts Reloaded をインストールします |
| クレデンシャルスタッフィングによる管理者アカウントの侵害 | すべての管理者ユーザーに 2FA を有効にし、各管理者に強力で一意のパスワードを使用します。サービス間で管理者の認証情報を使い回してはいけません |
| TOTP コードが無期限に有効になる(カスタムビルド) | otplib で window: 1 を使用して、±30 秒のずれのみを許容します。90 秒より古いコードは決して受け入れないでください |
| リフレッシュトークンが localStorage に保存されている | リフレッシュトークンは httpOnly Cookie のみに保存します。localStorage は JavaScript からアクセスでき、XSS に対して脆弱です |
| メールアドレスのバリエーションを変えてレート制限を回避 | アカウントごとのレート制限を適用する前に、メールアドレスを正規化します(小文字に変換し、@ より前の + エイリアスを削除します) |
関連スキル
- @secure-checkout
- @fraud-detection
- @gdpr-ecommerce
- @bot-protection