
シークレットを誤って使用する例を示す脆弱なアプリ
OWASP WrongSecretsゲームへようこそ!このゲームには、ソフトウェアにシークレットを保存する際の誤った方法の実例が満載されています。各例はチャレンジとしてまとめられており、さまざまなツールやテクニックを使って解決する必要があります。これらのチャレンジを解くことで、よくあるミスを認識し、自身のシークレット管理戦略を見直す助けとなるでしょう。
67個すべてのチャレンジを解くことはできますか?
Herokuデモ環境でいくつか試してみましょう。
他のチャレンジをプレイしたいですか?以下の設定方法を読んでください。
WrongSecretsを初めて使う方はこちらから:
次に http://localhost:8080 を開いてください 3. 先を見たいですか? 最新機能を搭載した最先端のマスターコンテナをお試しください: ```bash docker run -p 8080:8080 -p 8090:8090 ghcr.io/owasp/wrongsecrets/wrongsecrets-master:latest-master
⚠️ *注記:これは開発バージョンであり、不安定な可能性があります*
4. **上級セットアップ**: クラウドチャレンジとKubernetes演習については、以下の詳細な手順を参照してください
**学習内容:**
- 一般的なシークレット管理のミス
- 露出した認証情報の特定方法
- シークレットを安全に保護するためのベストプラクティス
- シークレット検出のためのツールとテクニック
**動作の仕組み:**
このリポジトリには、コードベース全体に実際のシークレットと偽のシークレットが隠された**意図的に脆弱なコードと設定ファイル**が含まれています。ソースコード、設定ファイル、Dockerコンテナ、クラウドデプロイメントを調査して、これらのシークレットを発見します。各チャレンジでは、実際のアプリケーションでシークレットが誤って公開されるさまざまな方法を学びます。

