状況
まずは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/sudoersに
sudoでコマンドを実行できるユーザーや各ユーザー/groupにおける
コマンドの制限等が設定されています。
デフォルトの設定ファイルには
## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
みたいな感じでwheel所属のユーザーにsudo権限を渡す設定がコメントとして載っています。
ここでもこれのコメントを外してsudoを許可したいユーザーを
wheelグループに入れてあげればsudoで全てのコマンドが打てる様になります。
ということでsuとsudoだと少し設定の方法とかが違いますが、
そもそもこの2つのコマンドは全く別のパッケージの中にあるものみたいです3。
これらとはまた別に、sshを使って外部からログインする時、
rootでログイン出来るかどうか、の設定も別にあり、それは
/etc/ssh/sshd_configの中でのPermitRootLoginと言う値になります。
PermitRootLogin yes
ならrootでのログイン可、
PermitRootLogin no
またはこの項目がなければログイン不可です。 デフォルトのsshd_configだと
# PermitRootLogin yes
な感じでyesのコメントアウト行があります。

