10 votes

Toutes les commandes de ma crontab échouent avec "Permission refusée".

Mise à jour : Cette question ne sera pas résolue de manière concluante ; j'ai changé de distro et je n'ai pas observé ce problème depuis. Je n'ai jamais été capable de le résoudre avec les réponses perspicaces disponibles à l'époque, mais votre rendement énergétique peut varier (YMMV).


crontab -e y crontab -l fonctionnent très bien :

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

Cependant, je vois deux messages comme celui-ci toutes les minutes en /var/log/syslog :

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

Ainsi, le crontab est en cours de lecture mais d'une manière ou d'une autre, il ne peut rien exécuter du tout (bien sûr, j'ai vérifié les commandes en me connectant avec le même utilisateur). Une idée de la raison ?

/etc/cron.allow y /etc/cron.deny n'existent pas.

crontab est défini groupe setuid :

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

Le répertoire crontabs semble avoir les bonnes permissions :

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

La crontab elle-même m'appartient (ce qui n'est pas surprenant, puisque je suis capable de la modifier) :

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

Je suis no un membre de la crontab groupe.

Ces lignes apparaissent dans /var/log/auth.log chaque minute (merci @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

Peut-être que PAM est cassé ? pam-auth-update (merci @coteyr) liste tous ces éléments, et tous sont activés :

  • Authentification Unix
  • GNOME Keyring Daemon - Gestion du trousseau de clés de connexion
  • Gestion des clés/montages eCryptfs
  • Gestion des sessions ConsoleKit
  • Gestion des capacités héréditaires

L'un d'entre eux peut-il être désactivé en toute sécurité ? Je n'utilise pas de systèmes de fichiers cryptés.

Sur la base d'un Entrée d'un bogue dans Debian J'ai essayé d'exécuter debconf-show libpam-runtime et j'ai obtenu le message d'erreur suivant :

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

Le contenu de /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

Les fichiers mentionnés ( /etc/environment , pam_env.so , /etc/default/locale , pam_limits.so , pam_succeed_if.so ) sont tous lisibles par mon utilisateur.

Sur un autre hôte avec Ubuntu 13.04, avec le même utilisateur crontab, aucune /etc/cron.{allow,deny} les mêmes permissions que ci-dessus, et ne pas être membre de la Commission européenne. crontab il fonctionne très bien (il enregistre les commandes, mais pas la sortie en /var/log/syslog ).


En modifiant la première ligne de crontab :

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

et vérifier que /tmp est accessible en écriture dans le monde :

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

J'ai vérifié que les commandes de la crontab ne sont pas exécutées du tout : Le site Permission denied Les messages apparaissent toujours dans /var/log/syslog mais /tmp/env.log n'est pas créé.


Sur la base d'un liste aléatoire de /etc/pam.d paramètres J'ai trouvé les divergences suivantes :

$ 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

Paquets PAM installés :

$ 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

J'ai essayé de les réinstaller - ça n'a rien donné :

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

Je ne peux pas les purger puis les réinstaller à cause de dépendances non satisfaites.

3voto

Michiel de Mare Points 15888

PAM bad jump in stack est un gros indice.

Votre /etc/pam.d/cron diffère de la version standard par l'ajout d'une ligne supplémentaire à la fin :

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

Le site success=1 signifie "si ce module réussit, on passe à la règle suivante". Seulement, il n'y a pas de règle suivante, car c'est la dernière ligne de votre configuration PAM.

1voto

coteyr Points 16560

Votre configuration PAM n'est pas normale. C'est fréquent si vous avez utilisé des méthodes d'authentification "externes" comme des scanners d'empreintes digitales, des comptes LDAP, des clés USB ou autres. En fait, cron ne peut pas faire fonctionner un scanner d'empreintes digitales et ne peut donc pas se connecter en tant que vous.

Vous devez supprimer la configuration incriminée de /etc/pam.d/common-* bien que le retrouver puisse être un peu difficile, surtout si vous n'avez pas activé quelque chose manuellement (par exemple si un script de configuration du scanner d'empreintes digitales a activé quelque chose).

Je ne peux pas vous aider en vous disant ce qui devrait être dans ces fichiers. Beaucoup de choses peuvent être différentes en fonction de votre configuration. Mais désactiver les méthodes d'authentification "requises" jusqu'à ce que vous n'ayez plus que "Unix Authentication" peut être une bonne première étape.

Vous pouvez le faire en exécutant pam-auth-update comme root et en décochant les autres cases. Soyez très très prudent car cela peut vous laisser avec un système auquel vous ne pouvez pas vous connecter si cela n'est pas fait correctement. Désactivez-les une par une, redémarrez par sécurité et testez. NE JAMAIS DÉSACTIVER "Authentification Unix"

1voto

pratpor Points 101

Nous avons essayé de programmer cron à partir d'un utilisateur LDAP (non utilisateur de la machine) et nous avons obtenu le même résultat. permission denied pour même mettre de base echo ou script dans la commande crontab alors qu'il fonctionnait complètement à partir des utilisateurs de la machine (qui ont des entrées dans /etc/passwd). En nous aidant des commentaires détaillés de dépannage ajoutés par OP, nous avons vérifié le fichier /var/log/auth.log où nous avons trouvé cette ligne :

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

Un peu de recherche sur Google m'a conduit à ce réponse qui a fonctionné pour nous. J'ajoute les détails ici aussi.

En /etc/sssd/sssd.conf sous notre domaine, nous avons ajouté une entrée (voir dernière ligne) comme ceci.

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

Et puis j'ai juste fait sudo service sssd restart et ça marche comme sur des roulettes.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X