ShellCheckはシェルスクリプトの静的解析ツールだ。文法エラー、バッドプラクティス、セキュリティリスクを指摘してくれる。チェック内容はWikiをみてほしい*1。
はじめの一歩
Macの場合はbrew install shellcheck
でインストールできる。早速以下のシェルスクリプトに対して解析をかけてみる。
#!/bin/bash echo "Deleting files in $DIR..." rm -rf $DIR
解析はshellcheck vulnerable.sh
で実行する。結果、以下のように表示される。
GitHub Actions
次にこれをGitHub Actions*2で解析することを考える。実はGHAにはデフォルトでShellCheckが装備されている。
なので、GHAでシェルスクリプトを実行する前に静的解析をかければ良い。以下のように定義し試してみる。
name: shellcheck on: push: branches: - master jobs: shellcheck: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: ref: ${{ github.head_ref }} - name: shellcheck run: shellcheck vulnerable.sh
すると無事に止まってくれた。
ワークフローファイル自体に潜む脆弱なコマンドはどうするか
ここまではシェルスクリプトに対して解析をかけていた。だが、GHAではワークフローファイルに以下のように直接コマンドを記述することもできる。
# 略 - name: vulnerable command run: rm -rf $DIR
これをどう検出するかだが、いきなり答えを出すとactionlint
を使えば良い。
actionlint
これはGHAのワークフローファイルを静的解析してくれるツールだ。本来の使い方は、書いたワークフローファイルをいちいちpushしてGHAを動かしてデバッグする…という煩わしい動きを解消するためのツールである。とても便利だ。
実はこのactionlintにはShellCheckも盛り込まれている。すると、ワークフローファイルに直接書かれたコマンドに対しても解析をかけてくれるのである。このことを確認するためにローカルでactionlintを動かしてみる。Macの場合はbrew install actionlint
でインストール可能だ*3。
インストール後、actionlint
を実行するだけでワークフローファイルを探して解析をかけてくれる。今回は以下のように怒ってくれた。
あとはactionlintをGit HookやShellCheck同様GHAなどでチェックすればよい*4。
おわりに
ShellCheckもactionlintも簡単に使えて効果は絶大だ。明日からでも是非使ってみてほしい。
ついでにだけど、Dockerfileに対する静的解析も過去の記事に書いている。こっちも併せて読んでもらえると参考になると思う。