Det är väl ingen som missat alla uppmärksammade brister i säkerheten som drabbat framför allt lite äldre Windows system, men inga operativsystem är osårbara. Vad gör man för att fixa ett så säkert Linux system som möjligt? Oavsett om det är en server eller en klient så borde det finnas massor med saker man kan göra för att skydda sig.
I grunden är Linux ganska säkert och de flesta säkerhetsproblem är sådant man själv som användare introducerar. Jag kan tycka att en sådan sårbarhet är att sätta upp ”file share” med smb protokollet då just smb har varit ett fokus för flera av de senaste ransomware attackerna. Om det verkligen är så vet jag dock inte med säkerhet.
”Säker” kan man aldrig vara och därför är det bättre att prata om ”riskhantering” i stället för säkerhet. Vilka risker är man beredd att ta för att lösa de uppgifter man behöver utföra med datorer. Det kan även finnas lagar och bestämmelser som man måste följa, men i övrigt tycker jag att det bästa är att man är medveten om vilka risker man tar. För mig så handlar IT-säkerhet framför allt om attityd!
Om man söker efter ”säker linux” på Internet så får man i huvudsak träffar med listor på säkerhetsfokuserade distributioner, men det är inte lika lätt att hitta information om vad man kan göra för att ”säkra” den distribution som man redan har, eller är van att använda.
Efter att ha letat ett tag så har jag hittat en del information som jag sammanställer i en egen ”lista”, men jag vill gärna höra om andra har ytterligare synpunkter och erfarenheter, då jag likt många andra inte prioriterat IT-säkerhet i vardagen speciellt högt.
Jag vill dock börja med ett logiskt resonemang. Om de data (information eller mjukvaror) du vill skydda finns på en dator, som du låser in i en plåtlåda, utan nätverkskontakt, utan att användare kommer åt den, eller övrig kontakt med omvärlden, så är data väldigt säker.
Man introducerar sedan risker om:
- Användare kommer åt datorn.
- Datorn ansluts till externa nätverk.
- Datorn sänder ut signaler som kan uppfångas på avstånd.
Man måste sedan även anta att det finns ytterligare risker som man inte känner till, men dessa är utomordentligt svåra att skydda sig emot.
Nåja, eftersom det är rimligt att anta att användare behöver kunna komma åt data antingen via nätverk eller direkt vid datorn så behöver man hantera dessa risker.
Portar och brandväggar
Innan man börjar säkra upp inloggningar och nätverkstjänster så tycker jag det är rimligt att man framför allt försöker inventera vilka tjänster man exponerar mot nätverket.
sudo netstat -tulpn
Kommandot ovan listar alla portar som är öppna och lyssnar på trafik från nätverket. Hittar man rader, eller portar, som man är osäker på så kan man forska vidare vad det handlar om, och om det innebär en risk man är villig att ta.
Vill man ”strypa” åtkomst via portar, eller öppna möjligheter för tjänster, så kan man hantera detta via brandväggsinställningar. Det finns flera olika sätt att hantera dessa, men i många fall så är det ”iptables” som finns i bakgrunden.
sudo iptables -L
Kommandot ovan visar en lista med de ”regler” som för närvarande gäller och denna lista behöver man gå igenom för att bedöma vad som är rimligt att hålla öppet.
Jag har läst lite om iptables på https://www.howtogeek.com/177621/the-beginners-guide-to-iptables-the-linux-firewall/ och där står det om hur man exempelvis kan ”stänga” portar.
Program och tjänster
Även om en port är öppen så behövs det något som tar hand om trafiken på insidan, eller om man vänder på det, program och servrar på datorn kan öppna sårbarheter i brandväggen vid installation. Därför bör man titta på vilka program och tjänster som är installerade på datorn och avinstallera sådant som inte behövs.
sudo dpkg --list
Kommandot ger en lång lista med installerade program där man framför allt kan ”söka” efter eventuella ”riskprogram”. Kanske en tjänst från listan av netstat kommandot som man vill avinstallera…
Om man sedan skall köra servertjänster på ett nätverk så är det klokt att separera alla tjänster på olika fysiska eller virtuella maskiner. Det är lättare att säkra upp en server om det bara finns en tjänst på varje maskin och konsekvenserna om ett intrång på en maskin inträffar kan förhoppningsvis begränsas till den maskinen.
Man bör även se till att de tjänster man använder och operativsystemet är uppdaterat!
Det är oroväckande många system som lämnas åt sitt öde efter installation. Det finns en risk att man hänger ett system vid uppgraderingar, men denna risk minimeras också av att separera tjänster till olika maskiner.
Kryptera
Är det över huvud taget möjligt så bör trafik på nätverket krypteras! All trafik på framför allt Internet är helt öppen för avlyssning. Om man bara kan så skall man därför använda krypterad kommunikation och ”säkra” protokoll.
Finns det någon anledning att använda http i stället för https? SSH, VPN, SSL med flera begrepp bör prioriteras, och FTP, Telnet och liknande tjänster helt undvikas. Du kan till och med se till att avinstallera klienter och servrar som använder dessa om de inte absolut nödvändigtvis behövs.
För kryptering så brukar man också prata om RSA, vilket är en etablerad krypteringsteknik, men där nyckeln bör vara minst 4096 bitar lång för att anses som ”säker”. Ett alternativ till RSA är ECC som generellt behöver en kortare nyckel för att anses som ”säker”. Detta kan vara bra att känna till om man exempelvis väljer aktiva kort som bärare för nycklar. Det finns nämligen inte så många kort som kan lagra så långa nycklar som 4096 bitar…
Man behöver även någon form av tjänst som hanterar dessa nycklar, men lite mera om detta längre ner.
Användarkonton
Det finns som vanligt en massa möjligheter att reglera hur användarkonton skall hanteras. Krav på lösenords komplexitet, hur länge de får användas och om konton skall låsas efter ett antal misslyckade inloggningsförsök.
Man skall även undvika att använda root som inloggning (använd sudo). Detaljer om ett root konto bör hanteras med hög sekretess. Rättigheter bör i stället hanteras på kontonivå.
Vill man ytterligare säkra upp autentisering av användare så kan Kerberos vara ett alternativ, där en tjänst används med ”nycklar” på klienten och servern, för att bekräfta att användaren är den han/hon utger sig för att vara.
Läs- och skrivrättigheter bör också regleras och begränsas för alla resurser på datorer och nätverk. En risk kan vara konfigurationsfiler som är ”globalt skrivbara”. Man kan kontrollera om man har sådana filer med kommandot:
sudo find /dir -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print
Ersätt ”/dir” med den sökväg du vill kontrollera, eller använd ”/” för att kontrollera hela systemet.
Fysisk säkerhet
När man sedan säkrat upp systemet med konton och brandväggar så får man inte glömma att se över tillgängligheten på datorerna som finns på ”insidan” av brandväggen.
Kan vem som helst promenera in och stoppa in en USB-enhet i en inloggad dator så har man effektivt oskadliggjort alla säkerhetsåtgärder (http://usbrubberducky.com/).
Exponerade datorer kanske inte skall ha USB portar, alls. Ett annat sätt är att begränsa vilka typer av USB-enheter som får anslutas. Tangentbord och mus brukar man vilja ansluta och det är denna typ av enheter som exempelvis ”rubber-ducky” simulerar. Det finns däremot andra sätt att skydda sig mot denna typ av attacker. Det är exempelvis inte troligt att en människa skriver med långt över hundra tangentbordstryckningar i sekunden…
Loggar
Bläää… Nej, det finns roligare saker att göra än att analysera loggar och leta efter eventuella risker och problem. Det är däremot nödvändigt för att i bästa fall identifiera sådant man måste åtgärda innan det blir ett problem, eller åtminstone försöka reda ut vad det är som hänt om man utsatts för intrång.
Vad som skall loggas får man fundera över och i princip allt kan loggas. Detta kan göras till den grad att man genererar otroliga mängder data enbart i loggar, men detta gör det inte enklare eller ”roligare” att analysera dessa.
Man kan även använda sig av system som ”detekterar” olika typer av intrångsförsök (NIDS och HIDS).
Riskanalys
”Bra artikel, men vi behöver nog inte alla dessa säkerhetsåtgärder”
Så kan det mycket väl vara, men då skall du åtminstone göra en riskanalys. Vad är det för data/information du har i systemen? Oavsett om det är familjens digitala foton på hårddisken på hemmadatorn, eller ett gigantiskt kundregister, så får det någon form av konsekvenser om informationen kommer ut eller försvinner.
Ett sätt att hantera risker är därför att göra en lista med vilka tänkbara konsekvenser en sådan händelse får. Förlust av data kan begränsas med regelbunden backup, men om information röjs kan det få långtgående konsekvenser.
När risker och konsekvenser har beskrivits så kan man besluta om lämpliga ”riskminimeringsåtgärder”.
Helt säker blir man aldrig, och det är trots allt riskhantering och inte riskeliminering det är frågan om. Skall man eliminera risker så skall man inte använda datorer över huvud taget.
Skulle nog inte rekommendera till någon att använda sig av iptables(8) för att ställa in brandväggar. För de flesta fungerar nog ufw(8) mycket bättre.
Enklare att hantera, helt enkelt. Men den är fortfarande baserad på iptables(8), än så länge.
Det är ett nytt ramverk för Linux på gång.