我的 crontab 中的所有命令都失败并显示“权限被拒绝”

我的 crontab 中的所有命令都失败并显示“权限被拒绝”

更新:这个问题不会得到最终答案;我已转到另一个发行版,此后再也没有发现这个问题。我无法用当时提供的深刻答案来修复它,但您的燃油效率可能会有所不同(YMMV)。


crontab -e并且crontab -l工作正常:

$ crontab -l | grep -v '^#'
* * * * * /usr/bin/env
* * * * * echo 'Hello from crontab'

然而,我每隔一分钟就会看到两条这样的消息/var/log/syslog

Mon DD hh:mm:01 username CRON[PID]: Permission denied

所以crontab 正在读取,但不知何故根本无法执行任何操作(当然,我在以同一用户身份登录时验证了命令)。知道为什么吗?

/etc/cron.allow并且/etc/cron.deny不存在。

crontab 设置组setuid:

$ stat --format '%A %U %G' /usr/bin/crontab
-rwxr-sr-x root crontab

crontabs 目录似乎具有正确的权限:

$ stat --format '%A %U %G' /var/spool/cron/crontabs
drwx-wx--T root crontab

crontab 本身属于我(这并不奇怪,因为我能够编辑它):

$ sudo stat --format '%A %U %G' /var/spool/cron/crontabs/$USER
-rw------- username crontab

我是不是该团体的一名成员crontab

这些行/var/log/auth.log每分钟都会出现(感谢@Alaa):

Mon DD hh:mm:01 username CRON[1752]: pam_unix(cron:session): session opened for user username by (uid=0)
Mon DD hh:mm:01 username CRON[1752]: PAM bad jump in stack

也许 PAM 坏了?pam-auth-update(感谢 @coteyr)列出了所有这些,并且它们都已启用:

  • Unix 身份验证
  • GNOME Keyring Daemon - 登录密钥环管理
  • eCryptfs 密钥/挂载管理
  • ConsoleKit 会话管理
  • 可继承权能管理

可以安全地禁用其中任何一个吗?我没有使用任何加密文件系统。

基于Debian 错误条目我尝试运行debconf-show libpam-runtime,但收到​​以下错误消息:

debconf: DbDriver "passwords" warning: could not open /var/cache/debconf/passwords.dat: Permission denied

内容/etc/pam.d/cron

# The PAM configuration file for the cron daemon

@include common-auth

# Read environment variables from pam_env's default files, /etc/environment
# and /etc/security/pam_env.conf.
session       required   pam_env.so

# In addition, read system locale information
session       required   pam_env.so envfile=/etc/default/locale

@include common-account
@include common-session-noninteractive 

# Sets up user limits, please define limits for cron tasks
# through /etc/security/limits.conf
session    required   pam_limits.so

session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid

我的用户都可以读取提到的文件(、、、、/etc/environment)。pam_env.so/etc/default/localepam_limits.sopam_succeed_if.so

在另一台安装有 Ubuntu 13.04 的主机上,使用相同的用户 crontab,没有/etc/cron.{allow,deny},与上面相同的权限,并且不是组成员crontab,它就可以正常工作(记录命令但不记录输出/var/log/syslog)。


通过更改第一个 crontab 行:

* * * * * /usr/bin/env >/tmp/env.log 2>&1

并检查 /tmp 是否是全世界可写的:

$ sudo -u nobody touch /tmp/test
$ ls /tmp/test
/tmp/test
$ ls -ld /tmp
drwxrwxrwt 15 root root 12288 May 27 10:18 /tmp

我已经证实crontab 命令根本没有运行Permission denied消息仍显示在 中/var/log/syslog,但/tmp/env.log并未创建。


基于随机列出/etc/pam.d设置我发现以下差异:

$ grep '^[^#]' /etc/pam.d/sshd 
@include common-auth
account    required     pam_nologin.so
@include common-account
@include common-session
session    optional     pam_motd.so # [1]
session    optional     pam_mail.so standard noenv # [1]
session    required     pam_limits.so
session    required     pam_env.so # [1]
session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale
@include common-password
$ grep '^[^#]' /etc/pam.d/common-session
session [default=1]         pam_permit.so
session requisite           pam_deny.so
session required            pam_permit.so
session optional            pam_umask.so
session required    pam_unix.so 
session optional    pam_ecryptfs.so unwrap
session optional            pam_ck_connector.so nox11
$ grep '^[^#]' /etc/pam.d/common-account
account [success=1 new_authtok_reqd=done default=ignore]    pam_unix.so 
account requisite           pam_deny.so
account required            pam_permit.so
$ grep '^[^#]' /etc/pam.d/common-session-noninteractive 
session [default=1]         pam_permit.so
session requisite           pam_deny.so
session required            pam_permit.so
session optional            pam_umask.so
session required    pam_unix.so 
session optional    pam_ecryptfs.so unwrap

安装的 PAM 软件包:

$ dpkg --get-selections | grep --invert-match deinstall | cut --fields 1 | grep pam
libpam-cap
libpam-ck-connector
libpam-gnome-keyring
libpam-modules
libpam-modules-bin
libpam-runtime
libpam0g
python-pam

我尝试重新安装这些 - 没有帮助:

$ sudo apt-get install --reinstall $(dpkg --get-selections | grep --invert-match deinstall | cut --fields 1 | grep pam)

由于未满足依赖关系,我无法清除然后重新安装它们。

答案1

PAM bad jump in stack是一个很大的线索。

您的/etc/pam.d/cron版本与原始版本的不同之处在于末尾添加了一行:

session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid

success=1位表示“如果此模块成功,则跳过下一条规则”。不过,这里没有下一条规则,因为这是 PAM 配置中的最后一行。

答案2

您的 PAM 配置有问题。如果您使用了指纹扫描仪、LDAP 帐户、USB 密钥或类似“外部”身份验证方法,这种情况很常见。基本上,cron 无法使用指纹扫描仪,因此无法以您的身份登录。

您需要删除有问题的配置,/etc/pam.d/common-*但追踪它可能有点困难,特别是如果您没有手动启用某些功能(例如,如果指纹扫描仪安装脚本打开了某些东西)。

我无法告诉你这些文件中应该包含什么。很多事情可能会有所不同,具体取决于您的设置。但是,禁用“必需”身份验证方法,直到只剩下“Unix 身份验证”可能是一个很好的第一步。

您可以通过pam-auth-update以 root 身份运行并取消选中其他框来执行此操作。请非常小心,因为如果操作不正确,可能会导致您无法登录系统。一次禁用一个,重新启动以确保安全,然后测试。永不禁用“Unix 身份验证”

答案3

我们尝试从 LDAP 用户(非机器用户)安排 cron,甚至在 中permission denied输入基本echo命令或脚本时也得到相同的结果crontab,而从机器用户(在 /etc/passwd 中有条目)的文件完全可以正常工作。借助 OP 添加的详细故障排除评论,我们检查了文件,/var/log/auth.log在其中找到了以下行:

pam_sss(cron:account): Access denied for user my_username: 6 (Permission denied)

谷歌搜索了一下,我对此答案对我们有用。在这里也添加详细信息。

/etc/sssd/sssd.conf,在我们的域下,我们添加了一个这样的条目(见最后一行)。

[domain/my.domain.com]
....
ad_gpo_map_interactive = +cron

然后就这样做了,sudo service sssd restart效果非常好。

相关内容