テクノロジー · 実用ガイド

systemd の status=203/EXEC:権限を変える前に失敗した execve 経路を監査する

203/EXEC は、サービスマネージャーが設定されたプロセスを実行できなかったことを示します。ログの正確な理由から、対象・インタープリター欠落、形式不正、経路・マウント拒否、MAC ポリシーを分けます。

systemd 203/EXEC をログ理由別に分けるオリジナル図
オリジナル概念イラスト:オリジナル図:最初の EXEC 行を保存し、ENOENT、EACCES、ENOEXEC を別々の証拠検査へ送ります。 Watch at Ease

systemd ユニットが code=exited、status=203/EXEC で終わった場合、通常はアプリケーションのロジックに到達していません。systemd は 203 を EXIT_EXEC、つまり execve システムコールの失敗と定義します。ただし、どのパス、インタープリター、マウント規則、セキュリティ判断が原因かまでは分かりません。

最初から chmod 777、シェルラッパー、SELinux 無効化を行わないでください。実際に読み込まれたユニットと最初の「Failed at step EXEC」行を保存し、サービスが通る実行境界を監査します。

1. 実際に失敗したコマンドを保存する

systemctl cat UNIT と systemctl show -p ExecStart -p User -p Group -p RootDirectory -p RootImage UNIT を実行し、最初の EXEC 失敗行のパスと理由を保存します。ユニット定義を変更した場合だけ daemon-reload を使います。

ExecStart は対話シェルではなく systemd 構文です。パイプ、リダイレクト、展開が本当に必要な設計だけ明示的なシェルを使います。systemd #23235 は、実行ファイル位置の ${APP} が 203/EXEC になる再現例です。

2. ログ理由を execve 分岐へ対応させる

「No such file or directory」では readlink -f と stat で対象を、head -n1 または readelf -l でインタープリターを調べます。execve 文書では ENOENT にスクリプトまたは ELF インタープリターの欠落も含まれ、CRLF は shebang に隠れた復帰文字を持ち込みます。

「Permission denied」では namei -l で各親を、findmnt -T PATH -o TARGET,FSTYPE,OPTIONS で noexec を確認します。「Exec format error」は file と readelf -h で形式とアーキテクチャを確認します。これらは証拠収集で、権限・ラベル・マウント変更の許可ではありません。

3. シェルではなくサービス文脈を確認する

有効な User と Group を確認し、その身元で無害なパス検査だけを行います。RootDirectory や RootImage がある場合、実行ファイルと補助ファイルは新しいルート内に必要です。保護的なファイルシステム設定もサービスから見える経路を変えます。

EACCES で通常の権限が正しいなら、配布元が支援する監査ツールで最近のポリシー記録を確認します。Red Hat は init_t から default_t、user_home_t、nfs_t、cifs_t への実行が AVC で拒否され 203/EXEC となる例を公開しています。AVC は精密なラベル・ポリシー修正の根拠で、強制モード全体を切る理由ではありません。

4. 証明された原因だけを修正する

パス、インタープリター、改行、実行ビット、親の探索権限、マウント、アーキテクチャ、名前空間、ポリシーラベルは、その分岐が証明された後だけ直します。chmod 777 では欠落インタープリター、誤ったアーキテクチャ、noexec、ポリシー遷移は直りません。

ExecStart は直接の絶対パスを優先します。/bin/bash の追加は shebang 不具合を隠し、execve が起動するファイルを変えます。シェルが本当に必要なら、汎用修復ではなく明示した設計として引用します。

5. 実行境界を越えたことを証明する

最小修正後、ユニット定義が変わった場合だけ daemon-reload を行い、一度起動して新しいログを読みます。203/EXEC の消失は実行境界を越えた証明ですが、アプリは別の終了状態で失敗できます。ActiveState、SubState、ExecMainCode、ExecMainStatus も確認します。

元の理由、一つの変更、変更後の状態を記録します。203 が残れば新しい最初の EXEC 行へ戻り、変更を重ねません。パッケージ管理のサービス、出所不明の実行物、または安全境界を弱める修正は中止して上位確認へ回します。

systemd サービス実行コンテキストのオリジナル監査図
オリジナル概念イラスト:オリジナル図:同じパスでも、サービス利用者、ルート/名前空間、マウント、MAC ポリシーが実行可否を変えます。 Watch at Ease