Donate245Patreon129


Deploy PlantUML safely

Sysdreamの協力を得て、PlantUMLにセキュリティプロファイルの概念を導入することになりました。

version 1.2020.11以降、 PlantUMLを実行する際にセキュリティプロファイルを選択しなければなりません。 デフォルトはLEGACYです。 このプロファイルは古いバージョンのPlantUMLの動作をエミュレートします。ですから、安全に1.2020.11にアップグレードすることができます。しかし、アップグレード後にはあなたの使用法に適したプロファイルを選択する必要があります。

これは、PlantUMLが異なるセキュリティ設定を必要とする多くの異なる構成で使用できるために必要となった機能です。

もし1.2020.11より古いバージョンを使用していて、システムがインターネットからアクセス可能であれば、古いバージョンの PlantUML は、あなたが期待するよりも少しだけ多くのことを暴露するかもしれませんので、アップグレードすべきでしょう。 デフォルトのLEGACYプロファイルでさえ、古いバージョンの PlantUML の動作よりも安全です。

Choose your Security Profile

セキュリティプロファイルは、2種類の方法で設定することができます。

OS環境変数の設定は、次のようにします。

set PLANTUML_SECURITY_PROFILE=INTERNET

または

setenv PLANTUML_SECURITY_PROFILE INTERNET

Java環境変数の設定は、コマンドラインのオプションで行います。 (-Dフラグを忘れずに)

java -DPLANTUML_SECURITY_PROFILE=INTERNET -jar /path/to/plantuml.jar ...

JavaとPlantUMLをライブラリとして使用している場合は、次のようにします。

System.setProperty("PLANTUML_SECURITY_PROFILE", "INTERNET");

List of Security Profiles

5つの異なるセキュリティプロファイルから選択できます。

UNSECURE

PlantUMLがUNSECUREプロファイルで動作する場合、PlantUMLは実行中のサーバのすべてのローカルファイルにアクセスでき、どのようなURLにもアクセスできることを意味します。

UNSECUREという名前は、このプロファイルを使用してはいけないという意味ではありません。ローカルのPlantUML環境で、スクリプトからドキュメントを生成する場合は、完全に安全であり問題ありません。

インターネットからアクセス可能なWebサーバで使用されている場合は、ユーザの入力したテキストで何が起きるかをコントロールできないため、問題になる可能性があります。

LEGACY

現在、このプロファイルがPlantUMLのデフォルトです。古いバージョンのPlantUMLと同じように、ローカルファイルとURLへの完全なアクセスを提供します。これは、スクリプトの動作を変えることなく、安全にバージョン1.2020.11へアップグレードできることを意味します。

しかし、アップグレード後にLEGACY以外の適切なセキュリティプロファイルを設定することを検討してください。

INTERNET

このプロファイルは、インターネットに接続されているサーバー向けの設計がされています。

INTERNETプロファイルで実行している場合、PlantUMLは(ホワイトリストを使用している場合を除き)ローカルファイルにアクセスできません。ただし、ポート80または443を使用している全てのURLにアクセス可能です。特定のポート(イントラネットサーバ用の8080のような)へのアクセスが必要な場合、ホワイトリストを使用することもできます。

ALLOWLIST

ALLOWLISTプロファイルでは、PlantUMLはローカルファイルやURLにアクセスできません。ローカルまたはリモートへのアクセスを明示的に許可するために、ホワイトリストを使用しなければいけません。

SANDBOX

SANDBOXプロファイルでは、PlantUMLはローカルファイルやURLにアクセスできません。ホワイトリストも無視されます。つまり、完全に閉じた環境です。

このプロファイルは主にテストで使用します。もし誰かがSANDBOXプロファイルを実行中に外へのアクセスに成功したならば、私たちはセキュリティホールがあると認識し、修正対応を行います。

Allowlists

ホワイトリストを定義するための変数を3つ用意しています。

これらの変数はPLANTUML_SECURITY_PROFILEと同じ方法で設定できます。

plantuml.allowlist.path

; (Windows) または : (Linux)を区切りとしたフォルダのリストに対して、ユーザーがアクセスする権限を与えます。

java -DPLANTUML_SECURITY_PROFILE=INTERNET  -Dplantuml.allowlist.path=/usr/common/:/usr/plantuml/  ...

plantuml.include.path

plantuml.allowlist.pathとほぼ同じように機能します。唯一の違いは、ユーザーがファイルをフルパスで記述する必要がなくなるという点です。PlantUMLはユーザーがフルパスを指定せずにファイル名だけを指定した場合にも、plantuml.include.pathで定義されたフォルダ内のファイルを検索します。

java -DPLANTUML_SECURITY_PROFILE=INTERNET  -Dplantuml.include.path=c:/windows/plantuml/  ...

plantuml.allowlist.url

; (Windows、Linux共通)を区切りとしたURLのリストに対して、ユーザーがアクセスする権限を与えます。

java -DPLANTUML_SECURITY_PROFILE=ALLOWLIST  -Dplantuml.allowlist.url=https://plantuml.com/;http://somelocalserver:8080/commons/  ...