CircleCIでプロジェクトごとに設定した環境変数の値を確認したい

2020.05.15

こんにちは、CX事業本部の若槻です。

今回は、CircleCircleCIの[project settings]-[Environment Variables]で設定した環境変数の値を確認するTipsです。

登録済みの環境変数は[project settings]-[Environment Variables]の画面では確認できなくなる

CircleCIではプロジェクトごとに利用したい環境変数を画面コンソールの[project settings]-[Environment Variables]から設定することができます。 image.png

しかし登録後は値の末尾4文字以外がマスクされて、コンソールから環境変数の値は確認できなくなってしまいます。 image.png

セキュリティ的にはこれで良いのかもしれませんが、「同じ環境変数を別のプロジェクトでも設定したい!」という場合などには別途方法により確認が必要となります。

確認できなかった方法

[project settings]-[Environment Variables]で設定した環境変数を確認する方法を探っていきます。まずは確認できなかった方法です。

ブラウザのディベロッパーツールを使う

よくあるWebサービスのパスワード入力画面のように、ブラウザ画面上への表示だけマスクしているが、実際のDOM上では未加工の値が使われているのでは?と思い、ブラウザのディベロッパーツールから[project settings]-[Environment Variables]を見てみましたが、確認できませんでした。 image.png

[Preparing Environment Variables]STEPの画面出力を確認する

実行されたworkflowでは[Preparing Environment Variables]というSTEPが実行され、実行内で利用可能な環境変数をコンソールから確認することができます。

ただし、[environment variables]より設定した環境変数に関しては、**REDACTED**とマスクが入り、確認できませんでした。 image.png

echoコマンドで画面出力する

環境変数をechoコマンドで画面出力してみます。テンプレートは下記のようになります。

version: 2

jobs:
  get_envs:
    docker:
      - image: circleci/hello
    steps:
      - run:
          name: test
          command: |
            echo 'account_id: '${account_id}
            echo 'access_key_id: '${access_key_id}
            echo 'secret_access_key: '${secret_access_key}

workflows:
  version: 2
  workflow:
    jobs:
      - get_envs

画面出力はproject settingsの環境変数の値部分のみマスクされ、確認できませんでした。 image.png

ファイルに書き込んだ内容を画面出力する

環境変数を一度ファイルに書き込み、その内容を画面出力してみます。configファイルは下記のようになります。(変更部分以外省略)

    steps:
      - run:
          name: test
          command: |
            env > env.txt
            cat env.txt

画面出力はproject settingsの環境変数の値部分のみマスクされ、確認できませんでした。 image.png

確認できた方法

続いて確認できた方法です。

末尾の文字を除いてスライスした結果を画面出力する

環境変数の値を末尾4文字を除いてスライスした結果を画面出力してみます。configファイルは下記のようになります。(変更部分以外省略)

    steps:
      - run:
          name: test
          command: |
            echo ${access_key_id:0:-4}

末尾4文字を除いた値がマスクされず画面出力され、確認することができました。 image.png

値の末尾4文字は[project settings]-[Environment Variables]から確認可能なので、これらを合わせれば値の全文が確認可能となります。

暗号化して画面出力する

環境変数の値をbase64暗号化した結果を画面出力してみます。configファイルは下記のようになります。(変更部分以外省略)

    steps:
      - run:
          name: test
          command: |
            echo $access_key_id | base64

画面出力することができました。 image.png

画面出力した暗号化文字列をbase64で復号することにより、環境変数の値を確認することができました。

$ echo 'MTIzNGFiY2Q1Njc4ZWZnaAo=' | base64 -d
1234abcd5678efgh

ファイルに書き込んでArtifactsに保存する

環境変数の値をファイルに書き込み、そのファイルを組み込み関数のstore_artifactsでArtifactsに保存します。configファイルは下記のようになります。(変更部分以外省略)

    steps:
      - run:
          name: test
          command: |
            echo 'account_id: '${account_id} >> env.txt
            echo 'access_key_id: '${access_key_id} >> env.txt
            echo 'secret_access_key: '${secret_access_key} >> env.txt
      - store_artifacts:
          path: env.txt

STEPの実行結果です。 image.png

workflowの[Artifacts]タブを開くと、env.txtがダウンロード可能となっています。 image.png

ダウンロードしたファイルを開くと、環境変数の値が確認できました。 image.png

おまけ

環境変数に設定した値と同じ値をただ画面出力するようにしてみます。

    steps:
      - run:
          name: test
          command: |
            echo '1234567890'
      - store_artifacts:
          path: env.txt

環境変数を参照したわけではないのに値の画面出力がマスクされました。どうやらマスクの基準は、環境変数の値で検索をかけて一致する文字列があればマスクする、というもののようです。 image.png

おわりに

今回はまるでサービスの抜け道を探すような内容となり、少し悪いことをしている気持ちにもなりましたが、CircleCIの仕様とセキュリティの工夫の理解につながって良かったです。Tipsとしてお役に立てば幸いです。

以上