2.4. RPC og portmap

Ud over services, som konfigureres via /etc/xinetd.d, er der en klasse af services, som anvender RPC - Remote Procedure call. Vi vil se lidt på RPC og de mest kendte RPC-baserede services.

RPC går ud på, at man har et netværk af computere og kan få dem til at arbejde sammen som et system. Altså en slags "distributed computing". Man kan driste sig til at kalde det en tidlig forgænger for CORBA. Det overordnede princip er, at man kalder en funktion, som enten udføres af den lokale maskine eller en anden maskine i netværket.

I praksis betyder det, at der kan køre en række RPC services på din maskine. I stedet for at RPC services kører på et bestemt portnummer, får de tildelt et portnummer ved opstart. De registrerer sig hos portmapper daemonen, når de bliver startet. Portmapper daemon'en holder styr på hvilken RPC services der kører på hvilket portnummer, og videresender forespørgsler fra klienter til den rette service. RPC services behøver altså ikke køre på et bestemt portnummer, som klienten kender i forvejen. Klienten henvender sig til portmap på serveren og bliver "stillet igennem" til den rigtige service.

Dette er meget smart, men det komplicerer opsætningen af firewalls, da man ikke på forhånd ved, hvilken port den RPC service vil benytte. Prøv at skrive

[robin@sherwood robin]$ /usr/sbin/rpcinfo -p localhost
   program vers proto   port
    100000    2   tcp    111  rpcbind
    100000    2   udp    111  rpcbind
    100005    1   udp    635  mountd
    100005    2   udp    635  mountd
    100005    1   tcp    635  mountd
    100005    2   tcp    635  mountd
    100003    2   udp   2049  nfs
    100003    2   tcp   2049  nfs

(Dette er fra et Red Hat system. På Debian står der portmapper i stedet for rpcbind). Man kan se at NFS og mountd (NFS mount) kører, men ikke NIS.

Portmapperen kører normalt på port 111. Hvis man ikke har brug for, at nogle RPC services er tilgængelige udefra, kan man i sin firewall blokere port 111. Hvis ikke du ved, om du bruger RPC, så gør du det ikke. Fjern det, og stop portmapper servicen.

Det er i øvrigt ikke nok at stoppe portmapperen. Der findes værktøjer til at sniffe på alle åbne porte og dermed afsløre kendte RPC-services uden at spørge portmapperen.

Udefra kan man spørge maskinen hvilke netværksprocesser, som tilbydes. Et program, som er velegnet til dette, er "nmap", som kan hentes fra http://www.insecure.org/nmap. Prøv at køre nmap på din egen maskine:

[robin@sherwood robin]$ nmap localhost
Starting nmap V. 2.2-BETA4 by Fyodor (fyodor@dhp.com, www.insecure.org/nmap/)
Interesting ports on localhost (127.0.0.1):
Port    State       Protocol  Service
25      open        tcp       smtp
37      open        tcp       time
53      open        tcp       domain
70      open        tcp       gopher
80      open        tcp       http
98      open        tcp       linuxconf
111     open        tcp       sunrpc
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
113     open        tcp       auth
139     open        tcp       netbios-ssn
143     open        tcp       imap2
513     open        tcp       login
514     open        tcp       shell
515     open        tcp       printer
635     open        tcp       unknown
2049    open        tcp       nfs
6000    open        tcp       X11

Nmap run completed -- 1 IP address (1 host up) scanned in 0 seconds

Man kan således udefra se, at sherwood har sunrpc til at lytte på port 111 - sunrpc er det samme som portmapperen. Processen - det kørende program - hedder portmap, men servicen hedder sunrpc. Bliv ikke forvirret, kært barn har mange navne. Kør ps -aux |grep portmap på dit system, og du kan indefra se, at portmapper daemonen kører.

Portmapper daemonen er et program, der hedder portmap (på nogle systemer hedder det rpcbind). Den bliver startet op i dine startup scripts (Red Hat: /etc/rc.d/init.d/portmap, Debian: /etc/init.d/netbase).

RPC er rent sikkerhedsmæssigt noget skidt. RPC er, som alt muligt andet fra dengang, designet med henblik på funktionalitet og stabilitet fremfor sikkerhed. RPC blev i sin tid lavet af Sun, men det blev hurtigt efterlignet af andre og vandt stor udbredelse. Problemet med RPC er, at metoden til autentifikation er baseret alene på brugerens UID og GID (User/Gruppe ID). RPC serveren tror på, at man er den, man giver sig ud for at være - uden yderligere validering af identitet. Udgiver man sig for at være en bruger med adgang, så bliver man lukket ind.

Sun kom senere med en mere sikker version, secure RPC, som bruger en kryptering baseret på DES. Secure RPC vandt aldrig den samme udbredelse, fordi den ikke blev efterlignet af andre (noget med at den anvendte krypteringsmetode var patenteret, og man skulle købe en licens for at bruge den).

