4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-11-16

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

このご時世ですので、前回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/upload-artifact@v2.2.0
  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/upload-artifact@v2.2.0
        with:
          name: hidden_name
          path: hidden_name.txt
          retention-days: 30

おわり

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

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

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?