Python埋め込みの権限

Pythonスクリプトのアクセス制御とセキュリティ制限 #

GraalPyをJavaに埋め込むことは、GraalVM Polyglot Sandbox で機能します。

PythonのPOSIXインターフェース #

オペレーティングシステムインターフェースがPythonスクリプトに公開される方法は、GraalPy固有です。デフォルトでは、すべてのアクセスはJavaインターフェースを介してルーティングされますが、一部のパッケージはPOSIX APIの詳細に依存しており、直接ネイティブアクセスが必要です。

Graal言語(Truffleフレームワーク上に実装されたもの)は通常、システム関連の関数をTruffle抽象化レイヤーを使用して実装します。これはOSに依存せず、GraalPyまたは他のGraal言語をJavaアプリケーションに埋め込むときにユーザーに拡張ポイントを提供します。たとえば、Truffle FileSystemサービスプロバイダーを参照してください。

標準のPythonライブラリもOS抽象化を提供しますが、より低いレベルのインターフェースを公開します。たとえば、osモジュールは、一部のPOSIX関数を直接公開します。非POSIXプラットフォームでは、このインターフェースはある程度エミュレートされます。

GraalPyは、osなどの組み込みPythonモジュールによって提供されるシステム関連機能の2つの代替実装(それぞれ「バックエンド」と呼ばれる)を提供します。PosixModuleBackendオプションは、どのバックエンドを使用するかを決定します。有効な値は、nativejavaです。

ネイティブバックエンド #

このバックエンドは、CPython(参照Python実装)とほぼ同じ方法でPOSIX APIを直接呼び出します。

このアプローチは、CPythonとの互換性が最も高く、中間エミュレーションレイヤーなしで、基盤となるOSインターフェースへのベアアクセスを提供します。

デフォルトでは、この実装はTruffle抽象化レイヤーをバイパスするため、サンドボックス化されず、Truffle FileSystemサービスプロバイダーや、システムインターフェースに関連する他のPolyglot APIプロバイダーのカスタム実装をサポートしません。

ネイティブバックエンドは、graalpyまたはその他のPython関連ランチャーを介してGraalPyが起動されるときにデフォルトで選択されます。例外は、Oracle GraalVMでのみ使用可能な-managedサフィックス付きのPython関連ランチャー(たとえば、graalpy-managed)であり、デフォルトではjavaPOSIXバックエンドを使用します。

ネイティブバックエンドの制限

既知の制限は次のとおりです

  • os.forkはサポートされていません
  • _posixsubprocess.fork_execpreexec_fnパラメーターをサポートしていません

Javaバックエンド #

このバックエンドは、Truffle抽象化レイヤーを使用するため、システムインターフェースとサンドボックス化に関連するカスタムPolyglot APIプロバイダーをサポートします。この抽象化はPOSIXに依存しないため、必要なすべての機能を公開するわけではありません。一部の機能はエミュレートされ、一部の機能はサポートされていません。

Javaバックエンドは、Context APIを介してGraalPyが実行される場合、つまり、Javaアプリケーションに埋め込まれている場合、または-managedサフィックス付き(Oracle GraalVMでのみ使用可能)のPython関連ランチャーを使用して起動される場合にデフォルトになります。

Javaバックエンドの制限

GraalPyは、実行時に実行される関数の既知の非互換性に関する情報(OSインターフェース関連の関数を含む)をログに記録できます。このロギングを有効にするには、コマンドラインオプション--log.python.compatibility.level=FINE(またはその他の目的のロギングレベル)を使用します。

Javaバックエンドの既知の制限は次のとおりです

  • その状態は実際のOS状態から切り離されており、特に次のことが当てはまります
    • ファイル記述子:Pythonレベルのファイル記述子はネイティブコードでは使用できません。
    • 現在の作業ディレクトリ:起動時に現在の作業ディレクトリに初期化されますが、その後は個別に維持されます。そのため、たとえば、Pythonでのchdirは、プロセスの実際の現在の作業ディレクトリを変更しません。
    • umask:現在の作業ディレクトリと同様の制限がありますが、起動時の実際のシステム値に関係なく、常に0022に初期化されます。
  • ファイルアクセス/変更時間の解決はJDKに依存します。Javaバックエンドが保証できる最高の精度は秒単位です。
  • os.accessおよびfaccessat POSIX関数に基づくその他の機能は、次をサポートしていません
    • 有効なID。
    • モードがF_OKのみでない限り、follow_symlinks=False

Pythonネイティブ拡張機能 #

Pythonネイティブ拡張機能は、デフォルトで、基盤となるシステムへのフルアクセスを備えたネイティブバイナリとして実行されます。埋め込みの制限を参照してください。

ネイティブ拡張機能を実行するために必要なコンテキスト権限は次のとおりです

.allowIO(IOAccess.ALL)
.allowCreateThread(true)
.allowNativeAccess(true)

お問い合わせ