メインコンテンツまでスキップ

Secrets

Secretsは特定の種類の環境変数で、情報を暗号化された形式で隠し、その値はビルドログに表示されません。また、bitrise.ymlの設定にも表示されません。パスワードやAPIキーなどの機密情報をSecretsとして保存できます。

Environment Variablesと同様に、SecretsはStep入力の値として使用できます。環境変数をStep入力として使用する

Secretの設定Click to copy link​

すべての環境変数の値は文字列です

環境変数またはシークレットの値には文字列のみを設定できます。数値(例:7)を設定した場合でも、文字列として渡されます。

シークレットは、Workflow EditorのSecretsページで作成するか、Step inputsを変更する際に作成できます。

  1. Bitrise にアクセスして Log in、左側の Bitrise CI を選択し、プロジェクトを選択します。

  2. メインページの Workflows ボタンをクリックします。

  3. 左側でSecretsを選択します。

  4. Project level Secretsの下にあるAdd newボタンをクリックします。

    secrets-screenshot.png

  5. キーと値を追加します。

    $記号の使用

    環境変数やシークレットの値(パスワードなど)には$記号を使用できますが、その場合は必ずReplace variables in inputsオプションのチェックを外したままにしてください。変数のキーを値に置き換えて入力に使用すると、$記号があるため、Bitrise CLIはその値を別の環境変数として扱います。

  6. 必要に応じて、シークレットのキーを入力内でその値に置き換えることができます。Replace variables in inputsオプションをチェックしてください。

  7. 必要に応じて、このオプションを選択することで、シークレットをプルリクエストに公開できます。

    ほとんどの場合、Secretsを公開しないことを強くおすすめします。

  8. Saveをクリックします。

既存のSecretの編集Click to copy link​

Secretsタブで新しいシークレット環境変数を追加したら、いつでもそこに戻って内容を変更したり、詮索好きな目から保護したりできます。

  1. Bitrise にアクセスして Log in、左側の Bitrise CI を選択し、プロジェクトを選択します。

  2. メインページの Workflows ボタンをクリックします。

  3. 左側でSecretsを選択します。

  4. シークレットの値の隣にあるEditをクリックします。

  5. 必要に応じて内容を変更します。

  6. Saveをクリックします。

Secretの値の保護Click to copy link​

通常、目のアイコンをクリックすることで、シークレットの値を表示または非表示にできます。この機能は、Secretsに多くのシークレット環境変数がある場合に、1つのシークレットの値だけを確認し、他の値は非表示のままにしたいときに便利です。値が非表示の場合は、斜線の入った目のアイコンで示されます。

ただし、シークレットを保護対象にすることで、その値を永久に非表示にできます。そうすると、自分自身を含め、誰もその値を再び変更したり表示したりできなくなります。

シークレットの保護は元に戻せません

シークレットを保護対象にする操作は取り消せません。値を変更する必要が生じた場合は、シークレットを削除して新しく作成する必要があります。

  1. Bitrise にアクセスして Log in、左側の Bitrise CI を選択し、プロジェクトを選択します。

  2. メインページの Workflows ボタンをクリックします。

  3. 左側でSecretsを選択します。

  4. シークレットの値の隣にあるEditをクリックします。

    edit-button-secrets.png

  5. Protectedをチェックします。

  6. ダイアログにこの処理が取り消せない旨の警告が表示されます。Save and protectをクリックします。

これで完了です。シークレットの値は表示できなくなります。

Secretのプルリクエストへの公開Click to copy link​

デフォルトでは、プルリクエストはSecretsの値にアクセスできません。つまり、リポジトリのフォークから作成されたプルリクエストがビルドをトリガーする場合、そのビルドはアプリのSecretsを使用できません。

特定のシークレットへのアクセスをプルリクエストビルドに許可する必要がある場合は、そのシークレットをプルリクエストに公開できます。ただし、公開した場合でも、その値はログには表示されず、[REDACTED]と表示されます。

保護されたSecretsは公開できません

シークレットが一度保護対象に設定されると、プルリクエストビルドに公開することはできません。

公開アプリ

