Windows + Git Bash環境でmiseとSafe Chainを共存させる
開発関連技術
Windows, mise, Safe Chain
めちゃ久しぶりの小ネタ記事です。
背景#
筆者の個人の開発では Windows + Git Bash 環境を使っています。
Node.js のバージョン管理ではしばらく Volta を使っていました。
この Volta をより汎用性の高い mise に移行したかったのですが、Safe Chain と共存させるのに少しだけ工夫が必要だったので、備忘録として残しておきます。
mise は言語や CLI ツールのバージョン管理、環境変数やタスク管理の機能を提供するツールです。
Safe Chain は、マルウェアに汚染されているパッケージをブロックしてくれるツールで、最近流行っている Shai Hulud による攻撃に対する防御策の1つです。
詳細は各公式情報を参照してください。
環境のつくり方#
mise のインストール#
mise の公式ドキュメントにもある通り、winget での導入に対応しています。
winget install jdx.misewinget で導入した場合は、パスを通す部分も自動で行ってくれるので楽ちんですね。
Node.js のインストール#
mise 経由で任意のバージョンの Node.js をインストールして、とりあえずグローバル使用設定にしておきます。
mise install [email protected]
mise use --global [email protected]Safe Chain のインストール#
mise 経由で Safe Chain を導入します。
mise exec node -- npm install -g @aikidosec/safe-chain
mise exec node -- safe-chain setupこの後にターミナルを再起動することで、Safe Chain が使えるようになるのですが…
以下の動作確認用パッケージをインストールしようとしても、ブロックしてくれず🙄
mise exec node -- npm install safe-chain-testまた、nodeやnpmコマンドを使うにあたり、毎回mise exec nodeを書くのがめんどくさいという課題もありました。
Volta では直接nodeやnpmコマンドを使っても、カレントディレクトリにおける設定バージョンを自動的に適用してくれていたため、これを mise でもやりたかったのです。
エイリアスの活用#
- mise 経由でインストールした Safe Chain のマルウェア検知がうまく動作しない
- mise でバージョン管理している
nodeやnpmコマンドを実行するには、mise exec nodeをつける必要がある
この2つの課題に対して、筆者の場合はエイリアスで解決しました。
Bash の環境で読み込まれるファイルにエイリアスを設定しておきます。
筆者の場合は、エイリアス用の別ファイルを用意して、それを.bashrcから読み込むようにしました。
# mise
# 本来は mise activate を実行すれば、直接 node や npm コマンドが実行できるようになるが
# Windows + Git Bash で mise activate すると git や vi などの PATH が通らなくなってしまう。
# 環境変数の PATH に <homedir>\AppData\Local\mise\shims 通すことでも直接 node, npm コマンドが使えるようになるが、
# Safe Chain がうまく動作してくれないため、エイリアスで対応する。
if command -v mise >/dev/null 2>&1; then
alias node='mise exec node -- node'
alias npm='mise exec node -- aikido-npm'
fiif [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fiこれで直接nodeやnpmコマンドを書いても、実質的には mise を通したコマンド実行をしてくれるのでいい感じになりました。
npmの方はaikido-npmにしているのがポイントです。これは通常のnpmコマンドではなく、Safe Chain が提供しているnpmコマンドのラッパーにあたるものとなるため、Safe Chain が動作してくれるようになりました。
今回はnpmコマンドのみの対応ですが、他のパッケージマネージャーのコマンドでも同様にエイリアスで対応できそうです(筆者は未確認です)
ちなみに直接nodeやnpmコマンドを書けるようにする方法として、mise の公式ドキュメントに記載があった方法も試しました。
しかし、筆者の環境では2つの課題の解決ができなかったため、今回の方法をとりました。
その1:.bashrcにmise activate bashを実行する処理を記載しておく方法
-> vi や git などほかのコマンドのパスが通らなくなってしまった。
その2:Windows の環境変数の PATH に<homedir>\AppData\Local\mise\shimsを追加する
-> 直接nodeやnpmコマンドを実行できるようにはなったが、Safe Chain のマルウェア検知がうまく動作しなかった。
ただし、もし Git Hook で任意の npm パッケージを動作させたい時は、この PATH 追加が必要なようだった(セキュリティ的には Lifecycle Scripts の取り扱いは要注意…!)
Safe Chain のマルウェア検知の動作確認#
マルウェア検知の動作確認用のパッケージをインストールしようとして、ブロックされていれば Safe Chain が動作しています。
> npm install safe-chain-test
✖ Safe-chain: Malicious changes detected:
- [email protected]
Safe-chain: Exiting without installing malicious packages.他にもよりよい方法はあるかもですが、とりあえず mise と Safe Chain の共存ができたので満足してます。
Shai Hulud による攻撃怖いですしね…。
皆様もご安全に開発を~。