注:元ネタ様以上にネタバレ要素満載ですので、ご注意ください。
このご時世ですので、前回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日)
この期間を過ぎれば、契約したログ自体が消えるので踏み倒せます
完成形
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を使ったほうが良いです。
-
GitHub公式は、信頼できないactionの場合、バージョン指定をバージョンタグ(
v1
,v1.0.1
など)ではなくコミットSHAで指定することを推奨しています。 ↩