OSSライブラリのライセンス管理の決定版「FOSSA」を使ってみよう

# はじめに

毎々お世話になっております。日立ソリューションズの森下です。
今回はOSSライセンス管理ツール「FOSSA」をご紹介します。
https://fossa.com/
ツールの概要から実際の使い方まで、一通りご紹介していきたいと思います。
※OSS…Open Source Software（オープンソースソフトウェア）

# FOSSAとは

FOSSAはOSSプロジェクトでも数多く採用されている、SaaS型のOSSライセンス管理ツールです。
GitHubプロジェクトのREADMEにFOSSAのバッジや Statusがよく入っているので、見たことがある方も多いかもしれません。

例：FOSSAのバッジ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/6e23079e-0394-3880-2b3a-36e5b25ea523.png" width="200">
例：ESLintのFOSSA Status
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/691b5600-b13c-e817-0779-7795a28738eb.png)

見て分かるとおり、FOSSAはプロジェクトが利用しているOSSをチェックし、そのライセンスを把握するためのツールです。

OSSのライセンスにはMIT License、BSD-3-Clause、Apache-2.0といった非コピーレフト型から、ソースコード開示義務のあるGPL-2.0、AGPL-3.0といったコピーレフト型まで、さまざまなライセンスが存在します。
ソフトウェア開発を行う企業・組織は、これらのライセンスに遵守するために運用ルールを定め、ツールによる自動化などを行い、管理しています。
ここで言うツールには例えば以下のようなものがありますが、FOSSAもこれらの仲間ということになります。

 - 無償ツール
   - [FOSSology](https://www.fossology.org/)
   - [licensed](https://github.com/github/licensed)
   - [LicenseFinder](https://github.com/pivotal/LicenseFinder)
   - [LicenseToolsPlugin](https://github.com/cookpad/LicenseToolsPlugin)
   - [license-checker](https://github.com/davglass/license-checker)
 - 有償ツール
   - [BlackDuck](https://www.synopsys.com/ja-jp/software-integrity/security-testing/software-composition-analysis.html)
   - [WhiteSource](https://www.whitesourcesoftware.com/)
   - [Insignary Clarity](https://www.insignary.com/)  


FOSSAが他のツールと何が違うかというと、大きな特徴として、提供元であるFOSSA Inc,が「 https://tldrlegal.com/ 」を運営しているというポイントが挙げられます。
tldrlegal.comはソフトウェアライセンス解釈のまとめサイトであり、これはOSI（Open Source Initiative）が提供するOSSライセンス情報からも参照される（※1）ほど、この業界では高い知名度を誇ります。
本サイトの運営元が提供するツールということで、FOSSAは「OSSライセンス管理の”決定版”」と言っても過言ではないツールかと思われます。

なおFOSSAを採用している企業としては、Docker、Tesla、Twitter、Uber、Verizon Mediaなどがあるようです（HPのロゴを参照）。米国の大手ITやスタートアップで採用されているようで、アジャイル、DevOpsにも対応したツールになっているようです。

※1…以下のようにOSI のライセンス情報は「OSI Page」「Wikipedia page」に加えて「tl;dr legal」を参照しています。
https://api.opensource.org/license/Apache-2.0

```

{
    "id":"Apache-2.0",
    "identifiers":
        [
            (省略)
        ],
    "links":
        [
            {
                "note":"tl;dr legal",
                "url":"https://tldrlegal.com/license/apache-license-2.0-%28apache-2.0%29"
            },
            {
                "note":"Wikipedia page",
                "url":"https://en.wikipedia.org/wiki/Apache_License"
            },
            {
                "note":"OSI Page",
                "url":"https://opensource.org/licenses/Apache-2.0"
            }
        ],
    "name":"Apache License, Version 2.0",
    
    (省略)
}


```

（念のため補足ですが、OSIはOSSを定義している団体です。https://ja.wikipedia.org/wiki/Open_Source_Initiative ）

# FOSSAでプロジェクトをスキャンする

それではさっそくFOSSAを使ってみましょう。FOSSAには無償版があります。

:::note warn
<b>無償版の機能制限について</b>

FOSSAの無償版には以下のような制限が存在します。

1. 解析可能なプロジェクト数が5つまで
2. 依存関係の解析は5階層まで
3. ポリシーのカスタマイズ不可
4. レポート出力の対象は直接依存パッケージのみ（推移的依存は含まない）
など

特に2.の制限は解析結果が不完全になってしまうため影響が大きそうです。本番利用の際は有償版などを検討ください。
:::

FOSSAのURLにアクセスするとサインアップができます。
https://fossa.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/58969fc5-8a24-4c73-1cd9-3f6de1703d35.png)

表示された画面で、メールアドレス、パスワードを入力し、サインアップします。他サービスのアカウントでサインアップすることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/857133c8-b5ac-264f-d768-baf66f765999.png)
サインアップ後、Add Projects画面が表示できたら、プロジェクトのタイプを選択します。今回は推奨である「INTEGRATE LOCALLY」のアイコン（画面左）を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/5531381d-085d-241c-8393-ee20badee8ad.png)
Integrate Locally画面が表示されます。スキャン手順が記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/7bf14dfc-1842-e7f5-163d-0e2c80622252.png)
まず、スキャナであるfossa-cliをインストールします。スキャン対象のソースコードが存在する環境で、インストールコマンドを実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/71fe0af4-a289-c999-47b9-22fd009fcdf8.png)
例として、Linux環境での実行結果は以下となります。

```
$ curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install-latest.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11251  100 11251    0     0  49346      0 --:--:-- --:--:-- --:--:-- 49346
fossas/fossa-cli info checking GitHub for latest tag
fossas/fossa-cli info found fossa-cli 3.4.0 binary for linux/amd64 at https://github.com/fossas/fossa-cli/releases/download/v3.4.0/fossa_3.4.0_linux_amd64.zip
fossas/fossa-cli info
fossas/fossa-cli info ------
fossas/fossa-cli info Notice
fossas/fossa-cli info ------
fossas/fossa-cli info
fossas/fossa-cli info FOSSA collects warnings, errors, and usage data to improve
fossas/fossa-cli info the FOSSA CLI and your experience.
fossas/fossa-cli info
fossas/fossa-cli info Read more: https://github.com/fossas/fossa-cli/blob/master/docs/telemetry.md
fossas/fossa-cli info
fossas/fossa-cli info If you want to prevent any telemetry data from being sent to
fossas/fossa-cli info the server, you can opt out of telemetry by setting
fossas/fossa-cli info FOSSA_TELEMETRY_SCOPE environment variable to 'off' in your shell.
fossas/fossa-cli info
fossas/fossa-cli info For example:
fossas/fossa-cli info    FOSSA_TELEMETRY_SCOPE=off fossa analyze
fossas/fossa-cli info
fossas/fossa-cli info
Archive:  fossa_3.4.0_linux_amd64.zip
  inflating: fossa
fossas/fossa-cli info installed /usr/local/bin/fossa

```

バージョン番号を確認できたら、インストール成功です。

```
$ fossa -V
fossa-cli version 3.4.0 (revision b3301313cb96 compiled with ghc-9.0)
```

続いてスキャンを実行します。
今回はスキャン対象として、以下のようなNodeプロジェクト（expressを利用）を用意しました。

```
$ mkdir express-sample2
$ cd express-sample2
$ npm init    # package名やversionなどはすべてデフォルト(Enterを押下)
$ ls
package.json
$ npm install express
$ ls
node_modules  package.json  package-lock.json
```

それではこのプロジェクトをスキャンしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/37dabb98-5632-0281-2b3e-2de8d3bd8def.png)
画面に示されているとおり、API Keyを指定して実行します。

```
$ FOSSA_API_KEY=<your-api-key> fossa analyze

============================================================

    View FOSSA Report:
    https://app.fossa.com/projects/xxxxxxxxxxxxxxxxxxxxxxxx

============================================================
```

スキャンが成功すると、FOSSAへのURLが表示されます。参照すると、スキャン結果を見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/121748bc-b948-78dc-52fb-acc04470943d.png)


# OSSとそのライセンスを確認する

それでは実際にどんなOSS（およびライセンス）が使われているか確認していきましょう。
注：画面キャプチャは有償版のものになっておりますので、一部、無償版と画面が異なる場合があります。

## DEPENDENCIES

まず利用しているOSSを画面のDEPENDENCIESタブから確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/7a1e9f10-424b-7ec0-56d0-ddb2c0684e89.png)
今回の例では全部で57個のライブラリが利用されていることが分かりました。
各パッケージの名称とバージョン、ライセンスがこのタブで一覧として確認できます。

また各OSSのホームページやAUTHORといった詳細も確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/670eda0d-1041-3055-8337-bddf692b68b8.png)
ここでライセンスの「View File Matches」を選択すると、ライセンス情報の詳細を見ることができます。
どこからライセンスを検出したのかが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/af9bd114-d480-88cb-df78-30fabb2ad50e.png)
ほとんどのライセンスチェックツールは、パッケージのメタデータで宣言されたライセンスのみをレポートします。これに対してFOSSAは、ソースファイルも確認して結果を報告することができます。ライブラリに混入している思いがけないライセンスのソースファイルなどを検出することができます。

