GitHub Actionsで実装した湯婆婆にマスクをつける


:元ネタ様以上にネタバレ要素満載ですので、ご注意ください。

このご時世ですので、前回GitHub Actionsで実装した湯婆婆にマスクをつけてもらいます。

はじめに

湯婆婆様は重症化しやすい高齢者ですので
前回の実装では、契約書に書いた名前がログに残ってしまいます。契約者のプライバシーにも関わりますし、何よりも奪った名前が後から参照できてしまうという「湯婆婆の労働搾取システム」に対する重大なインシデントが発生します。

今回は、入力された名前をログから隠すことを目指します。

add-mask

GitHub Actionsのログから、指定した値を****にマスクします。
なお、secretsコンテキストから持ってきた値は、最初からマスクされています。

# "secret_value"という文字列を****にマスクする
echo "::add-mask::secret_value"
# 環境変数nameとその値を****にマスクする
echo "::add-mask::$name"

注意点

add-mask評価前のログには効果がない

以下の部分などに該当文字列が利用された場合、ログに表示されてしまうことがあります。

  • job名
  • Actionのコマンドに直接埋め込んだ変数
  • workflow_dispatchで渡されたinputs (GitHubのissue)

本番利用前に、必ずマスクされているかテストしてください。

今回は以下のように対応することで、ログに入力した名前が表示されることを防いでいます。

  • job名の名前部分を固定で「****」にする
  • webhookのイベントペイロードから入力値を取得するよう変更 (上記issueのコメントより)

マスクされるのはログ表示だけ

あくまでも「GitHub Actionsのログ表示がマスクされる」だけですので、ファイルへのリダイレクトや、各actionからは普通に見えてしまいます
「定義されている環境変数・シークレットのすべてを外部のHTTPサーバーに送信する」ような悪意のあるactionをworkflowに含めないよう、細心の注意を払ってください。1

upload-artifact

このままだと、千尋が元の名前を思い出すことができなくなってしまうため、別口で名前を保存しておきます。
ビルド成果などをGitHub Actionsの実行結果画面にアップロードできるactions/upload-artifactを使用します。

# ファイルを作成
- run: echo "ありがとう 千尋。僕の名前は「$name」" > hidden_name.txt
# 作成したファイルをアップロード
- uses: actions/[email protected]
  with:
    name: hidden_name # artifactに表示される名前(任意)
    path: hidden_name.txt # アップロードするファイル/フォルダのパス

有効期間

保存されたartifactの有効期間は、retention-daysオプションで指定した日数になります。
この日数を過ぎた場合、永遠に元の世界には帰れなくなります。

未指定あるいは0を指定した場合は、リポジトリのログ保持期間と同じになります。
ログ保持期間はリポジトリの「Settings」→「Actions」→「Artifact and log retention」で確認できます。(デフォルトは90日)
この期間を過ぎれば、契約したログ自体が消えるので踏み倒せます

完成形

yubaba-mask.yml
name: 湯婆婆(マスク)

on:
  workflow_dispatch:
    inputs:
      name:
        description: '契約書だよ。そこに名前を書きな。'
        required: false

jobs:
  keiyaku:
    runs-on: ubuntu-latest
    steps:
      - name: フン。****というのかい。贅沢な名だねぇ。
        id: rnd
        run: |
          set -eu
          name=$(jq -r '.inputs.name' $GITHUB_EVENT_PATH)
          echo "::add-mask::$name"
          random=$[RANDOM % ${#name}]
          echo ::set-output name=new_name::${name:random:1}
          echo "ありがとう 千尋。僕の名前は「$name」" > hidden_name.txt
      - name: 今からお前の名前は${{ steps.rnd.outputs.new_name }}だ。いいかい、${{ steps.rnd.outputs.new_name }}だよ。分かったら返事をするんだ、${{ steps.rnd.outputs.new_name }}!!
        uses: actions/[email protected]
        with:
          name: hidden_name
          path: hidden_name.txt
          retention-days: 30

おわり

今回の実装は「認証トークンを外部から注入する」ようなワークフローに使えそうですが、そのような用途の場合、素直にSecretsを使ったほうが良いです。


  1. GitHub公式は、信頼できないactionの場合、バージョン指定をバージョンタグ(v1, v1.0.1など)ではなくコミットSHAで指定することを推奨しています。