Vodiči

Secure Linux Admin: SSH Certs, Least Privilege, and Auditing for Robust Control

Sigurna administracija Linuxa: SSH certifikati, najmanje potrebne ovlasti i revizija za robusnu kontrolu

Produkcijska ljuska nije samo udaljeni terminal. Ona je upravljačka ravnina za implementacije, tajne, procese i podatke. Zaštita dugotrajno važećim javnim ključem rješava samo jedan problem: dokazivanje posjedovanja datoteke koja je možda kopirana prije mnogo godina.

Snažniji dizajn koristi kratkotrajne SSH certifikate za identitet, zasebnu jednokratnu lozinku za višefaktorsku autentikaciju, usko ograničene administratorske naredbe i revizijske zapise koji povezuju prijavu s njezinim privilegiranim učincima. Rezultat nije neranjivost. To je sustav s ograničenim vjerodajnicama, izričitim ovlastima i dovoljno dokaza za istraživanje pogrešaka ili zloupotrebe.

Ovaj vodič gradi taj sustav na Ubuntu Server računalu naziva srv01.internal. Administratori mu pristupaju putem pouzdane VPN podmreže 10.20.0.0/24. Primjeri koriste račun alice, UID 1101 i aplikacijsku uslugu naziva myapp.service.

Arhitektura i sigurnosne granice

Šifrirani, izvanmrežni Ed25519 ključ certifikacijskog tijela potpisuje javne ključeve administratora. Poslužitelj pohranjuje samo javni ključ CA-a i prihvaća certifikate koji sadrže principal prod-admin. Certifikati traju osam sati, pa redovni pristup prirodno istječe bez uređivanja svakog poslužitelja.

OpenSSH zatim zahtijeva drugu metodu autentikacije putem PAM-a. Jednokratna lozinka temeljena na vremenu ovdje je korisna jer je neovisna o SSH ključu, iako nije otporna na krađu identiteta. TOTP sjeme također se nalazi na poslužitelju, pa potpuna kompromitacija računala poništava taj faktor. Za okruženja s višom razinom jamstva postavite granicu MFA-a na ojačani pristupni pristupnik ili koristite dizajn podržan sigurnosnim ključem.

Autorizacija ostaje lokalna. Članstvo u prod-admins dopušta prijavu, dok sudo dopušta samo tri točne operativne naredbe. OpenSSH bilježi autentikaciju, Linux Audit zapisuje izvršene programe, a sudo bilježi ulaz i izlaz terminala za privilegirane naredbe.

Certifikati odgovaraju na pitanje tko se smije povezati i koliko dugo. MFA povećava cijenu ukradenih vjerodajnica. Sudo određuje što autentikirana osoba smije učiniti. Revizija bilježi što se zapravo dogodilo. Nijedan od tih slojeva ne zamjenjuje drugi.

Preduvjeti i struktura projekta

Potrebni su vam Ubuntu Server računalo s pristupom konzoli ili postojećim administratorskim pristupom, ispravna sinkronizacija vremena, pouzdana VPN ili upravljačka mreža te zasebna Linux administratorska radna stanica. Tijekom implementacije zadržite trenutačnu SSH sesiju otvorenom. Nemojte je zatvarati dok nova sesija ne prođe svaki korak provjere.

Završeno računalo koristi ove datoteke:

  • /etc/ssh/ca/user_ca.pub — pouzdani javni ključ CA-a
  • /etc/ssh/auth_principals/alice — principi certifikata prihvaćeni za Alice
  • /etc/ssh/sshd_config.d/40-production-admin.conf — pravilo SSH učvršćivanja
  • /etc/pam.d/sshd — namjenski stog za SSH OTP autentikaciju
  • /etc/sudoers.d/alice-myapp — naredbe s najmanjim potrebnim ovlastima
  • /etc/audit/rules.d/50-admin-session.rules — izvršiva revizijska pravila
  • /etc/systemd/journald.conf.d/40-persistent-audit.conf — ograničena trajna pohrana dnevnika

Na srv01.internal instalirajte potrebne distribucijske pakete:

sudo apt update
sudo apt install openssh-server sudo auditd audispd-plugins \
  libpam-google-authenticator ufw

sudo systemctl enable --now ssh
sudo systemctl enable --now auditd
timedatectl status

Ispravite znatno odstupanje sata prije nastavka. Provjera TOTP-a i valjanost certifikata ovise o vremenu.

Izradite i zaštitite SSH certifikacijsko tijelo

Ovaj odjeljak pokrenite na administratorskoj radnoj stanici, a ne na poslužitelju. Privatni ključ CA-a trebao bi se nalaziti na šifriranom izmjenjivom mediju koji se drži izvan mreže, osim tijekom izdavanja ili opoziva certifikata. Njegova pristupna fraza štiti ukradenu kopiju; ne štiti ključ ostavljen montiran na otključanoj radnoj stanici.

