Semua perintah di crontab saya gagal dengan “Izin ditolak”

10

Pembaruan: Masalah ini tidak akan dijawab secara meyakinkan; Saya telah pindah ke distro lain dan tidak melihat masalah ini sejak itu. Saya tidak pernah bisa memperbaikinya dengan jawaban mendalam yang tersedia saat itu, tetapi efisiensi bahan bakar Anda mungkin berbeda-beda (YMMV).


crontab -edan crontab -lbekerja dengan baik:

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

Namun, saya melihat dua pesan seperti ini setiap menit di /var/log/syslog:

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

Jadi crontab sedang dibaca , tetapi entah bagaimana ia tidak dapat menjalankan apa pun (tentu saja saya memverifikasi perintah ketika login sebagai pengguna yang sama). Ada yang tahu kenapa?

/etc/cron.allowdan /etc/cron.denytidak ada.

crontab disetel kelompok setuid:

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

Direktori crontab tampaknya memiliki izin yang tepat:

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

Crontab itu sendiri milik saya (tidak mengherankan, karena saya dapat mengeditnya):

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

Saya bukan anggota crontabgrup.

Baris-baris ini muncul di /var/log/auth.logsetiap menit (terima kasih @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

Mungkin PAM rusak? pam-auth-update(terima kasih @coteyr) mencantumkan semua ini, dan semuanya diaktifkan:

  • Otentikasi unix
  • GNOME Keyring Daemon - Manajemen login keyring
  • Manajemen Kunci / Mount eCryptfs
  • Manajemen Sesi ConsoleKit
  • Manajemen Kemampuan yang Dapat Diwarisi

Bisakah salah satu dari mereka dinonaktifkan dengan aman? Saya tidak menggunakan sistem file terenkripsi.

Berdasarkan entri bug Debian saya mencoba menjalankan debconf-show libpam-runtime, dan saya mendapat pesan kesalahan berikut:

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

Isi dari /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

File-file yang disebutkan ( /etc/environment, pam_env.so, /etc/default/locale, pam_limits.so, pam_succeed_if.so) semua dibaca oleh pengguna saya.

Pada host lain dengan Ubuntu 13.04, dengan crontab pengguna yang sama, tidak /etc/cron.{allow,deny}, izin yang sama seperti di atas, dan tidak menjadi anggota crontabgrup, itu berfungsi dengan baik (mencatat perintah tetapi bukan output masuk /var/log/syslog).


Dengan mengubah baris crontab pertama:

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

dan memeriksa bahwa / tmp dapat ditulis dunia:

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

Saya telah memverifikasi bahwa perintah crontab tidak dijalankan sama sekali : Permission deniedPesan masih muncul /var/log/syslog, tetapi /tmp/env.logbelum dibuat.


Berdasarkan daftar /etc/pam.dpengaturan acak, saya menemukan perbedaan berikut:

$ 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

Paket PAM diinstal:

$ 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

Saya mencoba menginstal ulang ini - tidak membantu:

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

Saya tidak dapat membersihkan dan menginstal ulang ini karena dependensi yang tidak terpenuhi.

l0b0
sumber
Apakah Anda mencoba masuk sebagai cron dan menjalankan perintah?
NotFromBrooklyn
@ l0b0, bagaimana dengan izin file crontab itu sendiri, di dalam folder crontab, yaitu /var/spool/cron/crontabs/username?
Alaa Ali
1
Hmm. Apa yang /var/log/auth.logdikatakan tentang CRON?
Alaa Ali
@NotFromBrooklyn id cron->id: cron: No such user
l0b0
1
@ssoto Bagaimana saya mengetahuinya? Saya am a lokal pengguna, jika itu yang Anda maksud.
l0b0

Jawaban:

2

PAM bad jump in stack adalah petunjuk besar.

Anda /etc/pam.d/cronberbeda dari versi stok dengan penambahan satu baris tambahan di akhir:

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

The success=1bit berarti "jika modul ini berhasil, melewatkan aturan berikutnya". Hanya tidak ada aturan selanjutnya, karena ini adalah baris terakhir dalam konfigurasi PAM Anda.

Marius Gedminas
sumber
Saya memiliki baris yang sama (pasti mendapatkannya dari suatu tempat di interwebs), berkomentar dan semuanya mulai bekerja lagi.
Mike
1

Konfigurasi PAM Anda tidak lengkap. Ini umum jika Anda telah menggunakan metode otentikasi "eksternal" seperti pemindai sidik jari, akun LDAP, Kunci USB atau semacamnya. Pada dasarnya cron tidak dapat bekerja dengan pemindai sidik jari sehingga tidak bisa masuk seperti Anda.

Anda perlu menghapus konfigurasi yang menyinggung dari /etc/pam.d/common-*meskipun melacaknya bisa agak sulit, khususnya jika Anda tidak mengaktifkan sesuatu secara manual (misalnya jika skrip pengaturan pemindai pemindai sidik jari menghidupkan sesuatu).

Saya tidak bisa membantu banyak dengan memberi tahu Anda apa yang seharusnya ada di file-file itu. Banyak hal bisa berbeda tergantung pada pengaturan Anda. Tetapi menonaktifkan metode auth "wajib" sampai Anda kehabisan hanya dengan "Unix Authentication" mungkin merupakan langkah pertama yang baik.

Anda dapat melakukan ini dengan menjalankan pam-auth-updatesebagai root dan menghapus centang pada kotak lainnya. Berhati-hatilah karena ini dapat meninggalkan Anda dengan sistem yang tidak dapat Anda masuki jika dilakukan dengan tidak benar. Nonaktifkan mereka satu per satu, reboot untuk keamanan, dan uji. TIDAK PERNAH MENONAKTIFKAN "Unix Authentication"

kapas
sumber
Saya harus jelas, pemindai sidik jari biasanya harus "opsional" tidak "diperlukan". Menjadikannya "wajib" berarti bahwa hal-hal tanpa sidik jari Anda tidak dapat "masuk". Karena kesalahan konfigurasi seperti itu Anda bisa berakhir dengan masalah seperti ini. Namun, biasanya pemindai sidik jari (atau USB atau LDAP atau SMB atau apa pun) tidak akan menyebabkan masalah.
coteyr
Saya belum menghubungkan pemindai sidik jari atau drive USB. Apakah Anda tahu di suatu tempat saya dapat memeriksa konten default/etc/pam.d/common-* ?
l0b0
sudo dpkg-reconfigure pamadalah cara terbaik . Namun, Anda dapat menggunakan sudo dpkg -i --force-confmisssetelah menghapus file (HATI-HATI) dan itu akan mengembalikan satu link ini: superuser.com/questions/69045/…
coteyr
/usr/sbin/dpkg-reconfigure: pam is not installed. Saya juga mencoba sudo dpkg-reconfigure libpam-runtime, tetapi itu tidak membantu.
l0b0
1
Saya tidak berpikir itu paket yang hilang. Saya pikir ini adalah konfigurasi yang kacau. Kesalahan "PAM bad jump in stack" berarti bahwa, karena alasan tertentu, modul pam yang diperlukan tidak dapat diautentikasi. Seperti yang saya katakan ini biasanya disebabkan oleh orang-orang mengacaukan file pam mereka baik secara sengaja atau tidak sengaja dan menambahkan modul yang diperlukan yang tidak berfungsi. Beberapa contoh akan menjadi otentikasi SMB, otentikasi LDAP, otentikasi berbasis perangkat keras, dll. Perlu diingat, beberapa paket mungkin telah menambahkan file yang menyebabkan masalah. Pam berfungsi, karena Anda dapat masuk, tetapi juga tidak berfungsi karena cron tidak dapat
coteyr
1

Kami mencoba menjadwalkan cron dari pengguna LDAP (bukan pengguna mesin) dan mendapatkan yang sama permission deniedbahkan untuk memasukkan echoperintah atau skrip dasar crontab, sementara itu berfungsi sepenuhnya file dari pengguna mesin (yang memiliki entri di / etc / passwd). Mengambil bantuan dari komentar pemecahan masalah terinci yang ditambahkan oleh OP, kami memeriksa file /var/log/auth.logtempat kami menemukan baris ini:

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

Sedikit pencarian Google membawa saya ke jawaban ini yang berhasil bagi kami. Menambahkan detail di sini juga.

Di /etc/sssd/sssd.conf, di bawah domain kami, kami menambahkan entri (lihat baris terakhir) seperti ini.

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

Dan baru saja melakukannya sudo service sssd restartdan itu bekerja seperti pesona.

pratpor
sumber