Pertanyaan Semua perintah di crontab saya gagal dengan "Izin ditolak"


Pembaruan: Masalah ini tidak akan dijawab secara meyakinkan; Saya telah pindah ke distro lain dan belum mengamati masalah ini sejak itu. Saya tidak pernah dapat memperbaikinya dengan jawaban berwawasan yang tersedia pada saat itu, tetapi efisiensi bahan bakar Anda dapat bervariasi (YMMV).


crontab -e dan crontab -l bekerja dengan baik:

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

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

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

Sehingga crontab sedang dibaca, tapi entah bagaimana tidak bisa melakukan apa-apa (tentu saja saya memverifikasi perintah saat masuk sebagai pengguna yang sama). Ada yang tahu kenapa?

/etc/cron.allow dan /etc/cron.deny tidak ada.

crontab adalah set group setuid:

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

Direktori crontabs tampaknya memiliki izin yang tepat:

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

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

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

saya tidak anggota dari crontab kelompok.

Garis-garis ini muncul /var/log/auth.log setiap 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) daftar semua ini, dan semuanya diaktifkan:

  • Otentikasi unix
  • GNOME Keyring Daemon - Manajemen login keyring
  • eCryptfs Key / Mount Management
  • Pengelolaan Sesi KonsolKit
  • Manajemen Kemampuan yang Tidak Berwujud

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

Berdasarkan pada Entri bug Debian Saya mencoba berlari 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 dapat 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 crontab grup, itu berfungsi dengan baik (log perintah tetapi tidak output dalam /var/log/syslog).


Dengan mengubah baris crontab pertama:

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

dan memeriksa bahwa / tmp dapat ditulisi 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 sudah memverifikasi itu perintah crontab tidak dijalankan sama sekali: The Permission denied pesan masih muncul di /var/log/syslog, tapi /tmp/env.log tidak dibuat.


Berdasarkan pada daftar acak dari /etc/pam.d pengaturan Saya menemukan ketidaksesuaian 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.


10
2018-05-22 12:34


asal


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


Jawaban:


PAM bad jump in stack adalah petunjuk besar.

Anda /etc/pam.d/cron berbeda dari versi stok dengan penambahan satu baris ekstra di bagian akhir:

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

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


2



Saya memiliki baris yang sama (harus mendapatkannya dari suatu tempat di interwebs), berkomentar dan semuanya mulai bekerja lagi. - Mike


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

Anda harus 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 sidik jari mengubah sesuatu).

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

Anda dapat melakukan ini dengan berlari pam-auth-update sebagai root dan tidak memeriksa kotak lainnya. Sangat berhati-hati karena ini dapat meninggalkan Anda dengan sistem yang tidak dapat Anda masuki jika dilakukan dengan tidak benar. Nonaktifkan satu per satu, reboot untuk keamanan, dan uji. TIDAK PERNAH DISABAIKAN "Otentikasi Unix"


1



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 apa pun. Apakah Anda mungkin tahu suatu tempat saya dapat memeriksa apa default isi dari /etc/pam.d/common-* akan menjadi? - l0b0
sudo dpkg-reconfigure pam adalah terbaik cara. Namun, Anda bisa menggunakannya sudo dpkg -i --force-confmiss setelah menghapus file (CAREFUL) dan itu akan menempatkan kembali melihat tautan 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
Saya tidak berpikir itu paket yang hilang. Saya pikir ini adalah konfigurasi yang kacau. Kesalahan "PAM buruk lompat di tumpukan" berarti bahwa, untuk beberapa alasan, modul pam yang diperlukan tidak dapat mengotentikasi. Seperti yang saya katakan ini biasanya disebabkan oleh orang-orang mengotak-atik file pam mereka baik secara sengaja atau kebetulan dan menambahkan modul yang diperlukan yang tidak berfungsi. Beberapa contoh adalah otentikasi SMB, otentikasi LDAP, otentikasi berbasis perangkat keras, dll. Ingat, beberapa paket mungkin telah menambahkan file yang menyebabkan masalah. Pam berfungsi, karena Anda dapat masuk, tetapi juga tidak berfungsi karena cron tidak bisa - coteyr