Izinkan pengguna untuk menyiapkan terowongan SSH, tapi tidak yang lainnya

97

Saya ingin mengizinkan pengguna untuk mengatur terowongan SSH ke mesin tertentu pada port tertentu (katakanlah, 5000), tetapi saya ingin membatasi pengguna ini sebanyak mungkin. (Otentikasi akan dilakukan dengan keypair publik / pribadi).

Saya tahu saya perlu mengedit file ~ / .ssh / authorized_keys yang relevan, tetapi saya tidak yakin persis konten apa yang akan dimasukkan ke sana (selain kunci publik).

Lorin Hochstein
sumber

Jawaban:

91

Di Ubuntu 11.10, saya menemukan bahwa saya dapat memblokir perintah ssh, dikirim dengan dan tanpa -T, dan memblokir penyalinan scp, sambil mengizinkan penerusan port untuk masuk.

Secara khusus saya memiliki redis-server di "somehost" yang terikat ke localhost: 6379 yang ingin saya bagikan secara aman melalui terowongan ssh ke host lain yang memiliki keyfile dan akan melakukan ssh dengan:

$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost

Ini akan menyebabkan redis-server, port "localhost" 6379 pada "somehost" muncul secara lokal di host yang menjalankan perintah ssh, dipetakan ulang ke port "localhost" 16379.

Di remote "somehost" Berikut ini yang saya gunakan untuk authorized_keys:

cat .ssh/authorized_keys   (portions redacted)

no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost

The no-pty trip up sebagian besar upaya ssh yang ingin membuka terminal.

Izin buka menjelaskan port apa yang diizinkan untuk diteruskan, dalam hal ini port 6379 port server redis yang ingin saya teruskan.

Perintah = "/ bin / echo do-not-send-commands" echoes back "do-not-send-commands" jika seseorang atau sesuatu berhasil mengirim perintah ke host melalui ssh -T atau sebaliknya.

Dari Ubuntu terbaru man sshd, authorized_keys / perintah dijelaskan sebagai berikut:

command = "command" Menentukan bahwa perintah dijalankan setiap kali kunci ini digunakan untuk otentikasi. Perintah yang diberikan oleh pengguna (jika ada) akan diabaikan.

Upaya untuk menggunakan penyalinan file aman scp juga akan gagal dengan gema "do-not-send-commands" Saya telah menemukan sftp juga gagal dengan konfigurasi ini.

Saya pikir saran shell terbatas, dibuat dalam beberapa jawaban sebelumnya, juga merupakan ide yang bagus. Selain itu, saya setuju bahwa semua yang dirinci di sini dapat ditentukan dari membaca "man sshd" dan menelusuri "kunci_otorisasi" di dalamnya

Paul
sumber
1
Meskipun no-ptytidak memungkinkan untuk membuka tampilan interaktif, ia tidak melakukan apa pun untuk mencegah eksekusi perintah, sehingga pengguna dapat mengedit authorized_keysfile jika dia memiliki akses dengan sesuatu seperti ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'.
sinapsis
4
@synapse command = "/ bin / echo do-not-send-commands", juga tercantum di atas, dimaksudkan untuk memblokir perintah. dan memberikan pesan. Apakah Anda bermaksud contoh Anda untuk mengalahkan seluruh setting di atas atau Anda hanya mengomentari no-pty?
Paul
Perlu disebutkan bahwa admin tidak berkewajiban untuk memberikan kepemilikan kepada pengguna dari file authorized_keys atau direktori yang berisi, atau bahkan ada di direktori home pengguna (dengan asumsi server ssh dikonfigurasi dengan benar untuk lokasinya)
Daniel Farrell
?? @DanFarrell Akankah .ssh / authorized_keys dimiliki oleh root, atau wheel, atau siapa?
Andrew Wolfe
@AndrewWolfe biasanya, ~user/.ssh/authorized_keysakan dimiliki oleh user, dan userakan mengelola kunci resmi yang digunakan untuk mengakses akun. SSH pilih-pilih tentang izin dan dapat memaksakan ekspektasi ~/.ssh/dan isinya. Saya melakukan sudo chown root: .ssh/authorized_keysdan tampaknya telah menghentikan saya untuk masuk, tetapi saya tahu dari pengalaman sebelumnya bahwa pengguna tidak harus memiliki file itu - rootdapat mengelolanya jika Anda mau.
Daniel Farrell
18

Anda mungkin ingin menyetel shell pengguna ke shell terbatas . Hapus variabel PATH di ~ / .bashrc atau ~ / .bash_profile pengguna, dan mereka tidak akan dapat menjalankan perintah apa pun. Nanti, jika Anda memutuskan ingin mengizinkan pengguna untuk mengeksekusi serangkaian perintah terbatas, seperti lessatau tailmisalnya, Anda dapat menyalin perintah yang diizinkan ke direktori terpisah (seperti /home/restricted-commands) dan memperbarui PATH untuk diarahkan ke direktori itu.

Jason Day
sumber
1
Tetapi itu tidak mencegah pengguna untuk menentukan perintah yang berbeda pada baris perintah ssh, seperti ssh use@host "/bin/bash", bukan?
Fritz
Ya, benar, dengan asumsi bahwa user@hostrbash sebagai cangkangnya. Lihat The Restricted Shell
Jason Day
Oke, saya sudah mencobanya dan Anda benar. Karena perintah yang ditentukan dijalankan oleh shell login, eksekusi /bin/bashgagal karena mengandung garis miring.
Fritz
3
Meskipun harus dikatakan bahwa mengizinkan lessmungkin ide yang buruk, karena dari sana Anda dapat melarikan diri ke shell yang tidak dibatasi !/bin/bash. Lihat pen-testing.sans.org/blog/2012/06/06/… untuk contoh lainnya. Jadi mengizinkan perintah individu harus dilakukan dengan sangat, sangat hati-hati, jika ada.
Fritz
17

Selain opsi Authorized_keys seperti no-X11-forwarding, sebenarnya ada satu opsi yang Anda minta: permitopen = "host: port". Dengan menggunakan opsi ini, pengguna hanya dapat menyiapkan terowongan ke host dan port yang ditentukan.

Untuk detail tentang format file AUTHORIZED_KEYS, lihat man sshd.

marbu
sumber
13
Anda juga harus menentukan "no-pty" sebagai bagian dari set opsi. Jika Anda hanya menggunakan "permitopen", maka Anda akan membatasi tunnel ke host / port yang diberikan ... tetapi Anda masih akan mengizinkan shell interaktif.
John Hart
Apakah membatasi penerusan port dengan permitopen juga mengunci jenis penerusan perangkat terowongan yang diminta ssh -w?
flabdablet
5
@JohnHart: no-ptyjuga tidak membatasi akses shell, Anda masih akan mengakses shell, itu tidak akan menampilkan promptnya; Anda masih dapat memberikan perintah dan melihat hasilnya dengan baik. Anda memerlukan command="..."opsi ini jika ingin membatasi akses shell dari .ssh/authorized_keys.
Aleksi Torhamo
9

Solusi saya adalah menyediakan pengguna yang hanya mungkin melakukan tunneling, tanpa shell interaktif , untuk mengatur shell itu di / etc / passwd ke / usr / bin / tunnel_shell .

Cukup buat file yang dapat dieksekusi / usr / bin / tunnel_shell dengan loop tak terbatas .

#!/bin/bash
trap '' 2 20 24
clear
echo -e "\r\n\033[32mSSH tunnel started, shell disabled by the system administrator\r\n"
while [ true ] ; do
sleep 1000
done
exit 0

Sepenuhnya dijelaskan di sini: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/

