[Linux] sudoers 編集失敗からの復帰

PCにLinuxをインストールした後に、アプリケーションを追加していく際に権限変更が面倒なので、大抵 /etc/sudoers を編集して sudo のパスワードを省略するのですが、この編集を間違うと sudo を修正する sudo が使えなくなるというデッドロックに陥ります。

古典的には一旦再起動して single user mode に入り直し、mount し直して編集する、という流れでした。ここでは、再起動せずに権限変更して再編集することを試みます。

polkit による権限変更

Ubuntu や Fedora には polkit というシステム権限を変更する仕組みが導入されています。この中の pkexec コマンドは他のユーザとして指定されたコマンドを実行します。ユーザを指定しなければ root として実行されます。

pkexec visudo

を実行するとパスワードを聞かれます。入力すると visudo によるエディタが起動し、/etc/sudoers を編集できるようになります。

他の端末からの編集

pkexec が素直に実行できるのはコンソール端末のみです。遠隔 tty からこれを実行すると権限エラーになります。

$ pkexec visudo
==== AUTHENTICATING FOR org.freedesktop.policykit.exec ===
Authentication is needed to run `/usr/sbin/visudo' as the super user
Authenticating as: kunih,,, (kunih)
Password:
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
==== AUTHENTICATION FAILED ===
Error executing command as another user: Not authorized

This incident has been reported.

コンソール端末がすぐアクセスできればいいですが、モニタを外していたのですぐ用意できず困ってしまいました。

そこでいろいろ探していたところ、askubuntu.com にヒントがありました。

https://askubuntu.com/questions/799669/etc-sudoers-file-corrupted-and-i-cant-run-pkexec-visudo-over-ssh

  1. 変更するサーバに対して、2つのssh セッション(tty-A, tty-B)をオープンする
  2. tty-A にて shell の process ID を得る
    echo $$
  3. tty-B にて以下のコマンドで権限エージェントを起動、<PID> には 2. で得た process ID (数値) を指定
    pkttyagent --process <PID>
  4. tty-A にて visudo を起動
    pkexec visudo
  5. tty-B でパスワードを聞かれているので、入力して tty-A にて visudo が起動

これで、コンソールが使えない状態でも再起動なく sudoers が修正できます。


コメント

タイトルとURLをコピーしました