umask 077
sudo install -d -m 0700 /media/secure-ssh-ca
sudo chown "$(id -u):$(id -g)" /media/secure-ssh-ca

ssh-keygen -t ed25519 -a 100 \
  -f /media/secure-ssh-ca/user_ca \
  -C "production SSH user CA"

Zabilježite serijske brojeve i identitete certifikata u trajnoj evidenciji izdavanja. Serijski broj nije tajan, ali osobama koje odgovaraju na incidente pruža stabilan identifikator.

Prebacite samo user_ca.pub u /root/bootstrap/user_ca.pub na poslužitelju putem postojećeg pouzdanog administratorskog kanala. Nikada ne kopirajte privatnu datoteku naziva user_ca na upravljano računalo.

Pripremite račun i pravilo povjerenja

Natrag na srv01.internal, najprije potvrdite da se UID 1101 ne koristi. Prva naredba ne bi trebala proizvesti nikakav izlaz:

getent passwd 1101
sudo addgroup --system prod-admins
sudo adduser --uid 1101 --disabled-password --gecos "" alice
sudo adduser alice prod-admins

sudo install -d -o root -g root -m 0755 /etc/ssh/ca
sudo install -d -o root -g root -m 0755 /etc/ssh/auth_principals
sudo install -o root -g root -m 0644 \
  /root/bootstrap/user_ca.pub /etc/ssh/ca/user_ca.pub

Ako pretraga UID-a vrati račun, dodijelite drugi fiksni UID i dosljedno ga koristite u pravilima revizije u nastavku.

Izradite /etc/ssh/auth_principals/alice s ovim jedinim retkom:

prod-admin

Postavite vlasništvo na root i način rada 0644. Odvajanje principala certifikata od korisničkog imena Unixa omogućuje CA-u da izrazi ulogu, dok svaki poslužitelj odlučuje koji lokalni račun je smije preuzeti.

Upišite neovisni OTP faktor

Pokrenite upis s pouzdane konzole ili postojeće administratorske sesije:

sudo -H -u alice google-authenticator \
  -t -d -f -r 3 -R 30 -w 3

sudo chown alice:alice /home/alice/.google_authenticator
sudo chmod 0400 /home/alice/.google_authenticator

Alice mora zabilježiti prikazanu tajnu u svojem autentikatoru i pohraniti kodove za hitne slučajeve na zasebno zaštićeno mjesto. Opcije odabiru tokene temeljene na vremenu, odbijaju ponovnu upotrebu tokena, ograničavaju pokušaje i toleriraju mali vremenski prozor.

Prije promjene PAM-a sačuvajte sigurnosnu kopiju u vlasništvu roota prikladnu za ovu implementaciju. Zatim neka /etc/pam.d/sshd sadrži:

auth required pam_google_authenticator.so

account required pam_nologin.so
@include common-account

session required pam_loginuid.so
@include common-session

Time se namjerno isključuje common-auth. Interaktivna autentikacija tipkovnicom traži samo OTP; ne uključuje potajno lozinke računa. Pravila računa i sesije i dalje koriste Ubuntuove standardne PAM stogove.

Zahtijevajte certifikate i MFA u OpenSSH-u

Izradite /etc/ssh/sshd_config.d/40-production-admin.conf kao root:

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication yes
PubkeyAuthentication yes
UsePAM yes

TrustedUserCAKeys /etc/ssh/ca/user_ca.pub
AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u
AuthenticationMethods publickey,keyboard-interactive:pam
AllowGroups prod-admins

DisableForwarding yes
PermitTunnel no
X11Forwarding no
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 2
MaxStartups 10:30:30
ClientAliveInterval 300
ClientAliveCountMax 2
LogLevel VERBOSE

DisableForwarding zatvara putove prosljeđivanja agenta, TCP-a, Unix utičnica i X11-a. To je poželjno za administratorsku ljusku, ali neprikladno ako se ovo računalo namjerno koristi kao bastion ili krajnja točka tunela. U tom slučaju izložite samo potrebnu mogućnost prosljeđivanja i zasebno ograničite odredišta.

Provjerite sintaksu i učinkovito pravilo prije ponovnog učitavanja:

sudo sshd -t
sudo sshd -T -C user=alice,host=srv01.internal,addr=10.20.0.10 \
  | grep -E 'authenticationmethods|trustedusercakeys|authorizedprincipalsfile|disableforwarding'

sudo systemctl reload ssh
sudo systemctl is-active ssh

Neuspjeh naredbe sshd -t uvjet je za zaustavljanje. Ispravite prijavljenu datoteku i redak; nemojte eksperimentalno ponovno učitavati.

