How to Keep Sensitive Information Secret

Environment variables are the best way to store configuration that depends on where the application is run - for example, some API key that might be set to one value while developing locally and another value on production.

環境変数は、アプリケーションが実行される場所に依存する構成を保存するための最良の方法です。たとえば、一部の API キーは、ローカルでの開発中にはある値に設定され、本番環境では別の値に設定される可能性があります。

When these values are sensitive and need to be kept private, you can safely store them by using Symfony's secrets management system - sometimes called a "vault".

これらの値が機密であり、非公開にする必要がある場合は、Symfony のシークレット管理システム (「ボールト」と呼ばれることもあります) を使用して安全に保管できます。

Note

ノート

The Secrets system requires the Sodium PHP extension.

Secrets システムには、Sodium PHP 拡張機能が必要です。

Generate Cryptographic Keys

In order to encrypt and decrypt secrets, Symfony needs cryptographic keys. A pair of keys can be generated by running:

シークレットを暗号化および復号化するために、Symfony は暗号化キーを必要とします。
1
$ php bin/console secrets:generate-keys

This will generate a pair of asymmetric cryptographic keys. Each environment has its own set of keys. Assuming you're coding locally in the dev environment, this will create:

これにより、非対称暗号鍵のペアが生成されます。各環境には独自のキー セットがあります。開発環境でローカルにコーディングしていると仮定すると、次のものが作成されます。
config/secrets/dev/dev.encrypt.public.php
Used to encrypt/add secrets to the vault. Can be safely committed.
シークレットをボールトに暗号化/追加するために使用されます。安全にコミットできます。
config/secrets/dev/dev.decrypt.private.php
Used to decrypt/read secrets from the vault. The dev decryption key can be committed (assuming no highly-sensitive secrets are stored in the dev vault) but the prod decryption key should never be committed.
ボールトからシークレットを解読/読み取るために使用されます。 dev 復号化キーはコミットできます (非常に機密性の高いシークレットが dev ボールトに格納されていないと仮定します) が、prod 復号化キーは決してコミットしないでください。

You can generate a pair of cryptographic keys for the prod environment by running:

次のコマンドを実行して、prod 環境用の暗号化キーのペアを生成できます。
1
$ APP_RUNTIME_ENV=prod php bin/console secrets:generate-keys

This will generate config/secrets/prod/prod.encrypt.public.php and config/secrets/prod/prod.decrypt.private.php.

これにより、config/secrets/prod/prod.encrypt.public.php と config/secrets/prod/prod.decrypt.private.php が生成されます。

Caution

注意

The prod.decrypt.private.php file is highly sensitive. Your team of developers and even Continuous Integration services don't need that key. If the decryption key has been exposed (ex-employee leaving for instance), you should consider generating a new one by running: secrets:generate-keys --rotate.

prod.decrypt.private.php ファイルは非常に機密性が高いです。開発者チームや継続的インテグレーション サービスでさえ、そのキーは必要ありません。復号化キーが公開されている場合 (たとえば、元従業員が退職した場合)、:secrets:generate-keys --rotate を実行して新しいキーを生成することを検討する必要があります。

Create or Update Secrets

Suppose you want to store your database password as a secret. By using the secrets:set command, you should add this secret to both the dev and prod vaults:

データベースのパスワードをシークレットとして保存するとします。 thesecrets:set コマンドを使用して、このシークレットを dev と prod ボールトの両方に追加する必要があります。
1
2
3
4
5
6
7
# the input is hidden as you type for security reasons

# set your default development value (can be overridden locally)
$ php bin/console secrets:set DATABASE_PASSWORD

# set your production value
$ APP_RUNTIME_ENV=prod php bin/console secrets:set DATABASE_PASSWORD

This will create a new file for the secret in config/secrets/dev and another in config/secrets/prod. You can also set the secret in a few other ways:

