Kullanıcının bir SSH tüneli kurmasına izin ver ama başka hiçbir şey yapmam


98

Bir kullanıcının belirli bir bağlantı noktasındaki (örneğin 5000) belirli bir makineye bir SSH tüneli kurmasına izin vermek istiyorum, ancak bu kullanıcıyı olabildiğince kısıtlamak istiyorum. (Kimlik doğrulama, genel / özel anahtar çiftiyle yapılacaktır).

İlgili ~ / .ssh / yetkili_keys dosyasını düzenlemem gerektiğini biliyorum, ancak oraya tam olarak hangi içeriği koyacağımdan emin değilim (genel anahtar dışında).

Yanıtlar:


92

Ubuntu 11.10'da, bağlantı noktası yönlendirmenin geçmesine izin verirken, -T ile ve -T olmadan gönderilen ssh komutlarını ve scp kopyalamayı engelleyebileceğimi fark ettim.

Spesifik olarak, localhost'a bağlı "bir şekilde" üzerinde bir redis sunucum var: 6379, ssh tünelleri aracılığıyla bir anahtar dosyası olan ve şunlarla ssh yapacak diğer ana bilgisayarlarla güvenli bir şekilde paylaşmak istediğim:

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

Bu, redis-server, "localhost" bağlantı noktası 6379'un "somehost" üzerinde ssh komutunu yürüten ana bilgisayarda yerel olarak görünmesine ve "localhost" bağlantı noktası 16379'a yeniden eşlenmesine neden olacaktır.

Uzakta "bir şekilde" İşte yetkili_keys için kullandım:

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

No-pty, bir uçbirim açmak isteyen çoğu ssh denemesini açar.

Permitopen hangi bağlantı noktalarının yönlendirilmesine izin verildiğini açıklar, bu durumda 6379 numaralı bağlantı noktası iletmek istediğim redis sunucu bağlantı noktasıdır.

Command = "/ bin / echo do-not-send-commands", birisi veya başka bir şey ssh -T yoluyla veya başka bir şekilde ana bilgisayara komut göndermeyi başarırsa, "do-not-send-komutlarını" geri yansıtır.

Yeni bir Ubuntu'dan man sshd, yetkili_keys / komut aşağıdaki gibi açıklanmıştır:

command = "command" Bu anahtar kimlik doğrulama için her kullanıldığında komutun yürütüleceğini belirtir. Kullanıcı tarafından sağlanan komut (varsa) dikkate alınmaz.

Scp güvenli dosya kopyalamayı kullanma girişimleri de bir "gönderme-gönderme-komutları" yankısıyla başarısız olacak, sftp'nin de bu yapılandırmada başarısız olduğunu buldum.

Önceki cevapların bazılarında yapılan kısıtlanmış kabuk önerisinin de iyi bir fikir olduğunu düşünüyorum. Ayrıca, burada ayrıntılı olarak verilen her şeyin "man sshd" okunup "yetkili anahtarlar" aranarak belirlenebileceğini kabul ediyorum.


1
İken no-ptykullanıcı kutu düzenlemek böylece, bu komut yürütme engellemek için hiçbir şey yapmaz interaktif seesion açılmasına izin vermez authorized_keysdiye böyle bir şey ile erişimi olan dosya varsa ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'.
sinaps

4
@synapse command = "/ bin / echo do-not-send-commands", yine yukarıda listelenen, komutları engellemek için tasarlanmıştır. ve bir mesaj verin. Örneğinizin yukarıdaki tüm ayarları bozmayı mı düşündünüz yoksa sadece no-pty hakkında mı yorum yapıyorsunuz?
Paul

Yöneticilerin, kullanıcılara yetkili anahtarlar dosyası veya içeren bir dizinin sahipliğini vermek zorunda olmadıklarını veya bir kullanıcının ana dizininde bile var olduğunu belirtmekle birlikte (ssh sunucusunun konumu için uygun şekilde yapılandırıldığı varsayılarak)
Daniel Farrell