Izdajte kratkotrajni administratorski certifikat

Na Aliceinoj radnoj stanici izradite namjenski privatni ključ:

umask 077
ssh-keygen -t ed25519 -a 100 \
  -f "$HOME/.ssh/id_ed25519_prod" \
  -C "alice production access"

Premjestite samo id_ed25519_prod.pub na izvanmrežnu radnu stanicu za potpisivanje. Nakon provjere podnositelja zahtjeva i otiska ključa kroz postupak upisa vaše organizacije, montirajte CA i potpišite ga:

CERT_SERIAL=10001

ssh-keygen -s /media/secure-ssh-ca/user_ca \
  -I "alice-$(date -u +%Y%m%dT%H%M%SZ)" \
  -z "$CERT_SERIAL" \
  -n prod-admin \
  -V -5m:+8h \
  -O clear \
  -O permit-pty \
  id_ed25519_prod.pub

ssh-keygen -Lf id_ed25519_prod-cert.pub

Petominutno dopuštenje unatrag apsorbira male razlike sata. -O clear uklanja zadane dozvole certifikata, nakon čega se vraća samo dodjela terminala. Ograničenja prosljeđivanja na strani poslužitelja ostaju mjerodavna.

Vratite id_ed25519_prod-cert.pub Alice kao ~/.ssh/id_ed25519_prod-cert.pub. Privatni ključ nikada ne napušta njezinu radnu stanicu.

Primijenite najmanje ovlasti s revizijskim sudo-om

Alicein račun nema lozinku, stoga neograničeni sudo nije ni koristan ni namjeravan. Izradite /etc/sudoers.d/alice-myapp s točnim naredbama:

Defaults:alice use_pty,log_input,log_output
Defaults:alice iolog_dir="/var/log/sudo-io"

alice ALL=(root) NOPASSWD: /usr/bin/systemctl reload myapp.service
alice ALL=(root) NOPASSWD: /usr/bin/systemctl restart myapp.service
alice ALL=(root) NOPASSWD: /usr/bin/journalctl --unit=myapp.service --since=-30min --no-pager

Postavite način rada 0440, zatim pokrenite sudo visudo -cf /etc/sudoers.d/alice-myapp. Podudaranje argumenata je točno: promjena jedinice, redoslijeda opcija ili vremenskog raspona bit će odbijena. Izbjegavajte davanje interpretatora, uređivača, ljuski, neograničenog journalctl ili široko parametriziranih naredbi za usluge; one često postaju neizravne root ljuske.

Sudo I/O dnevnici mogu sadržavati osjetljiv izlaz aplikacije ili uneseni tekst. Ograničite pristup rootu, definirajte zadržavanje i nikada ne tražite od operatera da unose produkcijske tajne u snimane terminalske programe.

Izgradite revizijski trag

Izradite /etc/audit/rules.d/50-admin-session.rules:

-a always,exit -F arch=b64 -S execve -F auid=1101 -k admin-exec
-a always,exit -F arch=b32 -S execve -F auid=1101 -k admin-exec

Učitajte i pregledajte pravila:

sudo augenrules --load
sudo auditctl -l
sudo auditctl -s
sudo ausearch -k admin-exec -i

UID prijave, odnosno auid, prati Alice kroz sudo, povezujući privilegirane procese s izvornom prijavom. Audit bilježi pozive execve i argumente, a ne ugrađene naredbe ljuske, izlaz terminala ili svaku izmjenu datoteke. Sudo I/O bilježenje popunjava dio te praznine za privilegirane naredbe.

Za trajne SSH i servisne dnevnike izradite /etc/systemd/journald.conf.d/40-persistent-audit.conf:

