Penerusan ssh-agent dan sudo ke pengguna lain

153

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). 
kolypto
sumber

Jawaban:

182

Seperti yang Anda sebutkan, variabel lingkungan dihapus oleh sudo, untuk alasan keamanan.

Tetapi untungnya sudocukup dapat dikonfigurasi: Anda dapat menentukan dengan tepat variabel lingkungan mana yang ingin Anda pertahankan berkat env_keepopsi konfigurasi di /etc/sudoers.

Untuk penerusan agen, Anda perlu menjaga SSH_AUTH_SOCKvariabel lingkungan. Untuk melakukannya, cukup edit /etc/sudoersfile konfigurasi Anda (selalu menggunakan visudo) dan atur env_keepopsi ke pengguna yang sesuai. Jika Anda ingin opsi ini disetel untuk semua pengguna, gunakan Defaultsbaris seperti ini:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers untuk lebih jelasnya.

Sekarang Anda harus dapat melakukan sesuatu seperti ini (yang disediakan user1's kunci publik hadir di ~/.ssh/authorized_keysdalam user1@serverAdan user2@serverB, dan serverA' s /etc/sudoersfile setup seperti yang ditunjukkan di atas):

user1@mymachine> eval `ssh-agent`  # starts ssh-agent
user1@mymachine> ssh-add           # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA    # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2     # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB         # goto user2@serverB w/o typing pwd again...
user2@serverB>                     # ...because forwarding still works
MiniQuark
sumber
1
Ini jawaban yang benar, harus ditandai.
Xealot
41
Ini hanya berfungsi, jika di user2atas root! Jika tidak, user2SSH_AUTH_SOCK akan diatur dengan benar, tetapi user2tidak akan dapat mengakses mis. / Tmp / ssh-GjglIJ9337 /. rootmemang memiliki akses itu. Jadi ini mungkin menyelesaikan sebagian dari masalah, tetapi bukan OP: " dan soket hanya dapat dibaca oleh pengguna asli saya"
Peter V. Mørch
6
Defaults>root env_keep+=SSH_AUTH_SOCKSeharusnya 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.
Paul Schyska
1
sudo su -tidak bekerja untuk saya, mungkin itu tidak dapat melestarikan lingkungan karena tidak sudopada saat startup. sudo susepertinya berhasil.
Alex Fortuna
3
Saya tidak pernah mengerti mengapa orang menggunakannya sudo su. Jika Anda membutuhkan shell root, itulah yang sudo -satau sudo -iuntuk.
eaj
68
sudo -E -s
  • -E akan melestarikan lingkungan
  • -s menjalankan perintah, default ke shell

Ini akan memberi Anda shell root dengan kunci asli masih dimuat.

Joao Costa
sumber
2
Seperti halnya komentar di atas, ini hanya menjawab pertanyaan jika Anda menjadi root, karena dalam kasus itu root dapat menyiasati izin akses biasa pada $ SSH_AUTH_SOCK.
doshea
35

Izinkan pengguna lain mengakses $SSH_AUTH_SOCKfile dan direktori itu, misalnya dengan ACL yang benar, sebelum beralih ke file tersebut. Contoh mengasumsikan Defaults:user env_keep += SSH_AUTH_SOCKdi /etc/sudoersatas mesin host:

$ ssh -A user@host
user@host$ setfacl -m otheruser:x   $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$

Lebih aman dan bekerja untuk pengguna non-root juga ;-)

Viliam Pucik
sumber
6
Ingat ketika menggunakan metode ini, orang lain yang masuk sebagai otheruserpengguna juga dapat menggunakan otentikasi ssh Anda.
gitaarik
Ini berfungsi untuk saya kecuali saya harus mengubah "sudo su - otheruser" menjadi "sudo su otheruser" (menghapus -).
Charles Finkel
1
Kenapa rwxdan tidak rw(atau tidak rsama sekali)?
anatoly techtonik
3
@anatolytechtonik Dari 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.
mixel
alih-alih harus mengedit / etc / sudoers yang dapat Anda gunakansudo -u otheruser --preserve-env=HOME -s
Sec
14

Saya telah menemukan bahwa ini juga berfungsi.

sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

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.

chmod 777 -R `dirname $SSH_AUTH_SOCK`
sudo su otheruser -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

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".

filum
sumber
6
Ini sangat berisiko. Memberi setiap pengguna izin lainnya untuk menggunakan agen SSH Anda sama dengan memberi mereka semua kredensial Anda (dan jika Anda pernah menggunakan sudo atau su, memberi mereka kekuatan root atas semua pengguna lain pada sistem, serta semua sistem lain yang Anda ssh!) . Ini TIDAK PERNAH harus dilakukan!
Matija Nalis
4
Saya tidak setuju dengan pernyataan bahwa "Ini TIDAK PERNAH PERNAH dilakukan!" Ada banyak kasus di mana risiko ini dapat diterima. Misalnya, tim kecil tempat semua orang memiliki izin yang sama dan Anda mempercayai semua pengguna lain. Itu tidak boleh dilakukan tanpa memahami risiko yang ditimbulkannya. Tetapi begitu risiko-risiko itu dipahami, ada saatnya risiko itu dapat diterima.
phylae
6