## LICENSES

続いて、LICENSESタブを確認します。ここではどんなライセンスが含まれていたかを一覧で確認することができます。画面右ではObligation（責務）を一覧で参照することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/89f99028-83f4-60df-2f92-50e658269189.png)
OSSのライセンスには責務があります。ライセンスだけを確認して「よし、GPLは入ってなかった」「よし、AGPLは入ってなかった」で終わってしまうのはライセンスを遵守したことにはなりません。「ライセンスファイルを含める」「著作権表示を含める」といった責務を果たして初めて、ライセンス条件を遵守することができます。本画面ではこの責務を一覧で表示し、各責務に関してどのOSSが履行の義務があるかを確認できるようにしています。この責務情報は、冒頭で説明したtldrlegal.comの情報が用いられています。

また本画面からライセンスを選択することで、各ライセンスがどのOSSに該当するかも確認することができるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/6735e9b4-ac49-a256-8386-1ce04593e7f9.png)

## REPORT

最後にREPORTタブを確認します。
FOSSAのレポートは、OSSライセンスファイルの出力に特化しています。OSSライセンスファイルとは、[OSSライセンスの教科書](https://gihyo.jp/book/2018/978-4-297-10035-3)の12章「製品出荷・ソフトウェアリリース時の実務」にも記載されている、OSSリスト（ライセンス全文や著作権表示を含む）を記載したファイルです。プロダクトリリース時の実務としてほとんどの場合必要になるものです。

本レポート出力において、FOSSAではデータ形式としてHTML、MARKDOWN、PDFに加えて、CSVやプレーンテキストにも対応しています。また最近セキュリティ界隈などで注目されているSBOM（SPDX）も出力できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/7890fe5a-1a68-fae9-949f-ece4c954c2cf.png)
レポートはリンクを発行することができるので、HTML形式で発行してプロダクトのユーザにURLを配布することもできます。FOSSAのレポートにはライセンス全文や著作権表示などを含めることができるので、FOSSA一つで大部分のライセンス責務を果たすことが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/451c3ff9-8e19-0b8d-c463-f91ffd365cd9.png)
またプレーンテキスト形式であれば、これをダウンロードしてそのままプロダクトに同梱するというやり方でもライセンス責務を果たすことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328366/1768d3bf-0db8-a0ec-9394-fa1911692dd6.png)
主要なOSSライセンスでは、プロダクトを配布する際に同梱したOSSの著作権表示、およびライセンス全文などの配布が責務となっています。FOSSAは、こういった作業をスキャン～レポートまでで自動化し、OSSライセンス管理の効率化を実現するツールになっています。

# その他

参考になりそうなリンクを以下に示します。

 - FOSSAドキュメント：https://docs.fossa.com/docs  
今回の紹介ではNode.jsのプロジェクトを扱いましたが、FOSSAは他にもJavaやRuby、Goなど著名なプロジェクトのスキャンは概ねカバーしています。
またCIツールやGitHub、Jira、Slackなど一通り統合が可能となっていますので、この辺りの詳細はドキュメントをご覧ください。
 - fossa-cliリポジトリ：https://github.com/fossas/fossa-cli  
スキャンの設定については、fossa-cliのGitHubプロジェクトから詳細を確認できます。

# 最後に

以上が、OSSライセンス管理ツールFOSSAの紹介になります。
FOSSAはOSSライセンスのチェックで有名ですが、OSS脆弱性のチェックにも対応していますので、OSSのマネジメント全般に活用できそうです。https://fossa.com/product/open-source-vulnerability-management
というわけで、今後もOSSマネジメントを頑張っていきましょう。

※本文に記載の会社名、商品名は各社の商標、または登録商標です。