§アプリケーションシークレット
Playは、以下のものを含む多くの用途でシークレットキーを使用します。
- セッションクッキーとCSRFトークンの署名
- 組み込み暗号化ユーティリティ
これは `application.conf` で `play.http.secret.key` というプロパティ名で設定され、デフォルトは `changeme` です。デフォルトが示唆するように、本番環境では変更する必要があります。
**注意:** 起動時に、シークレットが設定されていない場合、`changeme` に設定されている場合、またはアプリケーションシークレットが短すぎる場合、Playはエラーをスローします。
§ベストプラクティス
シークレットにアクセスできる人は誰でも、任意のセッションを生成することができ、事実上、任意のユーザーとしてシステムにログインすることを許可することになります。そのため、アプリケーションシークレットをソースコントロールにチェックインしないことを強くお勧めします。 むしろ、本番サーバーで設定する必要があります。 つまり、本番アプリケーションシークレットを `application.conf` に配置することは悪い習慣と見なされます。
本番サーバーでアプリケーションシークレットを設定する1つの方法は、起動スクリプトにシステムプロパティとして渡すことです。 例えば
/path/to/yourapp/bin/yourapp -Dplay.http.secret.key='QCY?tAnfk?aZ?iwrNwnxIlR6CTf:G3gf:90Latabg@5241AB`R5W:1uDFN];Ik@n'
このアプローチは非常にシンプルであり、アプリケーションシークレットを設定する必要があることを思い出させるために、本番モードでアプリを実行する際のPlayのドキュメントでは、このアプローチを使用します。 ただし、一部の環境では、コマンドライン引数にシークレットを配置することは、良い習慣とは見なされません。 これに対処するには、2つの方法があります。
§環境変数
1つ目は、アプリケーションシークレットを環境変数に配置することです。 この場合、`application.conf` ファイルに次の設定を配置することをお勧めします。
play.http.secret.key="changeme"
play.http.secret.key=${?APPLICATION_SECRET}
この設定の2行目は、`APPLICATION_SECRET` という環境変数が設定されている場合、シークレットをその環境変数から取得するように設定し、そうでない場合は、前の行からシークレットを変更せずに残します。
このアプローチは、クラウドベースのデプロイシナリオで特にうまく機能します。クラウドベースのデプロイシナリオでは、パスワードやその他のシークレットを、そのクラウドプロバイダーのAPIを通じて設定できる環境変数に設定するのが通常のプラクティスです。
§本番設定ファイル
別のアプローチは、サーバー上に存在する `production.conf` ファイルを作成し、`application.conf` を含めるが、アプリケーションシークレットやパスワードなどの機密性の高い設定もオーバーライドすることです。
例えば
include "application"
play.http.secret.key="QCY?tAnfk?aZ?iwrNwnxIlR6CTf:G3gf:90Latabg@5241AB`R5W:1uDFN];Ik@n"
その後、Playを起動できます
/path/to/yourapp/bin/yourapp -Dconfig.file=/path/to/production.conf
§アプリケーションシークレットの要件
アプリケーションシークレットの設定 `play.http.secret.key` は、セッションとフラッシュクッキーの署名に使用されるアルゴリズムに応じて、最小長がチェックされます。 デフォルトでは、そのアルゴリズムはHS256であり、少なくとも256ビットが必要です。 したがって、キーのビット数が少ない場合、エラーがスローされ、設定は無効になります。 HS256の場合、`head -c 32 /dev/urandom | base64` などの完全にランダムな入力の少なくとも32バイトをシークレットに設定するか、以下で説明するように、`playGenerateSecret` または `playUpdateSecret` を使用したアプリケーションシークレットジェネレーターによって、このエラーを解決できます。
また、上記で説明したように、アプリケーションシークレットは、Playセッションクッキーが有効であること、つまり、攻撃者によって偽造されたのではなく、サーバーによって生成されたことを確認するためのキーとして使用されます。 ただし、シークレットは文字列のみを指定し、その文字列のエントロピーの量は決定しません。 とにかく、シークレットがどれほど短いかを測定するだけで、シークレットのエントロピーの上限を設定することができます。シークレットの長さが8文字の場合、それは最大64ビットのエントロピーであり、現代の基準では不十分です。
§アプリケーションシークレットの生成
Playは、新しいシークレットを生成するために使用できるユーティリティを提供します。 Playコンソールで `playGenerateSecret` を実行します。 これにより、アプリケーションで使用できる新しいシークレットが生成されます。 例えば
[my-first-app] $ playGenerateSecret
[info] Generated new secret: QCYtAnfkaZiwrNwnxIlR6CTfG3gf90Latabg5241ABR5W1uDFNIkn
[success] Total time: 0 s, completed 28/03/2014 2:26:09 PM
§application.conf のアプリケーションシークレットの更新
Playはまた、開発またはテストサーバー用に特定のシークレットを設定したい場合に、`application.conf` のシークレットを更新するための便利なユーティリティを提供します。 これは、アプリケーションシークレットを使用してデータを暗号化し、アプリケーションが開発モードで実行されるたびに同じシークレットが使用されるようにする場合に役立ちます。
`application.conf` のシークレットを更新するには、Playコンソールで `playUpdateSecret` を実行します
[my-first-app] $ playUpdateSecret
[info] Generated new secret: B4FvQWnTp718vr6AHyvdGlrHBGNcvuM4y3jUeRCgXxIwBZIbt
[info] Updating application secret in /Users/jroper/tmp/my-first-app/conf/application.conf
[info] Replacing old application secret: play.http.secret.key="changeme"
[success] Total time: 0 s, completed 28/03/2014 2:36:54 PM
**次へ:** セッションクッキーの設定
このドキュメントに誤りを見つけましたか? このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。 質問やアドバイスがありましたら、コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。