Sådan sikres din Linux-webserver

At bygge en LAMP-server og få det hele konfigureret med pålidelig datahåndtering, et domæne og et TLS-certifikat er kun halvdelen af ​​kampen. Du skal også sørge for, at din infrastruktur er beskyttet mod Internets mange skræmmende trusler.

I denne artikel - som blev uddraget fra kapitel 9 i min Manning-bog, Linux in Action - vil jeg undersøge websidesikkerhed gennem korrekt brug af systemgrupper, procesisolering og regelmæssige revisioner af dine systemressourcer. Det er ikke hele historien (min Linux in Action-bog dækker yderligere værktøjer som installation af TLS-certifikater og arbejde med SELinux), men det er en god start.

Systemgrupper og princippet om mindst privilegium

De udviklere, du støtter, er (endelig) klar over, at de har brug for at begrænse offentlig adgang til data- og konfigurationsfilerne, der lever på applikationsserveren, mens de stadig giver adgang til forskellige dev- og IT-teams.

Den første del af løsningen er grupper . En gruppe er et systemobjekt - stort set det samme som en bruger - bortset fra at ingen nogensinde vil logge ind på systemet som en gruppe. Gruppernes magt er, hvordan de, ligesom brugere, kan "tildeles" til filer eller kataloger, så alle gruppemedlemmer kan dele gruppens beføjelser. Dette er illustreret i figuren.

Prøv dette selv: Brug en teksteditor til at oprette en ny fil. Tilføj noget "Hello world" -tekst, så du nemt kan fortælle, hvornår du med succes kan få adgang til den. Rediger nu dets tilladelser ved hjælp af chmod 770, så filens ejer og gruppe har fulde rettigheder over filen, men andre kan ikke engang læse den.

nano datafile.txt chmod 770 datafile.txt

Hvis dit system ikke allerede har en ekstra bruger ud over din konto, skal du oprette en ved hjælp af enten adduser - Debian / Ubuntu-måde - eller brugeradd, hvis du er på CentOS. useradd vil også arbejde på Ubuntu.

Kommandoen useradd (i modsætning til Debian-adduser) kræver, at du gør det

generere en brugeradgangskode separat:

# useradd otheruser # passwd otheruser Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully

Brug su til at skifte til din nye bruger. Når du har indtastet brugerens adgangskode, køres alle de kommandoer, du udfører, som den bruger. Du arbejder kun med brugerens autoritet: ikke mere og ikke mindre. Hvis du prøver at læse filen datafile.txt (ved hjælp af kat), har du ikke held, da andre, som du husker, blev nægtet læsetilladelse. Når du er færdig, skal du skrive exit for at forlade den nye brugerskal og vende tilbage til din oprindelige skal.

$ su otheruser Password: $ cat /home/ubuntu/datafile.txt cat: /home/ubuntu/datafile.txt: Permission denied $ exit

Alt dette forventes og let at forstå. Og som du har set, kan det undertiden være et problem at ikke kunne læse filen, der tilhører en anden læser. Lad os se, hvad vi kan gøre ved det ved at knytte filen til en gruppe og derefter konfigurere filens tilladelser korrekt.

Opret en ny gruppe, som du kan bruge til at administrere dine applikationsdata og derefter redigere egenskaberne for din datafil ved hjælp af chown. Argumentet ubuntu: app-data-group efterlader filejerskabet i hænderne på ubuntu-brugeren, men ændrer sin gruppe til din nye app-data-gruppe.

groupadd app-data-group chown ubuntu:app-data-group datafile.txt

Kør ls med "lang" output mod filen for at se dens nye tilladelser og status. Bemærk, at ubuntu som forventet er filens ejer, og app-datagruppen er dens gruppe.

$ ls -l | grep datafile.txt -rwxrwx — — 1 ubuntu app-data-group 6 Aug 9 22:43 datafile.txt

Du kan bruge usermod til at tilføje din bruger til app-datagruppegruppen og derefter igen su for at skifte til en shell, der implementerer den anden brugers konto. Denne gang, selvom filens tilladelser låser andre ud - og du helt sikkert fungerer som en "anden" bruger lige nu - skulle du være i stand til at læse den takket være dit gruppemedlemskab.

# usermod -aG app-data-group otheruser $ su otheruser $ cat datafile.txt Hello World

