プログラミングの世界はオープンソースのものがたくさんあり、巨人の肩に乗って日々開発をしています。
オープンソースといっても実際はライセンスが決められており、ルールが厳格に決まっています。
先日、その件に関する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さんのブールで話を聞いた際に「ライセンス制限で特定のライセンスのライブラリを使用できないようにできる」とかって話を聞いたことを思い出して、そういった自動的にライセンスの確認ができる仕組みの導入が一番楽だと思いました。
調べないと。
個人的に調べた内容なので、間違いなどがありましたらご指摘頂けると嬉しいです。