GNU/Linux >> Znalost Linux >  >> Linux

Bastion server:použijte TCP forwarding VS umístění soukromého klíče na server

Použijte ProxyCommand nebo ProxyJump

Doporučil bych použít ProxyCommand (nebo ještě lépe ProxyJump protože syntaxe je snazší, ale vyžaduje openssh 7.3+ myslím na straně klienta), a nemusíte nasadit soukromý klíč na Bastion, vše zůstává lokální.

Příklad s ProxyJump

Na klientském počítači zapíšete soubor pod ~/.ssh/config s podobným obsahem jako níže:

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

Poté proveďte ssh srvC vás připojí k C přes B (bašta) bez přesměrování agenta ani nasazení soukromého klíče do bašty.

Ve výše uvedeném příkladu je "bastion" alias vašeho hostitele Bastion a srvC je alias vašeho serveru C. V HostName musíte pro své hostitele zadat buď IP adresy, nebo skutečný plně kvalifikovaný název domény. Pro uživatele musíte aktualizovat User pro správné přihlašovací jméno na Bastion a server C. Nakonec IdentityFile je volitelný, pokud používáte místního agenta (např. KeeAgent nebo ssh-agent), ale pokud neběží, bude také fungovat a požádá vás o každé klíčové heslo.

Nasazení veřejných klíčů

Samozřejmě je potřeba nasadit veřejné klíče k bastionu i srvC. Můžete použít (znak $ pouze ilustruje výzvu, nepište jej):

$ 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

Poznámka:Výše ​​uvedené bude fungovat pouze v případě, že je stále povoleno ověřování heslem. Po výše uvedeném nasazení a ověření, že vše funguje tak, jak bylo zamýšleno, byste měli zakázat ověřování hesla na těchto 2 serverech.

Příklad s ProxyCommand namísto ProxyJump

Pokud máte starší verzi OpenSSH, která nepodporuje ProxyJump (na straně klienta), poté nahraďte:

ProxyJump bastion

od

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

Pokud jsem pochopil, je to podobné.


Viděl jsem odpověď o ProxyJump. Pojďme si promluvit o ProxyCommand .

Ale počkat, počkat! Mohu vám napsat, jak hacknout server který používá Agent forwarding, bylo by mnohem snazší pochopit rozdíl!

Pojďme hacknout!

Pro základní kroky:můj příspěvek si můžete přečíst zde

Základní kroky jsou následující:

  1. Vytvořit uživatele bašt
  2. Zakázat přihlášení uživatele root
  3. Blokovat pokusy o hackování
  4. Změnit port
  5. Nakonfigurujte bránu firewall
  6. Nakonfigurujte SELinux

Jak používat AgentForwarding

-Vytvořte konfiguraci v ~/.ssh/config

  Host bast
        Hostname BASTION_IP
        ForwardAgent yes
        User bastion

-Přidejte svůj ověřovací klíč do ssh-agent

ssh-add ~/.ssh/name_rsa

-Připojit k bastion hos

ssh bast

-Připojit aplikační server z bašty

 ssh [email protected] -p PORT

Hackování!

Můžete mi položit otázku:

  • Je můj server bezpečný? A odpověď je docela jednoduchá:

    • NE!
  • Proč?

    • Protože používáte přesměrování agenta SSH!
  • A kde je problém?

    • Protože přeposílání agentem je nebezpečné a považuje se za škodlivé.
  • Proč?

    • Pojďme si vše vysvětlit naruby:Když připojíte hostitele bastion, váš skvělý ssh-agent bude předán dál. Znamená to, že soket bude nastaven tak, aby někdo mohl použít tato data soketu pro přístup k vašim serverům. Představte si, že váš bastion server je kompromitován. Pokud má někdo dostatečná oprávnění na vašem linuxovém serveru, použije pouze informace o vašem soketu. Výsledkem je, že je přístupný celý váš server. Vím, že okno kompromisu je velmi malé, protože závisí na tom, jak dlouho jste připojeni k hostiteli bastionu. Ale opravdu chcete riskovat, když máte jiné možnosti, jako je ProxyCommand? Proto stačí použít ProxyCommand!

Jak hacknout servery, pokud jste kompromitovali hostitele bastionu?

Cíl sledování

V adresáři /tmp můžete vidět něco takového:

[[email protected] tmp]# ll
total 12
drwx------  2 bastion bastion 4096 Sep  7 17:35 ssh-mKX88v0Vlo

Otevřeme dočasný soubor

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

Podívejme se na spojení na toto ID procesu.

netstat -nxp | grep  10507

výsledek:

unix  [ ]   STREAM     CONNECTED     501384   10507/sshd: bastion

a kdo je připojen?

lsof -i -a -p 10507

výsledek:

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

Můžeme také vidět soketové soubory:

cd /proc/10507/fd/
ls

výsledek:

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]

A co se stane kdy klient bude připojen na vzdálený server? uvidíme:

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]

Můžeme dokonce vidět, zda se používá soubor socket pomocí netstat:

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

Ukrást informace o zásuvce a IP adresu

Nyní potřebujeme ukrást informace o soketu, zatímco je relace hostitele bastion otevřená . Potřebujeme také adresu IP cílového serveru , takže stačí použít netstat:

netstat -tn

Poslední krok použít předaný soubor soketu

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

Zkontrolujte, zda je načten klíč .

ssh-add -l

výsledkem by mělo být něco takového :

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

Server je napaden hackery, jak vyřešit problém se zabezpečením?

Příkaz proxy

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

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

Pro základní operace:jak přenášet soubory přes servery (z klienta na server, ze serveru na klienta), si můžete přečíst v mém příspěvku zde

Závěr

  • Pokud používáte hostitele bastion, nepoužívejte AgentForwarding, ale použijteProxyCommand
  • K ověření vždy používejte uživatele bez oprávnění root
  • Použijte bránu firewall a zablokujte všechna nepotřebná připojení.
  • Používejte SELinux (obecně)
  • Zablokujte IP adresu, která se několikrát pokouší přihlásit s nesprávnými přihlašovacími údaji
  • Pokud to není nutné, nedávejte uživateli oprávnění sudo
  • Monitorujte svůj server
  • Aktualizujte svůj server kvůli opravám zabezpečení

Více informací naleznete na mém blogu. Navíc mám nějaké snímky obrazovky, takže to pro vás může být užitečné.


Jednoduše použijte Přesměrování agenta SSH jako většina ostatních.

  • Klíče budou v agentovi ssh na vašem notebooku.
  • Přihlásíte se do bastionu a budete ověřeni prostřednictvím agenta.
  • Odtud se přihlaste k cílovému hostiteli s požadavkem na ověření přesměrovaným zpět do vašeho notebooku .

Výhoda:na baště nejsou uloženy klíče, které by se daly zneužít.

Doufám, že to pomůže :)


Linux
  1. Jak používat ssh-copy-id na Ubuntu

  2. Kdy použít dedikovaný server

  3. Jaký příkaz mám použít, abych zjistil, jaký je otisk klíče ECDSA mého serveru?

  1. Převést soukromý klíč Openssh na soukromý klíč Ssh2?

  2. Sdílení soukromých klíčů mezi počítači?

  3. Jak SSH na ec2 instanci v privátní podsíti VPC přes NAT server

  1. Jiný cloudový server používá scénáře

  2. K zastavení cloudového serveru použijte volání API

  3. K vytvoření serveru použijte rady plánovače