Egy kis gyors feladatot kaptam, miszerint be kell állítanom Linux szervereket egy biztonságos konfigurációs sablon alapján. (Angolul kedvelőknek secure baseline config template :-)). És ha már beállítom, akkor előtte dolgozzam is ki ezt a bizonyos template-et. :-D
Jó, hogy meg sem lepődtem a feladaton, mert IT berkekben ez a találj-ki-jobb-megoldást-és-rögtön-meg-is-valósíthatod módszer a főnökök kedvence. A vicc, hogy a jó munkavégzők nem csak hogy mindig beszívják, de úgy vettem észre, egyenesen igénylik ezt a fajta bánásmódot. :-) Node a Bagoj türelmes állat, mint tudjuk.
Arra gondoltam viszont, hogy miért ne adnám közre az elvégzett munkát, hiszen más is kerülhet olyan helyzetbe, hogy hirtelen ki kell dolgoznia egy szerver jelszópolitikát. Naszóval.
Jelszó politika
Ezt a jelszó politikát érvényesíteni kell minden <X> szerveren. Amennyiben ez nem lehetséges, a jelszó generálás, -csere, -visszavonás folyamatát kell kidolgozni olyan módon, hogy megfeleljen jelen jelszópolitikának.
Az adminisztrátor és technikai felhasználókat szükséges megkülönböztetni. Az előbbiek személyhez / névhez kötöttek, napi munkavégzéshez, a rendszerek konfigurálásához interaktívan használtak. Minden ilyen tevékenységet végző számára saját, megszemélyesített felhasználó szükséges, hogy a tevékenysége nyomon követhető legyen. A technikai felhasználókat rendszerek pl. egymás közötti adatcsere miatt, azonosításhoz illetve titkosításhoz használják. A két felhasználó típust jelszóhossz, komplexitás, jelszócsere, korábban használt jelszavak ellenőrzése szempontjából ajánlatos megkülönböztetni.
Központi jelszókezelés
A központosított jelszókezelő rendszerek (Microsoft AD/Radius/Tacacs) preferáltak, a helyi (lokális) felhasználók létrehozása csak akkor indokolt, ha nincsen egyéb megoldás. Ez alól kivételt képeznek az ún. "last resort" felhasználók, amelyeket a központi jelszókezelő rendszer elérhetetlensége esetén lehet használni. Ezek a felhasználók technikai felhasználónak minősülnek, a jelszavukat borítékos, vagy ezzel egyező módszerrel kell tárolni.Jelszó történet
Adminisztartív és technikai felhasználó nem használhatja a legutóbbi 10 beállított jelszavát.Jelszó öregbítés
Adminisztratív felhasználók legalább 60 naponként kötelesek jelszót cserélni, ezt a rendszer vagy a folyamat lehetőség szerint kikényszeríti. Technikai felhasználókra nincs ilyen megkötés.Minimális jelszóhossz
Adminisztratív felhasználók legalább 8 karakteres, technikai felhasználók legalább 15 karakteres jelszót kell használjanak, ahol erre mód van.Jelszó komplexitás
Adminisztratív felhasználók legalább egy nagybetűt, legalább két kisbetűt és egy számot kötelesek használni. Technikai felhasználók legalább két nagybetűt, legalább 3 számot és különleges karaktert kötelesek használni.Egyéb
- Nem titkosított menedzsment protokoll (Telnet, HTTP) nem támogatott
- SSH esetén csak az SSHv2 támogatott
- Szükséges a rendszerekben időtúllépés (timeout) beállítása, a szabadon hagyott konzolok automatikus kiléptetése miatt
- Figyelmeztető üzenet (login banner) beállítása szükséges, ahol lehtséges
Szerintem elég logikusak a fentiek, de hogyan lehet ezeket elérni?
Induljunk ki először abból, hogy nem lehetséges a központi jelszókezelés, helyileg kell megoldanunk a dolgot. Sajnos a Linuxon nem lehet kétféle felhasználó típust kezelni, ezért legjobb, ha a gyengébb követelményt kikényszerítjük, az erősebbet pedig adminisztratív úton betartjuk.
Jelszó történet
Debian és származékai esetén:
# vi /etc/pam.d/common-passwordpassword [success=1 default=ignore] pam_unix.so obscure sha512 remember=10
Redhat és származékai esetén:
# vi /etc/pam.d/system-authpassword sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=10
Jelszó öregbítés
Ha mindenki számára egyszerre szeretnénk beállítani:
# vi /etc/login.defsPASS_MAX_DAYS 60
PASS_MIN_DAYS 0
PASS_WARN_AGE 7
Ha mondjuk a root felhasználót nem szeretnénk macerálni, akkor felhasználónként is lehet állítani a chage nevű paranccsal. Ez kis aranyos, pl. ki tudjuk kényszeríteni egy felhasználó jelszócseréjét akár azonnal is:
# chage -E 11/26/2015 bagojur
A mai napon cserélnem kell a jelszómat. A jelszópolitika érvényesítése:
# chage -M 60 -I 14 -W 7 bagojur
Tehát a -M azt állítja be, hogy 60 naponként kell cserélni. A -l megmondja, hogy a jelszócsere határidejének lejárta után még hány napig tud bejelentkezni, mielőtt letiltásra kerül. A -W pedig azt, hogy 7 nappal a lejárat előtt a rendszer elkelzdi minden belépéskor figyelmeztetni, hogy le kell majd cserélnie a jelszavát.
Minimális jelszóhossz
Debian származékoknál szintén a common-password fájlt írjuk:
password requisite pam_cracklib.so retry=3 minlen=8 difok=3
Redhatéknál pedig szintén a system-auth-ot:
password requisite pam_cracklib.so retry=3 difok=3 minlen=8
Fontos megjegyzés, hogy ezt a jelszóhosszt befolyásolják a komplexitásra adott értékek (ez az összefüggés mindjárt világos lesz, mivel ugyanezeket a sorokat kell majd írni a komplexitáshoz is, lásd lejjebb). Ez úgy történik, hogy a beállított minimális jelszóhossz annyival csökken, mint ahány megkötést megadunk a jelszó komplexitásra. Tehát, ha megadjuk hogy hány nagybetű legyen, akkor a fenti minimum jelszóhossz már csak 7. Ha meghatározzuk azt is, hogy legyen benne szám, akkor már csak 6 stb. Ezt is figyelembe kell vennünk, ezért változtatom meg lentebb a minlen paramétert.
Jelszó komplexitás
Először ismét nézzük a Debiant, aki az előző bekezdést elolvasta, annak nem lehet probléma kitalálni, hogy melyik fájlban találja a következő sort :-):
password requisite pam_cracklib.so retry=3 minlen=11 difok=3 ucredit=-1 lcredit=-2 dcredit=-1
(Azoknak, akik mindenképpen be akarnak állítani különleges karaktert is, a paraméter az ocredit=-x, ahol x a darabszám, ahány különleges karaktert szeretnénk látni a jelszóban.)
Redhatnál ismét a system-auth fájlt írjuk, és a sor hajszálpontosan megegyezik a Debianossal.
És a többi apró
Csak a timeout-tal, a bannerrel és az SSHv2-vel foglalkozom, a nem titkosított szolgáltatások letiltása nyilvánvaló. A https self-signed tanúsítvánnyal még mindig biztonságosabb, mint titkosítatlanul adatokat küldeni a hálózaton.
# vi /etc/ssh/sshd_config (Debianon /etc/ssh/ssh_config):
Protocol 2
ClientAliveInterval 300
ClientAliveCountMax 3
Banner /etc/issue.net
A fentiek 15 perces timeoutot (300 sec = 5 perc, és ez háromszor) követelnek meg. A /etc/issue.net-be bármit írhatunk, a felhasználó név begépelése után fog megjelenni. Ja és mivel a frissítések előszeretettel írják felül, én rá szoktam dobni egy chattr-ot:
# chattr +i /etc/issue.net
Hát, ennyi. :-)