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í:
- Vytvořit uživatele bašt
- Zakázat přihlášení uživatele root
- Blokovat pokusy o hackování
- Změnit port
- Nakonfigurujte bránu firewall
- 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 :)