SSH erişimine izin verirken SCP'yi önlemek mümkün müdür?


13

Solaris ve Linux sunucuları ve OpenSSH kullanarak, kullanıcıların "ssh" ile kabuk erişimine izin verirken "scp" kullanarak dosya kopyalamasını engellemek mümkün müdür?

'Ssh $ server "cat file"' tipi dosya erişimlerinin engellenmesinin çok daha zor olduğunun farkındayım, ancak yeni başlayanlar için "scp" yi durdurma hakkında bir şeyler görmeliyim.

Başarısız olursa, sunucu tarafında tüm SCP erişimini güvenli bir şekilde günlüğe kaydetmenin bir yolu var syslogmı?


Eğer ssh'yi kapatmak istiyor ancak scp'yi kapatmak istemiyorsanız bunu kullanabilirsiniz : sublimation.org/scponly/wiki/index.php/Main_Page Başka bir şekilde olmasını istediğiniz kadar kötü: - \

Aynı sorum var ama başka bir nedenden dolayı. Benim durumumda sunucudaki SFTPD ve SCPD'yi kapatmak istiyorum. Nedeni, dosya aktarımlarına izin vermemizdir ancak kullanıcıların aktarımları kopya düğümü üzerinden yapmasını isteriz. Bu, bağlantılarımızdaki yükü nasıl ayırdığımızdan kaynaklanmaktadır. Bu döngüye göre SFTPD'yi kapatmak kolaydır, ancak doğru anlarsam SCPD'yi kapatmak neredeyse imkansız mıdır?

Yanıtlar:


12

Buna /etc/ssh/sshd_configbenzer bir şeye bakmak için düzenleyebilirsiniz :

ForceCommand           /bin/sh
PermitOpen             0.0.0.0
AllowTcpForwarding     no
PermitTunnel           no
# Subsystem sftp       /usr/lib/openssh/sftp-server
PermitUserEnvironment  no

Bunun yerine kullanıcının ne için kullanacağını belirlerim. Çünkü erişmelerini istediğiniz birkaç komut varsa, bunun yerine normal bir sshkabuk bile çağırma yeteneğini kaldırırım .

AllowUsers             root
PermitRootLogin        forced-commands-only

PermitUserEnvironment  no

AllowTcpForwarding     no
PermitTunnel           no

# Subsystem sftp       /usr/lib/openssh/sftp-server
Subsystem smb-reload   /usr/bin/smbcontrol smbd reload-config
Subsystem status       /opt/local/bin/status.sh

ssh root@example -s smb-reload

Gerçekten normal bir mermi çalıştırmanız gerektiğini fark ederseniz, en çok umabileceğiniz şey onları yavaşlatmak ve daha zor hale getirmektir.


8

Diğerlerinin de belirttiği gibi, scp'yi engelleyemezsiniz (iyi, şunları yapabilirsiniz: rm /usr/bin/scpancak bu sizi gerçekten hiçbir yere götürmez).

Yapabileceğiniz en iyi şey, kullanıcıların kabuğunu sınırlı bir kabuğa (rbash) değiştirmek ve ancak o zaman belirli komutları çalıştırmaktır.

Dosyaları okuyabilirlerse, ekrandan kopyalayıp yapıştırabileceklerini unutmayın. İkili dosyalar? xxd / uuencode / mmencode hepsi bu sorunu çözer.

Etkinliği izlemenize yardımcı olması için süreç muhasebesini kullanmanızı da öneririm.


Süreç muhasebesi biraz yardımcı olur, ancak tarihsel süreç muhasebesi gerçekten işe yaramazdı (örneğin, komut çalıştırmasının yalnızca taban adını günlüğe kaydetme). Süreç muhasebesi ile gerçekten yararlı olan modern başarıları duymak isterim.
carlito

1
Bir yerde bir boruya çalıştırılan tüm komutları da kaydeden yamalı bir kısıtlanmış kabuk kullanmaya ne dersiniz? Merkezileştirilmiş .bash_history bir fikir.
MikeyB

Aslında sunucu tarafında / usr / lib / openssh / sftp-server'ı silmek zorunda kalacaksınız, ancak sshd'nin yerleşik bir sftp sunucusu olduğunu düşünüyorum.
Brad Gilbert

@Brad: İstemci tarafından belirtilen komutlar hala kabuk üzerinden çalıştırılır; sftp-server varsayılan PATH'de değilse (ki bu değil) kabuğu kısıtlanmış bir sunucuya değiştirmek devre dışı bırakmak için yeterliyse, ikili dosyayı silmenize gerek yoktur.
MikeyB

6

