sudoのパーミッションを変更してsudoが使えなくなった


経緯

先日、/usr/bin/sudoのパーミションを変更してしまったために、sudoが使えなくなりました。
sudoを使用した際のエラーは以下のようになります。

sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set

経緯としましては、ローカルPCの/usr/bin/以下のとある実行ファイルのパーミッションを変更しようとしたところ、(面倒くさいので) chmod 777 * -R/user/bin以下で行ってしまいました。
その中には /usr/bin/sudoがおり、こいつは変更してはいけなかったのです。

色々調べて解決を試みましたが、最終的に諦めたので、自戒の念を込めて調べたことを残しておきます。

症状

まずバージョンですがUbuntu 18.04を使っていました。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"

/etc/usr/sudo を誤って変更した後には、sudoを利用すると以下のようなエラーがでます。

(英語)sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
(日本語)sudo: 実効 uid が 0 ではありません、sudo は setuid root を設定してインストールされていますか

修正方法1

1つめの修正方法はrootユーザーでログインしてパーミッションを変更しましょうというものです。
ただしrootユーザーのパスワードが事前に設定されている必要があります。

# rootユーザーに変更
su
# 権限変更
chown root:root /usr/bin/sudo
chmod 4755 /usr/bin/sudo

残念ながらデフォルトではrootユーザーはパスワードをもっていないので、特別設定してなければsudoなしにrootユーザーになれないかと思います。私もそうでした。

修正方法2

修正方法の2つめはリカバリーモードを利用してパーミッションを変更するという方法です。

再起動時にShiftキーかEscキーを押しっぱなしにするとGrabのブートメニューが表示されると思います。

この中の Advanced options for Ubuntuを選び、その後 Ubuntu 18.04 (recovery mode)のようにRecovery Modeを選んで下さい。
そうしたら、別のスクリーンが立ちがりますので、 Drop to root shell promptを選んで下さい。
コマンドラインのスクリーンが現れたと思います。そしたら以下のコマンド打って、パーミッションの変更を行って下さい。

mount -o remount,rw /
mount –all
chown root:root /usr/bin/sudo
chmod 4755 /usr/bin/sudo

最後にrestartでPCを再起動します。

修正方法3

OS再インストール。

筆者はrootユーザーのパスワードを設定してなかったので、修正方法2のリカバリーモードによる解決を試みました。
しかし、再起動時にShiftやEscをいくら押しても、Grubのブートメニューが表示されないという問題にあたりました。
調べてみると、Grabの起動メニューの表示時間が0秒設定されているということがわかりました。
設定箇所は /etc/default/grabの中の GRUB_TIMEOUTの設定値です。

/etc/default/grab
...
GRUB_TIMEOUT=0
...

Ubuntu 18.04からこの設定がデフォルトのようです(そういえば昔14.04使っているときはブートメニューが毎回表示されていた気がする)。

これのせいで起動メニューが表示されなくなっていますので、この時間設定値を変更するなり、この設定をコメントアウトなりする必要があります。

しかし…このファイルの所有者はrootユーザーなんです。
sudoがないと編集できないんです。

詰んだ…

となりました。

泣く泣く諦めて、次回構築時はTIMEOUT設定を3秒にしておくことを誓って、OS再インストールとなりました。

以上