ブログ一覧へ戻るソフトウェアエンジニアリング

Pythonを.soファイルにパッケージする

Pythonを.soファイルへパッケージ化する技術

Pythonは迅速な開発に優れた言語であり、データ数字化や複雑なテキスト処理の課題を解く豊かなエコシステムを持っています。

しかし、製品を顧客のサーバーへ直接展開するとき(On-Premiseモデル)、知的財産の保護という大きな課題に直面しました。

Pythonはインタープリタ言語です。ソースコード全体は実質的にプレーンテキストです。コードディレクトリをそのまま引き渡せば、顧客やサーバーへアクセスできる誰もが、コアアルゴリズムと企業の技術ノウハウをすべて見ることができます。

ソースファイルを削除してバイトコード(.pyc)だけを残しても、一般的なツールを使えば数秒でほぼ元のソースへ逆コンパイルできます。

この課題を解決するため、技術チームは次のソリューションを適用しました。Pythonソースコードを「ブラックボックス」型のバイナリ .so(Shared Object)ファイルへ変換することです。


1. 核となるアイデア:Pythonをマシンコードへ落とす

C、C++、Goなどの言語は、製品を出荷する際にソースコード全体をマシンコード(Machine Code)へコンパイルします。人が読み解けるものではなく、バイナリ列だけになります。

私たちのアイデアは、Cのコンパイル機構を借りてPythonコードを変換することです。

[Pythonソースコード] ──(C-Extensionコンパイル)──► [バイナリ .so ファイル(マシンコード)]
  • 業務ロジックはすべて変換され、(Linux上で)バイナリ .so ファイルへコンパイルされます。
  • システム稼働時、Python Runtimeは通常どおり .so ファイル内の関数をロードして呼び出しますが、元のソースコードは完全に取り除かれています。
  • 攻撃者や競合がサーバーから .so ファイルを抽出しても得られるのはバイナリのマシンコードだけであり、元のソースコードへ戻すことは事実上不可能です。

2. ソースコード保護レベルの比較

[1. 純粋なPythonソース]     ──► 誰でもすぐに開いて読めます。
[2. バイトコード .pyc]      ──► 自動ツールで容易に逆コンパイルされます。
[3. バイナリ .so ファイル]  ──► ネイティブマシンコードで、知的財産を絶対的に保護します。
基準純粋なPythonソースバイトコード(.pyc)バイナリファイル(.so)
可読性公開され、明確読むにはツールが必要読めない
逆コンパイル不要極めて容易ほぼ不可能
実行速度普通起動時はより速いより最適化(Cコードとして実行するため)
On-Premiseの安全性非常に危険高い残存リスクEnterprise水準

3. バイナリ配布(Binary Distribution)のパッケージ化

顧客へ引き渡すとき、システムがスムーズに動き、かつリリースから元のソースファイルを完全に取り除くにはどうすればよいでしょうか。

私たちは Binary Distribution モデルに沿った自動パッケージ化プロセスを構築しました。

  • 自動コンパイル: リリースビルドのパイプラインで、Pythonソースコード全体が自動的にバイナリ .so ファイルへコンパイルされ、その後元の .py ファイルはきれいに削除されます。
  • 安全な配布: 顧客へ引き渡す配布物(Docker Imageまたは展開パッケージ)には実行可能なバイナリファイルだけが含まれます。システムはPython Runtime経由で通常どおり起動・稼働しますが、ユーザーやサーバー管理者は内部の業務ロジックを閲覧したり介入したりできません。

これにより、元のソースコードはすべて自社の内部インフラで絶対的に保護され、実展開環境へ一行のコードも露出しません。


4. 得られた実務上の価値

  1. 知的財産の完全な保護: 企業は、コアアルゴリズムの逆コンパイルや複製を心配せず、パートナーのあらゆるOn-Premiseインフラへ自信を持ってソリューションを展開できます。
  2. 性能の向上: Cのマシンコードとして直接実行することで、重い計算やデータ処理は純粋なインタープリタ実行より高い性能を達成します。
  3. リリースプロセスの標準化: 同期してパッケージ化されたバイナリとして製品を配布することで、On-Premise展開が一貫し、企業顧客の厳しい情報セキュリティ基準に応えられます。

結び

ソフトウェアセキュリティはネットワーク攻撃を防ぐことだけではありません。開発チーム自身の知的価値と技術資産を守ることでもあります。

Pythonを .so へパッケージ化する技術は、効果的なバランスのソリューションです。Pythonの柔軟な開発スピードを活かしつつ、実環境(production)へ製品をリリースするときのバイナリマシンコードの安全性と信頼性を確保します。


BK Hightechのエンジニアチームによる記事です。

Phan Van Tai

執筆 Phan Van Tai

ソフトウェアエンジニア、BK Hightech

一緒に、優れたプロダクトを作りませんか?

プロジェクトについてお聞かせください。1営業日以内にご連絡いたします。

お問い合わせ