Det er en dårlig idé at slå portmapper daemonen fra, før du har undersøgt hvilke programmer, der bruger den. NFS kører f.eks. via RPC, hvilket vi allerede så, da vi kørte rpcinfo programmet. Vi så faktisk alle de services, der har registreret sig hos portmapperen. Portmap er selv en af dem (kan hedde rpcbind). Alt efter hvor mange services, du har startet op, så kan du se, at services som nfs, mountd, nis, automounteren amd m.fl.kører på dit system via RPC.

Du er nødt til at tage stilling til, om du har brug for disse services, hvis ikke skal de slås fra. Hvis rpcinfo -p localhost kun viser portmapperen selv, evt fordi du har slået de andre services fra, så kan du godt slå portmap fra også. Men bemærk, at den skal slås til igen, hvis du vil anvende en af de services, der benytter RPC.

2.4.1. NIS og NIS+

NIS (Network Information Service) er en måde, hvorpå man kan nøjes med at have sin /etc/passwd fil og andre opsætningsfiler (typisk en del filer fra /etc/) på én server. Klienterne får de nødvendige oplysninger af serveren via NIS. NIS er baseret på RPC. Med NIS slipper man for at vedligeholde sine opsætningsfiler på en masse maskiner. Det gør det lettere at holde styr på sine brugere, grupper og hvem, der har lov til hvad. NIS er mere komplekst end UNIX bruger og gruppe rettighedssystemet og gearet til at holde styr på et stort netværk, hvor en bruger ikke må det samme på alle maskiner. NIS+ er en mere sikker version med lettere administration af store systemer (lettere opdatering af serveren etc).

Klient daemonen til NIS hedder ypbind, server daemonen ypserv og kommandoerne starter med yp (et levn fra dengang NIS hed yellow pages). Se i øvrigt http://www.sunsite.auc.dk/ldp/HOWTO/NIS-HOWTO-6.html.

2.4.2. NFS

NFS (Network File System) er et netværksfilsystem, som muliggør af flere maskiner kan dele den samme disk via netværket. Med NFS kan man eksportere hele eller dele af sit lokale filsystem, så en bruger kan mounte det fra andre maskiner over nettet. Det er dumt og unødvendigt at eksportere hele sin systemdisk - man bør nøjes med at eksportere de dele af filsystemet, der er behov for NFS-adgang til. NFS kører normalt på port 2049.

NFS er en RPC baseret service og er afhængig af at portmapperen kører. NFS startes af et startupscript (Red Hat: /etc/rc.d/init.d/nfs, Debian: /etc/init.d/nfs-server. Daemonerne hedder rpc.mountd og rpc.nfsd. mountd daemonen tager sig af selve mount processen, imens NFS daemonen tager sig af at åbne, lukke, læse og skrive filer etc.

Filsystemer, der skal være tilgængelige via NFS, angives i /etc/exports, f.eks.

/home/robin     192.168.0.0/255.255.255.252(rw)  

Denne linje eksporterer kataloget /home/robin/ med adgang for maskinerne 192.168.0.1, 192.168.0.2 og 192.168.0.3. Den eneste option, der er sat i ovenstående linje, er "rw" (read write). Der findes desuden nogle sikkerhedsrelaterede options til /etc/exports, men angiver du ingen, er de sat til det sikreste. Du skal således manuelt slå dem til for at få den mere usikre version. F.eks. "secure" option, som betyder at en forespørgsel skal komme fra en port mindre end 1024. Den er default slået til - vil man slå den fra, må man specificere "insecure". Beskrivelse af yderligere options findes i man exports.

Lad ikke dette forlede dig til at tro, at NFS er sikkert. Det er grundlæggende usikkert, da det kører via RPC, som du ikke kan betragte som sikker. Selve datatrafikken er heller ikke krypteret. Begræns din filsystemexport til det, du rent faktisk har brug for, og mount kun de drev du har brug for. Lad være med at mounte alle eksporterede drev på alle klientmaskiner, hvis der ikke er behov for det. Dette er i øvrigt klogt af hensyn til den almindelige driftstabilitet, idet du kun bliver afhængig af de maskiner, du skal bruge.

Hvis du ikke bruger NFS, så slå den fra. I Red Hat, Debian eller SuSE gøres det ved at fjerne symlinkene til startup scriptet i de forskellige runlevel kataloger /etc/rc.d/rcN.d eller /etc/rcN.d, hvor N er runlevel (0-6). I nogle distributioner er det i stedet nødvendigt at fjerne de linjer, der har med NFS opstart at gøre, i et større script, der køres, når maskinen startes, og som starter mange andre ting end NFS. Kører du Red hat, så kig på programmet chkconfig, som er et nemt og overskueligt værktøj til at styre, hvad der startes ved de forskellige runlevels.