アプリが公開アプリの場合、そのアプリのSecretsをプルリクエストビルドに公開することはできません。

  1. Bitrise にアクセスして Log in、左側の Bitrise CI を選択し、プロジェクトを選択します。

  2. メインページの Workflows ボタンをクリックします。

  3. 左側でSecretsを選択します。

  4. シークレットの値の隣にあるEditをクリックします。

  5. Expose for Pull Requests?トグルを切り替えます。

シークレットが公開されると、プルリクエストビルドからアクセスできるようになります。

複数のアプリにまたがるSecretsの管理Click to copy link​

デフォルトでは、すべてのSecretsはアプリレベルで管理されます。各アプリで対応する値が異なっていても、複数のBitriseアプリ間でシークレットキーを再利用できます。

ただし、すべてのアプリで同じ値を保持するシークレットを設定し、そのシークレットを1か所で管理することも可能です。例えば、すべてのアプリが同じAPIへのアクセスを必要とする場合は、APIキーを含むシークレットを一元的な場所に保存すると効率的です。APIキーが変更された場合でも、その1か所を変更するだけで、すべてのBitriseアプリに変更が反映されます。

これを実現する方法は2つあります。

WorkspaceレベルでSecretsを管理するClick to copy link​

Enterpriseプランでは、WorkspaceレベルでSecretsを保存できます。つまり、同じシークレットがそのWorkspaceが所有するすべてのアプリからアクセス可能になるということです。これによりセキュリティが向上し、WorkspaceのOwnerとManagerのみがこれらのSecretsにアクセスできるようになります。

ダウングレード

Enterpriseプランからダウングレードすると、Workspace SecretsはアプリレベルのSecretsに変換されます。

Secretsをビルドに渡す際は、有効順序において、アプリレベルのSecretsがWorkspaceレベルのSecretsより優先されます。これは、同じキーを持つSecretsが2つ存在する場合、ビルド中はアプリレベルのシークレットが使用されることも意味します。

新しいシークレットを追加するには:

  1. Bitriseのメインページで、左側のナビゲーションメニューからSettingsを選択します。Workspace settingsページに移動します。

  2. Workspace settingsページでShared resourcesを選択します。

    shared-res.png

  3. Add newボタンをクリックします。

  4. キーと値を追加します。

    ws-secrets.png

  5. シークレットの使用の詳細を設定します:

    • Replace variables in inputs: シークレットの値を文字列としてビルドに渡します。埋め込みのSecretsやEnvironment Variables(シークレットの値が別のシークレットまたは環境変数のキーである場合)に使用します。ほとんどのユースケースでは、これをチェックする必要はありません。
    • Expose for pull requests: シークレットをPRに公開すると、そのシークレットをプルリクエストビルドで使用できるようになります。リポジトリのプライバシー設定によっては、これがセキュリティリスクとなる可能性があります。
    • Protected: 値は二度と変更または表示できなくなります。この設定は保存すると元に戻せません。
  6. 準備ができたら、Doneをクリックします。

一元的なvaultやデータベースからSecretsを管理するClick to copy link​

一元的な場所にSecretsを設定するには、次の2つが必要です:

  • Secretsを保存するための一元的なvaultまたはデータベース(HashiCorpやDopplerなど)。CLI経由でアクセスできる必要があります。
  • 一元的なvault/データベースにアクセスし、シークレットを取得してBitrise上で機密として設定するためのScript Step。

ビルド中に新しいシークレットを作成し、一元的な場所に保存するには:

  1. 保存したいvaultまたはデータベースに、Secretsをキーと値のペアとして追加します。

  2. Secretsを使用したいすべてのWorkflowsに、Script Stepを追加します。

  3. vaultにアクセスしてSecretsを取得するために必要なコマンドを追加します。具体的なコマンドは使用しているサービスによって異なります。

  4. envmanツールを使用して、Secretsを機密としてマークします。envmanツールの構文は次のとおりです。

    envman add --key KEY --value value --sensitive .

  5. Stepがビルドログにシークレットの値を表示しないようにします。そのためには、Stepのcontentからset -xを削除します。

シークレットのマスキング

シークレットのマスキングをオフにしている場合、Secretsはマスキングされず、値がログに表示される可能性があるのでご注意ください。

SecretsをHashiCorp Vaultに保存する