## 📋 前提条件
**基本的な使用方法:**
- Webブラウザ
- Docker(ローカルセットアップ用)- [こちらからインストール](https://docs.docker.com/get-docker/)
**上級セットアップ用:**
- Kubernetes/Minikube - [こちらからインストール](https://minikube.sigs.k8s.io/docs/start/)
- クラウドアカウント(AWS/GCP/Azure) - クラウドチャレンジ用
- コマンドラインの使用経験
<a href="https://github.com/vshymanskyy/StandWithUkraine/blob/main/README.md"><img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-no-action.svg" /></a>
## 目次
### 🎯 はじめに
- [クイックスタート](#-quick-start)
- [前提条件](#-prerequisites)
- [サポート](#support)
### 🐳 デプロイオプション
- [基本的なDocker演習](#basic-docker-exercises)
- [Herokuでの実行](#running-these-on-heroku)
- [Render.ioでの実行](#running-these-on-renderio)
- [Railwayでの実行](#running-these-on-railway)
- [基本的なK8s演習](#basic-k8s-exercise)
- [Minikubeベース](#minikube-based)
- [k8sベース](#k8s-based)
- [Minikubeを使ったVault演習](#vault-exercises-with-minikube)
### ☁️ クラウドチャレンジ
- [クラウドチャレンジ](#cloud-challenges)
- [AWSでWrongSecretsを実行する](#running-wrongsecrets-in-aws)
- [GCPでWrongSecretsを実行する](#running-wrongsecrets-in-gcp)
- [AzureでWrongSecretsを実行する](#running-wrongsecrets-in-azure)
- [自分のクラウドのみでChallenge15を実行する](#running-challenge15-in-your-own-cloud-only)
### 🎮 上級使用方法
- [ガイダンスなしでプレイしたいですか?](#do-you-want-to-play-without-guidance-or-spoils)
- [CTF](#ctf)
- [CTFDサポート](#ctfd-support)
- [FBCTFサポート](#fbctf-support-experimental)
- [OWASP WrongSecretsをシークレット検出ベンチマークとして使用する](#use-owasp-wrongsecrets-as-a-secret-detection-benchmark)
### 👨💻 開発と貢献
- [開発に関する注意事項](#notes-on-development)
- [Spring Boot 4 採用チェックリスト](https://github.com/owasp/wrongsecrets/blob/HEAD/docs/SPRING_BOOT_4_ADOPTION_CHECKLIST.md)
- [依存関係管理](#dependency-management)
- [IntelliJ IDEAでプロジェクトを始める](#get-the-project-started-in-intellij-idea)
- [開発中の自動リロード](#automatic-reload-during-development)
- [チャレンジの追加方法](#how-to-add-a-challenge)
- [ローカルテスト](#local-testing)
- [ローカル自動テスト](#Local-automated-testing)
- [独自のリリースでチャレンジを無効にしたいですか?](#want-to-disable-challenges-in-your-own-release)
### 📚 リソースとコミュニティ
- [謝辞とコントリビューター](#special-thanks--contributors)
- [スポンサーシップ](#sponsorships)
- [ヘルプ募集中](#help-wanted)
- [シークレット管理に関する参考文献](#further-reading-on-secrets-management)
## サポート
サポートが必要な場合は、[こちら](https://owasp.org/slack/invite)で登録できる
[OWASP Slack](https://owasp.slack.com/archives/C02KQ7D9XHR) を通じて連絡するか、
[PR](https://github.com/OWASP/wrongsecrets/pulls) を提出するか、
[イシュー](https://github.com/OWASP/wrongsecrets/issues) を報告するか、
[ディスカッション](https://github.com/OWASP/wrongsecrets/discussions) をご利用ください。
これはOWASPボランティアベースのプロジェクトであるため、返信までに少々時間がかかる場合がありますのでご了承ください。
Copyright (c) 2020-2025 Jeroen Willemsen and WrongSecrets contributors.
## 🛤️ あなたの道を選んでください
どのセットアップが自分に適しているかわかりませんか? 以下が簡単なガイドです:
| **目的** | **推奨セットアップ** | **利用可能なチャレンジ** |
|------------------|----------------------|--------------------------|
| すぐにオンラインで試したい | [Herokuで実行中のコンテナ](https://www.wrongsecrets.com/) | 基本チャレンジ(0-4, 8, 12-32, 34-43, 49-52, 54-66) |
| Dockerを使ってローカルで実行したい | [基本的なDocker](#basic-docker-exercises) | 上記と同じ(自分のマシン上) |
| Kubernetesのシークレットを学びたい | [K8s/Minikubeセットアップ](#basic-k8s-exercise) | Kubernetesチャレンジ(0-6, 8, 12-43, 48-66) |
| クラウドシークレットで練習したい | [クラウドチャレンジ](#cloud-challenges) | 全チャレンジ(0-66) |
| ワークショップ/CTFを開催したい | [CTFセットアップ](#ctf) | カスタマイズ可能なチャレンジセット |
| プロジェクトに貢献したい | [開発セットアップ](#notes-on-development) | 全チャレンジ + 開発ツール |
## 基本的なDocker演習
_チャレンジ0-4, 8, 12-32, 34-43, 49-52, 54-66に使用可能_
基本的なDocker演習には現在以下が必要です:
- Docker [こちらからインストール](https://docs.docker.com/get-docker/)
- HTMLをレンダリングできるブラウザ
以下の手順でインストールできます:```bash
docker run -p 8080:8080 -p 8090:8090 jeroenwillemsen/wrongsecrets:latest-no-vault
🚀 最先端バージョンを試してみませんか?
次のリリースで何が来るかを確認したい場合は、自動ビルドされたマスターコンテナを使用できます:```bash docker run -p 8080:8080 -p 8090:8090 ghcr.io/owasp/wrongsecrets/wrongsecrets-master:latest-master
⚠️ **警告**: これは最新の master ブランチからビルドされた開発版であり、実験的な機能や不安定さを含む可能性があります。
**📝 ポートに関する注意:**
- ポート **8080**: メインアプリケーション (チャレンジ0-66)
- ポート **8090**: MCP サーバー (チャレンジ60で必要)
**📝 チャレンジ62 (Google Drive MCP) に関する注意:**
チャレンジ62は完全な機能のために Google Service Account の設定が必要です。セットアップ手順については [docs/CHALLENGE62_GOOGLE_DRIVE_SETUP.md](https://github.com/owasp/wrongsecrets/blob/HEAD/docs/CHALLENGE62_GOOGLE_DRIVE_SETUP.md) を参照してください。設定がない場合、チャレンジはプレースホルダーメッセージを表示します。
以下のリンクで提供されているチャレンジを解くことで、シークレットを見つけることができます。
<details>
<summary>すべてのDockerチャレンジのリンク (三角形をクリックしてブロックを開く)
</summary>
- [localhost:8080/challenge/challenge-0](http://localhost:8080/challenge/challenge-0)
- [localhost:8080/challenge/challenge-1](http://localhost:8080/challenge/challenge-1)
- [localhost:8080/challenge/challenge-2](http://localhost:8080/challenge/challenge-2)
- [localhost:8080/challenge/challenge-3](http://localhost:8080/challenge/challenge-3)
- [localhost:8080/challenge/challenge-4](http://localhost:8080/challenge/challenge-4)
- [localhost:8080/challenge/challenge-8](http://localhost:8080/challenge/challenge-8)
- [localhost:8080/challenge/challenge-12](http://localhost:8080/challenge/challenge-12)
- [localhost:8080/challenge/challenge-13](http://localhost:8080/challenge/challenge-13)
- [localhost:8080/challenge/challenge-14](http://localhost:8080/challenge/challenge-14)
- [localhost:8080/challenge/challenge-15](http://localhost:8080/challenge/challenge-15)
- [localhost:8080/challenge/challenge-16](http://localhost:8080/challenge/challenge-16)
- [localhost:8080/challenge/challenge-17](http://localhost:8080/challenge/challenge-17)
- [localhost:8080/challenge/challenge-18](http://localhost:8080/challenge/challenge-18)
- [localhost:8080/challenge/challenge-19](http://localhost:8080/challenge/challenge-19)
- [localhost:8080/challenge/challenge-20](http://localhost:8080/challenge/challenge-20)
- [localhost:8080/challenge/challenge-21](http://localhost:8080/challenge/challenge-21)
- [localhost:8080/challenge/challenge-22](http://localhost:8080/challenge/challenge-22)
- [localhost:8080/challenge/challenge-23](http://localhost:8080/challenge/challenge-23)
- [localhost:8080/challenge/challenge-24](http://localhost:8080/challenge/challenge-24)
- [localhost:8080/challenge/challenge-25](http://localhost:8080/challenge/challenge-25)
- [localhost:8080/challenge/challenge-26](http://localhost:8080/challenge/challenge-26)
- [localhost:8080/challenge/challenge-27](http://localhost:8080/challenge/challenge-27)
- [localhost:8080/challenge/challenge-28](http://localhost:8080/challenge/challenge-28)
- [localhost:8080/challenge/challenge-29](http://localhost:8080/challenge/challenge-29)
- [localhost:8080/challenge/challenge-30](http://localhost:8080/challenge/challenge-30)
- [localhost:8080/challenge/challenge-31](http://localhost:8080/challenge/challenge-31)
- [localhost:8080/challenge/challenge-32](http://localhost:8080/challenge/challenge-32)
- [localhost:8080/challenge/challenge-34](http://localhost:8080/challenge/challenge-34)
- [localhost:8080/challenge/challenge-35](http://localhost:8080/challenge/challenge-35)
- [localhost:8080/challenge/challenge-36](http://localhost:8080/challenge/challenge-36)
- [localhost:8080/challenge/challenge-37](http://localhost:8080/challenge/challenge-37)
- [localhost:8080/challenge/challenge-38](http://localhost:8080/challenge/challenge-38)
- [localhost:8080/challenge/challenge-39](http://localhost:8080/challenge/challenge-39)
- [localhost:8080/challenge/challenge-40](http://localhost:8080/challenge/challenge-40)
- [localhost:8080/challenge/challenge-41](http://localhost:8080/challenge/challenge-41)
- [localhost:8080/challenge/challenge-42](http://localhost:8080/challenge/challenge-42)
- [localhost:8080/challenge/challenge-43](http://localhost:8080/challenge/challenge-43)
- [localhost:8080/challenge/challenge-49](http://localhost:8080/challenge/challenge-49)
- [localhost:8080/challenge/challenge-50](http://localhost:8080/challenge/challenge-50)
- [localhost:8080/challenge/challenge-51](http://localhost:8080/challenge/challenge-51)
- [localhost:8080/challenge/challenge-52](http://localhost:8080/challenge/challenge-52)
- [localhost:8080/challenge/challenge-54](http://localhost:8080/challenge/challenge-54)
- [localhost:8080/challenge/challenge-55](http://localhost:8080/challenge/challenge-55)
- [localhost:8080/challenge/challenge-56](http://localhost:8080/challenge/challenge-56)
- [localhost:8080/challenge/challenge-57](http://localhost:8080/challenge/challenge-57)
- [localhost:8080/challenge/challenge-58](http://localhost:8080/challenge/challenge-58)
- [localhost:8080/challenge/challenge-59](http://localhost:8080/challenge/challenge-59)
- [localhost:8080/challenge/challenge-60](http://localhost:8080/challenge/challenge-60)
- [localhost:8080/challenge/challenge-61](http://localhost:8080/challenge/challenge-61)
- [localhost:8080/challenge/challenge-62](http://localhost:8080/challenge/challenge-62)
- [localhost:8080/challenge/challenge-63](http://localhost:8080/challenge/challenge-63)
- [localhost:8080/challenge/challenge-64](http://localhost:8080/challenge/challenge-64)
- [localhost:8080/challenge/challenge-65](http://localhost:8080/challenge/challenge-65)
- [localhost:8080/challenge/challenge-66](http://localhost:8080/challenge/challenge-66)
</details>
これらのチャレンジはまだ非常に基本的なものであり、その説明も同様です。見栄えを良くするために PR を送ってください ;-)。
### Heroku での実行
また、[https://wrongsecrets.herokuapp.com/](https://wrongsecrets.herokuapp.com/) でテストすることもできます!Heroku の皆様は素晴らしいオープンソースサポートパッケージを提供してくれたので、そこでアプリを無料で実行でき、ほぼ常に利用可能です。ただし、ファジングやダウンさせようとしないでください。他のユーザーのテスト体験を台無しにすることになります。ホスト版のアプリを使用するには [このリンク](https://wrongsecrets.herokuapp.com/) を使用してください。自分で Heroku にホストしたい場合(例:トレーニングの実行)、[このリンク](https://heroku.com/deploy?template=https://github.com/OWASP/wrongsecrets/tree/master) をクリックして行うことができます。この場合、費用が発生する可能性があり、本プロジェクトおよび/またはそのメンテナーはその責任を負いかねますのでご了承ください。
### Render.io での実行
*ステータス: 実験的*
[https://wrongsecrets.onrender.com/](https://wrongsecrets.onrender.com/) でテストできます。無料枠のインスタンスで動作しているため、保証はできませんのでご了承ください。ファジングやダウンさせようとしないでください。他のユーザーのテスト体験を台無しにすることになります。自分で Render にデプロイしたいですか?以下のボタンをクリックしてください:
[](https://render.com/deploy?repo=https://github.com/OWASP/wrongsecrets)
### Railway での実行
*ステータス: [alphasec.io](https://github.com/alphasecio) によってメンテナンスされています*
WrongSecrets を Railway でホストしたい場合は、[このワンクリックテンプレート](https://railway.com/deploy/McqJ_j?referralCode=I07F1) をデプロイして行えます。Railway はもはや常時無料プランを提供していませんが、無料トライアルでアップグレードを決定する前に十分テストできます。ステップバイステップのガイドが必要な場合は、[このブログ記事](https://alphasec.io/test-your-secret-management-skills-with-owasp-wrongsecrets/) を参照してください。
[](https://railway.com/deploy/McqJ_j?referralCode=I07F1j)
## 基本的なK8s演習
_チャレンジ 0-6, 8, 12-43, 48-66 に使用できます_
### Minikube ベース
以下がインストールされていることを確認してください:
- Docker [ここからインストール](https://docs.docker.com/get-docker/)
- Minikube [ここからインストール](https://minikube.sigs.k8s.io/docs/start/)
現在の K8S セットアップは、ローカルで楽しむために Minikube を使用することを前提としています。プロジェクトのルートから以下のコマンドを使用できます:```bash
minikube start
kubectl apply -f k8s/secrets-config.yml
kubectl apply -f k8s/secrets-secret.yml
kubectl apply -f k8s/challenge33.yml
kubectl apply -f k8s/challenge53/secret-challenge53.yml
echo "Setting up the bitnami sealed secret controler"
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.0/controller.yaml
kubectl apply -f k8s/sealed-secret-controller.yaml
kubectl apply -f k8s/main.key
kubectl delete pod -n kube-system -l name=sealed-secrets-controller
kubectl create -f k8s/sealed-challenge48.json
echo "finishing up the sealed secret controler part"
wait 10 #or check whether secret48 is there
kubectl apply -f k8s/secret-challenge-deployment.yml
while [[ $(kubectl get pods -l app=secret-challenge -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}') != "True" ]]; do echo "waiting for secret-challenge" && sleep 2; done
kubectl expose deployment secret-challenge --type=LoadBalancer --port=8080
minikube service secret-challenge
あるいは、次のようにすることもできます:```bash ./k8s-vault-minikube-start.sh
現在は、提供されたIPアドレスとポートを使用して(localhostの代わりに)K8sバリアントをさらに操作できます。
- [localhost:8080/challenge/challenge-5](http://localhost:8080/challenge/challenge-5)
- [localhost:8080/challenge/challenge-6](http://localhost:8080/challenge/challenge-6)
- [localhost:8080/challenge/challenge-33](http://localhost:8080/challenge/challenge-33)
- [localhost:8080/challenge/challenge-48](http://localhost:8080/challenge/challenge-48)
- [localhost:8080/challenge/challenge-53](http://localhost:8080/challenge/challenge-53)
### k8sベース
自分のk8sでvanillaを実行したいですか?以下のコマンドを使用してください:```bash
kubectl apply -f k8s/secrets-config.yml
kubectl apply -f k8s/secrets-secret.yml
echo "Setting up the bitnami sealed secret controler"
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.0/controller.yaml
kubectl apply -f k8s/sealed-secret-controller.yaml
kubectl apply -f k8s/main.key
kubectl delete pod -n kube-system -l name=sealed-secrets-controller
kubectl create -f k8s/sealed-challenge48.json
echo "finishing up the sealed secret controler part"
wait 10 #or check whether secret48 is there
kubectl apply -f k8s/challenge33.yml
kubectl apply -f k8s/secret-challenge-deployment.yml
while [[ $(kubectl get pods -l app=secret-challenge -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}') != "True" ]]; do echo "waiting for secret-challenge" && sleep 2; done
kubectl port-forward \
$(kubectl get pod -l app=secret-challenge -o jsonpath="{.items[0].metadata.name}") \
8080:8080
これで、提供されたIPアドレスとポートを使用して、localhostの代わりにK8sバリアントでさらに遊ぶことができます。
(チャレンジ0-8、12-66に使用可能) 以下のものがインストールされていることを確認してください:
./k8s-vault-minikube-start.shを実行します。スクリプトが完了すると、チャレンジがhttp://localhost:8080で待機しています。これにより、チャレンジ0-8、12-66を実行できます。
k8s-vault-minikube-start.shスクリプトを停止し、ポートフォワードを再開したい場合は、k8s-vault-minikube-resume.shを実行します。
これは、開始スクリプトを再度実行すると、vault内のシークレットが置き換えられ、secret-challengeアプリケーションが新しいシークレットで更新されないためです。
(チャレンジ0-66に使用可能)
お読みください: 以下の演習にはIAM権限昇格演習が含まれているため、本番環境に関連するアカウントや、アカウント全体のリソースに影響を与える可能性のあるアカウントでは絶対に実行しないでください。
AWSサブフォルダ内のREADMEの手順に従ってください。
GCPサブフォルダ内のREADMEの手順に従ってください。
Azureサブフォルダ内のREADMEの手順に従ってください。
クラウドデプロイメントに独自のCanarytokensを含めたい場合は、以下を行ってください:
AWS Keysを選択し、webHook URLフィールドに<your-domain-created-at-step1>/canaries/tokencallbackを追加します。各チャレンジには「Show hints」ボタンと「What's wrong?」ボタンがあります。これらのボタンはチャレンジを簡単にし、読者に説明を提供します。ただし、ハッキング演習として行いたい場合、説明が楽しみを台無しにする可能性があります。そのため、環境変数で次の設定を上書きすることで操作できます。
hints_enabled=false は「Show hints」ボタンを無効にします。reason_enabled=false は「What's wrong?」説明ボタンを無効にします。spoiling_enabled=false は /spoil/challenge-x エンドポイントを無効にします(x はチャレンジの短い名前です)。Dockerコンテナ実行時にSPRINGDOC_UIとSPRINGDOC_DOCを上書きすることで、SwaggerドキュメントとSwagger UIを有効にできます。
リーダー:
トップコントリビューター:
コントリビューター:
テスター:
特別な感謝:
以下の方々のご支援に感謝いたします:
GitGuardian のスポンサーシップにより、クラウドアカウントの費用を支払うことができています。
Jetbrains がプロジェクトリーダーにIntellij IDEA Ultimateエディションのライセンスを提供してくれました。これがなければ、これほど迅速な開発はできませんでした!
1Password は、シークレット検出テストベッド用に1Passwordのオープンソースライセンスを提供してくれました。
AWS は、AWSでのプロジェクトおよびWrongsecrets CTF Partyセットアップのテストに使用するAWSオープンソースクレジットを提供してくれました。
以下の方法でご協力いただけます:
DockerとGitの両方に対応したシークレット検出ツールが多数登場しているため、そのためのベンチマークテストベッドを作成しています。自分のツールがすべてを検出するか知りたいですか?埋め込まれたシークレットをこのIssueで追跡し、ブランチにツールが検出する追加のシークレットを配置しています。このブランチにはDockerコンテナ生成スクリプトが含まれており、それを使用してコンテナのシークレットスキャンをテストできます。
現在、複数のシークレットスキャンツールをWrongSecretsコードベースに対してベンチマークする自動化されたGitHub Actionワークフローを提供しています。Secret Scanner Comparisonワークフローは、以下の7つの異なるツールをテストします:
ワークフローは毎週実行され、各ツールが検出したシークレットの数を示す比較表を提供し、さまざまなシークレットスキャンツールの相対的な有効性を理解するのに役立ちます。結果の実行と解釈の詳細については、docs/scanner-comparison.mdを参照してください。
CTFをプレイする方法は3つあります:
無料のHeroku wrongsecrets-ctfインスタンスに基づくCTFをCTFDと一緒にプレイしたいですか?できます!
注:CTFDサポートは現在、Juiceshop CTF CLIに基づいて動作します。
注2:https://wrongsecrets-ctf.herokuapp.com(OSSクレジット不足により一時的にダウン中)はHerokuベースで、容量に制限があります。
CTFD用のzipファイルの最初の作成には、以下の手順を実行する前に、https://wrongsecrets-ctf.herokuapp.com/api/Challengesに1回アクセスする必要があります。
以下の手順に従ってください:```shell npm install -g [email protected] juice-shop-ctf #choose ctfd and https://wrongsecrets-ctf.herokuapp.com as domain. No trailing slash! The key is 'TRwzkRJnHOTckssAeyJbysWgP!Qc2T', feel free to enable hints. docker run -p 8001:8000 -it ctfd/ctfd:3.7.4
> **注意:** ヒントは、WrongSecretsインスタンスでヒントが有効になっている場合にのみ生成できます(`HINTS_ENABLED=true`)。Heroku CTFインスタンス([https://wrongsecrets-ctf.herokuapp.com](https://wrongsecrets-ctf.herokuapp.com))は`HINTS_ENABLED=false`で実行されています。そのため、「Free hints」または「Paid hints」を選択すると、ヒントリストが空になります。ヒントを生成するには、`HINTS_ENABLED=true`で独自のインスタンスを実行してください。
次に、CTFDインスタンスにアクセスしてください [http://localhost:8001](http://localhost:8001) し、CTFをセットアップしてください。
次に、管理バックアップ機能を使用して、juice-shop-ctfコマンドで作成したzipファイルをインポートしてください。
ゲームを始めてください を使用してください!
自分でセットアップしたいですか?できます!ただし、キーを見つけられないように注意してください。適切に保護してください:実際のctf-keyが含まれているコンテナが観客に公開されないようにしてください。Herokuコンテナと同様に。
## FBCTFサポート(試験的!)
注意:FBCTFサポートは試験的です。
CTFDと同じ手順に従ってください。ただし、今度はfbctfdを選択し、国マッピングのURLとして`https://raw.githubusercontent.com/OWASP/wrongsecrets/79a982558016c8ce70948a8106f9a2ee5b5b9eea/config/fbctf.yml`を選択してください。
次に、[https://github.com/facebookarchive/fbctf/wiki/Quick-Setup-Guide](https://github.com/facebookarchive/fbctf/wiki/Quick-Setup-Guide) に従ってFBCTFを実行してください。
## 開発に関する注意事項
ローカルマシンでの開発には、`local`プロファイルを使用します `./mvnw spring-boot:run -Dspring-boot.run.profiles=local,without-vault`
K8sなしでVaultをテストしたい場合:ローカルでVaultを起動します```shell
export SPRING_CLOUD_VAULT_URI='http://127.0.0.1:8200'
export VAULT_API_ADDR='http://127.0.0.1:8200'
vault server -dev
そして次のターミナルで、(前のコマンドのトークンを使用して)次のように実行します:```shell export SPRING_CLOUD_VAULT_URI='http://127.0.0.1:8200' export SPRING_CLOUD_VAULT_TOKEN='' vault token create -id="00000000-0000-0000-0000-000000000000" -policy="root" vault kv put secret/secret-challenge vaultpassword.password="$(openssl rand -base64 16)" vault kv put secret/injected vaultinjected.value="$(openssl rand -base64 16)" vault kv put secret/codified challenge47secret.value="debugvalue"
開発には `local-vault` プロファイルを使用してください。```shell
./mvnw spring-boot:run -Dspring-boot.run.profiles=local,local-vault
Vaultインスタンスなしで開発したい場合は、追加で without-vault プロファイルを使用して開発を行ってください:```shell
./mvnw spring-boot:run -Dspring-boot.run.profiles=local,without-vault
コンテナをプッシュしたいですか?すべてのコンテナを生成してプッシュするスクリプトについては、`.github/scripts/docker-create-and-push.sh` を参照してください。コンテナを構成する前にアプリを再ビルドすることを忘れないでください。
Vault内の何かがKubernetesで動作しない理由を確認したいですか?`kubectl exec vault-0 -n vault -- vault audit enable file file_path=stdout` を実行してください。
### 依存関係管理
脆弱性をチェックするために、CycloneDXとOWASP Dependency-checkを統合しています。
`mvn dependency-check:aggregate` を呼び出してOWASP Dependency-checkerを使用でき、`mvn cyclonedx:makeBom` を呼び出してCycloneDXを使用してSBOMを作成できます。
### Dependency-Check Mavenプラグインの設定
OWASP WrongSecretsは、[`dependency-check-maven`](https://jeremylong.github.io/DependencyCheck/dependency-check-maven/index.html)プラグインを使用して、プロジェクトの依存関係を既知の脆弱性(CVE)に対して自動的にスキャンします。
#### 動作方法
- プラグインはMavenビルド時(`./mvnw clean install`)に実行され、すべての依存関係を公開された脆弱性データベースと照合します。
- デフォルトでは、NVD(National Vulnerability Database)を使用し、追加のカバレッジのためにOSS Indexも使用できます。
#### 設定のハイライト
プラグインは、`pom.xml`の`<build><plugins>`セクションで設定されています:```xml
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>${dependency-check-maven.version}</version>
<configuration>
<nvdApiKey>...</nvdApiKey>
<assemblyAnalyzerEnabled>false</assemblyAnalyzerEnabled>
<ossIndexServerId>ossindex</ossIndexServerId>
<ossIndexAnalyzerEnabled>true</ossIndexAnalyzerEnabled> <!-- SET THIS TO FALSE IF YOU HAVE NO SONATYPE ACCOUNT! -->
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
settings.xml内の認証情報を参照します(以下参照)。trueに設定するとOSS Indexスキャンを有効にします。認証エラー(401)が発生した場合は、falseに設定してOSS Indexを無効にしてください。OSS Indexを使用するには、Mavenのsettings.xmlに認証情報を追加する必要があります。```xml
ossindex
YOUR_OSSINDEX_USERNAME
YOUR_OSSINDEX_API_TOKEN
`YOUR_OSSINDEX_USERNAME` と `YOUR_OSSINDEX_API_TOKEN` を、お使いの OSS Index アカウントの詳細に置き換えてください。
#### トラブルシューティング
- OSS Index で `401 Unauthorized` エラーが表示される場合は、資格情報を確認するか、`pom.xml` で `<ossIndexAnalyzerEnabled>false</ossIndexAnalyzerEnabled>` を設定して OSS Index を無効にしてください。
- NVD ベースのスキャンだけで十分な場合は、OSS Index を使用せずにビルドを実行することもできます。
#### 詳細情報
高度な設定オプションについては、[Dependency-Check Maven Plugin ドキュメント](https://jeremylong.github.io/DependencyCheck/dependency-check-maven/index.html) を参照してください。
### IntelliJ IDEA でプロジェクトを開始する
必要条件: 以下のツールがインストールされていることを確認してください: [Docker](https://www.docker.com/products/docker-desktop/)、[Java25 JDK](https://jdk.java.net/25/)、[NodeJS 24](https://nodejs.org/en/download/current)、[IntelliJ IDEA](https://www.jetbrains.com/idea/download)。
1. [ドキュメント](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md)の説明に従い、プロジェクトをフォークしてクローンします。
2. IntelliJ にプロジェクトをインポートします(例: mvn プロジェクト / ローカルソースとしてインポート)。
3. プロジェクト設定に移動し、Java25 を使用するように設定します(JDK が見つかることを確認)。
4. IDE 設定 > Language & Frameworks > Lombok に移動し、Lombok 処理が有効になっていることを確認します。
5. IDEA で Maven タブを開き、「Reload All Maven Projects」を実行してシステムを同期し、すべてをダウンロードします。次に、同じタブで OWASP WrongSecrets Lifecycle の「install」オプションを使用して、asciidoc などを生成します。
6. 次に、`org.owasp.wrongsecrets.WrongSecretsApplication.java` の `main` メソッドを実行します。これはスタックトレースで失敗するはずです。
7. 次に、アプリケーションの実行構成に移動し、アクティブプロファイルが `without-vault` になっていることを確認します。これは、VM オプションの引数を `--server.port=8080 --spring.profiles.active=local,without-vault` に設定することで行います。環境引数として `K8S_ENV=docker` を設定します。
8. ステップ6を繰り返します: アプリケーションを再度実行すると、アプリケーションが適切に実行され、ブラウザで http://localhost:8080 にアクセスできるようになります。
**画像付きガイド** は、IntelliJ IDEA でプロジェクトを開始する方法について、[_Contributing.md_](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md#how-to-get-started-with-the-project-in-intellij-idea) で入手できます。
自由に編集し、プルリクエストで変更を提案してください。作業を受け入れてもらうために、[ドキュメント](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md) のガイダンスに従ってください。
開発は公式には Linux と MacOS のみサポートしていることに注意してください。Windows マシンで開発する場合は、WSL2 または Linux 仮想マシンを使用してください。最初の実験として Windows 検出といくつかの `exe` ファイルを含めましたが、それらのアクティブなメンテナーを探しています。Windows で確実に動作させたいですか? PR を作成してください ;-)。
このセクションを読んでもアプリケーションコードがわからない場合は、[Baeldung の Spring Boot チュートリアル](https://www.baeldung.com/spring-boot) をご覧ください。
### 開発中の自動リロード
変更をより速く読み込むために、Maven プロジェクトに `spring-dev-tools` を追加しました。
IntelliJ でこれを自動的に有効にするには、以下を確認してください:
- Compiler -> Automatically build project が有効になっていること、および
- Advanced settings -> Allow auto-make to start even if developed application is currently running が有効になっていること。
手動で呼び出すこともできます: Build -> 変更したファイルを再コンパイルすると、アプリケーションのリロードも強制されます。
### チャレンジの追加方法
チャレンジを追加するには、以下の手順に従ってください:
1. まず、チャレンジが本当に望まれている [Issue](https://github.com/OWASP/wrongsecrets/issues) が報告されていることを確認します。
2. `org.owasp.wrongsecrets.challenges` フォルダに新しいチャレンジを追加します。`src/main/resources/explanations` に説明を追加し、新しい Challenge クラスからそれを参照するようにしてください。
3. チャレンジが機能することを示すために、適切なユニットテスト、統合テスト、UI テストを追加します。
4. `src/main/resources/wrong-secrets-configuration.yaml` でチャレンジを設定するのを忘れないでください。
5. 開発環境のセットアップと適切なコミットメッセージの書き方については、[CONTRIBUTING ガイド](https://github.com/owasp/wrongsecrets/blob/HEAD/CONTRIBUTING.md) を確認してください。
詳細については、[_Contributing.md_](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md#how-to-add-a-challenge) を参照してください。
既存のクラウドチャレンジを別のクラウドに移行する場合: `org.owasp.wrongsecrets.challenges.cloud` パッケージの Challenge クラスを拡張し、別のクラウドが識別されたフォルダに必要な Terraform を追加してください。環境が `org.owasp.wrongsecrets.RuntimeEnvironment` に追加されていることを確認してください。
プロジェクトの他のメンバーと協力してコンテナを実行し、クラウドアカウントでテストできるようにしてください。
### ローカルテスト
コードベースに変更を加えたり、新しいチャレンジを追加した後に、マージ後のコンテナがどのように見えるかを正確にテストしたい場合、これを非常に簡単にするスクリプトがあります。以下の手順に従ってください:
1. bash がインストールされて開いていることを確認します。
2. .github/scripts に移動します。
3. docker-create スクリプトを実行します: `bash docker-create.sh`。
- 注意: これを minikube で実行しますか? その場合は、最初に `eval $(minikube docker-env)` を実行してください。
4. 表示される指示に従ってください。パッケージのインストールや変更が必要になる場合があります。
5. 新しく作成されたコンテナを実行します:
- ローカルで実行する場合: `docker run -p 8080:8080 -p 8090:8090 jeroenwillemsen/wrongsecrets:local-test-no-vault`
- minikube で実行する場合: デプロイメント定義でコンテナ `jeroenwillemsen/wrongsecrets:local-test-k8s-vault` を使用します。
- minikube で Vault を使用して実行する場合: デプロイメント定義でコンテナ `jeroenwillemsen/wrongsecrets:local-test-local-vault` を使用します。
### ローカル自動テスト
現在、2つの異なるテストスイートがあり、どちらも `./mvnw test` で実行されます。
- 通常の JUnit テストスイート(ユニットテストと統合テスト)は、[`test/java` フォルダ](https://github.com/owasp/wrongsecrets/blob/HEAD/src/test/java) にあり、出力はデフォルトの target ディレクトリに保存されます。
- Cypress テストスイートは、JUnit テストによって統合され、[`test/e2e` フォルダ](https://github.com/owasp/wrongsecrets/blob/HEAD/src/test/e2e) にあり、出力は [`target/test-classes/e2e/cypress/reports/`](https://github.com/owasp/wrongsecrets/blob/HEAD/target/test-classes/e2e/cypress/reports/) に保存されます。詳細については、[cypress の readme](https://github.com/owasp/wrongsecrets/blob/HEAD/src/test/e2e/cypress/README.md) を参照してください。
注意: `./mvnw clean install` で、クリーン、ビルド、テストの完全なラウンドトリップを実行できます。
## 🔧 トラブルシューティング
### よくある問題
**Docker の問題:**
- **ポートがすでに使用中**: ポートマッピングを変更します: `docker run -p 8081:8080 -p 8091:8090 jeroenwillemsen/wrongsecrets:latest-no-vault`
- **Docker が見つからない**: Docker がインストールされ、実行されていることを確認します
- **権限が拒否された**: Linux では、docker グループにユーザーを追加する必要がある場合があります
**ブラウザの問題:**
- **localhost:8080 にアクセスできない**: `docker ps` で Docker コンテナが実行されているか確認します
- **チャレンジが読み込まれない**: ブラウザのキャッシュをクリアするか、シークレットモードを試します
**Kubernetes の問題:**
- **Minikube が起動しない**: `minikube delete` を試してから `minikube start` を実行します
- **Pod が pending 状態で停止している**: `kubectl describe pod <pod-name>` でリソースを確認します
**ヘルプが必要ですか?**
- [GitHub Issues](https://github.com/OWASP/wrongsecrets/issues) を確認してください
- [OWASP Slack](https://owasp.slack.com/archives/C02KQ7D9XHR) に参加してください
- [サポート](#support) セクションを確認してください
## プレイしたいけど、ツールをインストールできない場合
チャレンジをプレイしたいが、keepass、Radare などのツールをインストールできないが、Docker コンテナを実行することは許可されている場合は、以下を試してください:```shell
docker run -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock jeroenwillemsen/wrongsecrets-desktop:latest
または、より設定可能なものを使用してください:```shell
docker run -d
--name=webtop
--security-opt seccomp=unconfined
-e PUID=1000
-e PGID=1000
-e TZ=Europe/London
-e SUBFOLDER=/
-e KEYBOARD=en-us-qwerty
-p 3000:3000
-v /var/run/docker.sock:/var/run/docker.sock
--shm-size="2gb"
--restart unless-stopped
jeroenwillemsen/wrongsecrets-desktop:latest
そして、[http://localhost:3000](http://localhost:3000) にアクセスします。
注:`jeroenwillemsen/wrongsecrets-desktop` コンテナを Heroku にデプロイしようとする際は注意してください ;-)。
## macOS (M1) と Colima での Docker (実験的!)
注: Colima は公式にはサポートしていません。Github ランナーで多くの問題が発生することがわかっています。
Docker Desktop/Podman に切り替えられず、Apple Silicon M1 で Colima を使って Docker イメージ `jeroenwillemsen/wrongsecrets` を実行したい場合は、以下のいずれかを試してください:
- Colima をオフにする (`colima stop`)
- Docker コンテキストを変更する (`docker --context desktop-linux run -p 8080:8080 jeroenwillemsen/wrongsecrets:latest-no-vault`)
- Colima を 1 CPU で実行する (`colima start -m 8 -c 1 --arch x86_64`)
## 独自のリリースでチャレンジを無効にしたい場合
WrongSecrets を実行したいが、他人に見せたくない特定のチャレンジを除外したい場合は、このセクションをお読みください。
*_注_* 以下の手順を実行する場合、フォークに対するサポートは提供しませんのでご注意ください。フォークにおいても元のアプリケーションのライセンスと著作権はそのまま保持されることをご理解ください。
必要条件:
- Java 25 の JDK がインストールされていること;
- WrongSecrets コンテナのバリアントをプッシュできるレジストリのアカウントがあること;
特定のチャレンジを無効にした独自の WrongSecrets リリースを作成するには、以下の手順に従ってください:
1. リポジトリをフォークします。
2. `src/main/resources/wrong-secrets-configuration.yaml` で、フォークに含めたくないチャレンジへの参照を削除します。
3. プロジェクトのルートで `./mvnw clean install` を実行します。
4. 次に、選択したターゲット用の Docker イメージをビルドします:```sh
docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx build --platform linux/amd64,linux/arm64 -t <registry/container-name>:<yourtag>-no-vault --build-arg "argBasedPassword='this is on your command line'" --build-arg "PORT=8081" --build-arg "argBasedVersion=<yourtag>" --build-arg "spring_profile=without-vault" --push
docker buildx build --platform linux/amd64,linux/arm64 -t <registry/container-name>:<yourtag>-kubernetes-vault--build-arg "argBasedPassword='this is on your command line'" --build-arg "PORT=8081" --build-arg "argBasedVersion=<yourtag>" --build-arg "spring_profile=kubernetes-vault" --push
もっと詳しく知りたいですか?以下の情報源をご確認ください: