SSH kabuk erişimini etkinleştir, ancak SFTP erişimini devre dışı bırak


21

Bu soruya uygulanabilir bir cevap aradım ve cevapların çoğu neden yapmama konusunda tavsiyeler içeriyor. Ancak, işte senaryo ve onu gerekli kılan şey:

Bir konsol uygulamasına sahibim ve her kullanıcının .profile uygulamasında bir başlangıç ​​komutu var ve doğrudan onu başlatan komuttan sonra, onları sistemden çıkaran bir "exit" komutu var. Sadece bu konsol uygulamasına sağladığı arabirim aracılığıyla erişebilmelerini istiyorum. Başlangıçta, uygulama, kullanıcıya her biri kendi veri dizinine sahipken, uygulama üzerinden erişilebilecek bir müşteri listesi sunar. Kullanıcılara yalnızca erişmeleri gereken müşterilere erişim izni verilir.

Şimdi burada sorun var: Kullanıcılara SSH erişimi verirsem, bir SFTP istemcisi kullanarak da oturum açabilecekler ve bu da ÇOK istenmeyen bir durum olduğu için uygulamadaki veri dizinlerine doğrudan erişmelerini sağlayacak. erişemedikleri veri dizinlerine erişebilirler.

Bu bir telnet / FTP kombinasyonu kullanırken yapılacak çok basit bir şeydi, ancak şimdi kullanıcılara internetteki herhangi bir yerden erişim vermek istediğim için, onları SFTP’nin dışında bırakmanın bir yolunu bulamadım. hala uygulamayı çalıştırabilecekleri kabuğa erişmelerine izin veriyor.


8
Ayrıntıları unutuyorum, ancak SSH'nin kullanıcıların oturum açtıklarında tek bir komut çalıştırmalarını kısıtlamanıza izin verdiğini düşünüyorum. Bunu ayarlarsanız tam kabuk erişimi sağlayamazlar. Kullanım durumunuz için faydalı olabilir. (Ne de olsa, SSHFS kullanarak SFTP erişimini taklit etmek mümkündür. Sadece SFTP'yi devre dışı bırakmak, orta derecede belirlenmiş bir kullanıcının, kullanıcı hesabının erişebildiği herhangi bir dosyaya ulaşmasını engellemez.)
David Z

3
Ek olarak, kullanıcılarınızı "chrooting" olarak düşünebilirsiniz. ve yedek veri erişimi için, tasarım sorunu gibi görünüyor
Dennis Nolte

2
Bunun .profileiçin yanlış çözüm gibi geliyor. Kullanıcıyı alternatif bir kabuk ile ayarlamanın çok daha anlamlı olacağına inanıyorum.
kasperd

3
.profileErişimi kısıtlamak için numarayı kullanmaya çalışmayın , atlamak çok önemlidir. (ayrıntılar için cevabımı gör)
Aleksi Torhamo

Yanıtlar:


22

Düzenle:

Belli olmadığı durumda, aşağıdaki cevap SFTP'nin sunucuya kabuk erişimi olan herhangi biri tarafından kullanılmasını önlemenin güvenli bir yöntemi değildir . Bu sadece dış görünürlükten nasıl etkisizleştirileceğini açıklayan bir cevap. Kullanıcı seviyesi güvenliği hakkında bir tartışma için, bkz. @Cpast ve @Aleksi Torhamo. Güvenlik odak noktanız ise, bu cevap doğru değil. Basit hizmet görünürlüğü odak noktanız ise, bu sizin cevabınızdır.

Şimdi asıl cevaba devam ediyoruz:


Sshd_config dosyasındaki sftp desteğini yorumlayın (ve elbette yeniden başlatma sshd):

#Subsystem sftp /usr/lib/openssh/sftp-server


1
Bazen çizgi olabilirSubsystem sftp internal-sftp
Kondybas

1
Ben var Subsystem sftp /usr/libexec/sftp-server ama bu hile yaptı. Çok teşekkür ederim
sosaisapunk 19:14

16
Bu mantıklı görünmüyor. Sunucuda rasgele komutlar çalıştırabilirseniz sftp sunucu tarafı programını çalıştırabilirsiniz. Yüklenmemiş olsa bile, onu uzun bir kabuk komutu olarak yeniden uygulayabilir ve sftp istemcisinin sftp yerine bu komutu göndermesini sağlayabilirsiniz. Bu yöntem sftp kullanımını daha az uygun hale getirebilir, ancak keyfi komutları çalıştırabilen bir kullanıcının dosya aktarımı yapmak için bu komutları kullanmasını engellemenin bir yolu yoktur.
R. ..

1
@sosaisapunk Bu doğru değil. Kullanıcılar, istedikleri komutu kullanarak kullanabilirler ssh user@host command, çünkü .profilebunu yaparsanız hiç çalışmaz ve böylece uygulamanız hiç başlamaz. Basitçe söyleyerek tam kabuk erişimi alabilirler ssh -t user@host bash. Sadece dene ve göreceksin. Alt sistem sadece bir komut takma adıdır; sftp'yi daha önce kullanabilirlerse, yine de kullanabilirler - ve istedikleri herhangi bir komutu. Cevabımı aşağıda oku.
Aleksi Torhamo

1
@sosaisapunk: Hayır, mesele, ssh ile yapabileceğinizdir, ancak .profilegüvenlik için olmadığı ve kolayca atlandığı için. Cevabımda, ssh ile yapmanın üç farklı yöntemi listeledik. Kısacası, sadece uygulamanıza çağrılmasına taşımak .profilebir kabuk komut dosyası için ve ya 1)) Kullanıcının kabuğu 2 olarak shell script set düzgün eşleşti olarak shell script () set ForceCommandiçinde sshd_configaçık anahtarlı kimlik doğrulaması 3) anahtar ve set kabuk komut commandiçinde .ssh/authorized_keys. (Ayrıca, kullanıcı
adından

28

Diğerlerinin de belirttiği gibi, devre dışı bırakmak sftpyeterli bir yere yakın değildir - sınırsız ssherişimi olan bir kullanıcı , hesabının görüntüleme izni olan herhangi bir dosyayı görüntüleyebilir, değiştirme izni olan her şeyi değiştirebilir ve kendi okuyabildiği her şeyi kolayca indirebilir makinesi. Bunu yapmalarını engellemenin tek yolu, onların erişimini kısıtlamak. Ayrıca güvenmek ideal değil .profileo (Edit için olan bu değil gibi kullanıcıları kısıtlamak için: As Aleksi onun cevabını bahseder, aslında bypass için önemsizdir .profile; ilgili şey .profileo kolaylık değil, güvenlik için olmasıdır, o değil bu yüzden kullanıcıyı kısıtlamak amacı ile tasarlanmıştır: Güvenlik sağlamak için, aşağıdakiler gibi güvenlik için tasarlanmış şeyler kullanın).

Bunu yapmanın iki temel yolu vardır: Bunları dosya izinleriyle kısıtlayabilir veya yalnızca konsol uygulamanızı çalıştırmaya zorlayabilirsiniz. İkinci yol daha iyidir: Konsol uygulamasıyla sınırlandırılması gereken kullanıcıları bir gruba atayın (örn. customers); sonra, sshd_configaşağıdaki satırları ekleyin:

Match Group customers
ForceCommand /path/to/app

Bunun yaptığı, bu gruptaki kullanıcıların tüm bağlantılarının konsol uygulamasını açmasını sağlamak; sftpsunucu aracı dahil başka hiçbir şeyi başlatamazlar . Bu aynı zamanda bir şey yapmadan onları durdurur başka sistemle ve aksine .profileböylece (SSH sunucusu kendisi kullanıyor mu, .profilekabuk onları kısıtlar ForceCommandda bir kabuk başlayan içermeyen başka şeyler yaparken önler). Ayrıca .profile, bunun aksine , bu bir güvenlik meselesi olarak tasarlanmıştır ; Özellikle onu kaçıran kötü niyetli bir kullanıcıya direnmek için yapılır.

(Muhtemelen düşük) alternatifi, konsol uygulamasını çalıştırmak için yeni bir kullanıcı oluşturmayı içerir. Daha sonra veri dizinlerini o kullanıcı ile kısıtlar, o kullanıcının sahip olduğu konsol uygulamasını u+sve programa ayarlarsınız . Bu setuidbit; Bu, konsol programını çalıştıran birinin programın sahibinin izinleriyle yaptığı anlamına gelir. Bu şekilde, kullanıcı dizinlere erişemez, sadece programdan yararlanabilirler. Ancak, "sadece bu programı çalıştır" seçeneğine tüm erişimi ForceCommandkısıtladığından, muhtemelen sadece kullanmanız gerekir .


4
ForceCommandSSH portu yönlendirmesini engellemediğini eklemek isterim .
nyuszika7h

1
Aslında, güvenmek .profile"ideal" değil; Kolayca atlanır (ayrıntılar için cevabımı inceleyin) ve böylece hiçbir şekilde koruma sağlamaz, yalnızca yanlış güvenlik duygusu sunar.
Aleksi Torhamo

@AleksiTorhamo Ah. Bunu atlayabileceğinizden şüphelenmiştim, ancak kesin olarak emin değildi (genellikle güvenlik için amaçlanan şeylerin atlanabileceğinden şüpheleniyorum). Nasıl olduğuna dair ayrıntılar için teşekkürler!
cpast

15

Bunu yapmaya kalkmayın, .profileçünkü hiçbir şekilde güvenlik sağlamaz ve hiçbir şeyi kısıtlamaz!

Ne koyduğunuz önemli değil .profile, çünkü ssh komut satırında çalıştırılması için bir komut vererek onu atlayabilirsiniz ssh user@host command. Hala normal kabuk erişimini yaparak alabilirsiniz ssh -t user@host bash.

Sftp alt sistemini devre dışı bırakmak, başka bir cevapta belirtildiği gibi, hiç de yardımcı olmuyor. Alt sistemler aslında sadece komutların takma adlarıdır ve sftp'yi yine de normal şekilde kullanabilirsiniz sftp -s /path/to/sftp-executable user@host.

Cpast ve bazı yorumcuların söylediği gibi, erişimi kısıtlamak için uygun mekanizmaları kullanmalısınız. Yani,

  • Kullanım ForceCommandyılındasshd_config
  • Şifresiz giriş ve kullanma command="..."içinde.ssh/authorized_keys
  • Kullanıcının kabuğunu, kullanıcının yapabileceklerini kısıtlayan bir şeyle değiştirin

Notlar:

  • command="..." yalnızca bir anahtar için geçerlidir; bu nedenle parola veya başka bir anahtar kullanan kullanıcının ssh girişini kısıtlamaz
  • Ayrıca, liman yönlendirmesini vb. Sınırlamak da isteyebilirsiniz. (Liman iletme, x11 iletme, aracı iletme ve pty tahsisi, duyduğum olanlar)
    • AllowTcpForwarding vb. sshd_config
    • no-port-forwarding vb. .ssh/authorized_keys
  • Çalışan başka bir servise (FTP gibi) sahipseniz, kullanıcının içeri girmesine izin vermediğini doğrulamanız gerekir (Bazı servisciler bu kararı kullanıcının kabuğuna dayanarak alırlar;
  • Kullanıcının kabuğunu istediğinizi yapan bir komut dosyasına değiştirebilirsiniz; bağımsız değişkenler olmadan çalıştırılabilir veya benzeriscript -c 'command-the-user-wanted-to-run'
  • Her ikisi de ForceCommandve command="..."komutu kullanıcının kabuğu boyunca çalıştırın, böylece kullanıcının kabuğu örneğin olarak ayarlanmışsa çalışmazlar. /bin/falseveya/sbin/nologin

Feragatname: Bu konuda hiçbir konuda uzman değilim, bu yüzden, .profileşeyin güvenli olmadığını söyleyebildiğim halde, bilmediğim diğer yöntemlerle birlikte bir "kazanma" söz veremem. hakkında. Bildiğim kadarıyla güvendedirler, ama internette yanlış yapan ilk kişi olmazdım.


1
O en az görünüyor ForceCommandve sahip şifresiz girişe zorlandı command=içinde authorized_keyso olduğu: Daha önce bypass edilmiş ise sebebiyle sunucudaki bir hatadan en yani, amaçlanan kötü niyetli bir kullanıcıya karşı güvenli olması ve kullanıcının ciddi bir güvenlik açığı olarak sayılır atlayarak SSH sunucusunda (ve bu nedenle öncelikli bir düzeltmedir). Sizin .profilede belirttiğiniz gibi, tasarım gereği atlanabilir: bir güvenlik özelliği olarak görülmediğinden, onu atlayan bir kullanıcı, kabuk geliştiricinin bakış açısından tamamen uygun.
cpast

1
@cpast: Evet, liman yönlendirme gibi daha fazla özelliğin varlığını düşünüyordum. Yani, ssh'nin bağlantı noktası yönlendirmesine izin verdiğini ve yalnızca ForceCommanderişimi kısıtlamak için kullandığını ve yalnızca yerel olarak bağlantıları dinleyen ve kimlik doğrulaması gerçekleştirmeyen bir arka plan programı olduğunu bilmiyorsanız, ssh kullanıcısı yine de servise erişebilir. Benim listelediğim özellikler örn. git hosting çözümleri genellikle devre dışı bırakılır ve man sayfalarında "kötülükten" başka bir şey görmedim, ancak henüz herhangi bir resmi ForceCommand"bulamadık şekilde kullandım " belgesini de bulamadım.
Aleksi Torhamo

Kuşkusuz ~/.profile, kullanıcı düzenlenebilir ve güvenlik açısından yararlı değildir, ancak cpast'ın tekniğini içine koyarak anlamlı hale getirebilir misiniz /etc/profile? UID'yi doğru kullanıcılarla sınırlandırmak için kontrol edebilirsiniz.
civciv

1
@ chicks: Hayır, aynı sorun var. Sorun, dosyanın kullanıcı tarafından düzenlenebilir olması değildir; Sorun, her iki dosyanın da tamamen atlanmasıdır. Dosyalar sadece sadece söylerseniz elde ssh user@hostedeceğiniz giriş kabukları için kullanılır , ancak ssh komutunu çalıştırmasını söylerseniz - yani. ssh user@host command- artık bir giriş kabuğu alamazsınız ve dosyalara hiç dokunulmaz. Böylece, birileri ssh için fazladan bir argüman vererek dosyalarla oluşturmaya çalıştığınız kısıtlamaları önemsizce atlayabilirsiniz.
Aleksi Torhamo

2
@ chicks: Ayrıca, sadece cpast'a atıfta bulunduğunu anladım; cpast'ın cevabındaki yöntem kullanmaz .profile, kullanır sshd_configve güvenli olmalıdır. Sadece .profilebunu yapmak için kullanmamanız gereken bir yöntem olarak bahseder .
Aleksi Torhamo

1

SSH'yi etkinleştirmek ve SFTP'yi hem genel olarak hem de kullanıcı / grup başına devre dışı bırakmak mümkündür.

Kişisel olarak buna ihtiyacım var çünkü SSH üzerindeki bazı git depolarına erişim vermek istiyorum ve gerekmeyen sistemleri devre dışı bırakmayı seviyorum. Bu durumda SFTP gerekli değildir.

Küresel

Tüm kullanıcılar için SFTP'yi birkaç şekilde devre dışı bırakabilirsiniz.

Eksik alt sistem

SSH tarafından kullanılan SFTP arka plan programı Subsystemanahtar kelime ile yapılandırılabilir . Gönderen sshd_config(5)manuel:

Subsystem
        Configures an external subsystem (e.g. file transfer daemon).
        Arguments should be a subsystem name and a command (with optional
        arguments) to execute upon subsystem request.

        The command sftp-server(8) implements the “sftp” file transfer
        subsystem.

        Alternately the name “internal-sftp” implements an in-process
        “sftp” server.  This may simplify configurations using
        ChrootDirectory to force a different filesystem root on clients.

        By default no subsystems are defined.

Son satır, "sftp" için herhangi bir alt sistemi tanımlamamanın yeterli olduğunu göstermektedir.

Sahte bir yalan

Ayrıca SSH tarafından kullanılan SFTP arka planını kullanılamaz bir şeye ayarlayarak SFTP'yi devre dışı bırakabilirsiniz. Örneğin, "sftp" alt sistemini şu şekilde yapılandırın /bin/false:

Subsystem sftp /bin/false

Bir şey SFTP aracılığıyla giriş yapmaya çalıştığında, SSH arka plan programı "sftp arka planını" oluşturmaya çalışırdı /bin/false. /bin/falseProgram tek bir şey yapar ve bu bir hata kodu döndürmektir. SFTP bağlantısı girişimi etkin bir şekilde reddedildi.

Kullanıcı / grup başına

Ayrıca, kullanıcı, grup veya diğer birkaç kriter için SFTP'yi devre dışı bırakmak da mümkündür.

Kullanıcınızın normal bir kabuk istemi almasını istiyorsanız bu işe yaramaz. Kabuk erişiminiz varsa, çoğu şeyi aşağılayacağınız için anlamlı değildir. Yalnızca belirli bir programa erişim vermek istiyorsanız çalışır.

Eşleştirme

Bir kullanıcı grubuyla eşleştirmek için SSH'yi Matchanahtar kelimeyle yapılandırabilirsiniz . Gönderen sshd_config(5)manuel:

Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...

Birkaç örnek:

  • Match User eva "eva" kullanıcısıyla eşleşiyor
  • Match User stephen,maria "stephen" ve "maria" kullanıcıları ile eşleşir
  • Match Group wheel,adams,simpsons "tekerlek", "adams", "simpsons" grupları ile eşleşir

Daha fazla bilgi istiyorsanız, sshd_config(5)kılavuzda yükler var .

Zorla komut

Normalde, SSH ile bağlandığınızda kullanıcının oturum açma kabuğunu alırsınız, ancak SSH belirli bir komutu zorlamak için yapılandırılabilir. Komut, SFTP de dahil olmak üzere herhangi bir SSH bağlantısı için zorlanır ve bu nedenle istediğiniz komutu zorlama seçeneğiniz olabilir.

Zorla komutu, ForceCommandanahtar kelimeyle yapılandırılabilir . Gönderen sshd_config(5)manuel:

ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login shell
        with the -c option.  This applies to shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.

Böylece kullanmak istediğiniz sınırlı komutu zorlayabilirsiniz ForceCommand <your command>. Örneğin:

Match User kim
        ForceCommand echo 'successful login man, congrats'

Örnek

Git erişimi vermek istediğim durumda, sadece kullanıcının erişebilmesi için ihtiyacım var git-shell. Bu, bazı güvenlik seçenekleriyle birlikte git kullanıcılarım için SFTP'yi devre dışı bırakan bölümdür:

Match Group git

        # have to do this instead of setting the login shell to `git-shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no

Benim durumumda, sadece belirli bir yetkili anahtar için MySQL erişimine (hem SFTP erişimine hem de SSH terminal pencerelerine izin vermeme) izin vermek istedim (yani, sshd_config dosyasında değişiklik yok). Bunu, belirli bir anahtar için aşağıdaki ~ / .ssh / onaylı_düğün seçenekleriyle yapmayı başardım: command = "/ usr / bin / echo 'Yalnızca MySQL erişimine izin verilir.'", No-pty, no-X11 iletme, permitopen = "127.0.0.1:3306"
Martin_ATS
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.