ssh Izin ditolak hanya dalam pekerjaan cron

13

Memiliki masalah yang sangat aneh. Saya telah membuat skrip bash kecil yang menjalankan perintah pada host jarak jauh melalui ssh (menggunakan otentikasi kunci publik).

Ketika saya menjalankan skrip ini secara manual dari baris perintah berfungsi dengan baik, tetapi ketika ditempatkan di /etc/cron.hourly gagal dengan Permission denied, please try again.kesalahan.

  • Saya secara eksplisit mengatur kunci dalam skrip menggunakan ssh -i /root/.ssh/id_rsa user@remote "command";
  • skrip berjalan sebagai root (saya menambahkan echo `id` > /tmp/whoami.loguntuk memeriksa ulang); dan
  • kunci ssh tidak dilindungi kata sandi ...

Sistem ini adalah server Ubuntu 12.04, saya tidak memiliki banyak akses di sisi jarak jauh untuk memecahkan masalah, tetapi seperti yang saya katakan, menjalankan ssh secara manual atau skrip bash yang sama dari perintah-perintah berfungsi.

Adakah yang tahu mengapa ini terjadi atau bagaimana cara memperbaikinya ??

memperbarui

bergantian keluar aku salah, dan kunci ssh itu dilindungi password (dengan pembebanan keychain ssh-agent), maka mengapa gagal dari naskah tetapi tidak ketika berjalan dari sesi bash. Menambahkan . ~/.keychain/$HOSTNAME-shke skrip saya menyelesaikan masalah (terima kasih kepada @grawity yang menunjuk saya ke arah yang benar dan memberikan jawaban yang komprehensif).

Yoav Aner
sumber
Apakah Anda yakin menjalankannya secara manual menggunakan kunci tertentu? Tes lagi setelah variabel unsetting SSH_AUTH_SOCKdan KRB5CCNAMElingkungan.
user1686
Terima kasih untuk sarannya. Tidak yakin saya mengerti Anda sepenuhnya. Saya cukup yakin itu menggunakan kunci tertentu, karena saya dapat menghubungkan / menjalankan perintah pada host jarak jauh ketika berjalan secara manual. Apa sebenarnya yang harus saya uji lagi setelah membatalkan pengaturan variabel tersebut?
Yoav Aner
Juga - Saya tidak menggunakan ssh-agent, jadi tidak yakin bagaimana SSH_AUTH_SOCKhubungannya (walaupun saya senang mencoba apa pun). Saya mengakses file kunci secara langsung, dan file kunci tidak dilindungi kata sandi. Sedangkan untuk KRB5CCNAMEpencarian cepat menunjukkan ini ada hubungannya dengan Kerberos. Sekali lagi - jangan melihat hubungan dengan masalah ini, tapi mungkin saya kehilangan sesuatu di sini ...
Yoav Aner
Uji skrip Anda, tentu saja. Anda tidak dapat "cukup yakin menggunakan kunci tertentu" sampai Anda melakukannya, karena pekerjaan cron berjalan di lingkungan yang berbeda dari perintah interaktif. Akan lebih baik jika Anda menambahkan -vopsi ke sshperintah itu ...
user1686
Tetapi saya melakukannya. Saya secara eksplisit menggunakan kunci menggunakan ssh -iperintah dalam kedua kasus ... Saya akan mencoba membuka variabel-variabel dalam skrip dan melihat. Saran bagus untuk ditambahkan -v- Saya akan menambahkannya juga.
Yoav Aner

Jawaban:

11

Perintah dan pekerjaan cron interaktif berjalan di lingkungan yang berbeda - khususnya, sesi interaktif mungkin memiliki agen SSH berjalan, atau penyimpanan TGT Kerberos. Karena cara sshmemesan metode otentikasi, Anda tidak dapat memastikan bahwa kunci Anda digunakan hanya karena Anda menambahkan -iopsi.

  • Jika agen SSH berjalan, sshklien selalu mencoba kunci agen sebelum menggunakan kunci yang ditentukan secara eksplisit.

  • Jika jaringan menggunakan Kerberos dan TGT Kerberos hadir, OpenSSH akan menggunakannya sebelum mencoba otentikasi kunci publik.

Saya tidak tahu apa-apa tentang lingkungan Anda, tetapi kedua kemungkinan ini mudah diperiksa:

  1. Tambahkan unset SSH_AUTH_SOCKdan unset KRB5CCNAMEsebelum sshperintah, lalu jalankan skrip yang dimodifikasi secara manual.

    Ini akan mencegah skrip melihat agen atau tiket Kerberos, dan hanya akan menggunakan kunci yang ditentukan secara eksplisit.

  2. Tambahkan -vopsi ke ssh. Ini akan menampilkan lebih detail tentang bagaimana otentikasi terjadi.

Anda juga dapat menambahkan -oIdentitiesOnly=yeske sshperintah; ini akan memaksanya untuk menggunakan kunci yang ditentukan .


Dan jika Anda menambahkan kiat tentang mengakses agen dari cron - bahkan lebih baik

Ini umumnya tidak disarankan, karena agen biasanya terkait erat dengan sesi login interaktif Anda. Secara khusus, ini hanya dimulai ketika Anda masuk, dan terbunuh ketika Anda keluar - dan itu membutuhkan kata sandi Anda untuk benar-benar membuka kunci kunci SSH (dengan asumsi mereka dilindungi kata sandi).

Anda menyebutkan "Keychain" - apakah ini program OS X, atau skrip Linux? (Saya tidak tahu banyak tentang arsitektur Mac OS X, tetapi AFAIK membuatnya lebih sulit untuk mengakses ssh-agent pengguna dari cronjob ...)

pengguna1686
sumber
1
Anda dapat menggunakan ssh-cron untuk mengatur koneksi SSH terjadwal untuk mengamankan server tanpa mengekspos kunci SSH Anda, tetapi menggunakan agen SSH. superuser.com/questions/463540/…
Luchostein
5

Solusi lain untuk masalah ini adalah mengatur cron ke ssh ke kotak lokal untuk menjalankan perintah ssh alih-alih menjalankan file atau perintah dengan jalur absolut lokalnya. Ini cache KRB5CCNAME dan bekerja di mana / path / command tidak.

# Fails:
0 * * * * /home/user/sshscript.sh

# Works:
0 * * * * /usr/bin/ssh user@localhost /home/user/sshscript.sh

#!/bin/bash
# Works:
unset SSH_AUTH_SOCK
unset KRB5CCNAME
/usr/bin/ssh user@localhost /home/user/sshscript.sh
mmond
sumber
1

Anda dapat menggunakan ssh-cron untuk mengatur koneksi SSH terjadwal untuk mengamankan server tanpa mengekspos kunci SSH Anda, tetapi menggunakan agen SSH.

Luchostein
sumber
Ketergantungan tidak tersedia pada Homebrew, jadi menginstal tampaknya rumit. Kunci tanpa kata sandi kurasa…: - /
Charlie Gorichanaz
-1

Anda dapat menjalankan skrip atau perintah di crontab seperti:

0 * * * * bash -c -l "/home/user/sshscript.sh"

atau

0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"

pawan
sumber
1
OP sudah mencoba menjalankan skrip via cron; jadi ini sepertinya tidak memberikan jawaban.
bertieb