RootDirectory= を使用して systemd サービスを実行し、/bin バイナリにアクセスします。

RootDirectory= を使用して systemd サービスを実行し、/bin バイナリにアクセスします。

いくつかのシステムヘルパーを活用しようとしています。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別のバリエーションを試しました。RootDirectorychrootサービススクリプトでPythonや他のバイナリを正しく実行する方法と概念を理解しているかどうかはわかりません。私の前提は、サービスを実行する前にchroot:sと入力した/srv/http後、この場合サービスを終了してPythonを実行できないことです。これは意味がありますが、なぜ/server.py見つけることができないのかわかりません。他のバイナリに依存するタスクをどのように実行しますか?ほとんどのソリューションでは、言語(Cなど)を活用しchrootてアプリケーションで制御する方法について言及していますが、非常に制限されたbashスクリプトやスタンドアロンバイナリ以外のものに対してサービススクリプトにchrootを提供するという点はありません。

おそらく非常に簡単な質問でしょう。しかし、私はとても困惑しています。どんな助けでも大変感謝します!

ベストアンサー1

質問に直接答えるには:

RootDirectoryを使用してchrootの外部に外部依存関係を持つサービスを正しく実行する方法。

あなたはできません。 chroot刑務所に何かがある場合、バイナリやライブラリを含む外部のものにはアクセスできません。しかし、まだシステムを保護する方法があります。

~からman systemd.exec

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 flaskimport pyramid

これには3つのオプションがあります。

  1. chroot に必要なすべてを提供します。 Debianベースのシステムを使用している場合debootstrap設定deboostrap buster /srv/httpして動作する良いツールです。基本システムをインストールしてから、sudo chroot && apt install python python-flask必要なものをインストールできます。

  2. サービスをルートに切り替えるのではなく、組み込みオプションを使用してサービスをサンドボックス化します。具体的には:

  • RemoveIPC=trueそしてPrivateTmp=true。これにより、実行プロセスによって生成されたIPCオブジェクトと一時ファイルのライフサイクルがサービスランタイムに関連付けられます。/tmpとは通常、システムが誰でも書き込むことができる唯一のディレクトリであるため、/var/tmpデバイスがシャットダウンした後にファイルが残らないようにします。
  • NoNewPrivileges=trueそしてRestrictSUIDSGID=true。これにより、呼び出しプロセスはSUID / SGIDファイルまたはディレクトリを利用または作成できません。
  • ProtectSystem=strictサービスがファイルシステム上のどこにも書き込まれないように無効にしますProtectHome=read-only(例外は、および/dev/ /proc/です。/sys/)サービスを特定のディレクトリに書き込むことを許可するには、を使用する必要がありますReadWritePaths=
  • RuntimeDirectory=サービスには、サービスユーザーが所有するランタイムディレクトリが割り当てられ、システムがシャットダウンすると自動的に削除されます。
  1. ステップ2では、私が言ったすべての内容を1行に置き換えることができます。DynamicUser=true。良い時間をお過ごしください開発者の説明はこちら

とにかく、あなたがそれを使用しない場合User=、またはDynamicUser=使用する必要があります。これにより、サービスrootに他の秘密への読み取りアクセス権がないようになります。/etc/shadow

私はオプション3が大好きです。これを有効にすると、サービスからシステムが保護されます。

おすすめ記事