Tam anlamıyla sonsuz sayıda dosya aktarım mekanizmasına izin verirken "scp" yi durdurarak hiçbir şey kazanmazsınız. SCP'ye izin vermemek, ancak dosyaları kopyalamak için diğer mekanizmalara izin vermek denetçilere yalan söylemek için bir yöntemdir. Genellikle denetçiler yalan söylenmesini ister. Genellikle sahte düzeltmeler yapmak için yöneticilerle çalışan denetçilerin, "scp dosya aktarım komutu devre dışı bırakıldığını, böylece dosyaların scp kullanılarak sunucudan kopyalanamadığını" belirtebileceklerini görüyorum.

Şimdi makul bir kayıt mekanizması iyi olurdu. Belki denetim nihayet Linux üzerinde çalışır. Belki Solaris nihayet bir mekanizma veya dtrace güvenle kullanılabilir ekledi. Bir dosyaya her erişildiğinde işletim sisteminin günlüğe kaydedilmesini istemek mantıklıdır. Elbette "okuma" ve "kopyalama" arasında bir fark yoktur. Ancak bu bir denetçiyi tatmin edebilir ve sisteme önemli bir güvenlik sağlayabilir. Günlükleriniz o kadar gürültülü olabilir ki veriler işe yaramaz, hatta gülünç derecede kısa bir denetim izi tutmak zorunda kalırsınız. (örn. her read () 'ı günlüğe kaydedemezsiniz ve şaşırtıcı bir şey yapan bir uygulama her open () günlüğünü bir felaket haline getirebilir).


5

SSH'nin ne için gerekli olduğuna bağlı olarak, paket boyutu daha büyükse (örneğin 1400 bayt) oturumları sonlandırmak için IPTable'ları kullanarak bu hedefe (önemsiz olmayan) dosyaları elde edebilirsiniz. Bu, etkileşimli ssh'nin çoğunlukla işe yarayacağı anlamına gelir, ancak bir şey 1500 baytlık bir paket göndermeye çalıştığında, standart bir MTU 1500 varsayarak 1499 bayttan daha büyük bir dosya için bağlantıyı sonlandıracaktır.

Bu, bahsettiğiniz "catting" saldırısını da engelleyecektir.

Ne yazık ki bu, ekranın 1400 karakterden fazla çizmesi gerekiyorsa veya uzun bir dosyaya katlanmak veya uzun bir dizin listesi yapmak istiyorsanız, bazı dosyaları metin düzenleyicisiyle düzenlemekte sorun yaşayabileceğiniz anlamına gelir.

En basit durumda, bunu yapmak için bir komut şöyle görünebilir:

iptables -I OUTPUT -p tcp --dport 22 -m length --length 1400:0xffff -j DROP

Paket uzunluğu kontrollerini ipt_recent ile birleştirerek bu işi daha iyi hale getirebiliriz, böylece belirli bir zaman aralığında 1400 bayttan daha fazla sayıda sınırlı pakete izin verirsiniz (5 saniyede 8 paket diyelim) - bu, 12k'ye kadar olan paketlerin kaymasına izin verir aracılığıyla, ancak dosyaları vb. düzenlemek için ihtiyacınız olan etkileşimi verebilir. Tabii ki, paket sayısını değiştirebilirsiniz.

Bu şuna benzeyebilir

iptables -I OUTPUT -p tcp --dport 22 -m length --length 1400:0xffff \
         -m recent --name noscp --rdest --set 
iptables -I OUTPUT -p tcp --dport 22 -m length --length 1400:0xffff \
         -m recent --name noscp --rdest --update --seconds 5 --hitcount 8 \
         -j REJECT --reject-with tcp-reset

Yukarıdaki kural örnekleri yalnızca gibi scp yüklemelerine karşı koruma sağlar scp myfile.data remote.host:~. Ayrıca gibi scp indirmeleri karşı korumak için scp remote.host:~/myfile.data /local/path, yukarıdaki kurallara tekrarlamak ancak onların yerini --dportile --sport.

Dikkatli bir bilgisayar korsanı, makinesinde 1400'den daha az bir MTU ayarlayarak (veya mtu veya benzeri bir kuvvetle) bu sınırlamalar üzerinde çalışabilir. Ayrıca, bunu belirli kullanıcılarla sınırlayamazken, iptables hatlarını uygun şekilde değiştirerek IP ile sınırlandırabilirsiniz !!

Şerefe David Go



1

Hayır scpve sshaynı bağlantı noktaları ile çalışan ve aynı protokolü kullanır. Bir sshoturum açarsanız, bağlantınızı aşağıdaki seçenekleri kullanarak sonraki scp çağrılarıyla bile paylaşabilirsiniz ControlMaster.

İnsanların belirli dosyaları makineden kopyalamasını istemiyorsanız, onlara makineye herhangi bir kabuk erişimi vermemelisiniz.


Evet, bariz cevap sistemi kilitlemek ve erişim vermemek olacaktır. Ancak gerçekte şirketim, ssh erişimini ciddi şekilde sınırlandırmamıza ve sağlam bir RBAC sistemine sahip olmamıza rağmen dosyaların sunuculardan ve / veya günlük girişimlerden kopyalanmasını önlememiz gerektiğini söyleyen denetçilere sahiptir.

2
@Jason: O zaman dosya erişimini günlüğe kaydetmeniz gerekir. Scp'yi devre dışı bırakmış olsanız bile, birisinin çalışmasını nasıl durdurabilirsiniz: ssh server 'cat / path / to / file'> copy?
derobert

0

Etkileşimli ssh'yi devre dışı bırakmak ve scp'ye izin vermek için kabuk olarak 'scponly' kullanmanın bir yolu var, ancak ters yönde çalışan mevcut hiçbir şeyin farkında değilim.

Tersini gerçekleştirmek için scponly kabuğu hack keşfetmek keşfedebilirsiniz.


0

Bu aslında küçük bir googling sonrasında mümkün değildir.

Bu tartışmaya göz atın: http://www.mydatabasesupport.com/forums/unix-admin/387261-how-restrict-ssh-users-block-scp-sftp.html


Bu bağlantı öldü.
19x17

0

Değeri ne olursa olsun, ticari ürün CryptoAuditor , bağlantıyı MITM yaparak ve derin paket denetimi kullanarak SSH üzerinden dosya aktarımlarını kontrol edebildiğini iddia ediyor . Açıkçası hiçbir çözüm kopyalama + yapıştırma, uuencode / kod çözme, FISH , vb. Güvenli değildir . Güzel bir şey şeffaf olmasıdır (olası sertifika hatalarının yanı sıra); SSH bağlantısının her iki ucuna yüklenecek aracı yazılımı ve yapılandırılacak portal / proxy yoktur.

Ürünü ben kullanmadım, bu yüzden YMMV.


0

Makineyi tamamen yararsız bırakmak için pek çok sistem yardımcı programını kaldırmadan dosya aktarımını engellemek imkansızdır. Dosya içeriklerini stdout'a gösterebilen her şeyden ve stdin'sini stdout'a yazabilen her şeyden kurtulmanız gerekir ve bunların hepsini kaldırdığınızda, kabuk erişimine izin vermenin bir anlamı kalmaz. hiç.

Bu yüzden bunun yerine günlük alternatifinize odaklanacağım:

Hemen hemen her dağıtımda yer alan ve komut dosyası olmayan bir program var ve bu programın kurulumu kolay olmayan programlara yüklenmesi kolay. Bir kabuktan gelen tüm girdi ve çıktıları, isteğe bağlı olarak zamanlama verileriyle kaydeden bir oturum kaydedicidir, böylece yeniden oynatılabilir ve tıpkı bunu yaparken kullanıcının omzunun üzerinden izlediğiniz gibi görünebilir. (Yine de% 95, bazen hemşireler söz konusu olduğunda çıktıyı salgılar, ancak çok sık değildir.)

Kılavuz sayfası, sistemin giriş kabuğu olarak ayarlanması için talimatlar içerir. Günlüklerin kullanıcının yalnızca silemeyeceği bir yere gittiğinden emin olun (yalnızca ek dosya sistemi özniteliği (chattr ile ayarlanabilir) bunun için yararlı olabilir. ACL'ler veya komut dosyalarını inotify gibi)

Bu, kullanıcıların dosyaları sistemden kopyalamasını engellemez, ancak hangi kullanıcılar tarafından ve ne zaman yapıldığını gözden geçirmenize izin verir. Baypas yapmak muhtemelen imkansız değildir, ancak baypas neredeyse kesinlikle günlüklere dönüşür, böylece tam olarak ne olduğunu gizlemeyi başarsalar bile en azından birinin iyi olmadığını biliyorsunuzdur.


0

Sunucudaki openssh istemcilerini (veya eşdeğerini) kaldırabileceğinize inanıyorum.

Ben scp istemcisi scp sunucu üzerinde scp çağırır veri kopyalarken böylece sunucuda scp kurtulmak, o zaman iyi olmalı.

$ scp bla server:/tmp/
...
debug1: Sending environment.
debug1: Sending env LC_ALL = en_US.utf8
debug1: Sending env LANG = en_US.utf8
debug1: Sending env XMODIFIERS = @im=ibus
debug1: Sending env LANGUAGE = en_US.utf8
debug1: Sending command: scp -v -t /tmp/
bash: scp: command not found
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
lost connection
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.