20
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

オープンソースのライセンスを理解する

Posted at

プログラミングの世界はオープンソースのものがたくさんあり、巨人の肩に乗って日々開発をしています。
オープンソースといっても実際はライセンスが決められており、ルールが厳格に決まっています。
先日、その件に関するXの投稿を見たこともあり、客先とのトラブルを避けるためにもライセンスについて調べたもをまとめます。

主なライセンスと特徴

ライセンス 正式名称 カテゴリ 商用利用 複製 改変 再配布 ソースコード公開の必要
GPL GNU General Public License コピーレフト 可能 可能 可能 (ソースコード公開必須) 可能 (GPLで配布) 必要
AGPL GNU Affero General Public License コピーレフト 可能 可能 可能 (ソースコード公開必須) 可能 (AGPLで配布) 必要 (ネットワーク経由でも公開)
LGPL GNU Lesser General Public License コピーレフト 可能 可能 可能 (ライブラリ部分は公開必須) 可能 (LGPLで配布) ライブラリ部分のみ必要
MIT Massachusetts Institute of Technology License パーミッシブ 可能 可能 可能 可能 不要
Apache 2.0 Apache License 2.0 パーミッシブ 可能 可能 可能 可能 不要
BSD Berkeley Software Distribution License パーミッシブ 可能 可能 可能 可能 不要
MPL Mozilla Public License 中間 可能 可能 可能 (改変部分は公開必須) 可能 (MPLで配布) 改変部分のみ必要

全てではありませんが、よく出てくるライセンスとその特徴をまとめました。
基本的には商用利用可能で複製、改変、再配布も可能です。しかし、ソースコードの公開の必要性が異なってきます。
この時、重要になるのがコピーレフトの概念です。

コピーレフト

ライセンスについて調べていると出てくる言葉で結構重要な概念です。
要約すると 「自由に使用・改変・配布して良いけど、同じラインセスで公開してね」 ということです。

コピーレフトの性質のあるライセンスの付与されたライブラリを改変して再配布する場合は、そのライセンスが基本的に連鎖する仕組みです。

開発時に使用するライブラリはどうか

実際にビジネスでの使用する場合を考えると、サービス開発時に使用するライブラリのライセンスが問題になります。
一部の機能のために使用したライブラリのライセンスの影響でソースコード全体を開示する必要が発生した場合、大きな問題になります。
また、この問題を考える際に、WEBサービスかアプリケーションかで異なります。
WEBサービスは基本的にWEBサーバー上で動き、ユーザーにコードは配布されません。それに対して、アプリケーションはユーザー個々にコードが配布される形になるため、開示義務が同じライセンスでも異なってきます。
前出の表での「再配布」の項目に該当します。
私が調べた範囲のものを表にしてみました。

ライセンス 使用形態 ソースコード公開義務
GPL WEBサービス 不要
各端末アプリケーション 必要(全体のソースコード公開が必要)
AGPL WEBサービス 必要(全体のソースコード公開が必要)
各端末アプリケーション 必要(全体のソースコード公開が必要)
LGPL WEBサービス 不要(ライブラリ部分の改変がなければ不要)
各端末アプリケーション 不要(ライブラリ部分の改変がなければ不要)
MIT WEBサービス 不要
各端末アプリケーション 不要
Apache 2.0 WEBサービス 不要
各端末アプリケーション 不要
BSD WEBサービス 不要
各端末アプリケーション 不要
MPL WEBサービス 必要(改変した部分のソースコードのみ公開)
各端末アプリケーション 必要(改変した部分のソースコードのみ公開)

WEBサービスであってもAGPLライセンスだと、ソースコード全体を公開する必要があるので問題になりそうです。

ライセンスの調べ方

ライセンスの種類と特徴をある程度調べてので、実際に自分の開発環境でどうなのかを調べてみようと思います。
私はPython使いなので、Pythonでの話になりますがライブラリのライセンス確認方法です。

