FOSSologyの解析オプション(エージェント)の詳細
はじめに
FOSSologyにはnomosやmonkなどのさまざまな解析エージェントが含まれています。これらはソースコードのアップロード時にオプションにて指定することになりますが、今回はこれらの解析オプション(エージェント)について解説したいと思います。
中心的な役割を担うエージェントから順に説明していきます。それではいきましょう。
Nomos License Analysis
Nomos(読み方:ノモス)はMonkと並ぶFOSSologyの中心的なスキャンエージェントの1つです。正規表現ベースのライセンススキャナーで、短いフレーズとヒューリスティックを用いて識別をおこないます。
具体的なイメージを持つために実際に使われる正規表現を見てみます。
https://github.com/fossology/fossology/blob/master/src/nomos/agent/STRINGS.in
かなり大きいファイルですが各正規表現のパターンは以下のように記載されています。
%ENTRY% _TITLE_XYZ-LICENSE1
%KEY% "licen[cs]"
%STR% "XYZ-licen[cs]e (v|version ) 1\.?0"
まずKEYを使用してライセンスに関連する文を特定した後、正規表現を使用してライセンスの識別がおこなわれます。このような段階的な認識と特定によって解析が効率的になるようです。
またNomosはライセンス認識が不十分な場合にも「UnclassifiedLicense」と特定したり、「BSD」「GPL」といったライセンスカテゴリーの特定をおこなったりします。
例えば、ライセンススキャンにおいては以下のような場面があります。
- 何らかのライセンスと思われるフレーズが認識できたが、OSSライセンスかどうかは特定できない。
- BSDであることは認識できたが、何条項かがわからない。
- GPLであることは認識できたが、バージョンがわからない。
このような場面において、Nomosは分かる範囲で「UnclassifiedLicense」「BSD」「GPL」といったレベルの特定をおこないます。
ここまで説明したようにNomosは「広めにライセンスを検出すること」に長けたツールです。偽陽性を許容し、ライセンスと思われるものは(完璧に特定までいかなくても)すべて検出しようとするのが特徴です。
次に説明するMonkはこの逆の特徴を持っていますので、この2つを組み合わせることで効果的なライセンススキャンが可能となります。
ちなみにNomosという名前は「法」を表すギリシャ語(ギリシャ神話の法の守護神)にちなんで付けられたもので、これがFOSSologyの起こりとなっています(詳細)。
参考:NomosのWiki
https://github.com/fossology/fossology/wiki/Nomos
Monk License Analysis
Monk(読み方:モンク)はNomosと並ぶ中心的なスキャンエージェントの1つです。解析対象のファイルにライセンステキストが出現するかどうか、実際のライセンステキストとの一致率を計算して出力します。
ライセンステキストと判断されたものはJaccard係数で類似度が計算されます。現在は66%以上の一致率のものがMonkで検出される仕様になっているようです。
※検出される最低値はmonk.hのMIN_ALLOWED_RANKで66と指定されています。
https://github.com/fossology/fossology/blob/master/src/monk/agent/monk.h
Monkは既存のライセンスを正確に検出することが得意ですが、未知の(新しい)ライセンスなどは認識することはできません。実際のところMonkの検出が出現することは多くないため、Nomosと組み合わせて使用するのがベストプラクティスとなります。
参考:MonkのWiki
https://github.com/fossology/fossology/wiki/Monk
Copyright/Email/URL/Author Analysis
本オプションは、著作権関連の情報を検出する解析エージェントを有効にします。正規表現によって、「"Copyright 2022 xxxx"」のような「"Copyright"」で始まる文字列を検出したり、「"written by"」「"maintained by"」で始まる文字列などを検出します。またコード所有者に関する情報として、メールアドレス(例:xxxx@mail.domain)やURL(例:http://…)についても検出します。
正規表現はこちらで見ることができます。
https://github.com/fossology/fossology/blob/master/src/copyright/agent/copyright.conf
インストール先はこのあたりになります。
/usr/local/share/fossology/copyright/agent/copyright.conf
参考:CopyrightのWiki
https://github.com/fossology/fossology/wiki/Copyright
ECC Analysis
ECC(Export Control Codes / Export Control and Customs)のオプションは、輸出規制に関連する文字列検出をおこなう解析エージェントを有効化します。正規表現に基づいて「"export control"」「"crypt"」などの文字列が検出されます。
正規表現はこちらで見ることができます。
https://github.com/fossology/fossology/blob/master/src/copyright/agent/ecc.conf
インストール先はこのあたりになります。
/usr/local/share/fossology/ecc/agent/ecc.conf
参考:ECCのWiki
https://github.com/fossology/fossology/wiki/ECC
Keyword Analysis
本オプションは、任意のキーワードを検出する解析エージェントを有効化します。デフォルトでは「"patent"」「"licensed under"」などの文字列を検出可能です。設定ファイルに検出したい文字列を指定すれば、任意の文字列を検出することができます。
正規表現はこちらで見ることができます。
https://github.com/fossology/fossology/blob/master/src/copyright/agent/keyword.conf
インストール先はこのあたりになります。
/usr/local/share/fossology/keyword/agent/keyword.conf
例えば以下のように「hogehoge」を追記すれば、解析時に「hogehoge」という文字列を検出してくれます。
sudo sed -i "$ a keyword=__keyword__|(hogehoge)" /usr/local/share/fossology/keyword/agent/keyword.conf
MIME-type Analysis
本オプションではMIMEタイプを検出することができます。解析済みファイルのInfo画面からMIMEタイプを確認することができます。
Package Analysis
本オプションではrpmファイル(CentOSなどRed Hat系のLinuxパッケージ)の解析をおこなうエージェントを有効化することができます。rpmのメタデータをパースして出力します。
なお「Package Analysis」という名称から、例えばnpmパッケージなどの依存関係の解析ができそうな印象も受けますが、これはサポートされていないようです。
★本オプションについては現状、上記のとおりログとして参照する方法しかわかっていません(専用のGUIで視覚的に見るようなことはできないように思われます)。またドキュメントなどを見るとdebファイルも解析できるようなのですが、試したところ解析できませんでした。念のためご注意ください。
Ojo License Analysis
Ojoは「SPDX identifier」を検出するオプションです。
参考:SPDX IDs
https://spdx.dev/ids/
SPDX identifierは、SPDX(Software Package Data Exchange)というLinux Foundation傘下のプロジェクトが定義しているライセンスの識別子です。例えば、Apache License 2.0なら「Apache-2.0」、MIT LicenseとGPL 2.0のデュアルライセンスなら「MIT OR GPL-2.0」といった具合に表現します。
SPDX identifierはLinux Kernelをはじめ、さまざまなプロジェクトで使われているライセンス表現のスタンダードです。
https://www.kernel.org/doc/html/latest/process/license-rules.html#license-identifier-syntax
Ojoは以下のようにSPDX identifierを検出します。
REUSE.Software Analysis
REUSEは、FSFE(Free Software Foundation Europe)によって開始された取り組みで、ソフトウェアプロジェクトにおける著作権・ライセンスの宣言仕様を定義しています。
参考:REUSE Specification
https://reuse.software/spec/
本仕様では、例えばソースファイルのヘッダーには以下のように1つ以上のSPDX-FileCopyrightTextタグ(著作権表示)と1つ以上のSPDX-License-Identifierタグ(ライセンス名)を含めることが指定されています。
# SPDX-FileCopyrightText: 2016, 2018-2019 Jane Doe
# SPDX-FileCopyrightText: 2019 Example Company
#
# SPDX-License-Identifier: GPL-3.0-or-later
またテキストファイルではない場合で、上記のようなコメントを書けないとき(例:foobar.jpg)には、対象ファイルに.licenseを付けたファイル(foobar.jpg.license)を作成して上記のような情報を記載することが指定されています。
参考:REUSE準拠のソースコードのサンプル
https://github.com/fsfe/reuse-example
本仕様に則って書かれたソースコードがFOSSologyの解析対象である場合、この規則に沿ってライセンス情報を検出すれば効率よく、かつ正確に(誤検知なく)解析ができそうです。これがREUSE.Software Analysisの特徴です。またREUSE.Softwareは「ReSo」と略され、FOSSologyの解析結果画面においては「reso」と表示されます。
なお本オプションを有効にすると自動的にOjoも有効化されます。ReSoは単独で解析は実施しておらず、Ojoの解析結果を使っています。
仕組みは以下のとおりです。
- ojoがSPDXのライセンス表現を見つける
- 見つけたファイルのファイル名が *.license(例:foobar.jpg.license)だった場合、REUSE対象としてresoに情報を渡す
- resoはojoの情報から対象ファイル(例:foobar.jpg)を同一ライセンスとして検出する
Software Heritage Analysis
「Software Heritage」は、ユネスコ(UNESCO)とフランス国立情報学自動制御研究所(INRIA)の連携協定によるプロジェクトです。簡単にいうと「Internet Archive(Wayback Machine)のソースコード版」になります。
参考:Software Heritage
https://www.softwareheritage.org/
世の中の利用可能なすべてのソフトウェアソースコードを収集・保管するサービスで、GitHubやGitLab、npmなどのホスティングサイトから情報を収集してアーカイブしています。
FOSSologyでは2019年にSoftware Heritageとの統合機能が実装されています。解析対象ファイルがSoftware Heritageで公開されているものかどうか(≒解析対象にOSSが含まれているかどうか)を調べられるようになっています。
統合の詳細はこちらに記載されています。
https://github.com/sandipbhuyan/fossology/wiki/GSoC-Final-Report:-Integration-of-Software-Heritage-in-FOSSology
仕組みは以下のとおりです。
- 解析対象の各ファイルからsha256を計算する。
- FOSSologyのAPI「/api/1/content/sha256:(hash)」によりSoftware Heritageを検索する。
- 該当データがあればライセンス情報とともにFOSSologyのGUIで表示する。
sha256以外は社外に送信されることはないため、ソースファイルの内容が外部に流出することはありません。企業ユーザーも安心して使っていただける機能かと思います。
以上です。
今回はFOSSologyの解析オプション(各エージェント)の解説をおこないました。OSSコンプライアンス活動の一助になれば幸いです。
もう少しくわしい情報が欲しいなどのご相談がありましたら、こちらからお気軽にお問い合わせください。