systemctl が中断され、中断呼び出しが失敗しました。アクセスが拒否されました。

systemctl が中断され、中断呼び出しが失敗しました。アクセスが拒否されました。

最近のアップデート後、Ubuntu 20.04:

$ systemctl suspend
Call to Suspend failed: Access denied

数週間前にはうまくいきましたが、いいえすべてのroot権限。

日記:

dbus-daemon[1310]: [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.991" (uid=1000 pid=683426 comm="systemctl suspend " label="unconfined") interface="org.freedesktop.login1.Manager" member="SuspendWithFlags" error name="(unset)" requested_reply="0" destination="org.freedesktop.login1" (uid=0 pid=1512 comm="/lib/systemd/systemd-logind " label="unconfined")

~から

「メッセージの送信拒否」は、dbus の「許可拒否」と同じです。権限拒否の理由は、送信者、宛先、インタフェース、メンバーによって異なります。

簡単な検索では、主に休止状態に関する問題が返されました。一方通行(12)おそらくsudoersファイルにNOPASSWDを追加するだけです(いいえ同じです)しかしそうです。ポルキット質問。

どのパッケージアップデートがこの動作を引き起こす可能性がありますか? sudoerファイルを編集する以外に、他の(おそらくよりエレガントな)ソリューションはありますか?

編集する:

$ grep -ri org.freedesktop.login1.suspend /usr/share/polkit-1/
/usr/share/polkit-1/actions/org.freedesktop.login1.policy:        <action id="org.freedesktop.login1.suspend">
/usr/share/polkit-1/actions/org.freedesktop.login1.policy:        <action id="org.freedesktop.login1.suspend-multiple-sessions">
/usr/share/polkit-1/actions/org.freedesktop.login1.policy:                <annotate key="org.freedesktop.policykit.imply">org.freedesktop.login1.suspend</annotate>
/usr/share/polkit-1/actions/org.freedesktop.login1.policy:        <action id="org.freedesktop.login1.suspend-ignore-inhibit">
/usr/share/polkit-1/actions/org.freedesktop.login1.policy:                <annotate key="org.freedesktop.policykit.imply">org.freedesktop.login1.suspend</annotate>
$ grep -i suspend /usr/share/dbus-1/system.d/org.freedesktop.login1.conf
                       send_member="Suspend"/>
                       send_member="SuspendThenHibernate"/>
                       send_member="CanSuspend"/>
                       send_member="CanSuspendThenHibernate"/>

何らかの理由で他の同様の一般ユーザーを使用するとsystemctl suspend -i完全に機能します。

また試みこれそしてResult.YES

使用busctl monitor:

‣ Type=error ...  Sender=org.freedesktop.DBus  Destination=:1.4594
  ErrorName=org.freedesktop.DBus.Error.AccessDenied  ErrorMessage="Rejected send message, 2 matched rules; type="method_call", sender=":1.4594" (uid=1000 pid=636652 comm="systemctl suspend -i " label="unconfined") interface="org.freedesktop.login1.Manager" member="SuspendWithFlags" error name="(unset)" requested_reply="0" destination="org.freedesktop.login1" (uid=0 pid=1512 comm="/lib/systemd/systemd-logind " label="unconfined")"
  MESSAGE "s" { STRING "Rejected send message, 2 matched rules; type="method_call", sender=":1.4594" (uid=1000 pid=636652 comm="systemctl suspend -i " label="unconfined") interface="org.freedesktop.login1.Manager" member="SuspendWithFlags" error name="(unset)" requested_reply="0" destination="org.freedesktop.login1" (uid=0 pid=1512 comm="/lib/systemd/systemd-logind " label="unconfined")"; };

systemctl reboot私は/のような問題がありますRebootWithFlags/usr/share/dbus-1/system.d/org.freedesktop.login1.conf(パッケージの一部)に同じソリューションが追加されましたsystemd

答え1

Dバス

システムの停止に関する dbus ポリシーがあるか、メンバーへの非特権アクセスを明示的に拒否していることを/usr/share/dbus-1/system.d確認してください。/etc/dbus-1/system.dorg.freedesktop.login1

次のポリシーを使用して、権限のないユーザーが電話をorg.freedesktop.login1.Manager.Suspendかけるorg.freedesktop.login1.Manager.SuspendWithFlags

<?xml version="1.0"?> <!--*-nxml-*-->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
        "https://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
        <policy context="default">
                <allow send_destination="org.freedesktop.login1"
                       send_interface="org.freedesktop.login1.Manager"
                       send_member="Suspend"/>
 
                <allow send_destination="org.freedesktop.login1"
                       send_interface="org.freedesktop.login1.Manager"
                       send_member="SuspendWithFlags"/>
        </policy>
</busconfig>

このポリシーファイルを別の名前で保存し、/etc/dbus-1/system.d/org.freedesktop.login1.confreload dbusデーモンを使用してくださいsystemctl reload dbus

ポルキット

一般ユーザーが認証なしでシステムを中断できるように、次の規則を追加できます。

// vi: ft=javascript
Array.prototype.includes = function (variable) {
  for (var i = 0; i < this.length; i++) { if (this[i] === variable) return true; }
  return false;
}

polkit.addRule(function (action, subject) {
  if (
    [
      "org.freedesktop.login1.suspend",
      "org.freedesktop.login1.suspend-ignore-inhibit",
      "org.freedesktop.login1.suspend-multiple-sessions"
    ].includes(action.id) &&
    // Allow user named "user_name" or users in group "wheel" to suspend this system, 
    // Modify accordingly to suit your system    
    (subject.user == "user_name" || subject.isInGroup("wheel"))
  ) {
    return polkit.Result.YES;
  }
});

「user_name」をユーザー名に変更してください。

/etc/polkit-1/rules.d/01-suspend.rulesすぐに適用するには、このルールを保存してください。

答え2

sudo systemctl suspendルートアクセスが必要な場合がありますので、お試しください。

答え3

常にsudoを作成したくない場合は、シェル構成にエイリアスを追加してください。alias "systemctl suspend"="sudo systemctl suspend"

関連情報