Mengapa cron gagal menjalankan hal-hal sudo dalam skrip saya?

30

Saya memiliki skrip dijalankan dari crontab pengguna yang tidak memiliki hak istimewa yang meminta beberapa perintah menggunakan sudo. Kecuali tidak. Script berjalan dengan baik tetapi perintah sudo'ed diam-diam gagal.

  • Script berjalan dengan sempurna dari shell sebagai pengguna yang dimaksud.

  • Sudo tidak memerlukan kata sandi. Pengguna yang bersangkutan memiliki (root) NOPASSWD: ALLakses yang diberikan pada /etc/sudoers.

  • Cron menjalankan dan menjalankan skrip. Menambahkan sederhana date > /tmp/logmenghasilkan keluaran pada waktu yang tepat.

  • Itu bukan masalah izin. Sekali lagi skrip dieksekusi, tidak hanya perintah sudo'ed.

  • Itu bukan masalah jalur. Menjalankan envdari dalam skrip yang sedang dijalankan menunjukkan $PATHvariabel yang benar yang menyertakan path ke sudo. Menjalankannya menggunakan jalur lengkap tidak membantu. Perintah yang dieksekusi diberi nama path lengkap.

  • Mencoba menangkap keluaran dari perintah sudo termasuk STDERR tidak menunjukkan sesuatu yang berguna. Menambahkan sudo echo test 2>&1 > /tmp/logke skrip menghasilkan log kosong.

  • Sudo biner itu sendiri mengeksekusi dengan baik dan mengakui bahwa ia memiliki izin bahkan ketika dijalankan dari cron di dalam skrip. Menambahkan sudo -l > /tmp/logke skrip menghasilkan output:

    Pengguna ec2-pengguna dapat menjalankan perintah berikut pada host ini:
    (root) NOPASSWD: ALL

Memeriksa kode keluar dari perintah menggunakan $?menunjukkan itu mengembalikan kesalahan (kode keluar:) 1, tetapi tampaknya tidak ada kesalahan yang dihasilkan. Perintah sesederhana /usr/bin/sudo /bin/echo testmengembalikan kode kesalahan yang sama.

Apa lagi yang bisa terjadi?

Ini adalah mesin virtual yang baru dibuat yang menjalankan AMI Amazon Linux terbaru. Crontab milik pengguna ec2-userdan file sudoers adalah distribusi default.

Caleb
sumber
1
Saya akan berbicara tentang solusi tetapi kemudian saya membaca The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoersdan otak saya mulai berteriak terlalu keras untuk terus membaca.
Shadur
@ Safur: Bicara ke tangan. Itu bukan cara saya mengatur mesin, tetapi mesin-mesin ini keluar dari kotak. Bahkan melalui mesin itu milik Anda, Anda tidak mendapatkan kata sandi root, kunci Anda sebagai pemilik kotak masuk ke akun pengguna ec2 yang memiliki (seperti disebutkan) akses sudo penuh. Anda juga tidak mendapatkan kata sandi untuk ec2-user kecuali Anda menyetelnya, ini hanya login kunci.
Caleb
1
Maka hal pertama yang saya sarankan Anda lakukan adalah mengatur pengguna terpisah dengan sudohak terbatas / hanya / untuk perintah yang Anda butuhkan dalam skrip dan menonaktifkan sepenuhnya kemampuan login mereka.
Shadur
jika Anda memiliki root, dan Anda ingin pekerjaan cron dijalankan sebagai root, lalu mengapa memasukkannya ke crontab pengguna ec2? bukankan crontab root lebih cocok? atau / etc / crontab?
cas
@CraigSanders: Saya tidak ingin cron job dijalankan sebagai root, bahkan sebagian besar harus dijalankan sebagai pengguna. Pertanyaannya bukan tentang menjalankan pekerjaan sebagai root, tetapi tentang skrip yang memiliki akses khusus ke satu fungsi melalui sudo.
Caleb

Jawaban:

40

Sudo memiliki beberapa opsi khusus dalam file izinnya, salah satunya memungkinkan pembatasan penggunaannya pada shell yang berjalan di dalam TTY, yang bukan cron.

Beberapa distro termasuk Amazon Linux AMI mengaktifkannya secara default. The /etc/sudoersFile akan terlihat seperti ini:

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults   !visiblepw

Jika Anda telah menangkap output ke STDERR di tingkat skrip shell daripada perintah sudo itu sendiri, Anda akan tampak seperti pesan:

maaf, Anda harus memiliki tty untuk menjalankan sudo

Solusinya adalah mengizinkan sudo dieksekusi di lingkungan non TTY baik dengan menghapus atau mengomentari opsi ini:

#Defaults    requiretty
#Defaults   !visiblepw
Caleb
sumber
1
Saya dapat mengonfirmasi bahwa CentOS memiliki batasan ini.
Aeu
Sepertinya diperlukanetty ditambahkan di CentOS 7, jadi sementara ini tidak diperlukan dengan CentOS 6, itu dengan CentOS 7+. Dalam pengalaman saya, perintah sudo dari cron berfungsi pada CentOS 6 bahkan jika Defaults !visiblepwdihidupkan / tidak dikomentari.
kevinmicke