--- title: "OSS ライセンスの判別・管理とフィルタリング" order: 1 hidden: true ---

現在のソフトウェア開発では、すべてを 1 から書き上げることはまれです。多くの場合、何らかのライブラリを活用して開発の工数を節約しています。

検索すれば、Nuget ライブラリなど、たくさんのオープンソースのライブラリやパッケージがあり、さらに多くの企業が有料のライブラリ、パッケージ、ソフトウェアを有償で受注開発あるいは販売しています。

パッケージを使用すると、パッケージの開発者が提示するライセンス規約に同意したとみなされます。たいていのパッケージは、安全なのですが、GNU3 や GPL3 のように法的なリスクになりかねないライセンスもあります。

GNU3がライセンスのパッケージを使って開発をしたら、開発したアプリケーションもGNU3としてオープンソースにしなければなりません。時間と、お金と、社運をかけて作成したソフトウェアを、無料で配布しなければなりません。

注意したいのは、あなた自身ではなく、あなたが無料利用あるいは有償で購入したパッケージが、他人の GNU3 や GPL-3 などの地雷的なライセンスを使っていた場合です。

地雷ライセンスを避けるための社内プロセス

これを避ける方法は 2 つあります。

ライブラリや、コードのコピペではなく、Nuget などのパッケージを使うことです。パッケージとは、ライブラリに、マニフェストファイルという、バージョンやライセンス情報、そして、依存するパッケージのバージョンやライセンス情報が含み、zip 化したものです。ライセンス情報が含まれるので、簡単にどのライセンスタイプを調べられます。

もうひとつは、パッケージの検品プロセスを確立することです。開発者が、開発の際に好き勝手にパッケージをダウンロードするのではなく、専門のチームが検品した信頼できる、安全なパッケージだけを開発者が使えるようすることです。外部のパッケージのキャッシュと、社内のパッケージを保管する専用のリポジトリを作成し、開発者がそこからパッケージをダウンロードするのがよいでしょう。

例えば、食品工場では、「ケーキの材料となる牛乳がちょっと足りないから、コンビニで買ってくる」なんてしませんよね。きちん決められた場所で、決められた製品のみを材料として使用します。システム開発も同じことです。

地雷ライセンス探知機と、検品済みリポジトリとしての ProGet

パッケージ管理ツール ProGet には、サードパーティのオープンソースパッケージを使用する際に、地雷的なライセンスを避けるための機能が 2 つあります。

ProGet のライセンスの検出機能とは

ProGet はパッケージのライセンス規約を自動的に検出し、各パッケージの「パッケージの概要ページ」に表示します。 ProGet には、信頼できるオープンソース ライセンス タイプのデータベースが含まれています。これらのライセンスは、ProGet 内で「known licenses (既知のライセンス)」として処理されます。

このリストは SPDX(リンク先英語)をもとに作られており、つねに最新の状態に更新されています。また、ライセンスのタイプは、いつでも [Licenses (ライセンス)] > [License Types (ライセンスの種類)] で編集できます。

ライセンスの種類は以下の要素から構成されています:

などのライセンスの詳細

などのライセンス規約と関連するURLのリスト

不明なライセンス

パッケージの SPDX 識別子や URL がライセンスの種類のリストに入っていない、もしくはライセンスの表記が全くない場合、不明なライセンスとして認識されます。

不明なライセンスが検知された場合、ProGetからの警告が表示され、新たなライセンスの種類として保存する選択肢が提示されます。以降、同じ SPDX 識別子や URL を持つパッケージが検知された場合、新たに作成されたライセンスの種類として認識させることができます。

ProGet でできるライセンスのフィルタリング

ProGetでは、パッケージのライセンスの種類によって、ダウンロードを許可したりブロックしたりするように設定できます。不明なライセンスを持つパッケージのダウンロードをブロックするように設定することもできます。これらの条件はグローバルとフィード単位のどちらでも設定できます。

ライセンスのダウンロード条件を設定すると、ブロック対象のライセンスを持つパッケージには概要ページで赤色の警告が表示され、ダウンロードが拒否されます。

ライセンスのダウンロード条件

ライセンスのダウンロード条件は既知のライセンスの種類と、許可もしくはブロックのフラグをもとに構成されています。グローバルとフィード、両方で設定が可能です:

グローバルのライセンス条件: Licenses (ライセンス)

グローバルとフィード両方のレベルでライセンスの条件が設定されている場合、フィードの設定が優先されます。

不明なライセンスのブロック

ProGetでは、グローバルとフィード両方のレベルで不明なライセンスをブロックするように設定することもできます。

不明なライセンスを持つパッケージをブロックするように設定した場合、明確に許可されていないライセンスを持つパッケージもブロックされます。例えば、ライセンスのダウンロード条件が一つしか設定されておらず (例:MITのライセンスを許可する)、不明なパッケージをブロックするように設定した場合、明確に許可をしたライセンス(例:MIT)を持つパッケージのみのダウンロードが許可されます。