いくつかのシステムヘルパーを活用しようとしています。chroot(2)このプロセスは、ホスティングWebサーバーの下にRootDirectory=
あるデフォルトのPythonスクリプトです。/srv/http
シャバンがあります#!/usr/bin/python
(他の組み合わせも試してみました)
サービスファイルも非常に簡単です。
[Unit]
Wants=network-online.target
After=network-online.target
AssertPathExists=/srv/http
[Service]
Type=simple
Restart=always
RestartSec=10
RootDirectory=/srv/http
PrivateTmp=true
ExecStart=/server.py
PIDFile=/run/miniweb.pid
[Install]
WantedBy=multi-user.target
ログには、実行可能ファイルが見つからないことが明確に表示されます。
Mar 11 19:23:49 bigrigv2 systemd[13213]: testweb.service: Failed to execute /server.py: No such file or directory
Mar 11 19:23:49 bigrigv2 systemd[13213]: testweb.service: Failed at step EXEC spawning /server.py: No such file or directory
実行可能としてマークされます。
-rwxr-xr-x 1 anton anton 650 Mar 11 19:06 server.py
私もExecStart=/bin/python /srv/http/server.py
別のバリエーションを試しました。RootDirectory
chrootサービススクリプトでPythonや他のバイナリを正しく実行する方法と概念を理解しているかどうかはわかりません。私の前提は、サービスを実行する前にchroot:sと入力した/srv/http
後、この場合サービスを終了してPythonを実行できないことです。これは意味がありますが、なぜ/server.py
見つけることができないのかわかりません。他のバイナリに依存するタスクをどのように実行しますか?ほとんどのソリューションでは、言語(Cなど)を活用しchroot
てアプリケーションで制御する方法について言及していますが、非常に制限されたbashスクリプトやスタンドアロンバイナリ以外のものに対してサービススクリプトにchrootを提供するという点はありません。
おそらく非常に簡単な質問でしょう。しかし、私はとても困惑しています。どんな助けでも大変感謝します!
答え1
質問に直接答えるには:
RootDirectoryを使用してchrootの外部に外部依存関係を持つサービスを正しく実行する方法。
あなたはできません。 chroot刑務所に何かがある場合、バイナリやライブラリを含む外部のものにはアクセスできません。しかし、まだシステムを保護する方法があります。
Service Managerが実行されているシステムのルートであるホストルートに基づくディレクトリパスを選択します。実行されるプロセスのルートディレクトリを設定するには、chroot(2)システムコールを使用します。これを使うと、chroot()刑務所でプロセスバイナリとすべての補助ファイルが利用可能であることを確認する必要があります。。
これを設定すると、呼び出し時にRootDirectory=/srv/http
実行/server.py
しようとします/usr/bin/python
が、パスが見つからないため失敗します。このようなことができても、そうしようとしたときや、これらのライブラリがchrootにインストールされていないため、ExecStartPre=/bin/cp /usr/bin/python /src/http/usr/bin/python
問題が発生する可能性があります。私は良い設定なしであなたと同じ設定でテストしましたが、あなたと同じエラーが発生しました。import flask
import pyramid
これには3つのオプションがあります。
chroot に必要なすべてを提供します。 Debianベースのシステムを使用している場合
debootstrap
設定deboostrap buster /srv/http
して動作する良いツールです。基本システムをインストールしてから、sudo chroot && apt install python python-flask
必要なものをインストールできます。サービスをルートに切り替えるのではなく、組み込みオプションを使用してサービスをサンドボックス化します。具体的には:
RemoveIPC=true
そしてPrivateTmp=true
。これにより、実行プロセスによって生成されたIPCオブジェクトと一時ファイルのライフサイクルがサービスランタイムに関連付けられます。/tmp
とは通常、システムが誰でも書き込むことができる唯一のディレクトリであるため、/var/tmp
デバイスがシャットダウンした後にファイルが残らないようにします。NoNewPrivileges=true
そしてRestrictSUIDSGID=true
。これにより、呼び出しプロセスはSUID / SGIDファイルまたはディレクトリを利用または作成できません。ProtectSystem=strict
サービスがファイルシステム上のどこにも書き込まれないように無効にしますProtectHome=read-only
(例外は、および/dev/
/proc/
です。/sys/
)サービスを特定のディレクトリに書き込むことを許可するには、を使用する必要がありますReadWritePaths=
。RuntimeDirectory=
サービスには、サービスユーザーが所有するランタイムディレクトリが割り当てられ、システムがシャットダウンすると自動的に削除されます。
- ステップ2では、私が言ったすべての内容を1行に置き換えることができます。
DynamicUser=true
。良い時間をお過ごしください開発者の説明はこちら
とにかく、あなたがそれを使用しない場合User=
、またはDynamicUser=
使用する必要があります。これにより、サービスroot
に他の秘密への読み取りアクセス権がないようになります。/etc/shadow
私はオプション3が大好きです。これを有効にすると、サービスからシステムが保護されます。