はじめに
最近サプライチェーン攻撃が激化しており治安が悪いので、自衛のためにTakumi Guardで既知のマルウェアをブロックする設定しておく。
Takumi Guardには稼働確認用にマルウェアとマークされた無害なテストパッケージが存在するのだが、本稿執筆時点ではすべてのエコシステムでテストパッケージが提供されているわけではなく、通信がちゃんと曲がっているのか確認するのが地味に手間だったので、fenceという軽量なサンドボックスを使った通信先の確認方法についても補足する。
というか、Takumi Guardの設定方法自体は公式ドキュメントの抜粋なので、むしろオマケの稼働確認方法のためにこのメモを書いているみたいなところある。
Takumi Guardとは
Takumi Guardは、npmやpipなど各種パッケージマネージャとレジストリの間にプロキシを挟むことで、既知のマルウェアをブロックしてくれるサービスです。
無料版と有料版がありますが、既知のマルウェアをブロックするだけであれば、無料の範囲でも最低限の保護が得られます。
個人のローカル端末で使うだけであれば、プロキシ設定をするだけでアクセストークンなしでも手軽に使い始められ、メアド登録してアクセストークンを発行すればレートリミットの緩和や、マルウェア検出時の事後通知サービスなどが受けられます。
他の選択肢として、 Aikido Safe Chain や Socket Firewall Free も存在しますが、本稿執筆時点でJSやPythonだけでなく、RubyやGoにも無料の範囲で対応しているのが個人的にうれしいポイントです。
環境
稼働確認した手元の環境は以下のとおりです。
- macOS: 26.5.1
- npm: 11.16.0
- pip: 26.1.1
- poetry: 2.4.1
- uv: 0.11.16
- bundler: 4.0.13
- go: 1.26.3
- mise: 2026.5.5
- fence: 0.1.59
匿名設定(レジストリURLのみ)
以下では、アクセストークンなしの匿名設定でレジストリURLのみ設定していきます。
npm
~/.npmrc に以下の設定を追加
registry=https://npm.flatt.tech/
または環境変数に以下を追加
NPM_CONFIG_REGISTRY=https://npm.flatt.tech/
参考:
- https://shisho.dev/docs/ja/t/guard/quickstart/npm
- https://docs.npmjs.com/cli/v11/using-npm/config#registry
pip
~/.config/pip/pip.conf に以下の設定を追加
[global]
index-url = https://pypi.flatt.tech/simple/
または環境変数に以下を設定
PIP_INDEX_URL=https://pypi.flatt.tech/simple/
参考:
- https://shisho.dev/docs/ja/t/guard/quickstart/pypi
- https://pip.pypa.io/en/stable/cli/pip_install/#install-index-url
poetry
本稿執筆時点では、ユーザスコープでグローバルに設定する方法がありません。プロジェクト単位で設定する必要があります。
pyproject.toml があるディレクトリで、以下のコマンドを実行します。
$ poetry source add --priority=primary takumi-guard https://pypi.flatt.tech/simple/
あるいは、 pyproject.toml に以下の設定を追加
[[tool.poetry.source]]
name = "takumi-guard"
url = "https://pypi.flatt.tech/simple/"
priority = "primary"
参考:
- https://shisho.dev/docs/ja/t/guard/quickstart/pypi
- https://python-poetry.org/docs/repositories/#primary-package-sources
uv
~/.config/uv/uv.toml に以下の設定を追加
[[index]]
url = "https://pypi.flatt.tech/simple/"
default = true
または環境変数に以下を設定
UV_DEFAULT_INDEX=https://pypi.flatt.tech/simple/
参考:
bundler
~/.bundle/config に以下の設定を追加
BUNDLE_MIRROR__HTTPS://RUBYGEMS__ORG/: "https://rubygems.flatt.tech/"
参考:
- https://shisho.dev/docs/ja/t/guard/quickstart/rubygems/
- https://bundler.io/man/bundle-config.1.html#MIRRORS-OF-GEM-SOURCES
go mod
以下のコマンドで設定する
$ go env -w GOPROXY=https://golang.flatt.tech
または環境変数に以下を設定
GOPROXY=https://golang.flatt.tech
設定ファイルのパスはGOENVの設定により異なります。
場所は go env GOENV コマンドで確認できますが、mise経由でインストールした場合は ~/Library/Application Support/go/env に設定されていました。
設定ファイルとして管理しづらい場所であれば、 ~/.zshrc などに環境変数で設定するほうがよさそう。
参考:
mise
miseはバックエンドでいくつかパッケージマネージャを利用できますが、バックエンドごとに実装が異なるので個別に確認が必要です。
npm
miseのnpmバックエンドの実装は、内部的にaubeがインストールされていればaubeが使われますが、なければnpmが使われます。
参考:
pipx
miseのpipxバックエンドの実装は、内部的にデフォルトでuvxが使われています。
このuvxはユーザスコープのuvコマンドの設定を見てくれないので追加の設定が必要です。
~/.config/mise/config.toml に以下の設定を追加
[settings.pipx]
registry_url="https://pypi.flatt.tech/simple/{}/"
または環境変数に以下を設定
MISE_PIPX_REGISTRY_URL=https://pypi.flatt.tech/simple/{}/
参考:
go
miseのgoバックエンドの実装は、内部的にはそのままgoコマンドを使っているので、 GOPROXY の設定をしておけば有効です。
参考:
稼働確認
Takumi Guardではあらかじめ稼働確認用に、マルウェアとして判定されてブロックされるテストパッケージが存在しますが、本稿執筆時点ではすべてのエコシステム向けのテストパッケージが揃っていません。具体的にはJSとGoはあるが、PythonとRubyがなかった。
ここでは、プロキシの設定で通信がちゃんと曲がっているか確認するのに、fenceという軽量なサンドボックスを使うことで、想定通りの通信先となっているかを確認します。
macOSの場合は、fenceはbrew経由でインストールできます。
$ brew tap fencesandbox/tap
$ brew install fencesandbox/tap/fence
fenceはGo製のツールで、GitHubリリースでバイナリが配布されているので、他の環境でも簡単にインストールできます。mise経由でインストールする場合は以下の通り。
$ mise use -g github:fencesandbox/fence
fenceは引数にコマンドを指定すると、sandboxの中でコマンドを実行し、デフォルトですべての通信をブロックします。
$ fence curl https://example.com
curl: (56) CONNECT tunnel failed, response 403
fence -m オプションでログが見えるので、通信先が確認できます。fenceのオプションと実行するコマンドをオプションを区別するには、-- で区切ります。
$ fence -m -- curl https://example.com
[fence:logstream] 17:01:06 ✗ mach-lookup com.apple.diagnosticd (curl:84011)
[fence:http] 17:01:06 ✗ CONNECT 403 example.com https://example.com:443 (0s)
curl: (56) CONNECT tunnel failed, response 403
fenceで通信先ドメインを許可するのには設定ファイルを書く必要がありますが、デバッグ用とで使う場合はいちいちファイルに保存するのが面倒なので、プロセス置換を使ってワンライナーで書けなくもないです。力技ですが。
$ fence -m -s <(echo '{"network":{"allowedDomains":["example.com"]}}') \
-- curl https://example.com
[fence:logstream] 17:06:00 ✗ mach-lookup com.apple.diagnosticd (curl:84207)
<!doctype html><html lang="en"><head><title>Example Domain</title><meta name="viewport" content="width=device-width, initial-scale=1"><style>body{background:#eee;width:60vw;margin:15vh auto;font-family:system-ui,sans-serif}h1{font-size:1.5em}div{opacity:0.8}a:link,a:visited{color:#348}</style></head><body><div><h1>Example Domain</h1><p>This domain is for use in documentation examples without needing permission. Avoid use in operations.</p><p><a href="https://iana.org/domains/example">Learn more</a></p></div></body></html>
また、デフォルトではファイルシステムへの読み書きも制限されており、パッケージマネージャの実装によっては通信前にローカルのキャッシュを探しにいったりするので、パッケージマネージャごとに読み書きするパスを列挙するのは手間です。
ここではちょっと手を抜いて、fenceに組み込みで定義されている code テンプレートを借用します。これはAIコーディングエージェントがアクセスしそうな通信先のドメインやファイルパスのセットをよしなに定義してくれているもので、具体的には以下に定義があります。
https://github.com/fencesandbox/fence/blob/v0.1.59/internal/templates/code.json
都合がよいことに標準的なパッケージレジストリとは通信できますが、Takumi Guardのようなプロキシは通信許可先に含まれていません。というわけで、正しくプロキシされていれば *.flatt.tech への通信がブロックされることを観測できるはずという作戦です。
※本稿執筆時点では、code テンプレートに rubygems.org も登録されていないので、bunlderはプロキシ設定の有無によらずブロックされますが、ブロックされたドメインはログで確認できるのでヨシとし、ここでは吊るしの code テンプレートをそのまま使います。
npm
$ fence -m -t code -- npm install @panda-guard/test-malicious
pip
$ fence -m -t code -- pip install ruff
poetry
$ mkdir test1 && cd test1
$ poetry init --name test1 -q
$ poetry source add --priority=primary takumi-guard https://pypi.flatt.tech/simple/
$ fence -m -t code -- poetry add --no-cache ruff
uv
$ mkdir test1 && cd test1
$ uv init --name test1
$ fence -m -t code -- uv add --no-cache ruff
bundler
$ mkdir test1 && cd test1
$ echo "source 'https://rubygems.org'" > Gemfile
$ echo "gem 'rake'" >> Gemfile
$ fence -m -t code -- bundle install --no-cache
go mod
$ mkdir test1 && cd test1
$ go mod init verify-takumi-guard
$ fence -m -t code -- go get github.com/flatt-security/hola-takumi-go@v0.1.0
mise
pipx
$ fence -m -t code -- mise use pipx:ruff
まとめ
Takumi Guardの設定方法と通信先の確認方法について説明しました。
プロキシ設定をするだけでアクセストークンなしでも手軽に使い始められるので、コスパのよい対策ではなかろうか。
Takumi Guardが対応しているエコシステムごとにテストパッケージを提供してくれれば、こんなめんどくさい稼働確認をしなくて済むのだが。なにとぞなにとぞ ![]()