状況
まずは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
のコメントアウト行があります。