Daniel W.
sumber
9
CTRL + Z akan keluar dari skrip yang memberi Anda akses penuh ke bash ... Coba tambahkan "trap '' 20" (tanpa tanda kutip) di awal skrip
Big Papoo
1
terima kasih atas petunjuknya, saya menambahkan perangkap beberapa sinyal interupsi
Daniel W.
1
Saya hanya menggunakan / bin / cat untuk "shell". Sepertinya bekerja dengan baik. Tidak mengetahui adanya eksploitasi terhadap cat, dan bahkan jika Anda menemukan beberapa pola input yang berhasil membuatnya crash, sesi ssh Anda hanya akan berhenti.
flabdablet
4
@ BigPapoo: Apakah Anda benar-benar mengujinya? Aku tidak bisa melihat kemana dia akan kabur. Jika Anda berada di shell dan Anda menjalankan tunnel_shell, Anda akan melakukannya shell -> /bin/bash tunnel_shellsehingga Anda dapat melarikan diri kembali ke shell, tetapi jika Anda telah menetapkan tunnel_shell sebagai shell pengguna, Anda hanya akan /bin/bash tunnel_shellberjalan, tanpa shell untuk melarikan diri. , sejauh yang saya bisa lihat. Saya mengujinya dan tidak bisa lepas dengan ctrl-z. Jika Anda melakukan mencobanya dan bisa melarikan diri, bisa Anda posting setup? Demikian juga, jika Anda mengetahui dokumentasi yang mengatakan bahwa seharusnya berfungsi seperti itu, dapatkah Anda mempostingnya?
Aleksi Torhamo
3

Saya dapat menyiapkan file authorized_keys dengan kunci publik untuk masuk. Yang tidak saya yakini adalah informasi tambahan yang saya perlukan untuk membatasi apa yang boleh dilakukan akun itu. Misalnya, saya tahu saya bisa meletakkan perintah seperti:

no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding

Anda ingin baris di file authorized_keys Anda yang terlihat seperti ini.

permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache 
Zoredache
sumber
3

Jika Anda ingin mengizinkan akses hanya untuk perintah tertentu - seperti svn - Anda juga dapat menentukan perintah itu di file kunci resmi:

command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]

Dari http://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricks

joseph_morris
sumber
3

Di sini Anda memiliki posting bagus yang menurut saya berguna: http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/

Idenya adalah: (dengan nama pengguna baru yang dibatasi sebagai "sshtunnel")

useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel

Perhatikan bahwa kami menggunakan rbash (dibatasi-bash) untuk membatasi apa yang dapat dilakukan pengguna: pengguna tidak dapat melakukan cd (mengubah direktori) dan tidak dapat mengatur variabel lingkungan apa pun.

Kemudian kami mengedit variabel env PATH pengguna /home/sshtunnel/.profilemenjadi tidak ada - trik yang akan membuat bash tidak menemukan perintah apa pun untuk dieksekusi:

PATH=""

Akhirnya kami melarang pengguna untuk mengedit file apa pun dengan mengatur izin berikut:

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile
juanmf
sumber
0

Saya membuat program C yang terlihat seperti ini:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int signo)
{
    if (signo == SIGHUP)
        exit(0);
}

int main()
{
    signal(SIGINT, &sig_handler);
    signal(SIGTSTP, &sig_handler);

    printf("OK\n");
    while(1)
        sleep(1);
    exit(0);
}

Saya mengatur shell pengguna terbatas ke program ini.

Saya tidak berpikir pengguna yang dibatasi dapat mengeksekusi apa pun, bahkan jika mereka melakukannya ssh server command, karena perintah dijalankan menggunakan shell, dan shell ini tidak mengeksekusi apa pun.

fangfufu.dll
sumber
-3

Anda akan membuat kunci pada mesin pengguna melalui klien ssh apa pun yang mereka gunakan. PUTTY misalnya memiliki utilitas untuk melakukan hal yang persis seperti ini. Ini akan menghasilkan kunci pribadi dan publik.

Isi dari file kunci publik yang dihasilkan akan ditempatkan di file authorized_keys.

Selanjutnya Anda perlu memastikan bahwa klien ssh dikonfigurasi untuk menggunakan kunci pribadi yang menghasilkan kunci publik. Ini cukup lurus ke depan, tetapi sedikit berbeda tergantung pada klien yang digunakan.

kuda pucat
sumber