web-dev-qa-db-ja.com

hostnamectlがホスト名を変更するためにパスワードを必要としないのはなぜですか?

Systemdでホスト名を変更する新しい方法は次のようです。

hostnamectl set-hostname NEWNAME

ただし、管理者権限を持つユーザーとしてログインする場合は、パスワードは必要ありません(どのグループがカウントされるかはわかりません)。管理者以外のユーザーの場合は、特権ユーザーの1人のパスワードを要求するダイアログがポップアップ表示されます。

「shutdown-hnow」は、管理者以外のユーザーでも機能すると思います。

これらは両方とも新しいsystemd関連のコマンドだと思います。

コマンドを送信するユーザーがコマンドを実行する権限を持っているかどうかをどのように確認しますか?どうすればパスワードを要求したり、sudoを要求したりできますか?

2
KIAaze

systemdおよび関連するユーティリティでは、特権アクセスを必要とする可能性のあるアクションはPolicyKitを介してルーティングされます。パラメータなしでpkactionを実行して、PolicyKitによって処理されるすべての可能なアクションのリストを表示します。特定のアクションの現在のポリシーを確認するには、pkaction --verbose --action-id <action identifierを使用します。たとえば、ホスト名を変更します。

# pkaction | grep Host
org.freedesktop.hostname1.set-hostname
org.freedesktop.hostname1.set-machine-info
org.freedesktop.hostname1.set-static-hostname

# pkaction --verbose --action-id org.freedesktop.hostname1.set-hostname
org.freedesktop.hostname1.set-hostname:
  description:       Set Host name
  message:           Authentication is required to set the local Host name.
  vendor:            The systemd Project
  vendor_url:        http://www.freedesktop.org/wiki/Software/systemd
  icon:              
  implicit any:      auth_admin_keep
  implicit inactive: auth_admin_keep
  implicit active:   auth_admin_keep

したがって、ホスト名の変更に関するシステムの現在のポリシーはauth_admin_keepです。つまり、管理者のパスワードが必要ですただしユーザーがごく最近同様のチェックに合格した場合(Sudo連続したパスワード要求を回避できます)。

そして、パスワードでこれらのアクションを承認できる管理者は誰ですか?私のDebian9システムでは、これは/etc/polkit-1/localauthority.conf.d/ディレクトリ内のファイルによって決定されます。デフォルトでは、rootとSudoユーザーグループのメンバーのみが対象となります。

このポリシーが気に入らない場合は、カスタムPolicyKit構成ファイルを作成することで簡単に変更できます。

PolicyKitは、それによって管理されるアクションに対して次の「セキュリティレベル」を要求するように構成できます。

  • yes-ユーザーはいつでもそれを行うことができ、質問はありません
  • auth_self_keep-ユーザーが最近パスワードチェックを必要とすることを何もしていない場合は、ユーザーのパスワードを要求して、それが本当に彼/彼女であることを確認します。このレベルの複数の連続したアクションが数分ウィンドウ内に実行される場合、最初のチェックの後にチェックをスキップできます。
  • auth_self-常にユーザーのパスワードチェックが必要
  • auth_admin_keep-管理ユーザーのパスワードが必要です。 auth_self_keepと同様に、パスワード(およびオプションで管理者ユーザー名)を1回入力すると、ユーザーはパスワードを要求することなく、短い時間枠内でこのレベルの複数のアクションを実行できます。
  • auth_admin-常にパスワードチェックが必要であり、パスワードチェックに応答するユーザーは管理ユーザーの1人である必要があります
  • no-アクションはそれ以上の質問なしに拒否されます。

..._keepの結果が維持される時間は、PolicyKitアップストリームコードにハードコードされているようです: ここにPolicyKit Gitへのリンクがあります。

/* TODO: right now the time the temporary authorization is kept is hard-coded - we
 *       could make it a propery on the PolkitBackendInteractiveAuthority class (so
 *       the local authority could read it from a config file) or a vfunc
 *       (so the local authority could read it from an annotation on the action).
 */
 expiration_seconds = 5 * 60;

現在、実行時にこの値を構成するための、または一度設定された認証タイムスタンプを延長するための規定はないようです。

OpenSuSEはこれを...keep_session...keep_alwaysの結果で拡張したようです。 どうやら彼らは...keepアクションを再解釈して「結果を覚えている限り質問プロセスは実行され続けます。」

4
telcoM