[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=1G
MaxRetentionSec=30day

Izradite /var/log/journal s sudo systemd-tmpfiles --create --prefix /var/log/journal, zatim ponovno pokrenite systemd-journald. Lokalni dnevnici pomažu u radu, ali ih napadač koji stekne root pristup može izmijeniti. Produkcijske implementacije trebale bi prosljeđivati SSH, sudo i revizijske događaje kolektoru kojim se upravlja zasebno.

Vatrozid i fazna implementacija

Potvrdite da je 10.20.0.0/24 zaista VPN podmreža za ovu implementaciju. Zatim pripremite pravilo vatrozida:

sudo ufw allow from 10.20.0.0/24 to any port 22 proto tcp
sudo ufw status numbered

Ako UFW već nije aktivan, omogućite ga samo putem pristupa konzoli nakon što uzmete u obzir svaku drugu potrebnu uslugu. Daljinsko omogućavanje vatrozida sa zadanim odbijanjem bez potpunih pravila može prekinuti vezu i sa SSH-om i s aplikacijom.

Najprije uvedite promjene na jednom kanarskom računalu. Zadržite početnu sesiju otvorenom, autentikirajte se putem VPN-a u drugom terminalu, upotrijebite sudo, pregledajte sva tri revizijska sloja i tek tada ponovite konfiguraciju putem verzionirane automatizacije.

Testirajte autentikaciju, autorizaciju i dokaze

S Aliceine radne stanice:

ssh -o IdentitiesOnly=yes \
  -i "$HOME/.ssh/id_ed25519_prod" \
  [email protected]

sudo -l
sudo /usr/bin/systemctl reload myapp.service
sudo /usr/bin/journalctl --unit=myapp.service --since=-30min --no-pager
sudo /bin/bash

Veza mora zahtijevati i privatni ključ i OTP. Prve tri sudo naredbe trebale bi uspjeti gdje je primjenjivo; ljuska mora biti odbijena. Također testirajte negativne putove: izostavite certifikat, unesite nevažeći OTP, povežite se izvan VPN-a i upotrijebite certifikat s pogrešnim principalom. Svaki slučaj trebao bi biti sigurno odbijen.

Iz zadržane administratorske sesije korelirajte dobivene zapise:

sudo journalctl -u ssh --since "15 minutes ago"
sudo ausearch -k admin-exec -ua 1101 -i
sudo sudoreplay -l user alice
sudo ls -l /var/log/sudo-io

Česti kvarovi i operativni kompromisi

  • Certifikat je odbijen: usporedite izlaz ssh-keygen -Lf s principalom koji poslužitelj prihvaća, prozorom valjanosti i otiskom pouzdanog CA-a.
  • Nema OTP upita: potvrdite da je klijent doista ponudio certifikat i da se AuthenticationMethods pojavljuje u učinkovitom izlazu sshd -T.
  • Svaki OTP ne uspijeva: provjerite sinkronizaciju vremena te vlasništvo i dozvole datoteke .google_authenticator.
  • Sudo naredba je odbijena: usporedite putanju izvršne datoteke i potpuni slijed argumenata s sudo -l. Točno podudaranje je namjerno.
  • Nedostaju revizijski događaji: provjerite Alicein UID, učitana revizijska pravila i status revizijskog demona. Postojeće sesije zadržavaju izvorni UID prijave.
  • Prevelika količina dnevnika: zadržite opseg revizijskih pravila na administratorskim identitetima, pratite upotrebu diska i provodite zadržavanje. Sustavno bilježenje execve poziva može biti skupo na opterećenim računalima.

Kratki certifikati smanjuju izloženost, ali uvode ovisnost dostupnosti o postupku izdavanja. Držite CA izvan mreže, dokumentirajte postupak hitnog izdavanja i održavajte upute za opoziv za incidente koji ne mogu čekati istek. Testirajte artefakte opoziva na kanarskom računalu: nečitljiva datoteka konfigurirana putem RevokedKeys može uzrokovati široki neuspjeh autentikacije javnim ključem.

Završni kontrolni popis provjere

  • Privatni ključ CA-a postoji samo na šifriranom izvanmrežnom mediju.
  • Poslužitelj vjeruje samo javnom ključu CA-a i namjeravanom principalu.
  • Certifikati imaju jedinstvene identitete, zabilježene serijske brojeve i kratko razdoblje valjanosti.
  • Prijava roota, lozinke i nepotrebno prosljeđivanje su onemogućeni.
  • SSH zahtijeva i valjani certifikat i OTP.
  • Samo VPN podmreža može dosegnuti port 22.
  • Sudo dodjeljuje točne operativne naredbe umjesto opće ljuske.
  • SSH zapisi dnevnika, revizijski događaji i sudo reprodukcije mogu se dohvatiti.
  • Zadržavanje i prosljeđivanje izvan računala odgovaraju osjetljivosti snimljenih podataka.
  • Pozitivni i negativni testovi prolaze prije zatvaranja početne sesije.

Robusna udaljena administracija proizlazi iz toga da ovlasti budu privremene, uske i vidljive. Kopirani ključ trebao bi brzo isteći. Ukradeni faktor ne bi trebao biti dovoljan. Rutinska implementacija ne bi trebala podrazumijevati root ljusku. A kada nešto pođe po zlu, dokazi bi trebali opisati put od identiteta do radnje. To je razlika između pukog dopuštanja SSH-a i upravljanja obranjivom produkcijskom upravljačkom ravninom.

Portret autora bloga

Mihajlo

Ja sam Mihajlo — programer vođen znatiželjom, disciplinom i stalnom željom da stvorim nešto smisleno. Dijelim uvide, tutorijale i besplatne usluge kako bih pomogao drugima da pojednostave svoj rad i rastu u svijetu softvera i umjetne inteligencije koji se neprestano razvija.