secret/helloという名前のHashiCorp Vaultインスタンスがあるとします。このvaultインスタンスには2つのSecretsがあります。値がworldのfooと、値がworld2のfoo2です。これらのSecretsをBitriseビルドで使用するには、次の操作が必要です。

  • vaultインスタンスからエクスポートします。
  • それらを反復処理し、両方を機密としてマークします。

これらを実現するには、次のScriptを使用できます:

# Exporting the Secrets
vault kv get --format=json secret/hello | jq -r '.data.data | to_entries[] | [.key, .value] | @tsv' |
# Iterating over the Secrets and marking them as sensitive
while IFS=$'\t' read -r key value; do
envman add --key "$key" --value "$value" --sensitive
done

SecretsのマスキングClick to copy link​

Bitrise CLIは、シークレット環境変数を自動的にマスキングし、キーの後に改行を入れて[REDACTED]を出力することで、ビルドログにシークレット環境変数が表示されないようにします。これは非公開アプリと公開アプリの両方に適用されます。

ただし、Secretsをログに表示させる必要がある場合は、いつでもこれをオフにできます。

警告

これはセキュリティ上のリスクとなる可能性があります。シークレットのマスキングをオフにしないことを強くおすすめします。

  1. Bitrise にアクセスして Log in、左側の Bitrise CI を選択し、プロジェクトを選択します。

  2. メインページの Workflows ボタンをクリックします。

  3. 左側でSecretsを選択します。

  4. Add newをクリックして、値がfalseのBITRISE_SECRET_FILTERINGシークレット環境変数を登録します。

  5. 右上にあるSave changesをクリックします。

セルフホスト環境におけるSecretsClick to copy link​

Bitriseビルドはself-hosted infrastructure(自分で管理するハードウェアまたは仮想化環境)で実行できます。セキュリティポリシー上、bitrise.ioでホストされているBitrise Secretsを使用できない場合、このガイドではSecretsにアクセスしてビルドで使用するための別の方法を紹介します。

セルフホストビルドでは、ホストマシンは仮想プライベートクラウドの内側にあります。そのため、SecretsをBitriseのコントロールプレーンやウェブサイトに公開することなく、任意のシークレットサービスにアクセスできます。使用しているサービスからシークレットを取得し、envmanを使用してBitriseビルドに追加します:

  1. 必要に応じて、Bitriseで任意の値を持つプレースホルダーのシークレットを作成します。シークレットの設定を参照してください。

    これは、Workflow EditorのGUI上で機密のStep入力にシークレットを使用したい場合にのみ必要です。機密入力ではSecretsのみを受け付け、Workflow Editorでは既存のSecretsのみを機密入力の値として追加できます。

    YAMLでBitriseの設定を編集する場合は、入力に任意の値を設定できるため、プレースホルダーは不要です。

  2. 使用しているサービスからシークレットを取得するために、Script Stepを使用します。

  3. スクリプト内で、set +xを設定してデバッグをオフにします:

    これは非常に重要です。デバッグモードでは、シークレットの値がビルドログに表示される可能性があります。

    #!/usr/bin/env bash
    # fail if any commands fails
    set -e
    # make pipelines' return status equal the last command to exit with a non-zero status, or zero if all commands exit successfully
    set -o pipefail
    # debug log
    set +x
  4. 使用しているサービスからシークレットの値を取得し、envmanに追加します。

    set +x
    GIT_PASSWORD_SECRET=TODO Your call to fetch the secret value
    envman add --key GIT_HTTP_PASSWORD --value $GIT_PASSWORD_SECRET

    実際のコマンドは使用しているサービスによって異なります。例えば、AWSでBitriseを使用しており、EC2マシンがAWS Secrets Managerにアクセスできる場合、次のようなコマンドでシークレットを取得できます:

    set +x
    USERNAME=aws secretsmanager get-secret-value --secret-id BitriseDemoGitUsername --region eu-central-1 | jq -r '.SecretString'
    envman add --key GIT_HTTP_USERNAME --value $USERNAME
    PASS=aws secretsmanager get-secret-value --secret-id BitriseDemoGitPassword --region eu-central-1 | jq -r '.SecretString'
    envman add --key GIT_HTTP_PASSWORD --value $PASS