rcmdnk's blog

Songs of the Who

結論的にはどうしようもない話なんですが、 突然suでrootになろうとしたら Authentication failureと出てどうしてもrootになれなくなったという話。

状況

まずはsuしてみると

$ su
Password:
su: Authentication failure

となってパスワードを打っても失敗してしまいます。 この前まで大丈夫だったのに、設定何もいじってないのに、誰か勝手にパスワード変えた?(誰も変えない)、 という状態。

/var/log/secure(もしくは/var/log/auth.log)を見ると

su: pam_unix(su:auth): authentication failure;

とか出てます。

一方、

$ sudo -i

とかすればroot権限でインタラクティブに作業出来るというsudoは使える状態。

加えて、useraddで適当に新規ユーザーを作ってみてそこからsuしてみると 上で試した同じパスワードでrootになれてしまうという。

この時使っている元のユーザーはldapを使って管理しているので そこ関連の問題なのかな、とか色々疑ってましたが、結局全く別の問題でした。

原因

util-linuxパッケージをローカルでインストールして suコマンドがユーザーのローカルにインストールされていてそれを使おうとしていたからでした。

この状況でも

$ /bin/su

とシステムのsuを使えばrootになれました。

util-linuxを入れたのはstow-get のテストのためです。

通常は必要ないのですがテストで入れたまま残っていたようで。

色々可能性を探してたんですが、 見つけたのは色々な解決策がある中で1

$ type -a su
su is /home/user/usr/local/bin/su
su is /bin/su

をやってみたからでした。

で、このsuは勿論インストールしたユーザーの所有でそれが問題。

なのでこれを削除するか、

$ sudo chown root /home/user/usr/local/bin/su
$ sudo chmod 4755 /home/user/usr/local/bin/su

の様にsuコマンドの所有者をrootにして、 さらにSet User IDして上げるとユーザーがインストールしたsuでもきちんと使える様になりました。

Set User ID (SUID)はそのファイルを実行する時、 実行者がコマンドを打った人ではなくこのSUIDで設定された人のコマンドとして扱われる様になるというもの。

suはこれがrootでなければいけません。

$ ls -l /bin/su
-rwxr-xr-x. 1 root root 34904 Mar 22 22:40 /bin/su

みたいな感じの時は

これを

$ chmod 4755 /bin/su

として、

$ ls -l /bin/su
-rwsr-xr-x. 1 root root 34904 Mar 22 22:40 /bin/su

の様に所有者がrootでその実行権限部分xではなく sになっていないといけません。 これによってsuは常にrootとして実行される様になります。

ただし、この変更自体root権限が無いと出来ないので sudoで出来る権限があるかもしくは何らか他の方法でrootとしてログインする必要があります。

その他の可能性

1つはPAMの設定で弾かれてる、というもの。

/etc/pam.d/suにデフォルトだと

# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid

というコメントアウトされた行があります。 このauthの行のコメントを取って有効にすると wheelというグループに入ってないユーザーのsuコマンドは許可しない状態になります。

このwheelですが、Macでシステムファイルとかroot所有のファイルとかがwheelグループ所属になってたりして よく見る名前ですが、 もともとUnixでシステム管理を行うユーザーが所属するグループだったようです2

ただ、Linuxではそのシステムは基本的には採用せずに基本誰でもsu出来る様な環境がデフォルトにしているみたいです。

/etc/pam.d/sudoに関してはデフォルトでは

auth       include      system-auth

の様にOS全体の設定を行うsystem-authの設定を使う様になっています。 これら設定はコマンド自体をどのユーザーがどの様に使えるか、という設定。

sudoに関しては/etc/sudoerssudoでコマンドを実行できるユーザーや各ユーザー/groupにおける コマンドの制限等が設定されています。 デフォルトの設定ファイルには

## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL

みたいな感じでwheel所属のユーザーにsudo権限を渡す設定がコメントとして載っています。 ここでもこれのコメントを外してsudoを許可したいユーザーを wheelグループに入れてあげればsudoで全てのコマンドが打てる様になります。

ということでsusudoだと少し設定の方法とかが違いますが、 そもそもこの2つのコマンドは全く別のパッケージの中にあるものみたいです3

これらとはまた別に、sshを使って外部からログインする時、 rootでログイン出来るかどうか、の設定も別にあり、それは /etc/ssh/sshd_configの中でのPermitRootLoginと言う値になります。

PermitRootLogin yes

ならrootでのログイン可、

PermitRootLogin no

またはこの項目がなければログイン不可です。 デフォルトのsshd_configだと

# PermitRootLogin yes

な感じでyesのコメントアウト行があります。

Sponsored Links
Sponsored Links

« Firefox 55リリース: WebVRをサポート Vim起動時にdeinを使うかどうか対話的に設定する(confirm()) »

}