su:权限被拒绝(凭据正确)

su:权限被拒绝(凭据正确)

有很多类似标题的问题。我相信在问这个问题之前我已经检查了所有这些。

我的错误su: Permission denied用户切换未完成。以下是详细信息。

ssh admin@remote-machine
su --login myuser
Password:
su: Permission denied
(the password is correct)

结果:切换用户失败

然而,以下命令确实有效,尽管它报告了一个小错误:

su --preserve-environment myuser
Password:
bash: /home/admin/.bashrc: Permission denied

结果:切换用户成功

另外,su myuser没有任何参数的普通也可以。这些变体也有效:

su -P myuser
su -s /bin/sh myuser

尽管我有解决方法,但我想了解这个问题。另外,我最喜欢的命令形式su - user是不起作用的。此问题仅影响一台远程设备,尽管我有几台远程设备的配置似乎相同。他们都运行 Arch Linux。

我没有使用 SELinux。通过阅读其他问题,我检查了一些事情。

user@remote-machine [/home/myuser] # ls
total 13904
drwx--x---+ 1 myuser myuser    3210 Feb 18 16:00  .
-rw-r--r--  1 myuser myuser     396 Aug 13  2018  .bashrc

# getfacl /home/myuser/
getfacl: Removing leading '/' from absolute path names
# file: home/myuser/
# owner: myuser
# group: myuser
user::rwx
user:sddm:--x
group::---
mask::--x
other::---

# ls /home/admin/.bashrc
-rw-r--r-- 1 admin admin 624 Apr 17 17:08 /home/admin/.bashrc

less /etc/passwd
myuser:x:1000:1000:myuser myuser:/home/myuser:/bin/bash

以下/etc/pam.d/su行被注释掉(这是默认的):

# auth       required     pam_wheel.so use_uid

编辑: 按要求添加信息。

首先,我对该系统和不存在此问题的类似系统进行了diff -rw比较。没有差异。两者都仅包含./etc/profile.d/su -l/etc/profile.d/

/etc/profile与现有的 Arch Linux 文件相比,其本身有一项更改。但这种变化既存在于正常工作的系统中,也存在于有问题的系统中su -l。唯一的变化/etc/profileumask 006.

/etc/bash.bashrc

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

[[ $DISPLAY ]] && shopt -s checkwinsize

HISTFILESIZE=
HISTSIZE=
HISTCONTROL=ignorespace

case ${TERM} in
  xterm*|rxvt*|Eterm|aterm|kterm|gnome*)
    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'

    ;;
  screen*)
    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033_%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
    ;;
esac

[ -r /usr/share/bash-completion/bash_completion   ] && . /usr/share/bash-completion/bash_completion

下面显示的文件位于我发出su命令的用户帐户中。但此问题会影响任何用户更改为任何其他用户。我没有看到任何修改过文件的用户帐户(对于 ~/.bash_profile、~/.bash_login 和 ~/.profile)。.bash_login任何帐户或 中都没有/etc

接下来的两个文件都是简单的。

〜/ .bash_profile

[[ -f ~/.bashrc ]] && . ~/.bashrc

~/.bashrc

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

在一个帐户中,~/.bashrc有:

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi
  • 所有的别名.bash_aliases看起来都不错。该问题还会影响未定义别名的用户。
  • /etc/security/limits.conf- 没有行(除了注释之外,工作设备和非工作设备都具有相同的空文件)
  • /etc/securetty- 原生 Arch Linux(不更改文件且工作和非工作设备具有相同的行)
  • /etc/passwd- 644 烫发
  • /etc/- 755 烫发

解决方案:(/etc/pam.d/su-l但不是其中的任何其他文件/etc/pam.d/)所需的pam_wheel.so use_uid。有关更多信息,请参阅已接受的答案。现在这个问题已经解决了,这个问题包含了这个问题的全面清单。希望它能为其他人提供一个很好的参考。

答案1

我怀疑当您生成登录 shell 时调用的脚本之一存在问题,而不是由非登录 shell 调用的脚本。

看一下 INVOCATION 部分man bash

我的内容是:

当 bash 作为交互式登录 shell 或带有 --login 选项的非交互式 shell 被调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个存在且可读的文件中读取并执行命令。

...

当启动非登录 shell 的交互式 shell 时,bash 会从 ~/.bashrc 读取并执行命令(如果该文件存在)。这可以通过使用 --norc 选项来禁止。 --rcfile 文件选项将强制 bash 从文件而不是 ~/.bashrc 读取并执行命令。

对于“小错误” bash: /home/admin/.bashrc: Permission denied

这是因为 admin 用户的 HOME 环境变量即将被访问,而 myuser 用户没有访问 HOME 环境变量的权限$~/.bashrc,而这正是 bash 在生成新 shell 时所做的事情。

答案2

我在这个系统和一个没有这个问题的类似系统之间进行了diff -rw测试。我发现有这条线/etc/pam.d/su -l/etc/pam.d/su-l未注释的:

auth           required        pam_wheel.so use_uid

通常会对其进行注释,以免强加此要求。中的其他类似文件都没有/etc/pam.d/取消注释此行,因此该命令的不同变体的行为不一致。

我通过评论该行解决了这个问题:

# auth           required        pam_wheel.so use_uid

相关内容