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 にヒントがありました。
- 変更するサーバに対して、2つのssh セッション(tty-A, tty-B)をオープンする
- tty-A にて shell の process ID を得る
echo $$
- tty-B にて以下のコマンドで権限エージェントを起動、<PID> には 2. で得た process ID (数値) を指定
pkttyagent --process <PID>
- tty-A にて visudo を起動
pkexec visudo
- tty-B でパスワードを聞かれているので、入力して tty-A にて visudo が起動
これで、コンソールが使えない状態でも再起動なく sudoers が修正できます。
コメント