Brug su til at skifte mellem brugerkonti. Disse var tilfældigvis indholdet af min datafile.txt-fil. Denne form for organisation er den korrekte og effektive måde at håndtere mange af de komplicerede tilladelsesproblemer, der vil opstå på et flerbruger-system.

Faktisk bruges det ikke kun til at give individuelle brugere den adgang, de har brug for, men mange systemprocesser kunne ikke udføre deres job uden specielt gruppemedlemskab. Se hurtigt igennem / etc / gruppefilen og bemærk, hvor mange systemprocesser der har deres egne grupper.

En delvis oversigt over indholdet af / etc / gruppefilen:

$ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: […]

Isolering af processer i containere

Bekymret for at de flere tjenester, du har kørt på en enkelt server, vil, hvis en tjeneste overtrædes, alle være i fare? En måde at begrænse den skade, som uforsigtig eller ondsindet bruger kan forårsage, er ved at isolere systemressourcer og processer. På denne måde, selvom nogen måske vil udvide deres rækkevidde ud over en fastsat grænse, har de ikke fysisk adgang.

Den gamle tilgang til problemet var tilvejebringelse af en separat fysisk maskine til hver tjeneste. Men virtualisering kan gøre det meget lettere - og mere overkommeligt - at opbygge en "siled" infrastruktur.

Denne arkitektur kaldes ofte mikrotjenester og vil have dig til at starte flere containere med en, måske kun kører en database, en anden Apache og en tredje, der indeholder mediefiler, der muligvis er indlejret i dine websider. Udover de mange ydelses- og effektivitetsfordele forbundet med mikroservicearkitekturer, kan dette i høj grad reducere hver enkelt komponents risikoeksponering.

Med "containere" mener jeg ikke nødvendigvis dem, der er med LXC-overtalelse.

I disse dage er Docker-containere langt mere for denne type implementering

populær. Hvis du er interesseret i at lære mere om Docker, så tjek mine Pluralsight-kurser, der berører emnet.

Scanning efter farlige bruger-id-værdier

Mens enhver administratorbruger midlertidigt kan påtage sig root-autoritet ved hjælp af sudo, er kun root faktisk root. Som du allerede har set, er det ikke sikkert at udføre regelmæssige funktioner som root. Men det kan ske - hvad enten det er ved uskyldig ulykke eller ondsindet manipulation - at en almindelig bruger effektivt kan få administratorrettigheder på fuld tid.

Den gode nyhed er, at det er let at få øje på bedragere: deres bruger- og / eller gruppe-ID-numre vil ligesom rod være nul (0). Se på passwd-filen i / etc /. Denne fil indeholder en registrering for hver almindelig og systembrugerkonto, der aktuelt findes. Det første felt indeholder kontonavnet (root og ubuntu i dette tilfælde), og det andet felt kan indeholde en x i stedet for en adgangskode (som, hvis den findes, vises krypteret i / etc / shadow-filen). Men de næste to felter indeholder bruger- og gruppe-id'erne. I tilfælde af ubuntu i dette eksempel er begge ID'er 1000. Og som du kan se, har root nuller.

$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash […] ubuntu:x:1000:1000::/home/ubuntu:/bin/bash

Hvis du dog nogensinde ser en almindelig bruger med et bruger- eller gruppe-id på 0, ved du dog, at der er noget grimt i gang, og du skal komme i gang med at ordne det. Den hurtige og nemme måde at få øje på et problem er at køre denne awk-kommando. mod passwd-filen, som vil udskrive enhver linje, hvis tredje felt kun indeholder en 0. I dette tilfælde var det eneste resultat til min store lettelse root. Du kan køre det en anden gang og erstatte $ 3 med $ 3 for at hente gruppe-ID-feltet.

$ awk -F: ‘($3 == “0”) {print}’ /etc/passwd root:x:0:0:root:/root:/bin/bash

Revision af systemressourcer

Jo flere ting du har kørt, jo større er sandsynligheden for, at noget går i stykker. Så det giver mening, at du vil holde styr på, hvad der kører. Dette gælder for netværksporte (hvis de er "åbne", så skal der pr. Definition være en vej ind), tjenester (hvis de er aktive, kan folk køre dem) og installeret software (hvis den er installeret, det kan udføres).

