この記事はアドベントカレンダー12日目の記事です。
ご挨拶
どうも、github-readme-statsのmost-used-languageをみたらNixが3番目になっていて驚いているComaviusです。本稿では、Nixとsbomnixを使って、サーバー上の実行環境の設定におけるライセンス違反を検出できるようにした話をします。
Nixって?
本題ではないので簡潔に、Nixについて説明をしようと思います。Nixは宣言的なパッケージマネージャーで、まずNix言語で書かれた依存関係の設定を評価し、その結果を用いてプログラムであったり環境であったりを作成することができるというツールです。詳しく知りたい場合はNix Reference Manual(英語)あるいはNix入門(日本語)を参照するとよいと思います。
本題-動機
サーバー上で何らかの依存関係を持つアプリを動かす際、AGPLライセンスが問題となることがあります。AGPLのもと公開されたものをサーバー上で動作させそれをAPI越しに提供すると、場合によっては派生物全体をAGPLで公開しなければならなくなります。モダンなエコシステムでは依存ライブラリの ライセンスを チェックする 機能を使うことができますが、環境に多くの言語/アプリケーションを導入する必要がある場合は、これらを統一的に使うことは難しいです。そのため、パッケージマネージャーのレイヤーで依存先のライセンスをチェックしたい、というのが今回の動機です。
本題-実装
大体のパッケージマネージャーでライセンスはメタデータとして提供されており、今回はNixpkgs(Nix公式によって提供されているパッケージマネージャー)のメタデータをsbomnixを用いてspdx形式に変換しました。spdx/tools-golangなどを使えばきちんと解析することもできそうですが、AGPLを弾ければ何でもよいのでsbom.spdx.json
をgrepして済ませました。
総括
Nixがメインの環境に影響を与えずに環境をビルドしてくれるおかげで、仮想環境を立てたりせずに依存関係を調べることができ、実装はかなり楽でした。これを導入した結果、実際に2つのAGPLライセンスで公開されているライブラリを検出でき、リリース前に無事弾くことができました。しかし、Nixpkgsでメタデータが適切に設定されていないパッケージもあり、そのような場合はsbomnixでは検出できないため、この点が今後の課題です。
終わりに
apt show <package-name>
でそのパッケージのライセンスを確認できるという記事を見たのですが、実際に叩いても出てこなくて困っています。このあたりご存じの方はご一報いただけるとありがたいです。
明日の担当は@show_nokiさんと@sent_pさんです。お楽しみに!
タイトル画像左側のNixのロゴはCC BY 4.0のもとで公開されています。