これにより、config/secrets/dev にシークレットの新しいファイルが作成され、config/secrets/prod に別のファイルが作成されます。他のいくつかの方法でシークレットを設定することもできます。
1
2
3
4
5
6
7
8
# provide a file where to read the secret from
$ php bin/console secrets:set DATABASE_PASSWORD ~/Download/password.json

# or contents passed to STDIN
$ echo -n "$DB_PASS" | php bin/console secrets:set DATABASE_PASSWORD -

# or let Symfony generate a random value for you
$ php bin/console secrets:set REMEMBER_ME --random

Note

ノート

There's no command to rename secrets, so you'll need to create a new secret and remove the old one.

シークレットの名前を変更するコマンドはないため、新しいシークレットを作成して古いシークレットを削除する必要があります。

Referencing Secrets in Configuration Files

Secret values can be referenced in the same way as environment variables. Be careful that you don't accidentally define a secret and an environment variable with the same name: environment variables override secrets.

シークレット値は、環境変数と同じ方法で参照できます。シークレットと環境変数を誤って同じ名前で定義しないように注意してください。環境変数はシークレットをオーバーライドします。

If you stored a DATABASE_PASSWORD secret, you can reference it by:

DATABASE_PASSWORD シークレットを保存した場合は、次の方法で参照できます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
# config/packages/doctrine.yaml
doctrine:
    dbal:
        password: '%env(DATABASE_PASSWORD)%'
        # ...
    # ...

The actual value will be resolved at runtime: container compilation and cache warmup don't need the decryption key.

実際の値は実行時に解決されます。コンテナーのコンパイルとキャッシュウォームアップでは、復号化キーは必要ありません。

List Existing Secrets

Everybody is allowed to list the secrets names with the command secrets:list. If you have the decryption key you can also reveal the secrets' values by passing the --reveal option:

コマンドsecrets:list を使用して、誰でもシークレット名を一覧表示できます。復号化キーを持っている場合は、 --reveal オプションを渡すことでsecretsの値を明らかにすることもできます:
1
2
3
4
5
6
7
$ php bin/console secrets:list --reveal

 ------------------- ------------ -------------
  Name                Value        Local Value
 ------------------- ------------ -------------
  DATABASE_PASSWORD   "my secret"
 ------------------- ------------ -------------

Remove Secrets

Symfony provides a convenient command to remove a Secret:

symfony はシークレットを削除するための便利なコマンドを提供します:
1
$ php bin/console secrets:remove DATABASE_PASSWORD

Local secrets: Overriding Secrets Locally

The dev environment secrets should contain nice default values for development. But sometimes a developer still needs to override a secret value locally when developing.

開発環境のシークレットには、開発用の適切なデフォルト値が含まれている必要があります。

Most of the secrets commands - including secrets:set - have a --local option that stores the "secret" in the .env.{env}.local file as a standard environment variable. To override the DATABASE_PASSWORD secret locally, run:

secrets:set を含むほとんどのシークレット コマンドには、「シークレット」を標準環境変数として .env.{env}.local ファイルに格納する --local オプションがあります。 DATABASE_PASSWORD シークレットをローカルでオーバーライドするには、次を実行します。
1
$ php bin/console secrets:set DATABASE_PASSWORD --local

If you entered root, you will now see this in your .env.dev.local file:

root を入力すると、.env.dev.local ファイルに次のように表示されます。
1
DATABASE_PASSWORD=root

This will override the DATABASE_PASSWORD secret because environment variables always take precedence over secrets.

環境変数は常にシークレットよりも優先されるため、これは DATABASE_PASSWORD シークレットをオーバーライドします。

Listing the secrets will now also display the local variable:

シークレットを一覧表示すると、ローカル変数も表示されるようになりました。
1
2
3
4
5
6
$ php bin/console secrets:list --reveal
 ------------------- ------------- -------------
  Name                Value         Local Value
 ------------------- ------------- -------------
  DATABASE_PASSWORD   "dev value"   "root"
 ------------------- ------------- -------------