?? @DanFarrell .ssh / yetkili_keys'in sahibi kök veya tekerleğe veya kime ait olabilir?
Andrew Wolfe

@AndrewWolfe genellikle hesaba erişmek için kullanılan yetkili anahtarlara ~user/.ssh/authorized_keysaittir userve userbu anahtarları yönetir. SSH izinler konusunda seçici davranır ~/.ssh/ve içeriğiyle ilgili beklentileri empoze edebilir . Bir yaptım sudo chown root: .ssh/authorized_keysve oturum açmamı engelledi gibi görünüyor, ancak geçmiş deneyimlerimden kullanıcının bu dosyanın sahibi rootolması gerekmediğini biliyorum - tercih ederseniz onu yönetebilirsiniz.
Daniel Farrell

18

Muhtemelen kullanıcının kabuğunu kısıtlanmış kabuğa ayarlamak isteyeceksiniz . Kullanıcının ~ / .bashrc veya ~ / .bash_profile dosyasındaki PATH değişkeninin ayarını kaldırın ve kullanıcı herhangi bir komutu yürütemez. Daha sonra, örneğin lessveya tailörneğin, kullanıcıların sınırlı bir komut kümesini yürütmesine izin vermek istediğinize karar verirseniz , izin verilen komutları ayrı bir dizine (örneğin /home/restricted-commands) kopyalayabilir ve PATH'i işaret edecek şekilde güncelleyebilirsiniz. o dizin.


1
Ancak bu, kullanıcının ssh komut satırında farklı bir komut belirtmesini engellemez ssh use@host "/bin/bash", öyle değil mi?
Fritz

Evet, user@hostkabuğun kızarıklık olduğunu varsayarsak öyle . Kısıtlanmış Kabuk'u
Jason Day

Tamam, denedim ve haklısın. Belirtilen komut oturum açma kabuğu tarafından yürütüldüğünden /bin/bash, eğik çizgi içerdiğinden çalıştırma başarısız olur.
Fritz

3
İzin vermenin lessmuhtemelen kötü bir fikir olduğu söylenmelidir , çünkü oradan sınırsız bir kabuğa kaçabilirsiniz !/bin/bash. Diğer örnekler için pen-testing.sans.org/blog/2012/06/06/… bakın . Bu nedenle, tek tek komutlara izin vermek çok, çok dikkatli yapılmalıdır.
Fritz

17

No-X11-forwarding gibi yetkili_keys seçeneğinin yanı sıra, aslında tam olarak istediğiniz bir tane var: permitopen = "host: port". Bu seçeneği kullanarak, kullanıcı yalnızca belirtilen ana bilgisayara ve bağlantı noktasına bir tünel kurabilir.

AUTHORIZED_KEYS dosya formatının ayrıntıları için man sshd'ye bakın.


13
Ayrıca seçenek kümesinin bir parçası olarak "no-pty" yi de belirtmeniz gerekir. Yalnızca "permitopen" kullanırsanız, tünelleri belirtilen ana bilgisayar / bağlantı noktasıyla sınırlarsınız ... ancak yine de etkileşimli kabuklara izin verirsiniz.
John Hart

Permitopen ile bağlantı noktası iletimini kısıtlamak, ssh -w'nin istediği türden tünel aygıtı iletimini de kilitler mi?
flabdablet

5
@JohnHart: no-ptyKabuk erişimini de kısıtlamaz, yine de kabuğa ulaşırsınız , sadece size bilgi istemini göstermez; Hala komutlar verebilir ve çıktıyı gayet iyi görebilirsiniz. command="..."Kabuk erişimini kısıtlamak istiyorsanız seçeneğe ihtiyacınız var .ssh/authorized_keys.
Aleksi Torhamo

9

Benim çözümüm, etkileşimli bir kabuk olmadan yalnızca tünel oluşturabilen kullanıcıya bu kabuğu / etc / passwd içinde / usr / bin / tunnel_shell olarak ayarlamasını sağlamaktır .

Sadece yürütülebilir dosya oluşturmak / usr / bin / tunnel_shell bir ile sonsuz döngüye .

#!/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

Burada tam olarak açıklanmıştır: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/


9
CTRL + Z komut dosyasından çıkarak size
bash'a

1
ipucu için teşekkürler, ben bazı kesme sinyallerinin hapsi eklendi
Daniel W.

1
Ben sadece bir "kabuk" için / bin / cat kullanıyorum. İyi çalışıyor gibi görünüyor. Cat'e karşı herhangi bir istismarın farkında olmasanız ve onu çökertmeyi başaran bir girdi modeli bulmuş olsanız bile, ssh oturumunuz sona erecektir.
flabdablet

4
@BigPapoo: Gerçekten test ettin mi? Nereye kaçacağını göremiyorum. Bir kabuğun içindeyseniz ve koşarsanız tunnel_shell, shell -> /bin/bash tunnel_shellelbette kabuğa geri kaçabilirsiniz, ancak kullanıcının kabuğu tunnel_shell olarak ayarladıysanız /bin/bash tunnel_shell, kaçacak bir kabuk olmadan yalnızca koşmanız gerekir. , görebildiğim kadarıyla. Test ettim ve ctrl-z ile kaçamadım. Eğer varsa yaptığımız Kurulumu sonrası olabilir, denemek ve kaçış olabilir? Aynı şekilde, böyle çalışması gerektiğini söyleyen herhangi bir belge biliyorsanız, bunu gönderebilir misiniz?
Aleksi Torhamo

3

Oturum açmak için yetkili_keys dosyasını genel anahtarla kurabiliyorum. Emin olmadığım şey, o hesabın ne yapmasına izin verildiğini kısıtlamak için ihtiyacım olan ek bilgiler. Örneğin, aşağıdaki gibi komutlar koyabileceğimi biliyorum:

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

Authorized_keys dosyanızda buna benzer bir satır olmasını istersiniz.

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


3

Burada faydalı bulduğum güzel bir gönderiniz var: http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/

Fikir şudur: (yeni kısıtlanmış kullanıcı adı "sshtunnel" olarak)

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

Kullanıcının yapabileceklerini kısıtlamak için rbash (restricted-bash) kullandığımıza dikkat edin: kullanıcı cd yapamaz (dizini değiştiremez) ve herhangi bir ortam değişkeni ayarlayamaz.

Daha sonra kullanıcının PATH env değişkenini sıfır olarak düzenleriz /home/sshtunnel/.profile- bu, bash'ın yürütecek herhangi bir komut bulmamasını sağlayacak bir numara:

PATH=""

Son olarak, aşağıdaki izinleri ayarlayarak kullanıcının herhangi bir dosyayı düzenlemesine izin vermeyiz:

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile

0

Şuna benzeyen bir C programı yaptım:

#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);
}

Kısıtlı kullanıcının kabuğunu bu programa ayarladım.

Kısıtlı kullanıcının herhangi bir şeyi çalıştırabileceğini sanmıyorum ssh server command, çünkü komutlar kabuk kullanılarak yürütülüyor ve bu kabuk hiçbir şey çalıştırmıyor.



-3

Kullandıkları ssh istemcisi aracılığıyla kullanıcıların makinesinde bir anahtar oluşturacaksınız. örneğin pUTTY, bunu tam olarak yapacak bir yardımcı programa sahiptir. Hem özel hem de genel bir anahtar oluşturacaktır.

Oluşturulan ortak anahtar dosyasının içeriği, authred_keys dosyasına yerleştirilecektir.

Daha sonra, ssh istemcisinin genel anahtarı oluşturan özel anahtarı kullanacak şekilde yapılandırıldığından emin olmanız gerekir. Oldukça basit, ancak kullanılan müşteriye bağlı olarak biraz farklı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.