For at revisioner skal være nyttige, skal du huske at køre dem en gang imellem. Da du bare ved, at du kommer til at glemme, vil det være meget bedre for dig at integrere dine revisionsværktøjer i et script, der ikke kun udføres regelmæssigt, men ideelt set også analyserer resultaterne for at gøre dem mere læsbare.

Her vil jeg dog fokusere på at introducere dig til tre vigtige revisionsværktøjer, der hjælper dig med at scanne efter åbne porte, aktive tjenester og unødvendige softwarepakker. At få det automatiseret vil være dit job.

Scanning efter åbne porte

En port betragtes som "åben", hvis der kører en eller anden proces på værten, der lytter på den port for anmodninger. Hvis du holder øje med dine åbne porte, kan du holde dig tilsluttet, hvad der virkelig foregår med din server.

Du ved allerede, at en almindelig webserver sandsynligvis vil have HTTP (80) og SSH (22) åbne, så det bør ikke komme som en overraskelse at komme på tværs af dem. Men du vil virkelig fokusere på andre uventede resultater. netstat viser åbne porte sammen med et væld af oplysninger om, hvordan de bruges.

I dette eksempel køres mod en ret typisk multifunktionel server, -n fortæller netstat at inkludere de numeriske porte og adresser. -l inkluderer kun lyttestik, og -p tilføjer proces-id'et for lytteprogrammet. Hvis du ser noget, skal du naturligvis gøre noget.

# netstat -npl Active Internet connections (only servers) Proto Local Address Foreign Address State PID/Program name tcp 127.0.0.1:3306 0.0.0.0:* LISTEN 403/mysqld tcp 0.0.0.0:139 0.0.0.0:* LISTEN 270/smbd tcp 0.0.0.0:22 0.0.0.0:* LISTEN 333/sshd tcp 0.0.0.0:445 0.0.0.0:* LISTEN 270/smbd tcp6 :::80 :::* LISTEN 417/apache2 […]

In recent years, ss has begun to replace netstat for many uses. Just in case you find yourself at a party one day and someone asks you about ss , this example (which lists all established SSH connections) should give you enough information to save you from deep embarrassment:

$ ss -o state established ‘( dport = :ssh or sport = :ssh )’ Netid Recv-Q Send-Q Local Address:Port Peer Address:Port tcp 0 0 10.0.3.1:39874 10.0.3.96:ssh timer:(keepalive,18min,0)

Scanning for active services

Getting a quick snapshot of the systemd-managed services currently enabled on your machine can help you spot activity that doesn’t belong. systemctl can list all existing services, which can then be narrowed down to only those results whose descriptions include enabled. This will return only active services.

# systemctl list-unit-files — type=service — state=enabled [email protected] enabled bind9.service enabled cron.service enabled dbus-org.freedesktop.thermald.service enabled docker.service enabled [email protected] enabled haveged.service enabled mysql.service enabled networking.service enabled resolvconf.service enabled rsyslog.service enabled ssh.service enabled sshd.service enabled syslog.service enabled systemd-timesyncd.service enabled thermald.service enabled unattended-upgrades.service enabled ureadahead.service enabled

If you do find something that shouldn’t be there, you can use systemctl to both stop the service and make sure it doesn’t start up again with the next boot.

systemctl stop haveged systemctl disable haveged

There’s actually nothing dark and sinister about the haveged service I’m

stopping in this example: it’s a very small tool I often install to generate

random background system activity when I’m creating encryption keys.

Searching for installed software

Could someone or something have installed software on your system without you knowing? Well, how would you know if you don’t look? yum list installed or, on Debian/Ubuntu, dpkg — list will give you the whole briefing, while remove should delete any packages that don’t belong.

yum list installed yum remove packageName

Here’s how it goes on Ubuntu:

dpkg --list apt-get remove packageName

It’s also a good idea to be aware of changes to your system configuration files - which is something I cover in chapter 11.

Denne artikel er uddraget af min Manning “Linux in Action” bog . Der er meget sjovere, hvor dette kom fra , inklusive et hybridkursus kaldet Linux in Motion , der består af mere end to timers video og omkring 40% af teksten til Linux in Action. Hvem ved ... Du kan også nyde mine nyligt udgivne Learn Amazon Web Services i en måned med frokost .