Jika saya memiliki server A di mana saya dapat login dengan kunci ssh saya dan saya memiliki kemampuan untuk "sudo su - otheruser", saya kehilangan penerusan kunci, karena variabel env dihapus dan soket hanya dapat dibaca oleh pengguna asli saya. Apakah ada cara saya dapat menjembatani penerusan kunci melalui "sudo su - otheruser", sehingga saya dapat melakukan hal-hal pada server B dengan kunci penerusan saya (git clone dan rsync dalam kasus saya)?
Satu-satunya cara yang bisa saya pikirkan adalah menambahkan kunci saya ke otor_keys dari pengguna lain dan "ssh otheruser @ localhost", tapi itu rumit untuk dilakukan untuk setiap kombinasi pengguna dan server yang mungkin saya miliki.
Pendeknya:
$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey).
user2
atasroot
! Jika tidak,user2
SSH_AUTH_SOCK akan diatur dengan benar, tetapiuser2
tidak akan dapat mengakses mis. / Tmp / ssh-GjglIJ9337 /.root
memang memiliki akses itu. Jadi ini mungkin menyelesaikan sebagian dari masalah, tetapi bukan OP: " dan soket hanya dapat dibaca oleh pengguna asli saya"Defaults>root env_keep+=SSH_AUTH_SOCK
Seharusnya pastikan hanya meneruskan saat sudoing ke root. Anda tidak ingin melakukannya untuk pengguna lain karena alasan keamanan. Lebih baik jalankan ssh-agent terpisah untuk orang lain, dan tambahkan kunci yang sesuai.sudo su -
tidak bekerja untuk saya, mungkin itu tidak dapat melestarikan lingkungan karena tidaksudo
pada saat startup.sudo su
sepertinya berhasil.sudo su
. Jika Anda membutuhkan shell root, itulah yangsudo -s
atausudo -i
untuk.Ini akan memberi Anda shell root dengan kunci asli masih dimuat.
sumber
Izinkan pengguna lain mengakses
$SSH_AUTH_SOCK
file dan direktori itu, misalnya dengan ACL yang benar, sebelum beralih ke file tersebut. Contoh mengasumsikanDefaults:user env_keep += SSH_AUTH_SOCK
di/etc/sudoers
atas mesin host:Lebih aman dan bekerja untuk pengguna non-root juga ;-)
sumber
otheruser
pengguna juga dapat menggunakan otentikasi ssh Anda.rwx
dan tidakrw
(atau tidakr
sama sekali)?man 7 unix
- di Linux yang terhubung ke soket memerlukan izin baca dan tulis pada soket itu. Anda juga perlu mencari (mengeksekusi) dan menulis izin pada direktori di mana Anda membuat soket atau hanya mencari (mengeksekusi) izin ketika Anda terhubung ke soket ini. Jadi dalam jawaban di atas, jalankan izin pada soket berlebihan.sudo -u otheruser --preserve-env=HOME -s
Saya telah menemukan bahwa ini juga berfungsi.
Seperti yang telah dicatat orang lain, ini tidak akan berfungsi jika pengguna yang Anda pindahkan tidak memiliki izin baca di $ SSH_AUTH_SOCK (yang mana hampir semua pengguna selain root). Anda dapat menyiasatinya dengan menetapkan $ SSH_AUTH_SOCK dan direktori yang ada di dalamnya untuk memiliki izin 777.
Ini cukup berisiko sekalipun. Anda pada dasarnya memberi setiap pengguna lain izin sistem untuk menggunakan Agen SSH Anda (sampai Anda keluar). Anda juga dapat mengatur grup dan mengubah izin menjadi 770, yang bisa lebih aman. Namun, ketika saya mencoba mengubah grup, saya mendapat "Operasi tidak diizinkan".
sumber
Jika Anda berwenang
sudo su - $USER
, maka Anda mungkin akan memiliki argumen yang bagus untuk diizinkan melakukanssh -AY $USER@localhost
sebaliknya, dengan kunci publik Anda yang valid di direktori home $ USER. Kemudian penerusan otentikasi Anda akan dilakukan bersama Anda.sumber
Anda selalu dapat ssh ke localhost dengan penerusan agen alih-alih menggunakan sudo:
Kerugiannya adalah Anda harus masuk lagi, tetapi jika Anda menggunakannya di tab layar / tmux, itu hanya upaya satu kali, namun, jika Anda memutuskan sambungan dari server, soket (tentu saja) akan rusak lagi . Jadi itu tidak ideal jika Anda tidak dapat menjaga layar / sesi tmux Anda terbuka setiap saat (namun, Anda dapat secara manual memperbarui
SSH_AUTH_SOCK
env var Anda jika Anda keren).Perhatikan juga bahwa ketika menggunakan penerusan ssh, root selalu dapat mengakses soket Anda dan menggunakan otentikasi ssh Anda (selama Anda masuk dengan penerusan ssh). Jadi pastikan Anda bisa memercayai root.
sumber
otheruser
melaluisudo
alih-alih melalui SSH (mis. Anda ingin barang-barang SCPwww-data
)Jangan gunakan
sudo su - USER
, melainkansudo -i -u USER
. Bekerja untukku!sumber
Sudo version 1.6.9p17
berjalan di Debian Lenny. Cobasudo -s
?sudo -s
juga tidaksudo -i
berfungsi untuk saya ...Menggabungkan informasi dari jawaban lain saya datang dengan ini:
Saya suka ini karena saya tidak perlu mengedit
sudoers
file.Diuji pada Ubuntu 14.04 (harus menginstal
acl
paket).sumber
Saya pikir ada masalah dengan opsi
-
(dash) setelahsu
di perintah Anda:Jika Anda membaca halaman manual su , Anda mungkin menemukan bahwa opsi
-, -l, --login
memulai lingkungan shell sebagai shell login. Ini akan menjadi lingkungan untukotheruser
terlepas dari variabel env tempat Anda menjalankansu
.Sederhananya, tanda hubung akan merusak apa pun yang Anda lewati
sudo
.Sebagai gantinya, Anda harus mencoba perintah ini:
Seperti yang ditunjukkan @ joao-costa,
-E
akan mempertahankan semua variabel di lingkungan tempat Anda berlarisudo
. Kemudian tanpa tanda hubung,su
akan menggunakan lingkungan itu secara langsung.sumber
Sayangnya ketika Anda su ke pengguna lain (atau bahkan menggunakan sudo) Anda akan kehilangan kemampuan untuk menggunakan kunci yang diteruskan Anda. Ini adalah fitur keamanan: Anda tidak ingin pengguna acak terhubung ke ssh-agent Anda dan menggunakan kunci Anda :)
Metode "ssh -Ay $ {USER} @localhost" sedikit rumit (dan seperti yang tercantum dalam komentar saya pada jawaban David yang cenderung rusak), tetapi mungkin itu yang terbaik yang dapat Anda lakukan.
sumber
-a
dan-A
argumen.-a
apakah kebalikan dari apa yang dimaksudkan, itu menonaktifkan penerusan agen! Jadi, di bawah versi Ubuntu terbaru (dan mungkin semua), gunakan-A
untuk mengaktifkan penerusan agen.