Symfony also provides the secrets:decrypt-to-local command which decrypts all secrets and stores them in the local vault and the secrets:encrypt-from-local command to encrypt all local secrets to the vault.

Symfony は、すべてのシークレットを復号化してローカル Vault に保存する secrets:decrypt-to-local コマンドと、すべてのローカル シークレットを暗号化して Vault に保存する secrets:encrypt-from-local コマンドも提供します。

Secrets in the test Environment

If you add a secret in the dev and prod environments, it will be missing from the test environment. You could create a "vault" for the test environment and define the secrets there. But an easier way is to set the test values via the .env.test file:

開発環境と本番環境でシークレットを追加すると、テスト環境からは失われます。テスト環境用の「ボールト」を作成し、そこでシークレットを定義できます。しかし、より簡単な方法は、.env.test ファイルを介してテスト値を設定することです。
1
2
# .env.test
DATABASE_PASSWORD="testing"

Deploy Secrets to Production

Due to the fact that decryption keys should never be committed, you will need to manually store this file somewhere and deploy it. There are 2 ways to do that:

復号化キーは決してコミットされるべきではないため、手動でこのファイルをどこかに保存して展開する必要があります。それには 2 つの方法があります。
  1. Uploading the file

    ファイルのアップロード

    The first option is to copy the production decryption key - config/secrets/prod/prod.decrypt.private.php to your server.

    最初のオプションは、本番用の復号化キー -config/secrets/prod/prod.decrypt.private.php をサーバーにコピーすることです。
  2. Using an Environment Variable

    環境変数の使用

    The second way is to set the SYMFONY_DECRYPTION_SECRET environment variable to the base64 encoded value of the production decryption key. A fancy way to fetch the value of the key is:

    2 番目の方法は、SYMFONY_DECRYPTION_SECRET 環境変数を、製品の復号化キーの base64 でエンコードされた値に設定することです。キーの値を取得する気の利いた方法は次のとおりです。
    1
    2
    3
    # this command only gets the value of the key; you must also set an env var
    # in your system with this value (e.g. `export SYMFONY_DECRYPTION_SECRET=...`)
    $ php -r 'echo base64_encode(require "config/secrets/prod/prod.decrypt.private.php");'

    To improve performance (i.e. avoid decrypting secrets at runtime), you can decrypt your secrets during deployment to the "local" vault:

    パフォーマンスを向上させる (つまり、実行時にシークレットを復号化するのを避ける) ために、「ローカル」ボールトへのデプロイ中にシークレットを復号化できます。
    1
    $ APP_RUNTIME_ENV=prod php bin/console secrets:decrypt-to-local --force

    This will write all the decrypted secrets into the .env.prod.local file. After doing this, the decryption key does not need to remain on the server(s).

    これにより、復号化されたすべてのシークレットが .env.prod.local ファイルに書き込まれます。これを行った後、復号化キーをサーバーに残す必要はありません。

Rotating Secrets

The secrets:generate-keys command provides a --rotate option to regenerate the cryptographic keys. Symfony will decrypt existing secrets with the old key, generate new cryptographic keys and re-encrypt secrets with the new key. In order to decrypt previous secrets, the developer must have the decryption key.

secrets:generate-keys コマンドは、暗号鍵を再生成する --rotate オプションを提供します。 symfony は古いキーで既存のシークレットを復号化し、新しい暗号化キーを生成して、新しいキーでシークレットを再暗号化します。以前のシークレットを解読するには、開発者は解読キーを持っている必要があります。

Configuration

The secrets system is enabled by default and some of its behavior can be configured:

シークレット システムはデフォルトで有効になっており、その動作の一部を構成できます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
# config/packages/framework.yaml
framework:
    secrets:
        #vault_directory: '%kernel.project_dir%/config/secrets/%kernel.environment%'
        #local_dotenv_file: '%kernel.project_dir%/.env.%kernel.environment%.local'
        #decryption_env_var: 'base64:default::SYMFONY_DECRYPTION_SECRET'