Jika Anda berwenang sudo su - $USER, maka Anda mungkin akan memiliki argumen yang bagus untuk diizinkan melakukan ssh -AY $USER@localhostsebaliknya, dengan kunci publik Anda yang valid di direktori home $ USER. Kemudian penerusan otentikasi Anda akan dilakukan bersama Anda.

David Mackintosh
sumber
Dia menyebutkan itu di bagian bawah pertanyaannya, dan mengatakan itu akan sulit dilakukan.
Fahad Sadah
Ini mungkin solusi terbaik tetapi menjadi berbulu jika $ USER adalah Orang yang Nyata (tm) - mereka mungkin menghapus kunci SA dari berwenang_kunci atau mengubah kata sandi mereka ...
voretaq7
Anda dapat menghapus akses tulis mereka ke otor_keys (meskipun jika mereka benar-benar ditetapkan untuk menolak akses Florian, mereka dapat menghapus dan membuatnya kembali, itu berada di direktori yang mereka miliki)
Fahad Sadah
4

Anda selalu dapat ssh ke localhost dengan penerusan agen alih-alih menggunakan sudo:

ssh -A otheruser@localhost

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_SOCKenv 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.

gitaarik
sumber
Ini tidak berfungsi jika Anda hanya memiliki akses otherusermelalui sudoalih-alih melalui SSH (mis. Anda ingin barang-barang SCP www-data)
Gert van den Berg
3

Jangan gunakan sudo su - USER, melainkan sudo -i -u USER. Bekerja untukku!

Fahad Sadah
sumber
Apa versi sudo yang Anda miliki? Milik saya (1.6.7p5, CentOS 4.8) tidak memiliki -i di halaman manualnya.
David Mackintosh
Sudo version 1.6.9p17berjalan di Debian Lenny. Coba sudo -s?
Fahad Sadah
6
Tidak bekerja untuk saya.
Di Ubuntu, menggunakan Sudo 1.8.9p5, tidak sudo -sjuga tidak sudo -iberfungsi untuk saya ...
Jon L.
2

Menggabungkan informasi dari jawaban lain saya datang dengan ini:

user=app
setfacl -m $user:x $(dirname "$SSH_AUTH_SOCK")
setfacl -m $user:rwx "$SSH_AUTH_SOCK"
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -u $user -i

Saya suka ini karena saya tidak perlu mengedit sudoersfile.

Diuji pada Ubuntu 14.04 (harus menginstal aclpaket).

warvariuc
sumber
1

Saya pikir ada masalah dengan opsi -(dash) setelah sudi perintah Anda:

sudo su - otheruser

Jika Anda membaca halaman manual su , Anda mungkin menemukan bahwa opsi -, -l, --loginmemulai lingkungan shell sebagai shell login. Ini akan menjadi lingkungan untuk otheruserterlepas dari variabel env tempat Anda menjalankan su.

Sederhananya, tanda hubung akan merusak apa pun yang Anda lewati sudo.

Sebagai gantinya, Anda harus mencoba perintah ini:

sudo -E su otheruser

Seperti yang ditunjukkan @ joao-costa, -Eakan mempertahankan semua variabel di lingkungan tempat Anda berlari sudo. Kemudian tanpa tanda hubung, suakan menggunakan lingkungan itu secara langsung.

Koala Yeung
sumber
0

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.

voretaq7
sumber
1
Hmm, tetapi jika saya melakukan ini dengan ssh, maka agen saya dapat diakses oleh pengguna itu, atau apakah saya salah?
Jika Anda SSH menjadi pengguna target dengan agen meneruskan permintaan agen Anda akan memantul rantai ke mana pun agen "nyata" berada. Ketika Anda su atau sudo jauh dari pengguna asli soket agen SSH Anda tidak akan (atau tidak seharusnya) dapat diakses - Direktori tempat tinggalnya adalah mode 700 & dimiliki oleh pengguna asli. (Obvious Peringatan: Jika Anda beralih ke root & reset lingkungan SSH_AUTH_SOCK itu mungkin berhasil, tapi saya tidak akan bergantung pada itu)
voretaq7
1
Di server saya (Ubuntu 12.04, ssh versi OpenSSH_5.9p1 Debian-5ubuntu1.1, OpenSSL 1.0.1 14 Mar 2012), ssh memiliki -adan -Aargumen. -aapakah kebalikan dari apa yang dimaksudkan, itu menonaktifkan penerusan agen! Jadi, di bawah versi Ubuntu terbaru (dan mungkin semua), gunakan -Auntuk mengaktifkan penerusan agen.
knite
@knite Anda benar - itu salah ketik (3 tahun!) dalam jawaban saya. Diperbaiki sekarang :-)
voretaq7