特定の1つのライブラリのライセンスを調べたい場合は下記コマンドになります。

pip show <ライブラリ名>

出力例はこんな感じです。

$ pip show requests
Name: requests
Version: 2.31.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages
Requires: certifi, charset-normalizer, idna, urllib3
Required-by: CacheControl, poetry, requests-toolbelt, Sphinx

requestsのライセンスはApache 2.0は自由度の高いライセンスなので、商用でも自由に使えそうです。

実際の開発の場面ではたくさんのライセンスを使用することになるので、その環境にあるライブラリを一括で調べたいですよね。

まず一括で調べるために必要なライブラリをインストールします。

pip install pip-licenses

私のとある環境でのライブラリとライセンスです。

$ pip-licenses
 Name                       Version      License
 GitPython                  3.1.43       BSD License
 Jinja2                     3.1.4        BSD License
 MarkupSafe                 2.1.5        BSD License
 Pygments                   2.18.0       BSD License
 altair                     5.4.1        BSD License
 attrs                      24.2.0       MIT License
 blinker                    1.8.2        MIT License
 cachetools                 5.5.0        MIT License
 certifi                    2024.8.30    Mozilla Public License 2.0 (MPL 2.0)
 changecase                 0.1.0        UNKNOWN
 charset-normalizer         3.3.2        MIT License
 click                      8.1.7        BSD License
 gitdb                      4.0.11       BSD License
 idna                       3.10         BSD License
 jsonschema                 4.23.0       MIT License
 jsonschema-specifications  2023.12.1    MIT License
 markdown-it-py             3.0.0        MIT License
 mdurl                      0.1.2        MIT License
 narwhals                   1.9.0        MIT License
 numpy                      2.1.1        BSD License
 packaging                  24.1         Apache Software License; BSD License
 pandas                     2.2.3        BSD License
 pillow                     10.4.0       Historical Permission Notice and Disclaimer (HPND)
 protobuf                   5.28.2       3-Clause BSD License
 pyarrow                    17.0.0       Apache Software License
 pydeck                     0.9.1        Apache License 2.0
 python-dateutil            2.9.0.post0  Apache Software License; BSD License
 pytz                       2024.2       MIT License
 referencing                0.35.1       MIT License
 requests                   2.32.3       Apache Software License
 rich                       13.9.1       MIT License
 rpds-py                    0.20.0       MIT License
 six                        1.16.0       MIT License
 smmap                      5.0.1        BSD License
 streamlit                  1.39.0       Apache Software License
 tenacity                   9.0.0        Apache Software License
 toml                       0.10.2       MIT License
 tornado                    6.4.1        Apache Software License
 typing_extensions          4.12.2       Python Software Foundation License
 tzdata                     2024.2       Apache Software License
 urllib3                    2.2.3        MIT License

ライセンス不明のものや、今まで調べたもの以外のライセンスも散見されるので今後追加で調べないとです。

社内管理がしやすいように、CSVやJSONでの出力も可能です。

pip-licenses --format=csv
pip-licenses --format=json

まとめ

仕事でコーディングしている時も正直これまであまりライセンスを意識していませんでした。
「オープンソースだから、自由に使ってOK」となんとなく思っていましたが、そう簡単な話はないですよね。
「実際訴えられることがあるのか」などの指摘はあると思いますが、企業の法令遵守の観点から意識するべきだとは思います。

受託開発などでも、不用意にライセンス違反をしてしまうと将来的に問題になる可能性があります。
気をつけていきましょう。

以前、PyConでAnazondaさんのブールで話を聞いた際に「ライセンス制限で特定のライセンスのライブラリを使用できないようにできる」とかって話を聞いたことを思い出して、そういった自動的にライセンスの確認ができる仕組みの導入が一番楽だと思いました。
調べないと。

個人的に調べた内容なので、間違いなどがありましたらご指摘頂けると嬉しいです。

20
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?