Fedora 13 Beperkte services beheren
Scott Radvan
Beperkte services beheren
Fedora 13 Beperkte services beheren Auteur
Scott Radvan
[email protected]
Copyright © 2010 Red Hat, Inc. The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. The original authors of this document, and Red Hat, designate the Fedora Project as the "Attribution Party" for purposes of CC-BY-SA. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version. Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law. Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, MetaMatrix, Fedora, the Infinity Logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries. For guidelines on the permitted uses of the Fedora trademarks, refer to https://fedoraproject.org/wiki/ Legal:Trademark_guidelines. Linux® is the registered trademark of Linus Torvalds in the United States and other countries. Java® is a registered trademark of Oracle and/or its affiliates. XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries. All other trademarks are the property of their respective owners.
De gids voor het beheren van beperkte services is ontworpen om geavanceerde gebruikers en beheerders te helpen met het gebruik en het configureren van SELinux. De gids richt zich op Fedora SELinux en beschrijft de onderdelen van SELinux die betrekking hebben op services die een geavanceerde gebruiker of beheerder misschien moet configureren. De gids bevat ook een aantal voorbeelden uit de praktijk voor configureren van deze services en voorbeelden die laten zien hoe SELinux hun werking aanvult.
Voorbericht v 1. Document conventies ...................................................................................................... v 1.1. Typografische conventies ...................................................................................... v 1.2. Pull-quote conventies ........................................................................................... vi 1.3. Opmerkingen en waarschuwingen ........................................................................ vii 2. We hebben terugkoppeling nodig! .................................................................................. viii 1. Handelsmerk informatie
1
2. Inleiding
3
3. Gerichte tactiek 3.1. Type afdwinging ........................................................................................................... 3.2. Beperkte processen ..................................................................................................... 3.3. Onbeperkte processen .................................................................................................
5 5 5 7
4. De Apache HTTP server 4.1. De Apache HTTP server en SELinux .......................................................................... 4.2. Types ......................................................................................................................... 4.3. Booleans .................................................................................................................... 4.4. Configuratie voorbeelden ............................................................................................ 4.4.1. Een statische site draaien ................................................................................ 4.4.2. NFS en CIFS bestandssystemen delen ............................................................. 4.4.3. Bestanden delen tussen services ..................................................................... 4.4.4. Poort nummers veranderen ..............................................................................
13 13 16 18 21 21 22 23 26
5. Samba 5.1. Samba en SELinux .................................................................................................... 5.2. Types ......................................................................................................................... 5.3. Booleans .................................................................................................................... 5.4. Configuratie voorbeelden ............................................................................................ 5.4.1. Aangemaakte mappen delen ............................................................................ 5.4.2. Een website delen ...........................................................................................
29 29 30 30 31 31 33
6. File Transfer Protocol 6.1. FTP en SELinux ......................................................................................................... 6.2. Types ......................................................................................................................... 6.3. Booleans .................................................................................................................... 6.4. Configuratie voorbeelden ............................................................................................ 6.4.1. Uploaden naar een FTP site ............................................................................
37 37 39 39 40 40
7. Network File System 7.1. NFS en SELinux ........................................................................................................ 7.2. Types ......................................................................................................................... 7.3. Booleans .................................................................................................................... 7.4. Configuratie voorbeelden ............................................................................................ 7.4.1. Mappen delen met NFS ...................................................................................
45 45 45 45 46 46
8. Berkeley Internet Naam Domein 8.1. BIND en SELinux ....................................................................................................... 8.2. Types ......................................................................................................................... 8.3. Booleans .................................................................................................................... 8.4. Configuratie voorbeelden ............................................................................................ 8.4.1. Dynamische DNS ............................................................................................
51 51 51 52 52 52
9. Concurrent Versioning System
53
iii
Beperkte services beheren
9.1. 9.2. 9.3. 9.4.
CVS en SELinux ........................................................................................................ Types ......................................................................................................................... Booleans .................................................................................................................... Configuratie voorbeelden ............................................................................................ 9.4.1. CVS instellen .................................................................................................. 9.4.2. Server instelling ...............................................................................................
53 53 53 53 53 54
10. Squid Caching Proxy 10.1. Squid Caching Proxy en SELinux .............................................................................. 10.2. Types ....................................................................................................................... 10.3. Booleans .................................................................................................................. 10.4. Configuratie voorbeelden .......................................................................................... 10.4.1. Squid laten verbinden met niet-standaard poorten ............................................
57 57 59 60 60 60
11. MySQL 11.1. MySQL en SELinux .................................................................................................. 11.2. Types ....................................................................................................................... 11.3. Booleans .................................................................................................................. 11.4. Configuratie voorbeelden ........................................................................................... 11.4.1. Veranderen van de MySQL database locatie ...................................................
63 63 64 65 65 65
12. PostgreSQL 12.1. PostgreSQL en SELinux ........................................................................................... 12.2. Types ....................................................................................................................... 12.3. Booleans .................................................................................................................. 12.4. Configuratie voorbeelden .......................................................................................... 12.4.1. Veranderen van de PostgreSQL database locatie ............................................
69 69 70 71 71 71
13. rsync 13.1. 13.2. 13.3. 13.4.
rsync en SELinux ..................................................................................................... Types ....................................................................................................................... Booleans .................................................................................................................. Configuratie voorbeelden .......................................................................................... 13.4.1. Rsync als een daemon ..................................................................................
75 75 75 76 76 76
14. Postfix 14.1. Postfix en SELinux ................................................................................................... 14.2. Types ....................................................................................................................... 14.3. Booleans .................................................................................................................. 14.4. Configuratie voorbeelden .......................................................................................... 14.4.1. SpamAssassin en Postfix ...............................................................................
81 81 82 82 82 82
15. Referenties
85
iv
Voorbericht 1. Document conventies Dit handboek hanteert verscheidene conventies om bepaalde woorden of zinsdelen te benadrukken en aandacht te vestigen op specifieke delen van informatie. 1
In PDF en papieren edities gebruikt dit handboek Liberation Fonts set lettertypen. Het Liberation lettertype wordt ook gebruikt in HTML-edities indien dit lettertype op jouw computer geïnstalleerd is. Indien dat niet het geval is, worden alternatieve, gelijkwaardige lettertypen gebruikt. Opmerking: bij Red Hat Enterprise Linux 5 en later wordt de Liberation Font set standaard ingesteld.
1.1. Typografische conventies Vier typografische conventies worden gebruikt om aandacht te vestigen op specifieke woorden en zinsdelen. Deze conventies, en de omstandigheden waaronder zij gebruikt worden, luiden als volgt: Mono-spaced Bold Wordt gebruikt om systeem input, waaronder shell commando's, bestandsnamen en paden aan te geven. Wordt ook gebruikt bij toetsaanduiding of toetsencombinaties. Bijvoorbeeld: Om de inhoud van het bestand mijn_onwijsgoed_verkopende_boek in jouw huidige map te bekijken, voer je het commando cat mijn_onwijsgoed_verkopende_boek in bij de shell-prompt en druk je op Enter om het commando uit te voeren. Bovenstaande bevat een bestandsnaam, een shell-commando en een toetsaanduiding, alle getoond in mono-spaced bold en alle te onderscheiden dankzij hun context. Toetsencombinaties kunnen worden onderscheiden van toetsaanduidingen door het plusteken dat elk deel van een toetsencombinatie aan elkaar verbind. Bijvoorbeeld: Druk op Enter om het commando te laten uitvoeren. Druk op Ctrl+Alt+F1 om naar de eerste virtuele terminal over te schakelen. Druk op Ctrl+Alt+F7 om terug te keren naar jouw X-Windows sessie. De eerste paragraaf benadrukt de bepaalde toets die moet worden ingedrukt. De tweede benadrukt twee toetscombinaties (ieder een reeks van drie toetsen, waarbij de toetsen van elke reeks tegelijk moeten worden ingedrukt). Indien broncode wordt besproken, worden klasse namen, methodes, functies, variabele namen en resultaten die in een paragraaf worden genoemd, weergegeven als hier boven afgedrukt, namelijk in mono-spaced bold. Bijvoorbeeld: Onder bestandsgerelateerde klassen vallen filesystem voor bestandssystemen, file voor bestanden, en dir voor mappen. Elke klasse heeft haar eigen set van rechten. Proportional Bold 1
https://fedorahosted.org/liberation-fonts/
v
Voorbericht
Wordt gebruikt om woorden of zinsdelen op een systeem aan te duiden, waaronder toepassings namen, dialoogtekst-boxen, gelabelde knoppen, checkbox en radio-knop labels, menu titels en submenu titels. Bijvoorbeeld: Kies Systeem → Voorkeuren → Muis in de hoofdmenu balk om Muisvoorkeuren te openen. In de Knoppen tab, klik je de Linkshandige muis checkbox aan en klik je Sluiten om de primaire muisknop van links naar rechts te wisselen (waardoor de muis beter geschikt is geworden voor linkshandig gebruik). Om een speciaal teken in een gedit bestand op te nemen, kies je Toepassingen → Hulpmiddelen → Tekens en symbolen in de hoofd menubalk. Vervolgens kies je Zoeken → Zoeken… in de Tekens en symbolen menubalk, typ je de naam van het teken in het Zoek veld en klik je Volgende. Het teken dat je zoekt zal worden gemarkeerd in de Tekentabel. Dubbel-klik op dit teken om het in het Te kopiëren tekst veld op te nemen en klik dan de Kopiëren knop. Keer nu terug naar jouw document en kies Bewerken → Plakken in de gedit menubalk. De bovenstaande tekst bevat toepassingsnamen, systeem-brede menu namen en onderdelen, toepassings specifieke menu namen, en knoppen en tekst van een GUI-interface, alle getoond in proportional bold en alle te onderscheiden dankzij hun context. Mono-spaced Bold Italic of Proportional Bold Italic Voor mono-spaced bold of proportional bold geeft cursief gedrukt altijd vervangbare of wisselende teksten aan. Cursief wijst op niet letterlijke tekst of toont tekst die wisselt naar omstandigheden. Bijvoorbeeld: Om verbinding te maken met een andere computer met behulp van ssh, typ je ssh
[email protected] bij een shell prompt. Als de machine op afstand example.com is en jouw gebruikersnaam op die machine is jan, dan type je ssh
[email protected]. Het mount -o remount bestandssysteem commando koppelt het genoemde bestandssysteem opnieuw aan. Om bijvoorbeeld het /home bestandsysteem opnieuw aan te koppelen, gebruik je het mount -o remount /home commando. Om de versie van een huidig geïnstalleerd pakket te zien, gebruik je het rpm q package commando. Dit zal het volgende resultaat opleveren: packageversion-release . Let op de woorden in bold italics in bovenstaande tekst — username, domain.name, file-system, package, version en release. Elk woord is een plaats reservering, hetzij voor tekst die je invult als je een commando typt, hetzij voor tekst die door het systeem wordt getoond. Buiten het standaard gebruik bij het presenteren van een titel van een werk, wordt cursief ingezet om het eerste gebruik van een nieuwe en belangrijke term te benadrukken. Bijvoorbeeld: Publican is een DocBook publicatie systeem.
1.2. Pull-quote conventies Terminal output en broncode lijsten worden worden visueel gescheiden van de omringende tekst.
vi
Opmerkingen en waarschuwingen
Output gestuurd naar een terminal wordt getoond in mono-spaced roman en als volgt gepresenteerd: books books_tests
Desktop Desktop1
documentation downloads
drafts images
mss notes
photos scripts
stuff svgs
svn
Opsommingen van broncode worden ook getoond in mono-spaced roman maar worden als volgt gepresenteerd en benadrukt: package org.jboss.book.jca.ex1; import javax.naming.InitialContext; public class ExClient { public static void main(String args[]) throws Exception { InitialContext iniCtx = new InitialContext(); Object ref = iniCtx.lookup("EchoBean"); EchoHome home = (EchoHome) ref; Echo echo = home.create(); System.out.println("Created Echo"); System.out.println("Echo.echo('Hello') = " + echo.echo("Hello")); } }
1.3. Opmerkingen en waarschuwingen Tenslotte gebruiken we drie visuele stijlen om aandacht te vestigen op informatie die anders misschien over het hoofd zou worden gezien.
Opmerking Een opmerking is een tip, handigheidje of een alternatieve benadering voor de taak die uitgevoerd moet worden. Het negeren van een opmerking zou geen ernstige gevolgen moeten hebben, maar het leven kan een stuk makkelijker worden als de opmerking gevolgd wordt.
Belangrijk Important boxes detail things that are easily missed: configuration changes that only apply to the current session, or services that need restarting before an update will apply. Ignoring a box labeled 'Important' won't cause data loss but may cause irritation and frustration.
Waarschuwing Een waarschuwing dient niet genegeerd te worden. Waarschuwingen negeren zal ongetwijfeld leiden tot data verlies.
vii
Voorbericht
2. We hebben terugkoppeling nodig! Als je een typografische fout in deze handleiding vindt, of je weet een manier om deze handleiding te verbeteren, zouden wij dat graag van jou horen! Meldt alstublieft fouten in de uitgave Fedora Documentation via Bugzilla: http://bugzilla.redhat.com/bugzilla/. When submitting a bug report, be sure to mention the manual's identifier: selinux-managing-confinedservices-guide Als je suggesties hebt om de documentatie te verbeteren, probeer dan zo duidelijk mogelijk deze suggesties te omschrijven. Als je fouten hebt ontdekt, vermeldt dan alstublieft het sectienummer en wat omringende tekst, zodat we de fout gemakkelijker kunnen vinden.
viii
Handelsmerk informatie Linux® is het geregistreerde handelsmerk van Linus Torvalds in de V.S en andere landen. UNIX is een geregistreerd handelsmerk van The Open Group. Type Enforcement is een handelsmerk van Secure Computing, LLC, een dochtermaatschappij van McAfee, Inc., geregistreerd in de V.S. en in andere landen. McAfee noch Secure Computing, LLC, hebben toegestemd met het gebruik van of referentie naar dit handelsmerk door de schrijver van deze gids. Apache is een handelsmerk van The Apache Software Foundation. MySQL is een geregistreerd handelsmerk van Sun Microsystems in de V.S. en andere landen. Windows is een geregistreerd handelsmerk van Microsoft Corporation in de V.S. en andere landen. Andere genoemde producten kunnen handelsmerken zijn van hun respectievelijke corporaties.
1
2
Inleiding Security-Enhanced Linux (SELinux) refereert naar bestanden, zoals mappen en apparaten, als objecten. Naar processen, zoals een gebruiker die een commando of de Mozilla® Firefox® toepassing uitvoert, wordt gerefereerd als subjecten. De meeste besturingssystemen gebruiken een Discretionary Access Control (DAC) systeem dat controleert hoe subjecten omgaan met objecten, en hoe subjecten omgaan met elkaar. In besturingssystemen die DAC gebruiken, controleren gebruikers de rechten van bestanden (objecten) waarvan ze eigenaar zijn. Bijvoorbeeld, in Linux® besturingssystemen kunnen gebruikers hun persoonlijke map leesbaar voor de wereld maken, wat gebruikers en processen (subjecten) onopzettelijk toegang geeft tot potentieel gevoelige informatie. DAC mechanismes zijn fundamenteel ongeschikt voor een sterke systeem beveiliging. DAC toegang beslissingen worden alleen gebaseerd op gebruiker identificatie en eigendom, en negeren andere informatie die relevant is voor beveiliging zoals de rol van de gebruiker, de functie en betrouwbaarheid van het programma, en de gevoeligheid en integriteit van de data. Elke gebruiker heeft de complete beschikking over zijn bestanden, wat het onmogelijk maakt om een systeem-brede beveiliging tactiek op te leggen. Bovendien erft elk programma dat door een gebruiker gedraaide wordt alle rechten die aan de gebruiker toegekend zijn en is in staat om de toegang tot bestanden van de gebruiker te veranderen, dus er wordt geen bescherming geboden tegen kwaadwillige software. Veel systeem services en gemachtigde programma's moeten draaien met grofkorrelige rechten die hun vereisten ver overschrijden, zodat een fout in een van deze programma's uitgebuit kan worden om complete 1 systeem toegang te verkrijgen. Het volgende is een voorbeeld van rechten gebruikt in Linux besturingssystemen die SecurityEnhanced Linux (SELinux) niet draaien. De rechten in deze voorbeelden kunnen verschillen met die van jouw systeem. Gebruik het ls -l commando om de bestand rechten te bekijken:
$ ls -l bestand1 -rwxrw-r-- 1 gebruiker1 groep1 0 2010-02-28 07:12 bestand1
De eerste drie rechten bits, rwx, controleren de toegang die de Linux gebruiker1 gebruiker (in dit geval de eigenaar) heeft tot bestand1. De volgende drie rechten bits, rw-, controleren de toegang die de Linux groep1 groep heeft naar bestand1. De laatste drie rechten bits, r--, controleren de toegang die alle anderen hebben tot bestand1, wat alle gebruikers en processen omvat. Security-Enhanced Linux (SELinux) voegt Mandatory Access Control (MAC) toe aan de Linux kernel, en wordt in Fedora standaard aangezet. Een MAC architectuur voor algemene doeleinden heeft de mogelijkheid nodig om een door een beheerder ingestelde beveiliging tactiek af te dwingen voor alle processen en bestanden op het systeem, waarbij beslissingen gebaseerd worden op labels die variëteit aan informatie bevatten die relevant is voor de beveiliging. Als het juist geïmplementeerd werd, stelt dit het systeem in staat om zich afdoende te beschermen en biedt kritische ondersteuning voor toepassingen beveiliging tegen het rommelen met, of voorbij gaan aan, beveiligde toepassingen. MAC biedt een sterke scheiding van toepassingen aan, wat de veilige uitvoering van onbetrouwbare toepassingen toestaat. De mogelijkheid van MAC om de rechten te beperken die horen bij draaiende processen beperkt de omvang van de potentiële schade die het resultaat kan zijn van de uitbuiting van kwetsbaarheden in toepassingen en systeem services. MAC maakt het mogelijk dat informatie "Integrating Flexible Support for Security Policies into the Linux Operating System", door Peter Loscocco en Stephen Smalley. Dit artikel werd oorspronkelijk gemaakt voor de National Security Agency en is daarom in het publieke domein. Refereer naar het originele artikel [http://www.nsa.gov/research/_files/selinux/papers/freenix01/index.shtml] voor details en het document as het eerst werd vrijgegeven. Alle bewerkingen en veranderingen werden gemaakt door Murray McAllister.
3
Hoofdstuk 2. Inleiding
beschermd wordt tegen zowel legitieme gebruikers met beperkte rechten als geautoriseerde die 2 onbedoeld kwaadwillige toepassingen uitgevoerd hebben. Het volgende is een voorbeeld van de labels die informatie bevatten die relevant is voor beveiliging zoals die gebruikt worden voor processen, Linux gebruikers, en bestanden, in Linux besturingssystemen die SELinux draaien. Deze informatie wordt de SELinux context genoemd, en kan bekeken worden met het ls -Z commando:
$ ls -Z bestand1 -rwxrw-r-- gebruiker1 groep1 unconfined_u:object_r:user_home_t:s0
bestand1
In dit voorbeeld biedt SELinux een gebruiker (unconfined_u), een rol (object_r), een type (user_home_t), en een niveau (s0) aan.
"Meeting Critical Security Objectives with Security-Enhanced Linux", door Peter Loscocco en Stephen Smalley. Dit artikel werd origineel gemaakt voor de National Security Agency en is daarom in het publieke domein. Refereer naar het originele artikel [http://www.nsa.gov/research/_files/selinux/papers/ottawa01/index.shtml] voor details en het document zoals het eerst werd vrijgegeven. Alle bewerkingen en veranderingen werden gemaakt door Murray McAllister.
4
Gerichte tactiek Gerichte tactiek is de SELinux tactiek die standaard gebruikt wordt in Fedora. Bij gebruik van gerichte tactiek draaien processen de gericht zijn in een beperkt domein en processen die niet gericht zijn in een onbeperkt domein. Bijvoorbeeld, standaard draaien ingelogde gebruikers in het unconfined_t domein, en systeem processen opgestart door init draaien in het initrc_t domein - deze beide domeinen zijn onbeperkt. SELinix wordt gebaseerd op het laagste niveau van toegang vereist om een service te laten draaien. Services kunnen op een aantal manieren draaien; je moet daarom SELinux vertellen hoe je de services draait. Dit kan bereikt worden met Booleans die toestaan dat onderdelen van SELinux tactiek tijdens het draaien veranderd kunnen worden, zonder dat enige kennis nodig is over het schrijven van SELinux tactiek. Dit staat veranderingen toe, zoals services toegang toestaan tot NFS bestandssystemen, zonder het opnieuw inladen of compileren van SELinux tactiek. Boolean configuratie wordt later besproken. Andere veranderingen, zoals het gebruik van niet-standaard mappen om bestanden voor services op te slaan, en het veranderen van services om op niet-standaard poorten te draaien, vereisen dat de tactiek configuratie vernieuwd wordt met gereedschappen zoals semanage. Dit wordt later besproken met gebruik van gedetailleerde configuratie voorbeelden.
3.1. Type afdwinging Type afdwinging is het de hoofd rechten controle gebruikt in SELinux gerichte tactiek. Alle bestanden en processen zijn gelabeld met een type: type definieert een domein voor processen en een type voor bestanden. SELinux tactiek regels definiëren hoe types toegang tot elkaar hebben, of dit nu een domein is die toegang vraagt tot een type, of een domein dat toegang vraagt tot een ander domein. Toegang wordt alleen toegestaan als er een specifieke SELinux tactiek regel bestaat die dit toestaat.
3.2. Beperkte processen Bijna elke service die luistert op een netwerk is in Fedora beperkt. Ook zijn de meeste processen die draaien als de root gebruiker en die taken uitvoeren voor gebruikers, zoals de passwd toepassing, beperkt. Als een proces beperkt is dan draait het in zijn eigen domein, zoals het httpd proces draait in het httpd_t domein. Als een beperkt proces in gevaar gebracht wordt door een aanvaller wordt, afhankelijk van de SELinux tactiek configuratie, de toegang van de aanvaller tot hulpbronnen en en de mogelijke schade die aangebracht kan worden beperkt. Het volgende voorbeeld laat zien hoe SELinux de Apache HTTP server (httpd) belet om bestanden te lezen die niet correct gelabeld zijn, zoals bestanden die bedoeld zijn voor gebruik met Samba. Dit is een voorbeeld, en moet niet in een productie omgeving gebruikt worden. Het neemt aan dat de httpd, wget, setroubleshoot-server, en audit pakketten geïnstalleerd zijn, dat de SELinux gerichte tactiek gebruikt wordt, en dat SELinux draait in de afdwingende mode: 1. Voer het sestatus commando uit om te bevestigen dat SELinux aangezet is, het draait in de afdwingende mode, en dat de gerichte tactiek wordt gebruikt:
$ /usr/sbin/sestatus SELinux status: SELinuxfs mount: Current mode: Mode from config file:
enabled /selinux enforcing enforcing
5
Hoofdstuk 3. Gerichte tactiek
Policy version: Policy from config file:
24 targeted
SELinux status: enabled wordt teruggegeven als SELinux aangezet is. Current mode: enforcing wordt teruggegeven als SELinux draait in de afdwingende mode. Policy from config file: targeted wordt teruggegeven als de SELinux gerichte tactiek gebruikt wordt. 2. Als de root gebruiker voer je het touch /var/www/html/testfile commando uit om een bestand aan te maken. 3. Voer het ls -Z /var/www/html/testfile commando uit om de SELinux context te bekijken: -rw-r--r--
root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
Het testfile bestand is gelabeld met de SELinux unconfined_u gebruiker omdat een Linux gebruiker die is afgebeeld op de unconfined_u SELinux gebruiker het bestand aan heeft gemaakt. Role-Based Access Control (RBAC) wordt gebruikt voor processen, niet voor bestanden. Rollen hebben geen betekenis voor bestanden - de object_r rol is een algemene rol die gebruikt wordt voor bestanden (op permanente opslag en netwerk bestandssystemen). In 1 de /proc/ map kunnen bestanden gerelateerd aan processen de system_r rol gebruiken. Het httpd_sys_content_t type staat het httpd proces toegang tot dit bestand toe. 4. Als de root gebruiker voer je het service httpd start commando uit om het httpd proces te starten. Als httpd met succes opstart is de output als volgt : # /sbin/service httpd start Starting httpd:
[
OK
]
5. Ga naar een map waar jouw Linux gebruiker schrijf toegang tot heeft, en voer het wget http:// localhost/testfile commando uit. Behalve als er veranderingen gemaakt zijn in de standaard configuratie, zal dit commando slagen: --2010-02-28 08:44:36-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 0 [text/plain] Saving to: `testfile' [ <=> ] 0 --.-K/s in 0s \t\t 2010-02-28 08:44:36 (0.00 B/s) - `testfile' saved [0/0]
6. Het chcon commando her-labelt bestanden; zo'n label verandering overleeft niet als het bestandssysteem opnieuw gelabeld wordt. Voor permanente veranderingen die het opnieuw labelen van het bestandssysteem overleven, moet je het semanage commando gebruiken, welke later besproken wordt. Als de root gebruiker voer je het volgende commando uit om het type te veranderen naar een type dat door Samba wordt gebruikt: chcon -t samba_share_t /var/www/html/testfile Voer het ls -Z /var/www/html/testfile commando uit om de veranderingen te bekijken: -rw-r--r--
6
root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile
Onbeperkte processen
7. Merk op dat de huidige DAC rechten het httpd proces toegang geeft tot testfile. Ga naar een map waar jouw Linux gebruiker schrijf rechten heeft, en voer het wget http://localhost/ testfile commando uit. Behalve als er veranderingen zijn in de standaard configuratie, zal dit commando falen: --2010-02-28 08:45:07-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 403 Forbidden 2010-02-28 08:45:08 ERROR 403: Forbidden.
8. Als de root gebruiker voer je het rm -i /var/www/html/testfile commando uit om testfile te verwijderen. 9. Als het niet nodig is dat httpd blijft draaien, voer je als de root gebruiker het service httpd stop commando uit om httpd te stoppen: # /sbin/service httpd stop Stopping httpd:
[
OK
]
Dit voorbeeld laat de extra beveiliging zien toegevoegd door SELinux. DAC regels stonden het httpd proces toegang naar testfile toe in stap 7, maar omdat het bestand gelabeld was met een type waartoe hethttpd proces geen toegang tot heeft, verbiedt SELinux toegang. Na stap 7 wordt een fout die lijkt op de volgende gelogd naar /var/log/messages: Apr 6 23:00:54 localhost setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/testfile (samba_share_t). For complete SELinux messages. run sealert -l c05911d3-e680-4e42-8e36-fe2ab9f8e654
Vorige log bestanden kunnen een /var/log/messages.JJJJMMDD formaat gebruiken. Als je syslog-ng draait, kunnen vorige log bestanden een /var/log/messages.X formaat gebruiken. Als de setroubleshootd en auditd processen draaien, worden fouten vergelijkbaar met het volgende gelogd naar /var/log/audit/audit.log: type=AVC msg=audit(1220706212.937:70): avc: denied { getattr } for pid=1904 comm="httpd" path="/var/www/html/testfile" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13 a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/ usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
Een fout lijkend op het volgende wordt ook gelogd naar /var/log/httpd/error_log: [Sat Apr 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to / testfile denied
3.3. Onbeperkte processen Onbeperkte processen draaien in niet beperkte domeinen. Bijvoorbeeld, init programma's draaien in het onbeperkte initrc_t domein, onbeperkte kernel processen draaien in het kernel_t domein, en onbeperkte Linux gebruikers draaien in het unconfined_t domein. Voor onbeperkte domeinen worden SELinux tactiek regels toegepast, maar er zijn tactiek regels die processen die draaien in
7
Hoofdstuk 3. Gerichte tactiek
onbeperkte domeinen bijna alle toegang toestaan. Processen die draaien in onbeperkte domeinen vallen terug naar het exclusieve gebruik van DAC regels. Als een onbeperkt proces in gevaar wordt gebracht, belet SELinux een aanvaller niet om toegang te krijgen tot systeem hulpbronnen en data, maar DAC regels worden natuurlijk nog steeds gebruikt. SELinux is een beveiliging verbetering bovenop DAC regels - het vervangt deze niet. Het volgende voorbeeld laat zien hoe de Apache HTTP server (httpd) toegang kan krijgen tot data bedoeld voor gebruik met Samba, als het onbeperkt draait. Merk op: in Fedora draait het httpd proces standaard in het httpd_t domein. Dit is een voorbeeld, en moet niet in een productie omgeving gebruikt worden. Het neemt aan dat de httpd, wget, setroubleshoot-server, en audit pakketten geïnstalleerd zijn, dat de SELinux gerichte tactiek gebruikt wordt, en dat SELinux draait in de afdwingende mode: 1. Voer het sestatus commando uit om te bevestigen dat SELinux aangezet is, het draait in de afdwingende mode, en dat de gerichte tactiek wordt gebruikt:
$ /usr/sbin/sestatus SELinux status: SELinuxfs mount: Current mode: Mode from config file: Policy version: Policy from config file:
enabled /selinux enforcing enforcing 24 targeted
SELinux status: enabled wordt teruggegeven als SELinux aangezet is. Current mode: enforcing wordt teruggegeven als SELinux draait in de afdwingende mode. Policy from config file: targeted wordt teruggegeven als de SELinux gerichte tactiek gebruikt wordt. 2. Als de root gebruiker voer je het touch /var/www/html/test2file commando uit om een bestand aan te maken. 3. Voer het ls -Z /var/www/html/test2file commando uit om de SELinux context te bekijken: -rw-r--r--
root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/test2file
test2file is gelabeld met de SELinux unconfined_u gebruiker omdat een Linux gebruiker die is afgebeeld op de unconfined_u SELinux gebruiker het bestand aan heeft gemaakt. RBAC wordt gebruikt voor processen, niet voor bestanden. Rollen hebben geen betekenis voor bestanden - de object_r rol is een algemene rol die gebruikt wordt voor bestanden (op permanente opslag en netwerk bestandssystemen). In de /proc/ map kunnen bestanden 2 gerelateerd aan processen de system_r rol gebruiken. Het httpd_sys_content_t type staat het httpd proces toegang tot dit bestand toe. 4. Het chcon commando her-labelt bestanden; zo'n label verandering overleeft niet als het bestandssysteem opnieuw gelabeld wordt. Voor permanente veranderingen die het opnieuw labelen van het bestandssysteem overleven, moet je het semanage commando gebruiken, welke later besproken wordt. Als de root gebruiker voer je het volgende commando uit om het type te veranderen naar een type dat door Samba wordt gebruikt: chcon -t samba_share_t /var/www/html/test2file Voer het ls -Z /var/www/html/test2file commando uit om de veranderingen te bekijken:
8
Onbeperkte processen
-rw-r--r--
root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/test2file
5. Voer het service httpd status commando uit om te bevestigen dat het httpd proces niet draait: $ /sbin/service httpd status httpd is stopped
Als de output anders is, voer je het service httpd stop commando uit als de root gebruiker om het httpd proces te stoppen: # /sbin/service httpd stop Stopping httpd:
[
OK
]
6. Om het httpd proces onbeperkt te laten draaien, voer je het volgende commando uit als de root gebruiker om het type van /usr/sbin/httpd te veranderen naar een type dat niet niet overgaat naar een beperkt domein: chcon -t unconfined_exec_t /usr/sbin/httpd 7. Voer het ls -Z /usr/sbin/httpd commando uit om te bevestigen dat /usr/sbin/httpd gelabeld is met het unconfined_exec_t type: -rwxr-xr-x
root root system_u:object_r:unconfined_exec_t /usr/sbin/httpd
8. Als de root gebruiker voer je het service httpd start commando uit om het httpd proces te starten. Als httpd met succes opstart is de output als volgt : # /sbin/service httpd start Starting httpd:
[
OK
]
9. Voer het ps -eZ | grep httpd commando uit om het httpd proces het te zien draaien inunconfined_t domein: $ ps -eZ | grep httpd unconfined_u:system_r:unconfined_t unconfined_u:system_r:unconfined_t unconfined_u:system_r:unconfined_t unconfined_u:system_r:unconfined_t unconfined_u:system_r:unconfined_t unconfined_u:system_r:unconfined_t unconfined_u:system_r:unconfined_t unconfined_u:system_r:unconfined_t unconfined_u:system_r:unconfined_t
7721 7723 7724 7725 7726 7727 7728 7729 7730
? ? ? ? ? ? ? ? ?
00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00
httpd httpd httpd httpd httpd httpd httpd httpd httpd
10. Ga naar een map waar jouw Linux gebruiker schrijf toegang tot heeft, en voer het wget http:// localhost/test2file commando uit. Behalve als er veranderingen gemaakt zijn in de standaard configuratie, zal dit commando slagen: --2008-09-07 01:41:10-- http://localhost/test2file Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected.
9
Hoofdstuk 3. Gerichte tactiek
HTTP request sent, awaiting response... 200 OK Length: 0 [text/plain] Saving to: `test2file.1' [ <=> ]--.-K/s in 0s \t 2008-09-07 01:41:10 (0.00 B/s) - `test2file.1' saved [0/0]
Hoewel het httpd proces geen toegang heeft tot bestanden gelabeld met het samba_share_t type, draait httpd in het onbeperkte unconfined_t domein, en valt terug op het gebruik van DAC regels, en daarom slaagt het wget commando. Als httpd in het beperkte httpd_t domein had gedraaid, dan zou het wget commando falen. 11. Het restorecon commando herstelt de standaard SELinux context voor bestanden. Als de root gebruiker voer je het restorecon -v /usr/sbin/httpd commando uit om de standaard SELinux context voor /usr/sbin/httpd te herstellen: # /sbin/restorecon -v /usr/sbin/httpd restorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_notrans_exec_t:s0>system_u:object_r:httpd_exec_t:s0
Voer het ls -Z /usr/sbin/httpd commando uit om te bevestigen dat /usr/sbin/httpd gelabeld is met het httpd_exec_t type: $ ls -Z /usr/sbin/httpd -rwxr-xr-x root root system_u:object_r:httpd_exec_t
/usr/sbin/httpd
12. Als de root gebruiker voer je het /sbin/service httpd restart commando uit om httpd opnieuw op te starten. Na het opstarten, voer je het ps -eZ | grep httpd commando uit om te bevestigen dat httpd draait in het beperkte httpd_t domein: # /sbin/service httpd restart Stopping httpd: Starting httpd: # ps -eZ | grep httpd unconfined_u:system_r:httpd_t unconfined_u:system_r:httpd_t unconfined_u:system_r:httpd_t unconfined_u:system_r:httpd_t unconfined_u:system_r:httpd_t unconfined_u:system_r:httpd_t unconfined_u:system_r:httpd_t unconfined_u:system_r:httpd_t unconfined_u:system_r:httpd_t
[ [ 8880 8882 8883 8884 8885 8886 8887 8888 8889
? ? ? ? ? ? ? ? ?
00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00
OK OK
] ]
httpd httpd httpd httpd httpd httpd httpd httpd httpd
13. Als de root gebruiker voer je het rm -i /var/www/html/test2file commando uit om test2file te verwijderen. 14. Als het niet nodig is dat httpd blijft draaien, voer je als de root gebruiker het service httpd stop commando uit om httpd te stoppen: # /sbin/service httpd stop Stopping httpd:
10
[
OK
]
Onbeperkte processen
De voorbeelden in deze paragraaf laten zien hoe data kan worden beschermd tegen een in gevaar gebracht beperkt proces (beschermd door SELinux), en hoe data toegankelijker wordt voor een aanvaller vanuit een in gevaar gebracht onbeperkt proces (niet beschermd door SELinux).
11
12
De Apache HTTP server 1
Uit de Apache HTTP Server Project pagina: "Het Apache HTTP server project is een poging om een open-bron HTTP server te ontwikkelen en onderhouden voor moderne besturingssystemen inclusief UNIX en Windows NT. Het doel van dit project is het bieden van een veilige, efficiënte en uitbreidbare server die HTTP services biedt in lijn 2 met de huidige HTTP standaarden". In Fedora biedt het httpd pakket de Apache HTTP server. Voer rpm -q httpd uit om te kijken of het httpd pakket geïnstalleerd is. Als het niet geïnstalleerd is en je wilt de Apache HTTP server draaien, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install httpd
4.1. De Apache HTTP server en SELinux Als SELinux aangezet is, draait de Apache HTTP server (httpd) standaard als beperkt. Beperkte processen draaien in hun eigen domein, en worden gescheiden van andere beperkte processen. Als een beperkt proces in gevaar wordt gebracht door een aanvaller, afhankelijk van de SELinux tactiek configuratie, wordt de toegang van een aanvaller tot hulpbronnen en de mogelijke schade die aangericht kan worden beperkt. Het volgende voorbeeld laat zien dat de httpd processen in hun eigen domein draaien. Dit voorbeeld neemt aan dat het httpd pakker geïnstalleerd is: 1. Voer getenforce uit om te bevestigen dat SELinux draait in de afdwingende mode:
$ getenforce Enforcing
Het getenforce commando geeft Enforcing terug als SELinux in de afdwingende mode draait. 2. Voer service httpd start uit als de root gebruiker om httpd op te starten:
# service httpd start Starting httpd:
[
OK
]
3. Voer ps -eZ | grep httpd uit om de httpd processen te bekijken:
$ ps -eZ | grep httpd unconfined_u:system_r:httpd_t:s0 unconfined_u:system_r:httpd_t:s0 unconfined_u:system_r:httpd_t:s0 unconfined_u:system_r:httpd_t:s0 unconfined_u:system_r:httpd_t:s0 unconfined_u:system_r:httpd_t:s0
2850 2852 2853 2854 2855 2856
? ? ? ? ? ?
00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00
httpd httpd httpd httpd httpd httpd
1
http://httpd.apache.org/ Uit de "The Number One HTTP Server On The Internet" paragraaf van de Apache HTTP Server Project pagina: http:// httpd.apache.org/. Copyright © 2010 The Apache Software Foundation. Accessed 1 March 2010.
13
Hoofdstuk 4. De Apache HTTP server
unconfined_u:system_r:httpd_t:s0 2857 ? unconfined_u:system_r:httpd_t:s0 2858 ? unconfined_u:system_r:httpd_t:s0 2859 ?
00:00:00 httpd 00:00:00 httpd 00:00:00 httpd
De SELinux context geassocieerd met het httpd proces is unconfined_u:system_r:httpd_t:s0. Het een na laatste deel van de context, httpd_t, is het type. Een type definieert een domein voor processen en een type voor bestanden. In dit geval draaien de httpd processen in het httpd_t domein. SELinux tactiek definieert hoe processen draaien in beperkte domeinen, zoals httpd_t, hoe ze omgaan met bestanden, andere processen, en het systeem in het algemeen. Bestanden moeten correct gelabeld zijn om httpd toe te staan er toegang tot te hebben. Bijvoorbeeld, httpd kan bestanden lezen gelabeld met het httpd_sys_content_t type, maar kan niet naar deze schrijven, zelfs als Linux rechten schrijf toegang toestaat. Booleans moeten gebruikt worden om bepaald gedrag toe te staan, zoals het toestaan van netwerk toegang voor scripts, wat httpd toegang toestaat tot NFS en CIFS bestandssystemen, en het httpd wordt toegelaten om Common Gateway Interface (CGI) scripts uit te voeren. Als /etc/httpd/conf/httpd.conf geconfigureerd wordt voor httpd om te luisteren op een poort anders dan TCP poorten 80, 443, 488, 8008, 8009, of 8443, moet het semanage port commando gebruikt worden om ee nieuwe poort aan de SELinux tactiek configuratie toe te voegen. Het volgende voorbeeld laat het configureren van httpd zien om te luisteren op een poort die niet gedefinieerd is in SELinux tactiek configuratie voor httpd, en daarom niet op zal starten. Dit voorbeeld laat ook zien hoe het SELinux systeem daarna te configureren om httpd toe te staan om met succes te luisteren op een niet standaard poort die in de tactiek nog niet gedefinieerd is. Dit voorbeeld neemt aan dat het httpd pakket geïnstalleerd is. Voer elk commando in het voorbeeld uit als de root gebruiker: 1. Voer het service httpd status commando uit om te bevestigen dat httpd niet draait:
# service httpd status httpd is stopped
Als de output anders is, voer je service httpd stop uit om het proces te stoppen:
# service httpd stop Stopping httpd:
[
OK
]
2. Voer semanage port -l | grep -w http_port_t uit om de poorten te bekijken waarop SELinux httpd toestaat om te luisteren:
# semanage port -l | grep -w http_port_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443
3. Bewerk /etc/httpd/conf/httpd.conf als de root gebruiker. Configureer de Listen optie zodat het een poort laat zien die niet geconfigureerd is in de SELinux tactiek configuratie voor httpd. In dit voorbeeld wordt httpd geconfigureerd om te luisteren op poort 12345:
# Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses (0.0.0.0) #
14
De Apache HTTP server en SELinux
#Listen 12.34.56.78:80 Listen 127.0.0.1:12345
4. Voer service httpd start uit om httpd te starten:
# service httpd start Starting httpd: (13)Permission denied: make_sock: could not bind to address 127.0.0.1:12345 no listening sockets available, shutting down Unable to open logs\t\t\t\t\t [FAILED]
Een SElinux weigering lijkend op het volgende wordt gelogd in /var/log/messages:
setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For complete SELinux messages. run sealert -l f18bca99-db64-4c16-9719-1db89f0d8c77
5. Om SELinux httpd toe te laten staan om te luisteren op poort 12345, zoals gebruikt in dit voorbeeld, is het volgende commando vereist:
# semanage port -a -t http_port_t -p tcp 12345
6. Voer service httpd start opnieuw uit om httpd te starten en het te laten luisteren op de nieuwe poort:
# service httpd start Starting httpd:\t\t\t\t\t\t
[
OK
]
7. Nu SELinux geconfigureerd is om httpd toe te staan om op een niet standaard poort (TCP 12345 in dit voorbeeld) te luisteren, zal httpd met succes op deze poort starten. 8. Om te bewijzen dat httpd luistert en communiceert op TCP poort 12345, open je een telnet verbinding naar de gespecificeerde poort en geef je een HTTP GET commando als volgt:
# telnet localhost 12345 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET / HTTP/1.0 HTTP/1.1 200 OK Date: Tue, 31 Mar 2009 13:12:10 GMT Server: Apache/2.2.11 (Fedora) Accept-Ranges: bytes Content-Length: 3918 Content-Type: text/html; charset=UTF-8 [...gaat verder...]
15
Hoofdstuk 4. De Apache HTTP server
4.2. Types Type afdwinging is de hoofd rechten controle gebruikt in SELinux gerichte tactiek. Alle bestanden en processen zijn gelabeld met een type: types definiëren een domein voor processen en een type voor bestanden. SELinux tactiek regels definiëren hoe types toegang tot elkaar hebben, of dit nu een domein is dat toegang vraagt tot een type, of een domein dat toegang vraagt tot een ander domein. Toegang wordt alleen toegestaan als er een specifieke SELinux tactiek regel bestaat die dit toestaat. Het volgende voorbeeld maakt een nieuw bestand aan in de /var/www/html/ map, en laat zien dat het bestand hethttpd_sys_content_t type erft van zijn ouder map (/var/www/html/): 1. Voer ls -dZ /var/www/html uit om de SELinux context van /var/www/html/ te bekijken:
$ ls -dZ /var/www/html drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
Dit laat zien dat /var/www/html/ is gelabeld met het httpd_sys_content_t type. 2. Voer touch /var/www/html/file1 uit als de root gebruiker om een nieuw bestand aan te maken. 3. Voer ls -Z /var/www/html/file1 uit om de SELinux context te bekijken:
$ ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
Het ls -Z commando laat zien dat file1 gelabeled is met het httpd_sys_content_t type. SELinux staat httpd toe om bestanden te lezen met dit type, maar niet om er naar te schrijven, zelfs als Linux rechten schrijf toegang toestaan. SELinux tactiek definieert welke types een proces dat draait in het httpd_t domein (waarin httpd draait) kan lezen en naar schrijven. Dit helpt om te voorkomen dat processen toegang krijgen tot bestanden die bedoeld zijn voor gebruik van een ander proces. Bijvoorbeeld, httpd heeft toegang tot bestanden gelabeld met het httpd_sys_content_t type (bedoeld voor de Apache HTTP server), maar standaard heeft het geen toegang tot bestanden gelabeld met het samba_share_t type (bedoeld voor Samba). Bovendien worden bestanden in de persoonlijke mappen van gebruikers gelabeld met het user_home_t type: standaard voorkomt dit dat httpd bestanden in de persoonlijke mappen van gebruikers kan lezen of schrijven. De volgende types worden gebruikt met httpd. Verschillende types staan je toe om toegang flexibel te configureren: httpd_sys_content_t Gebruik dit type voor statische web inhoud, zoals .html bestanden gebruikt bij een statische website. Bestanden gelabeld met type type zijn toegankelijk (alleen lezen) voor httpd en scripts uitgevoerd door httpd. Standaard kan naar bestanden en mappen van dit type niet geschreven of veranderd worden door httpd of andere processen. Merk op: standaard worden bestanden aangemaakt of gekopieerd naar /var/www/html/ gelabeld met het httpd_sys_content_t type.
16
Types
httpd_sys_script_exec_t Gebruik dit type voor scripts die je wilt laten uitvoeren door httpd. Dit type wordt gewoonlijk gebruikt voor Common Gateway Interface (CGI) scripts in /var/www/cgi-bin/. Standaard SELinux tactiek belet httpd om CGI scripts uit te voeren. Om dit toe te staan, label je de scripts met het httpd_sys_script_exec_t type en zet je de httpd_enable_cgi Boolean aan. Scripts gelabeld met httpd_sys_script_exec_t draaien in het httpd_sys_script_t domein als ze uitgevoerd worden door httpd. Het httpd_sys_script_t domein heeft toegang tot andere systeem domeinen, zoals postgresql_t en mysqld_t. httpd_sys_content_rw_t Naar bestanden gelabeld met dit type kan geschreven worden door scripts gelabeld met het httpd_sys_script_exec_t type, maar kunnen niet veranderd worden door scripts gelabeld met een ander type. Je moet het httpd_sys_content_rw_t type gebruiken voor het labelen van bestanden waarnaar gelezen en geschreven gaat worden door scripts gelabeld met het httpd_sys_script_exec_t type. httpd_sys_content_ra_t In bestanden gelabeld met dit type kan iets toegevoegd worden door scripts gelabeld met het httpd_sys_script_exec_t type, maar kunnen niet veranderd worden door scripts gelabeld met een ander type. Je moet het httpd_sys_content_ra_t type gebruiken voor het labelen van bestanden waarnaar gelezen en iets toegevoegd gaat worden door scripts gelabeld met het httpd_sys_script_exec_t type. httpd_unconfined_script_exec_t Scripts gelabeld met dit type draaien zonder SELinux bescherming. Gebruik dit type alleen voor complexe scripts als alle andere opties niet voldoen. Het is beter om dit type te gebruiken in plaats van het uitzetten van SELinux voor httpd, of voor het gehele systeem.
De SELinux context veranderen De types voor bestanden en mappen kunnen veranderd worden met het chcon commando. Veranderingen gemaakt met chcon overleven een her-labelen van het bestandssysteem of het gebruik van het restorecon commando niet. SELinux tactiek controleert welke gebruikers in staat zijn om SELinux context te veranderen voor alle bestanden. Het volgende voorbeeld laat het aanmaken van een nieuwe map zien, met daarin een index.html bestand voor gebruik door httpd, en het labelen van die map en dat bestand om httpd er toegang toe te laten hebben: 1. Voer mkdir -p /my/website uit als de root gebruiker om een top-niveau map structuur aan te maken voor het opslaan van bestanden die gebruikt gaan worden door httpd. 2. Bestanden en mappen die niet overeenkomen met een patroon in bestand context configuratie kunnen gelabeld zijn met het default_t type. Dit type is niet toegankelijk voor beperkte services:
$ ls -dZ /my drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /my
3. Voer chcon -R -t httpd_sys_content_t /my/ uit als de root gebruiker om het type van de /my/ map en sub-mappen naar een type dat toegankelijk is voor httpd. Bestanden die nu in /my/website/ aangemaakt worden erven het httpd_sys_content_t type, in plaats van het default_t type, en zijn daarom toegankelijk voor httpd:
17
Hoofdstuk 4. De Apache HTTP server
# chcon -R -t httpd_sys_content_t /my/ # touch /my/website/index.html # ls -Z /my/website/index.html -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /my/website/index.html
Gebruik het semanage fcontext commando om label veranderingen te maken die een herlabeling en het restorecon commando overleven. Dit commando voegt veranderingen toe aan bestand context configuratie. Voer daarna het restorecon commando uit, welke de bestand context configuratie leest, om de label veranderingen toe te passen. Het volgende voorbeeld toont het aanmaken van een nieuwe map en een index.html bestand voor gebruik door httpd, en het permanent veranderen van die map en dat bestand om httpd toe te staan er toegang tot te hebben. 1. Voer mkdir -p /my/website uit als de root gebruiker om een top-niveau map structuur aan te maken voor het opslaan van bestanden die gebruikt gaan worden door httpd. 2. Voer het volgende commando uit als de root gebruiker om de label verandering toe te voegen aan de bestand context configuratie:
semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
De "/my(/.*)?" expressie betekent dat de label verandering toegepast wordt op de /my/ map en alle bestanden erin. 3. Voer touch /my/website/index.html uit als de root gebruiker om een nieuw bestand aan te maken. 4. Voer restorecon -R -v /my/ uit als de root gebruiker om de label veranderingen toe te passen (restorecon leest bestand context configuratie, welke veranderd werd door het semanage commando in stap 2):
# restorecon -R -v /my/ restorecon reset /my context unconfined_u:object_r:default_t:s0>system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website context unconfined_u:object_r:default_t:s0>system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0>system_u:object_r:httpd_sys_content_t:s0
4.3. Booleans SELinux wordt gebaseerd op het laagste niveau van toegang vereist om een service te laten draaien. Services kunnen op een aantal manieren draaien; je moet daarom SELinux vertellen hoe je de services draait. Dit kan bereikt worden met Booleans die toestaan dat onderdelen van SELinux tactiek tijdens het draaien veranderd kunnen worden, zonder dat enige kennis nodig is over het schrijven van SELinux tactiek. Dit staat veranderingen toe, zoals services toegang toestaan tot NFS bestandssystemen, zonder het opnieuw inladen of compileren van SELinux tactiek. Om de toestand van een Boolean te veranderen gebruik je het setsebool commando. Bijvoorbeeld, om de allow_httpd_anon_write Boolean aan te zetten, voer je het volgende commando uit als de root gebruiker:
18
Booleans
# setsebool -P allow_httpd_anon_write on
Om een Boolean uit te zetten met hetzelfde voorbeeld, verander je een voudig on naar off in het commando, zoals hieronder getoond wordt: # setsebool -P allow_httpd_anon_write off
Opmerking Gebruik de -P optie niet als je wilt dat setsebool veranderingen niet permanent voor opnieuw opstarten. Hieronder is een beschrijving van algemene Booleans die beschikbaar zijn om de manier waarop httpd draait te veranderen: allow_httpd_anon_write Als het uitgezet is, staat deze Boolean httpd alleeen lees toegang toe tot bestanden gelabeld met het public_content_rw_t type. Deze Boolean aanzetten zal httpd toestaan om te schrijven naar bestanden gelabeld met het public_content_rw_t type, zoals een publieke map welke bestanden bevat voor een publieke bestand uitruil service. allow_httpd_mod_auth_ntlm_winbind Het aanzetten van deze Boolean staat toegang toe tot NTLM en Winbind authenticatie mechanismes via de mod_auth_ntlm_winbind module in httpd. allow_httpd_mod_auth_pam Het aanzetten van deze Boolean staat toegang toe aan PAM authenticatie mechanismes via de mod_auth_pam module in httpd. allow_httpd_sys_script_anon_write Deze Boolean definieert of het HTTP scripts wel of niet toegestaan wordt om schrijf toegang te hebben tot bestanden gelabeld met het public_content_rw_t type, zoals gebruikt in een publieke bestand uitruil service. httpd_builtin_scripting Deze Boolean definieert toegang tot httpd script gebruik. Het is vaak vereist voor PHP inhoud om deze Boolean aangezet te hebben. httpd_can_network_connect Als deze Boolean uitgezet is worden HTTP scripts en modules belet om een verbinding met een netwerk of een poort op afstand te initiëren. Deze Boolean aanzetten staat deze toegang toe. httpd_can_network_connect_db Als deze Boolean uitgezet is worden HTTP scripts en modules belet om een verbinding met database servers te initiëren. Deze Boolean aanzetten staat deze toegang toe. httpd_can_network_relay Zet deze Boolean aan als httpd wordt gebruikt als een voorwaartse of achterwaartse proxy.
19
Hoofdstuk 4. De Apache HTTP server
httpd_can_sendmail Als deze Boolean uitgezet is worden HTTP modules belet om mail te versturen. Dit kan spam aanvallen voorkomen als een kwetsbaarheid in httpd zou worden gevonden. Deze Boolean aanzetten staat HTTP modules toe om mail te versturen. httpd_dbus_avahi Als deze Boolean uitgezet is wordt httpd toegang geweigerd tot de avahi service via D-Bus. Deze Boolean aanzetten staat deze toegang toe. httpd_enable_cgi Als deze Boolean uitgezet is wordt httpd belet om CGI scripts uit te voeren. Zet deze Boolean aan om httpd toe te staan CGI scripts uit te voeren (CGI scripts moeten gelabeld zijn met het httpd_sys_script_exec_t type). httpd_enable_ftp_server Het aanzetten van deze Boolean zal httpd toestaan om te luisteren op de FTP poort en op te treden als een FTP server. httpd_enable_homedirs Als deze Boolean uitgezet is wordt httpd belet om toegang te krijgen tot persoonlijke mappen van gebruikers. Zet deze Boolean aan om httpd toe te staan toegang the hebben tot persoonlijke mappen van gebruikers; bijvoorbeeld, inhoud in /home/*/. httpd_execmem Als deze Boolean aangezet is wordt het httpd toegestaan om programma's uit te voeren die geheugen adressen vereisen die zowel uitvoerbaar als beschrijfbaar zijn. Deze Boolean aanzetten wordt niet aanbevolen vanuit een beveiliging standpunt omdat het de bescherming tegen buffer overloop vermindert, bepaalde modules (zoals Java en Mono toepassingen) vereisen dit recht echter. httpd_ssi_exec Deze Boolean definieert of server side include (SSI) elementen op een web pagina wel of niet uitgevoerd kunnen worden. httpd_tmp_exec Het aanzetten van deze Boolean staat httpd toe om bestanden uit te voeren in tijdelijke mappen. httpd_tty_comm Deze Boolean definieert of httpd wel of geen toegang wordt gegeven tot de controlerende terminal. Gewoonlijk is deze toegang niet vereist, echter in gevallen zoals het configureren van een SSL certificaat bestand, wordt terminal toegang vereist om een wachtwoord prompt te tonen en af te handelen. httpd_unified Als deze Boolean aangezet is wordt httpd_t complete toegang toegestaan tot alle httpd types (b.v. voor het uitvoeren, lezen, of schrijven van write sys_content_t). Als het uitgezet wordt, is er een scheiding in ruimte tussen web inhoud die alleen leesbaar, beschrijfbaar of uitvoerbaar is. Deze Boolean uitzetten verzekert een extra niveau van beveiliging maar voegt de administratieve overhead toe om alle scripts en andere web inhoud individueel te labelen gebaseerd op de bestand toegang die voor ieder nodig is.
20
Configuratie voorbeelden
httpd_use_cifs Zet deze Boolean aan om httpd toe te staan toegang te krijgen tot bestanden op CIFS bestandssystemen die gelabeld zijn met het cifs_t type, zoals bestandssystemen aangekoppeld met Samba. httpd_use_gpg Deze Boolean aanzetten staat httpd toe om gebruik te maken van GPG encryptie. httpd_use_nfs Zet deze Boolean aan om httpd toegang toe te staan tot bestanden op NFS bestandssystemen die gelabeld zijn met hetnfs_t type, zoals bestandssystemen aangekoppeld met NFS.
4.4. Configuratie voorbeelden De volgende voorbeelden bieden een praktijk illustratie en laat zien hoe SELinux de Apache HTTP server completeert en hoe de volledige functionaliteit gehandhaafd blijft.
4.4.1. Een statische site draaien Om een statische website te maken, label je de .html bestanden voor die website met het httpd_sys_content_t type. Standaard kan de Apache HTTP server niet schrijven naar bestanden die gelabeld zijn met hethttpd_sys_content_t type. Het volgende voorbeeld maakt een nieuwe map om de bestand voor een alleen-lezen website op te slaan: 1. Voer mkdir /mywebsite uit als de root gebruiker om een top-niveau map aan te maken. 2. Als de root gebruiker maak je een /mywebsite/index.html bestand aan. Kopieer de volgende inhoud naar /mywebsite/index.html:
index.html from /mywebsite/
3. Om de Apache HTTP server alleen-lezen toegang toe te staan tot /mywebsite/, en de bestanden in sub-mappen hierin, label je /mywebsite/ met het httpd_sys_content_t type. Voer het volgende commando uit als de root gebruiker om de label verandering aan the bestand context configuratie toe te voegen:
# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
4. Voer restorecon -R -v /mywebsite uit als de root gebruiker om de label veranderingen aan te brengen:
# restorecon -R -v /mywebsite restorecon reset /mywebsite context unconfined_u:object_r:default_t:s0>system_u:object_r:httpd_sys_content_t:s0 restorecon reset /mywebsite/index.html context unconfined_u:object_r:default_t:s0>system_u:object_r:httpd_sys_content_t:s0
21
Hoofdstuk 4. De Apache HTTP server
5. Voor dit voorbeeld bewerk je /etc/httpd/conf/httpd.conf als de root gebruiker. Maak van de bestaande DocumentRoot optie commentaar. Voeg een DocumentRoot "/mywebsite" optie toe. Na het bewerken moeten de opties er als volgt uit zien:
#DocumentRoot "/var/www/html" DocumentRoot "/mywebsite"
6. Voer service httpd status uit als de root gebruiker om te kijken naar de status van de Apache HTTP server. Als de server gestopt is, voer je service httpd start uit als de root gebruiker om de server te starten. Als de server draait, voer je service httpd restart als de root gebruiker om de server opnieuw te starten (dit brengt ook de veranderingen aan die gemaakt zijn in httpd.conf). 7. Gebruik een web browser om naar http://localhost/index.html te gaan. De volgende output wordt getoond:
index.html from /mywebsite/
4.4.2. NFS en CIFS bestandssystemen delen Standaard zijn NFS aankoppelingen op de cliënt zijde gelabeld met een standaard context gedefinieerd door tacktiek voor NFS bestandssystemen. In algemene tactieken gebruikt de standaard context het nfs_t type. Satandaard zijn ook Samba delingen aangekoppeld op de cliënt zijde gelabeld met een standaard context gedefinieerd door de tactiek. In algemene tactieken gebruikt deze standaard context het cifs_t type. Afhankelijk van de tactiek configuratie kunnen services niet in staat zijn om bestanden gelabeld met de nfs_t of cifs_t types te lezen. Dit kan beletten dat bestandssystemen met deze types aangekoppeld en dan gelezen of geëxporteerd kunnen worden door andere services. Booleans kunne naan of uit gezet worden om te controleren aan welke services het toegestaan is om toegang te krijgen tot de nfs_t en cifs_t types. Zet de httpd_use_nfs Boolean aan om httpd toe te staan toegang te krijgen NFS bestandssystemen en deze te delen (gelabeld met het nfs_t type. Voer het setsebool commando uit als de root gebruiker om de Boolean aan te zetten:
setsebool -P httpd_use_nfs on
Zet de httpd_use_cifs Boolean aan om httpd toe te staan toegang te krijgen CIFS bestandssystemen en deze te delen (gelabeld met het cifs_t type. Voer het setsebool commando uit als de root gebruiker om de Boolean aan te zetten:
setsebool -P httpd_use_cifs on
Opmerking Gebruik de -P optie niet als je wilt dat setsebool veranderingen niet permanent voor opnieuw opstarten.
22
Bestanden delen tussen services
4.4.3. Bestanden delen tussen services Type afdwinging helpt met het beletten dat processen toegang krijgen tot bestanden die bedoeld zijn voor gebruik door andere processen. Bijvoorbeeld, standaard kan Samba geen bestanden lezen die gelabeld zijn met het httpd_sys_content_t type, welke bedoeld zijn voor gebruik door de Apache HTTP server. Bestanden kunnen gedeeld worden tussen de Apache HTTP server, FTP, rsync, en Samba, als de gewenste bestanden gelabeld zijn met het public_content_t of public_content_rw_t type. Het volgende voorbeeld maakt een map en bestanden aan, en staat toe dat de map en bestanden gedeeld (alleen-lezen) kunnen worden tussen de Apache HTTP server, FTP, rsync, en Samba: 1. Voer mkdir /shares uit als de root gebruiker om een nieuwe top-niveau map aan de maken om bestanden te delen tussen meerdere services. 2. Bestanden en mappen die niet overeenkomen met een patroon in bestand context configuratie kunnen gelabeld zijn met het default_t type. Dit type is niet toegankelijk voor beperkte services:
$ ls -dZ /shares drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /shares
3. Als de root gebruiker maak je een /shares/index.html bestand aan. Kopieer de volgende inhoud naar /shares/index.html:
Hello
4. Het labelen van /shares/ met het public_content_t type staat alleen-lezen toegang toe voor de Apache HTTP server, FTP, rsync, en Samba. Voer het volgende commando uit als de root gebruiker om de label verandering toe te voegen aan de bestand context configuratie:
semanage fcontext -a -t public_content_t "/shares(/.*)?"
5. Voer restorecon -R -v /shares/ uit als de root gebruiker om de label veranderingen aan te brengen:
# restorecon -R -v /shares/ restorecon reset /shares context unconfined_u:object_r:default_t:s0>system_u:object_r:public_content_t:s0 restorecon reset /shares/index.html context unconfined_u:object_r:default_t:s0>system_u:object_r:public_content_t:s0
Om /shares/ te delen met Samba: 1. Voer rpm -q samba samba-common samba-client uit om te bevestigen dat de samba, samba-common, en samba-client pakketten geïnstalleerd zijn (de versie nummers kunnen anders zijn):
23
Hoofdstuk 4. De Apache HTTP server
$ rpm -q samba samba-common samba-client samba-3.5.2-59.fc13.i386 samba-common-3.5.2-59.fc13.i386 samba-client-3.5.2-59.fc13.i386
Als een van deze pakketten niet geïnstalleerd is, installeer je ze door het uitvoeren van yum install pakket-naam als de root gebruiker. 2. Bewerk /etc/samba/smb.conf als de root gebruiker. Voeg de volgende ingang toe aan het eind van dit bestand om de /shares/ map de delen met Samba:
[shares] comment = Documents for Apache HTTP Server, FTP, rsync, and Samba path = /shares public = yes writeable = no
3. Een Samba account is vereist om een Samba bestandssysteem aan te koppelen. Voer smbpasswd -a gebruikersnaam uit als de root gebruiker om een Samba account aan te maken, waarin gebruikersnaam een bestaande Linux gebruiker is. Bijvoorbeeld, smbpasswd a testuser maakt een Samba account aan voor de Linux testuser gebruiker:
# smbpasswd -a testuser New SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.
Het draaien van smbpasswd -a gebruikersnaam, waarin gebruikersnaam de gebruikersnaam van een Linux account is dat niet bestaat op het systeem, veroorzaakt een Cannot locate Unix account for 'gebruikersnaam'! fout. 4. Voer service smb start als de root gebruiker om de Samba service te starten:
service smb start Starting SMB services:
[
OK
]
5. Voer smbclient -U gebruikersnaam -L localhost uit om de beschikbare delingen te zien, waarin gebruikersnaam het Samba account is dat toegevoegd is in stap 3 (versie nummer kunnen anders zijn):
$ smbclient -U username -L localhost Enter username's password: Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.5.2-59.fc13] Sharename Type Comment -----------------shares Disk Documents for Apache HTTP Server, FTP, rsync, and Samba IPC$ IPC IPC Service (Samba Server Version 3.5.2-59) username Disk Home Directories Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.5.2-59.fc13]
24
Bestanden delen tussen services
Server ---------
Comment -------
Workgroup ---------
Master -------
6. Voer mkdir /test/ uit als de root gebruiker om een nieuwe map aan te maken. Deze map zal gebruikt worden om de shares Samba deling aan te koppelen. 7. Voer het volgende commando uit als de root gebruiker om de shares Samba deling te koppelen aan /test/, vervang hierbij gebruikersnaam met de gebruikersnaam van stap 3:
mount //localhost/shares /test/ -o user=gebruikersnaam
Type het wachtwoord in voor gebruikersnaam, welke geconfigureerd is in stap 3. 8. Voer cat /test/index.html uit om het bestand te bekijken, welke nu gedeeld wordt met Samba:
$ cat /test/index.html
Hello
Om /shares/ te dlen met de Apache HTTP server: 1. Voer rpm -q httpd uit om te bevestigen dat het httpd pakket geïnstalleerd is (versie nummers kunnen anders zijn):
$ rpm -q httpd httpd-2.2.11-6.i386
Als dit pakket niet geïnstalleerd is, voer je yum install httpd uit als de root gebruiker om het te installeren. 2. Ga naar de /var/www/html/ map. Voer het volgende commando uit als root om een link (met de naam shares) naar de /shares/ map aan te maken:
ln -s /shares/ shares
3. Voer service httpd start uit als de root gebruiker om de Apache HTTP server te starten:
service httpd start Starting httpd:
[
OK
]
4. Gebruik een web browser om te navigeren naar http://localhost/shares. Het /shares/ index.html bestand wordt getoond:
25
Hoofdstuk 4. De Apache HTTP server
Standaard leest de Apache HTTP server een index.html bestand als het bestaat. Als /shares/ geen index.html heeft, in plaats daarvan file1, file2, en file3 had, dat zal een map lijst verschijnen als toegang verkregen wordt tot http://localhost/shares: 1. Voer rm -i /shares/index.html uit als de root gebruiker om het index.html bestand te verwijderen. 2. Voer touch /shares/file{1,2,3} uit als de root gebruiker om drie bestanden aan te maken in /shares/:
# touch /shares/file{1,2,3} # ls -Z /shares/ -rw-r--r-- root root system_u:object_r:public_content_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:public_content_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:public_content_t:s0 file3
3. Voer service httpd status uit als de root gebruiker om de status van de Apache HTTP server te bekijken. Als de server gestopt is, voer je service httpd start uit als de root gebruiker om de server te starten. 4. Gebruik een web browser om naar http://localhost/shares te gaan. Een map lijst wordt getoond:
4.4.4. Poort nummers veranderen Afhankelijk van de tactiek configuratie is het aan services alleen maar toegestaan op bepaalde poort nummers te draaien. Een poging om de poort waarop een service draait te veranderen zonder de tactiek te veranderen kan resulteren in het niet opstarten van de service. Voer semanage port -l | grep -w "http_port_t" uit als de root gebruiker om de poorten te laten zien waarop SELinux httpd toestaat om te luisteren:
# semanage port -l | grep -w http_port_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443
26
Poort nummers veranderen
Standaard staat SELinux http toe om te luisteren op TCP poorten 80, 443, 488, 8008, 8009, of 8443. Als /etc/httpd/conf/httpd.conf geconfigureerd is zodat httpd luistert op een poort die niet getoond werd voor http_port_t, dan zal httpd niet starten. Om httpd te configureren om te draaien op een andere poort dan TCP poort 80, 443, 488, 8008, 8009, of 8443: 1. Bewerk /etc/httpd/conf/httpd.conf als de root gebruiker zodat de Listen optie een poort laat zien die niet geconfigureerd is in de SELinux tactiek voor httpd. Het volgende voorbeeld configureert httpd geconfigureerd om te luisteren op het IP adres 10.0.0.1, en op poort 12345:
# Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses (0.0.0.0) # #Listen 12.34.56.78:80 Listen 10.0.0.1:12345
2. Voer semanage port -a -t http_port_t -p tcp 12345 uit als de root gebruiker om de poort toe te voegen aan de SELinux tactiek configuratie. 3. Voer semanage port -l | grep -w http_port_t uit als de root gebruiker om te bevestigen dat de poort is toegevoegd:
# semanage port -l | grep -w http_port_t http_port_t tcp 12345, 80, 443, 488, 8008, 8009, 8443
Als je httpd niet langer draait op poort 12345, voer je semanage port -d -t http_port_t -p tcp 12345 uit als de root gebruiker om de poort uit de tactiek configuratie tr verwijderen.
27
28
Samba 1
Van de Samba website: 2
3
4
"Samba is een Open Bron /Vrije Software suite die, sinds 1992 , bestand en print services biedt aan allerlei SMB/CIFS cliënten, inclusief de talrijke versies van Microsoft Windows besturingssystemen. 5 6 Samba is vrij beschikbaar met de GNU General Publieke Licentie .". In Fedora biedt het samba pakket de Samba server. Voer rpm -q samba uit om te kijken of het samba pakket geïnstalleerd is. Als het niet geïnstalleerd is en je wilt Samba gebruiken, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install samba
5.1. Samba en SELinux Als SELinux is aangezet, draait de Samba server (smbd) standaard beperkt. Beperkte services draaien in hun eigen domein, en worden gescheiden van andere beperkte services. Het volgende voorbeeld laat zien hoe het smbd proces in zijn eigen domein draait. Dit voorbeeld neemt aan dat het samba pakket geïnstalleerd is. 1. Voer getenforce uit om te bevestigen dat SELinux in de afdwingende mode draait:
$ getenforce Enforcing
Het getenforce commando geeft Enforcing terug als SELinux in de afdwingende mode draait. 2. Voer service smbd start uit als de root gebruiker om smbd te starten:
service smb start Starting SMB services:
[
OK
]
3. Voer ps -eZ | grep smb uit om de smbd processen te bekijken:
$ ps -eZ | grep smb unconfined_u:system_r:smbd_t:s0 16420 ? unconfined_u:system_r:smbd_t:s0 16422 ?
00:00:00 smbd 00:00:00 smbd
De SELinux context geassocieerd met de smbd processen is unconfined_u:system_r:smbd_t:s0. Het een na laatste deel van de context, smbd_t, is 1
http://samba.org/ http://www.opensource.org/ 3 http://www.gnu.org/philosophy/free-sw.html 4 http://us1.samba.org/samba/docs/10years.html 5 http://us1.samba.org/samba/docs/GPL.html Uit de eerste paragraaf op de Samba website: http://samba.org. Accessed 20 January 2009. 2
29
Hoofdstuk 5. Samba
het type. Een type definieert een domein voor processen en een type voor bestanden. In dit geval draaien de smbd processen in het smbd_t domein. Bestanden moeten correct gelabeld zijn om smbd toegang toe te staan en ze te delen. Bijvoorbeeld, smbd kan lezen en schrijven naar bestanden gelabeld met het samba_share_t type, maar standaard heeft het geen toegang tot bestanden gelabled met het httpd_sys_content_t type, welke bedoeld is voor gebruik met de Apache HTTP server. Booleans moeten aangezet worden om bepaalde gedrag toe te staan, zoals het toestaan om persoonlijke mappen en NFS bestandssystemen te exporteren met Samba, alsmede Samba toe te staat om op te treden als een domein controller.
5.2. Types Label bestanden met het samba_share_t type om Samba toe te staan ze te delen. Label alleen bestanden die je aangemaakt hebt, en herlabel systeem bestanden niet met het samba_share_t type: Booleans kunnen aangezet worden om zulke bestanden en mappen te delen. SELinux staat Samba toe om te schrijven naar bestanden die gelabeld zijn met het samba_share_t type, als / etc/samba/smb.conf en Linux rechten hiervoor ingesteld zijn. Het samba_etc_t type wordt gebruikt voor bepaalde bestanden in /etc/samba/, zoals smb.conf. Label bestanden niet handmatig met het samba_etc_t type. Als bestanden in /etc/samba/ niet correct gelabeld zijn, voer je restorecon -R -v /etc/samba uit als de root gebruiker om zulke bestanden hun standaard context te geven. Als /etc/samba/smb.conf niet gelabeld is met het samba_etc_t type, zal het service smb start commando falen en een SELinux weigering kan gelogd worden. Het volgende is een voorbeeld weigering gelogd naar /var/log/messages als / etc/samba/smb.conf gelabeld is met het httpd_sys_content_t type:
setroubleshoot: SELinux is preventing smbd (smbd_t) "read" to ./smb.conf (httpd_sys_content_t). For complete SELinux messages. run sealert -l deb33473-1069-482b-bb50e4cd05ab18af
5.3. Booleans SELinux is gebaseerd op het laagste niveau van toegang vereist voor een service om te draaien. Services kunnen draaien op een aantal manieren, je moet daarom SELinux vertellen hoe je services draait. De volgende Booleans staan je toe om SELinux te vertellen hoe je Samba draait: allow_smbd_anon_write Als deze Boolean aangezet is, wordt smbd toegestaan om naar publieke mappen te schrijven, zoals een gebied gereserveerd voor algemene bestanden die op een andere manier geen speciale toegang beperkingen hebben. samba_create_home_dirs Als deze Boolean aangezet is, wordt het Samba toegestaan om nieuwe persoonlijke mappen onafhankelijk aan te maken. Dit wordt vaak gedaan door mechanismes zoals PAM. samba_domain_controller Als deze Boolean aangezet is, wordt het Samba toegestaan om op te treden als een domein controller, en geeft het ook het recht om gerelateerde commando's uit te voeren, zoals useradd, groupadd en passwd.
30
Configuratie voorbeelden
samba_enable_home_dirs Het aanzetten van deze Boolean staat Samba toe om persoonlijke mappen van gebruikers te delen. samba_export_all_ro Exporteert alle bestanden of mappen en geeft alleen-lezen rechten. Dit staat bestanden en mappen die niet gelabeld zijn met het samba_share_t type toe om gedeeld te worden met Samba. Als de samba_export_all_ro Boolean aangezet is, maar de samba_export_all_rw Boolean is uitgezet, wordt schrijf toegang tot Samba delingen niet toegestaan, zelfs als schrijf toegang geconfigureerd is in /etc/samba/smb.conf, en ook als Linux rechten schrijf toegang toestaan. samba_export_all_rw Exporteert alle bestanden of mappen en geeft lees en schrijf rechten. Dit staat bestanden en mappen die niet gelabeld zijn met het samba_share_t type toe om gedeeld te worden met Samba. De rechten in /etc/samba/smb.conf en Linux rechten moeten geconfigureerd zijn om schrijf toegang toe te staan. samba_run_unconfined Het aanzetten van deze Boolean staat Samba toe om onbeperkte scripts te draaien in de /var/ lib/samba/scripts map. samba_share_fusefs Deze Boolean moet aangezet zijn om Samba fusefs bestandssystemen te laten delen. samba_share_nfs Het uitzetten van deze Boolean belet smbd om volledige toegang tot NFS delingen te krijgen met Samba. Het aanzetten van deze Boolean zal Samba toestaan NFS bestandssystemen te delen. use_samba_home_dirs Zet deze Boolean aan om een server op afstand te gebruiken voor Samba persoonlijke mappen. virt_use_samba Sta virt toe om CIFS bestanden te beheren.
5.4. Configuratie voorbeelden De volgende voorbeelden bieden praktijk demonstraties hoe SELinux de Samba server completeert en hoe de volledige functie van de Samba server gehandhaafd kan blijven.
5.4.1. Aangemaakte mappen delen Het volgende voorbeeld maakt een nieuwe map aan, en deelt die map met behulp van Samba: 1. Voer rpm -q samba samba-common samba-client uit om te bevestigen dat de samba, samba-common, en samba-client pakketten geïnstalleerd zijn. Als een van deze pakketten niet geïnstalleerd is, installeer je deze met het uitvoeren van yum install pakket-naam als de root gebruiker. 2. Voer mkdir /myshare uit als de root gebruiker om een nieuwe top niveau map aan te maken voor het delen met gebruik van Samba.
31
Hoofdstuk 5. Samba
3. Voer touch /myshare/file1 uit als de root gebruiker om een leeg bestand aan te maken. Dit bestand wordt later gebruikt om te verifiëren dat de Samba deling correct aangekoppeld werd. 4. SELinux staat Samba toe om bestanden te lezen en te schrijven als ze gelabeld zijn met het samba_share_t type, als /etc/samba/smb.conf en Linux rechten overeenkomstig ingesteld zijn. Voer het volgende commando uit als de root gebruiker om de label verandering toe te voegen aan de bestand context configuratie.
semanage fcontext -a -t samba_share_t "/myshare(/.*)?"
5. Voer restorecon -R -v /myshare/ uit als de root gebruiker om de label verandering toe te passen:
# restorecon -R -v /myshare restorecon reset /myshare context unconfined_u:object_r:default_t:s0>system_u:object_r:samba_share_t:s0 restorecon reset /myshare/file1 context unconfined_u:object_r:default_t:s0>system_u:object_r:samba_share_t:s0
6. Bewerk /etc/samba/smb.conf als de root gebruiker. Voeg het volgende onderaan in dit bestand toe om de /myshare/ map de delen met behulp van Samba.
[myshare] comment = My share path = /myshare public = yes writeable = no
7. Een Samba account is vereist om een Samba bestandssysteem aan te koppelen. Voer smbpasswd -a gebruikersnaam uit als de root gebruiker om een Samba account aan te maken, waarin gebruikersnaam een bestaande Linux gebruiker is. Bijvoorbeeld, smbpasswd a testuser maakt een Samba account aan voor de SELinux testuser gebruiker.
# smbpasswd -a testuser New SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.
Het uitvoeren van smbpasswd -a gebruikersnaam, waarin gebruikersnaam de gebruikersnaam is van een Linux account dat niet op het systeem bestaat, veroorzaakt een Cannot locate Unix account for 'gebruikersnaam'! fout. 8. Voer service smb start uit als de root gebruiker om de Samba service te starten:
service smb start Starting SMB services:
32
[
OK
]
Een website delen
9. Voer smbclient -U gebruikersnaam -L localhost uit om een lijst van de beschikbare delingen te tonen, waarin gebruikersnaam het Samba account is dat in stap 7 werd toegevoegd (versie nummers kunnen anders zijn):
$ smbclient -U username -L localhost Enter username's password: Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.5.2-59.fc13] Sharename Type Comment -----------------myshare Disk My share IPC$ IPC IPC Service (Samba Server Version 3.5.2-59.fc13) username Disk Home Directories Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.5.2-59.fc13] Server ---------
Comment -------
Workgroup ---------
Master -------
10. Voer mkdir /test/ uit als de root gebruiker om een nieuwe map aan te maken. Deze map zal gebruikt worden om de myshare Samba deling aan te koppelen. 11. Voer het volgende commando uit als de root gebruiker om de myshare Samba deling aan te koppelen op /test/, met vervanging van gebruikersnaam met de gebruikersnaam uit stap 7:
mount //localhost/myshare /test/ -o user=username
Vul het wachtwoord in voor gebruikersnaam, welke geconfigureerd werd in stap 7. 12. Voer ls /test/ uit om het file1 bestand gemaakt in stap 3 te bekijken:
$ ls /test/ file1
5.4.2. Een website delen Het is misschien niet mogelijk om bestanden te labelen met het samba_share_t type, bijvoorbeeld las je een website in /var/www/html/ wilt delen. In deze gevallen gebruik je de samba_export_all_ro Boolean om een bestand of map (onafhankelijk van het huidige label) te delen met het toestaan van alleen-lezen rechten, of de samba_export_all_rw Boolean om een bestand of map (onafhankelijk van het huidige label) de delen met lees en schrijf rechten. Het volgende voorbeeld maakt een bestand aan voor een website in /var/www/html/, en deelt daarna dat bestand door middel van Samba met het toestaan van lees en schrijf rechten. Dit voorbeeld neemt aan dat de httpd, samba, samba-common, samba-client, en wget pakketten geïnstalleerd zijn: 1. Als de root gebruiker maak je een /var/www/html/file1.html bestand aan. Kopieer de volgende inhoud naar /var/www/html/file1.html:
33
Hoofdstuk 5. Samba
File being shared through the Apache HTTP Server and Samba.
2. Voer ls -Z /var/www/html/file1.html uit om de SELinux context van file1.html te bekijken:
$ ls -Z /var/www/html/file1.html -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/ file1.html
file1.index.html is gelabeld met het httpd_sys_content_t type. Standaard heeft de Apache HTTP server toegang tot dit type, maar Samba niet. 3. Voer service httpd start uit als de root gebruiker om de Apache HTTP server te starten:
service httpd start Starting httpd:
[
OK
]
4. Ga naar een map waar jouw gebruiker schrijf toegang tot heeft, en voer het wget http:// localhost/file1.html commando uit. Behalve als er veranderingen in de standaard configuratie aangebracht zijn, zal dit commando slagen:
$ wget http://localhost/file1.html --2009-03-02 16:32:01-- http://localhost/file1.html Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 84 [text/html] Saving to: `file1.html.1' 100%[=======================>] 84
--.-K/s
in 0s
2009-03-02 16:32:01 (563 KB/s) - `file1.html.1' saved [84/84]
5. Bewerk /etc/samba/smb.conf als de root gebruiker. Voeg het volgende onderaan in dit bestand toe om de /var/www/html/ map de delen met behulp van Samba.
[website] comment = Sharing a website path = /var/www/html/ public = no writeable = no
6. De /var/www/html/ map is gelabeld met het httpd_sys_content_t type. Standaard heeft Samba geen toegang tot bestanden en mappen gelabeld met het httpd_sys_content_t type, zelfs als de Linux rechten het toestaan. Om Samba toegang te geven, voer je het volgende commando uit als de root gebruiker om de samba_export_all_ro Boolean aan te zetten:
34
Een website delen
setsebool -P samba_export_all_ro on
Gebruik de -P optie niet als je niet wilt dat de verandering blijvend is na opnieuw opstarten. Merk op: het aanzetten van de samba_export_all_ro Boolean staat Samba toegang toe tot alle types. 7. Voer service smbd start uit als de root gebruiker om smbd te starten:
service smb start Starting SMB services:
[
OK
]
35
36
File Transfer Protocol 1
Uit de Red Hat Enterprise Linux 5 Deployment Guide : File Transfer Protocol (FTP) is een van de oudste en meest gebruikte protocollen op het huidige Internet. Het doel van het protocol is het betrouwbaar versturen van bestanden tussen computer hosts op een netwerk zonder dat een gebruiker direct moet inloggen op het systeem op afstand of kennis moet hebben over het gebruik van het systeem op afstand. Het staat gebruikers toe om toegang te krijgen tot bestanden op systemen op afstand met gebruik van een standaard set eenvoudige 2 commando's. De Very Secure FTP Daemon (vsftpd) is geheel opnieuw ontworpen om snel, stabiel, en, het meest belangrijke, veilig te zijn. De mogelijkheid om een groot aantal verbindingen efficiënt en veilig af te handelen is de reden dat vsftpd de enigste alleen-staande FTP is die met Red Hat Enterprise Linux 3 wordt meegeleverd. In Fedora biedt het vsftpd pakket de Very Secure FTP daemon. Voer rpm -q vsftpd uit om te kijken of vsftpd geïnstalleerd is:
$ rpm -q vsftpd
Als je een FTP server wilt en het vsftpd pakket is niet geïnstalleerd, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install vsftpd
6.1. FTP en SELinux Als SELinux draait, zal de FTP server, vsftpd, standaard beperkt draaien. SELinux tactiek definieert hoe vsftpd interactie heeft met bestanden, processen , en met het systeem in het algemeen. Bijvoorbeeld, als een gemachtigde gebruiker inlogt met FTP, kan deze niet lezen van of schrijven naar bestanden in zijn persoonlijke map: SELinux belet vsftpd standaard toegang tot persoonlijke mappen. Ook heeft vsftpd standaard geen toegang tot NFS of CIFS bestandssystemen, en anonieme gebruikers hebben geen schrijf toegang, zelfs als die schrijf toegang geconfigureerd is in / etc/vsftpd/vsftpd.conf. Booleans kunnen aangezet worden om de eerder genoemde toegang toe te staan. Het volgende voorbeeld toont het inloggen van een gemachtigde gebruiker, een SELinux weigering als de gebruiker probeert bestanden in zijn persoonlijke map te bekijken: 1. Voer rpm -q vsftpd uit om te kijken of het vsftpd pakket geïnstalleerd is. Als dat niet het geval is, voer je yum install vsftpd uit als de root gebruiker om het te installeren. 1
http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/index.html De eerste paragraaf van "Chapter 23. FTP" van de Red Hat Enterprise Linux 5 Deployment Guide: http://www.redhat.com/docs/ en-US/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/ch-ftp.html. Copyright © 2007 Red Hat, Inc. De eerste paragraaf van de "23.2.1. vsftpd" sectie van de Red Hat Enterprise Linux 5 Deployment Guide: http:// www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/s1-ftp-servers.html#s2-ftp-servers-vsftpd. Copyright © 2007 Red Hat, Inc.
37
Hoofdstuk 6. File Transfer Protocol
2. In Fedora staat vsftpd standaard alleen anonieme gebruikers toe om in te loggen. Om gemachtigde gebruikers toe te staan in te loggen, bewerk je /etc/vsftpd/vsftpd.conf als de root gebruiker. Activeer de local_enable=YES optie:
# Uncomment this to allow local users to log in. local_enable=YES
3. Voer service vsftpd start uit als de root gebruiker om vsftpd te starten. Als de service draaide voor het bewerken van vsftpd.conf, voer je service vsftpd restart uit als de root gebruiker om de configuratie veranderingen toe te passen:
service vsftpd start Starting vsftpd for vsftpd:
[
OK
]
4. Voer ftp localhost uit als de gebruiker waarmee je op dit moment ingelogd bent. Als naar jouw naam gevraagd wordt, weer er dan zeker van dat jouw gebruikersnaam getoond wordt. Als de juiste gebruikersnaam getoond wordt, duw je op Enter, anders vul je de juiste gebruikersnaam in:
$ ftp localhost Connected to localhost (127.0.0.1). 220 (vsFTPd 2.1.0) Name (localhost:gebruikersnaam): 331 Please specify the password. Password: Enter your password 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>
5. Voer het ls commando uit op de ftp prompt. Omdat de ftp_home_dir Boolean uitgezet is, belet SELinux vsftpd toegang tot persoonlijke mappen, wat resulteert in het mislukken van dit commando om een map lijst te tonen:
ftp> ls 227 Entering Passive Mode (127,0,0,1,225,210). 150 Here comes the directory listing. 226 Transfer done (but failed to open directory).
Een SELinux weigering lijkend op het volgende wordt gelogd naar /var/log/messages:
setroubleshoot: SELinux is preventing the ftp daemon from reading users home directories (username). For complete SELinux messages. run sealert -l c366e889-2553-4c16b73f-92f36a1730ce
6. Zet de ftp_home_dir Boolean aan door het volgende commando uit te voeren als de root gebruiker:
38
Types
# setsebool -P ftp_home_dir=1
Opmerking Gebruik de -P optie niet als je niet wilt dat veranderingen opnieuw opstarten kunnen overleven. Voer het ls commano opnieuw uit op de ftp prompt. Nu SELinux toestaat dat de persoonlijke map bekeken wordt dankzij de ftp_home_dir Boolean, wordt de map getoond:
ftp> ls 227 Entering Passive Mode (127,0,0,1,56,215). 150 Here comes the directory listing. -rw-rw-r-1 501 501 0 Mar 30 09:22 file1 -rw-rw-r-1 501 501 0 Mar 30 09:22 file2 226 Directory Send OK. ftp>
6.2. Types Standaard hebben anonieme gebruikers lees toegang tot bestanden in /var/ftp/ als ze inloggen via FTP. De map wordt gelabeld met het public_content_t type, wat alleen lees toegang toestaat, zelfs als schrijf toegang geconfigureerd is in /etc/vsftpd/vsftpd.conf. Het public_content_t type is toegankelijk voor andere services, zoals Apache HTTP server, Samba, en NFS. Gebruik een van de volgende types om bestanden te delen met behulp van FTP: public_content_t Label bestanden en mappen die je aangemaakt hebt met het public_content_t type om ze alleen-lezen te delen met vsftpd. Anderse services, zoals Apache HTTP server, Samba, en NFS, hebben ook toegang tot bestanden gelabeld met dit type. Naar bestanden gelabeld met het public_content_t type kan niet geschreven worden, zelfs als Linux rechten schrijf toegang toestaan. Als je schrijf toegang nodig hebt, gebruik je het public_content_rw_t type. public_content_rw_t Label bestanden en mappen die je hebt aangemaakt met het public_content_rw_t type om ze te delen met lees en schrijf rechten via vsftpd. Andere services, zoals Apache HTTP server, Samba, en NFS, hebben ook toegang tot bestanden gelabeld met dit type; Er moeten echter Booleans voor iedere service aangezet worden voordat deze services kunnen schrijven naar bestanden gelabeld met dit type.
6.3. Booleans SELinux is gebaseerd op het laagste niveau van toegang vereist voor een service om te draaien. Services kunnen draaien op een aantal manieren, je moet daarom SELinux vertellen hoe je services draait. De volgende Booleans staan je toe om SELinux te vertellen hoe je vsftpd draait:
39
Hoofdstuk 6. File Transfer Protocol
allow_ftpd_anon_write Als deze Boolean is aangezet wordt vsftpd belet om te schrijven naar bestanden en mappen gelabeld met het public_content_rw_t type. Zet deze Boolean aan om gebruikers toe te staan om bestanden te uploaden met FTP. De map waarnaar bestanden ge-upload worden moet gelabeld zijn met het public_content_rw_t type en Linux rechten moeten overeenkomstig gezet zijn. allow_ftpd_full_access Als deze Boolean aangezet is, worden alleen Linux rechten gebruikt om toegang te controleren, en gemachtigde gebruikers kunnen lezen en schrijven naar bestanden die niet gelabeld zijn met de public_content_t of public_content_rw_t types. allow_ftpd_use_cifs Het aanzetten van deze Boolean staat vsftpd toegang toe tot bestanden en mappen gelabeld met het cifs_t type; het aanzetten van deze Boolean staat je toe om bestandssystemen die aangekoppeld zijn via Samba te delen met vsftpd. allow_ftpd_use_nfs Het aanzetten van deze Boolean staat vsftpd toegang toe tot bestanden en mappen gelabeld met het nfs_t type; het aanzetten van deze Boolean staat je daarom toe om bestandssystemen die aangekoppeld zijn via NFS te delen met vsftpd. ftp_home_dir Het aanzetten van deze Boolean staat gemachtigde gebruikers toe om te lezen en schrijven naar bestanden in hun persoonlijke mappen. Als deze Boolean uitgezet is, zal een poging om een bestand te downloaden van een persoonlijke map resulteren in een fout zoals 550 Failed to open file. Een SELinux weigering wordt gelogd naar /var/log/messages. ftpd_connect_db Staat FTP daemons toe om een verbinding naar een database te initiëren. httpd_enable_ftp_server Staat httpd toe om te luisteren op de FTP poort en op te treden als een FTP server. tftp_anon_write Het aanzetten van deze Boolean staat TFTP toegang toe tot een publieke map, zoals een gebied gereserveerd voor algemene bestanden die anders geen speciale toegang restricties hebben.
6.4. Configuratie voorbeelden 6.4.1. Uploaden naar een FTP site Het volgende voorbeeld maakt een FTP server aan die een specifieke gebruiker toestaat om bestanden te uploaden. Het maakt een map structuur en de vereiste SELinux configuratie veranderingen: 1. Voer mkdir -p /myftp/pub uit als de root gebruiker om een nieuwe top niveau map aan te maken. 2. Stel de Linux rechten voor de /myftp/pub/ map in om een Linux gebruiker schrijf toegang te geven. Dit voorbeeld verandert de eigenaar en groep van root naar eigenaar user1 en groep root. Vervang uder1 met de gebruiker die je schrijf toegang wilt geven:
40
Uploaden naar een FTP site
# chown user1:root /myftp/pub # chmod 775 /myftp/pub
Het chown commando verandert de eigenaar en groep rechten. Het chmod commando verandert de mode, wat user1 lees, schrijf en uitvoerbaar rechten geeft, en evenals leden van de root groep. Alle anderen hebben lees en uitvoerbaar rechten: dit is vereist om de Apache HTTP server toe te stand bestanden in deze map te lezen. 3. Als SELinux draait, moeten bestanden en mappen correct gelabeld zijn om toegang toe te staan. Het instellen van Linux rechten is niet genoeg. Naar bestanden gelabeld met het public_content_t type kan geschreven worden met FTP. Andere services, zoals Samba, vereisen dat Booleans ingesteld worden voordat ze kunnen schrijven naar bestanden gelabeld met het public_content_rw_t type. Label de top niveau map (/myftp/) met het public_content_t type, om te voorkomen dat gekopieerde of nieuw aangemaakte bestanden in /myftp/ beschreven of veranderd worden door services. Voer het volgende commando uit als de root gebruiker om de label verandering toe te voegen aan de bestand context configuratie:
semanage fcontext -a -t public_content_t /myftp
4. Voer restorecon -R -v /myftp/ uit om de label verandering toe te passen:
# restorecon -R -v /myftp/ restorecon reset /myftp context unconfined_u:object_r:default_t:s0>system_u:object_r:public_content_t:s0
5. Bevestig dat /myftp is gelabeld met het public_content_t type, en /myftp/pub/ is gelabeld met het default_t type:
$ ls -dZ /myftp/ drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /myftp/ $ ls -dZ /myftp/pub/ drwxrwxr-x. user1 root unconfined_u:object_r:default_t:s0 /myftp/pub/
6. Het moet FTP toegestaan worden om naar een map te schrijven voordat gebruikers bestanden kunnen uploaden met FTP. SELinux staat FTP toe te schrijven naar bestanden gelabeld met het public_content_rw_t type. Dit voorbeeld gebruikt /myftp/pub/ als de map waarin FTP kan schrijven. Voer het volgende commando uit als de root gebruiker om de label verandering toe te voegen aan de bestand context configuratie:
semanage fcontext -a -t public_content_rw_t "/myftp/pub(/.*)?"
7. Voer restorecon -R -v /myftp/ uit als de root gebruiker om de label verandering toe te passen:
# restorecon -R -v /myftp/pub
41
Hoofdstuk 6. File Transfer Protocol
restorecon reset /myftp/pub context system_u:object_r:default_t:s0>system_u:object_r:public_content_rw_t:s0
8. De allow_ftpd_anon_write Boolean moet aangezet worden om toe te staan dat vsftpd schrijft naar bestanden die gelabeld zijn met het public_content_rw_t type. Voer het volgende commando uit als de root gebruiker om deze Boolean aan te zetten:
setsebool -P allow_ftpd_anon_write on
Gebruik de -P optie niet als je niet wilt dat veranderingen opnieuw opstarten kunnen overleven. Het volgende voorbeeld laat het inloggen via FTP en het uploaden van een bestand zien. Dit voorbeeld gebruikt de user1 gebruiker van het vorige voorbeeld, waarin user1 de specifieke eigenaar van de /myftp/pub/ map wordt: 1. Voer cd ~/ om naar jouw persoonlijke map te gaan. Voer daarna mkdir myftp uit om een map aan te maken om bestanden op te slaan die met FTP ge-upload worden. 2. Voer cd ~/myftp om naar de ~/myftp/ map te gaan. In deze map maak je een ftpupload bestand aan. Kopieer de volgende inhoud naar dit bestand:
File upload via FTP from a home directory.
3. Voer getsebool allow_ftpd_anon_write om te bevestigen dat de allow_ftpd_anon_write Boolean aangezet is:
$ getsebool allow_ftpd_anon_write allow_ftpd_anon_write --> on
Als deze Boolean uit is, voer je setsebool -P allow_ftpd_anon_write on uit als de root gebruiker om het aan te zetten. Gebruik de -P optie niet als je niet wilt dat de verandering opnieuw opstarten overleeft. 4. Voer service vsftpd start uit als de root gebruiker om vsftpd te starten:
# service vsftpd start Starting vsftpd for vsftpd:
[
OK
]
5. Voer ftp localhost uit. Als je gevraagd wordt naar een gebruikersnaam, vul je de gebruikersnaam in van de gebruiker die schrijf toegang heeft, en daarna vul je het juiste wachtwoord in voor die gebruiker:
$ ftp localhost Connected to localhost (127.0.0.1). 220 (vsFTPd 2.1.0) Name (localhost:username): 331 Please specify the password. Password: Enter the correct password 230 Login successful.
42
Uploaden naar een FTP site
Remote system type is UNIX. Using binary mode to transfer files. ftp>
43
44
Network File System 1
Uit de Red Hat Linux Reference Guide : NFS (Network File System) staat hosts toe om partities aan te koppelen op een systeem op afstand en deze te gebruiken alsof ze locale bestandssystemen zijn. Dit staat een systeem beheerder toe om hulpbronnen op te slaan in een centrale locatie op het netwerk, en gemachtigde gebruikers er continue toegang tot te bieden. In Fedora is het nfs-utils pakket vereist voor volledige NFS ondersteuning. Voer rpm -q nfs-utils uit om te kijken of nfs-utils geïnstalleerd is. Als het niet geïnstalleerd is en je wilt NFS gebruiken, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install nfs-utils
7.1. NFS en SELinux Als SELinux draait worden de NFS daemons standaard beperkt. SELinux tactiek staat standaard NFS niet toe om bestanden te delen. Als je NFS partities wilt delen, kan dit ingesteld worden met de nfs_export_all_ro en nfs_export_all_rw Booleans, zoals hieronder beschreven. Deze Booleans zijn echter niet vereist als de te delen bestanden gelabeld zijn met de public_content_t of public_content_rw_t types. NFS kan bestanden gelabeld met deze types delen zelfs als de nfs_export_all_ro en nfs_export_all_rw Booleans uitgezet zijn.
7.2. Types Standaard worden op de cliënt zijde aangekoppelde NFS bestandssystemen gelabeld met een standaard context gedefinieerd door tactiek voor NFS bestandssystemen. In algemene tactieken gebruikt deze standaard context het nfs_t type. De volgende types worden met NFS gebruikt. Verschillende types staan je toe om toegang flexibel te configureren: var_lib_nfs_t Dit type wordt gebruikt voor bestaande en nieuwe bestanden gekopieerd naar of aangemaakt in de /var/lib/nfs map. Voor normale werking hoeft dit type niet veranderd te worden. Om veranderingen in de standaard instelling te herladen, gebruik je het restorecon -R -v /var/ lib/nfs commando als de root gebruiker. nfsd_exec_t Het /usr/sbin/rpc.nfsd bestand wordt gelabeld met het nfsd_exec_t type, net zoals andere uitvoerbare systeem programma's en bibliotheken gerelateerd aan NFS. Gebruikers moet geen bestanden met dit type labelen. nfsd_exec_t zal overgaan naar nfs_t.
7.3. Booleans SELinux is gebaseerd op het laagste niveau van toegang vereist voor een service om te draaien. Services kunnen draaien op een aantal manieren, je moet daarom SELinux vertellen hoe je services draait. De volgende Booleans staan je toe om SELinux te vertellen hoe je NFS draait: 1
http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/ref-guide/ch-nfs.html
45
Hoofdstuk 7. Network File System
allow_ftpd_use_nfs Als deze Boolean aangezet is, krijgt ftpd toegang tot NFS aankoppelingen. allow_nfsd_anon_write Als deze Boolean aangezet is, wordt het nfsd toegestaan om anoniem naar een publieke map te schrijven ; zoals naar een gebied gereserveerd voor algemene bestanden die op een andere manier geen speciale toegang beperkingen hebben. httpd_use_nfs Als deze Boolean aangezet is, krijgt httpd toegang tot bestanden opgeslagen op een NFS bestandssysteem. nfs_export_all_ro Exporteer alle bestanden of mappen met NFS met alleen het toestaan van lees rechten. nfs_export_all_rw Exporteer alle bestanden of mappen met NFS met het toestaan van lees en schrijf rechten. qemu_use_nfs Sta qemu toe NFS bestandssystemen te gebruiken. samba_share_nfs Als deze Boolean uitgezet is, wordt smbd belet om via Samba volledige toegang te krijgen tot NFS delingen. Deze Boolean aanzetten staat Samba toe om NFS bestandssystemen te delen. use_nfs_home_dirs Het aanzetten van deze Boolean voegt ondersteuning voor NFS persoonlijke mappen toe. virt_use_nfs Sta virt toe om NFS bestanden te gebruiken. xen_use_nfs Sta xen toe om NFS bestanden te beheren.
7.4. Configuratie voorbeelden 7.4.1. Mappen delen met NFS Het voorbeeld in deze paragraaf maakt een map aan en deelt deze met gebruik van NFS en SELinux. Twee hosts worden in dit voorbeeld gebruikt; een NFS server met hostnaam nfs-srv en een IP adres 192.168.1.1, en een cliënt met hostnaam nfs-client en een IP adres 192.168.1.100. Beide host zijn op hetzelfde sub-net (192.168.1.0/24). Dit is slechts een voorbeeld en neemt aan dat het nfs-utils geïnstalleerd is, en dat de SELinux gerichte tactiek gebruikt wordt, en dat SELinux draait in de afdwingende mode. Dit voorbeeld zal laten zien dat zelfs met een volledig beschikbaar netwerk en Linux rechten die toegang via NFS toestaan aan alle gebruikers, SELinux in staat is om aankoppelen van NFS bestandssystemen te blokkeren behalve als de juiste rechten zijn gegeven met SELinux Booleans.
7.4.1.1. Server instelling De stappen 1-10 hieronder moeten uitgevoerd worden op de NFS server, nfs-srv.
46
Mappen delen met NFS
1. Voer het setsebool commando uit om lees/schrijf aankoppelen van NFS bestandssystemen uit te zetten: setsebool -P nfs_export_all_rw off
Opmerking Gebruik de -P optie niet als je niet wilt dat setsebool veranderingen opnieuw opstarten kunnen overleven. 2. Voer rpm -q nfs-utils uit om te bevestigen dat het nfs-utils pakket geïnstalleerd is. Het nfsutils pakket biedt ondersteuning programma's voor het gebruik van NFS en moet geïnstalleerd zijn op een NFS server en op alle cliënten die gebruikt worden. Als dit pakket niet geïnstalleerd is, installeer je het met het uitvoeren van yum install nfs-utils als de root gebruiker. 3. Voer mkdir /myshare uit als de root gebruiker om een nieuwe top niveau map aan te maken voor het delen met gebruik van NFS. 4. Voer touch /myshare/file1 uit als de root gebruiker om een nieuw leeg bestand aan te maken in het gedeelde gebied. De cliënt zal later toegang krijgen tot dit bestand. 5. Om te laten zien dat SELinux nog steeds in staat is om toegang te blokkeren zelfs als de Linux rechten helemaal open zijn, geef je de /myshare map volledige Linux toegang rechten voor alle gebruikers. # chmod -R 777 /myshare
Waarschuwing Dit is slechts een voorbeeld en deze rechten moeten in een productie systeem niet gebruikt worden. 6. Bewerk het /etc/exports bestand en voeg de volgende regel toe bovenin het bestand:
/myshare \t192.168.1.100(rw)
Deze ingang laat het volledige pad naar de gedeelde map /myshare op de server zien, de host of netwerk reeks waarmee nfs-srv zal delen (in dit geval het IP adres van een enkele host, nfs-client op 192.168.1.100), en tenslotte de deel rechten. Hier zijn lees en schrijf rechten gegeven, zoals aangegeven met (rw). 7. De TCP en UDP poorten gebruikt voor NFS worden dynamisch toegekend door rpcbind, wat problemen kan veroorzaken met het creëren van firewall regels. Om het proces van het toestaan van NFS verkeer door de firewall in dit voorbeeld eenvoudiger te maken, bewerk je het /etc/sysconfig/nfs bestand en verwijder je de commentaar tekens bij de MOUNTD_PORT,STATD_PORT,LOCKD_TCPPORT en LOCKD_UDPPORT variabelen. Het veranderen van de poort nummers is in dit voorbeeld niet vereist.
47
Hoofdstuk 7. Network File System
Verzeker je ervan dat binnenkomende verbindingen op TCP poorten 111, 892 en 2049 toegestaan worden door de firewall van de server. Dit kan bereikt worden met het system-config-firewall gereedschap in Fedora. 8. Voer service nfs start uit als de root gebruiker om NFS en zijn gerelateerde services te starten:
# service nfs start Starting NFS services:\t\t[ OK ] Starting NFS quotas:\t\t[ OK ] Starting NFS daemon:\t\t[ OK ] Starting NFS mountd:\t\t[ OK ]
9. Om er zeker van te zijn dat de NFS subsysteem export tabel vernieuwd wordt, voer je exportfs -rv uit als de root gebruiker:
# exportfs -rv exporting 192.168.1.100:/myshare
10. Voer showmount -e uit als de root gebruiker om alle geëxporteerde bestandssystemen te laten zien:
# showmount -e Export list for nfs-srv: /myshare 192.168.1.100
Op dit punt aangekomen is de server nfs-srv geconfigureerd om NFS communicatie toe te staan aan nfs-client op 192.168.1.100, en volledige Linux bestandssysteem rechten zijn geactiveerd. Als SELinux uitgezet was, zou de de cliënt instaat zijn om deze deling aan te koppelen en er volledige toegang tot hebben. Omdat echter de nfs_export_all_rw Boolean uitgezet is, is de cliënt op dit moment niet in staat om dit bestandssysteem aan te koppelen, zoals hieronder getoond wordt. Deze stap moet uitgevoerd worden op de cliënt, nfs-client:
[nfs-client]# mkdir /myshare [nfs-client]# mount.nfs 192.168.1.1:/myshare /myshare mount.nfs: access denied by server while mounting 192.168.1.1:/myshare/
Zet de SELinux Boolean aan die in stap 1 hierboven uitgezet werd, en de cliënt zal in staat zijn om het gedeelde bestandssysteem succesvol aan te koppelen. Deze stap moet uitgevoerd worden op de NFS server, nfs-srv:
[nfs-srv]# setsebool -P nfs_export_all_rw on\t\t\t\t
Probeer nu het NFS bestandssysteem opnieuw aan te koppelen. Deze stap moet uitgevoerd worden op de NFS cliënt, nfs-client:
[nfs-client]# mount.nfs 192.168.1.1:/myshare /myshare
48
Mappen delen met NFS
[nfs-client]# [nfs-client]# ls /myshare total 0 -rwxrwxrwx. 1 root root 0 2009-04-16 12:07 file1 [nfs-client]#
Het bestandssysteem is succesvol aangekoppeld door de cliënt. Dit voorbeeld laat zien hoe SELinux een extra laag bescherming toevoegt en kan nog steeds SELinux rechten forceren zelfs als Linux rechten ingesteld zijn om volledige rechten aan alle gebruikers te geven.
49
50
Berkeley Internet Naam Domein BIND voert naam oplossing services aan via de named daemon. BIND laat gebruikers compuer hulpbronnen en services lokaliseren volgens naam in plaats van numerieke adressen. In Fedora biedt het bind pakket een DNS server. Voer rpm -q bind uit om te kijken of het bind pakket geïnstalleerd is. Als het niet geïnstalleerd is en je wilt BIND gebruiken, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install bind
8.1. BIND en SELinux De standaard rechten voor de /var/named/slaves,/var/named/dynamic en /var/named/ data mappen staan toe dat zone bestanden vernieuwd mogen worden met zone overdrachten en dynamische DNS vernieuwingen. Bestanden in /var/named zijn gelabeld met het name_zone_t type, welke gebruikt wordt voor meester zone bestanden. Voor een slaaf server configureer je /etc/named.conf om slaaf zones in /var/named/slaves te plaatsen. Het volgende is een voorbeeld van een domein ingang in /etc/named.conf voor een slaaf DNS server die de zone bestanden voor testdomain.com opslaat in /var/named/slaves:
zone "testdomain.com" { \t\t\ttype slave; \t\t\tmasters { IP-address; }; \t\t\tfile "/var/named/slaves/db.testdomain.com"; \t\t };
Als een zone bestand gelabeld is met name_zone_t, moet de named_write_master_zones Boolean aangezet worden om toe te staan dat zone overdrachten en dynamische DNS het zone bestand vernieuwen. De mode van de ouder map moet ook veranderd worden om de named gebruiker of groep lees, schrijf en uitvoer toegang toe te staan. Als zone bestanden in /var/named/ gelabeld zijn met het name_cache_t type, zal een bestandssysteem her-labelen of het uitvoeren van restorecon -R /var/ hun type veranderen naar named_zone_t.
8.2. Types De volgende types worden gebruikt met BIND. Verschillende types staan je toe om een flexibele toegang te configureren. named_zone_t Gebruikt voor meester zone bestanden. Andere services kunnen bestanden van dit type niet veranderen. named kan alleen bestanden van dit type veranderen als de named_write_master_zones Boolean aangezet is. named_cache_t Standaard kan named schrijven naar bestanden gelabeld met dit type, zonder dat extra Booleans aangezet zijn. Bestanden gekopieerd of aangemaakt in de /var/named/slaves,/var/
51
Hoofdstuk 8. Berkeley Internet Naam Domein
named/dynamic en /var/named/data mappen worden automatisch gelabeld met het named_cache_t type.
8.3. Booleans SELinux is gebaseerd op het laagste niveau van toegang vereist door een service om te draaien. Services kunnen op verschillende manieren gedraaid worden; je moet daarom SELinux vertellen hoe je services draait. De volgende Booleans staan je toe om SELinux te vertellen hoe je BIND draait: named_write_master_zones Als deze Boolean uitgezet is wordt named belet om te schrijven naar zone bestanden of mappen gelabeld met het named_zone_t type. named hoeft gewoonlijk niet naar zone bestanden te schrijven; maar in het geval dat dit nodig is, of als een secundaire server naar zone bestnaden moet schrijven, moet je deze Boolean aanzetten om dit toe te staan.
8.4. Configuratie voorbeelden 8.4.1. Dynamische DNS BIND staat hosts toe om hun records in DNS en zone bestanden dynamisch te vernieuwen. Dit wordt gebruikt als het IP adres van een host computer vaak verandert en het DNS record real-time aanpassing vereist. Gebruik de /var/named/dynamic map voor zone bestanden die je wilt vernieuwen via dynamische DNS. Bestanden aangemaakt in of gekopieerd naar/var/named/dynamic erven Linux rechten die toestaan dat named naar hen schrijft. Als zulke bestanden gelabeld zijn met het named_cache_t type, staat SELinux named toe om naar deze bestanden te schrijven. Als een zone bestand in /var/named/dynamic is gelabeld met het named_zone_t type, kunnen dynamische DNS vernieuwingen niet succesvol zijn tijdens een bepaalde tijdsperiode omdat de vernieuwing naar een journaal bestand moet worden geschreven voordat het toegevoegd wordt. Als het zone bestand gelabeld is met het named_zone_t type en de journaal probeert zich toe te voegen, wordt een fout lijkend op de volgende gelogd in /var/log/messages:
named[PID]: dumping master file: rename: /var/named/dynamic/zone-name: permission denied
Bovendien wordt de volgende SELinux weigering gelogd naar /var/log/messages:
setroubleshoot: SELinux is preventing named (named_t) "unlink" to zone-name (named_zone_t)
Om dit label probleem op te lossen, voer je het restorecon -R -v /var/named/dynamic commando uit als de Linux root gebruiker.
52
Concurrent Versioning System De Concurrent Versioning System (CVS) is een vrij revisie controle systeem. Het wordt gebruikt voor het monitoren en bijhouden van veranderingen aan een set bestanden waar gewoonlijk meerdere verschillende gebruikers toegang tot hebben. Het wordt veel gebruikt door programmeurs voor het beheren van een broncode repository en wordt veel gebruikt door open bron programmeurs. In Fedora biedt het cvs pakket CVS. Voer rpm -q cvs uit om te kijken of het cvs pakket geïnstalleerd is. Als het niet geïnstalleerd is en je wilt CVS gebruiken, voer je het volgende commando uit als de root gebruiker om te installeren:
yum install cvs
9.1. CVS en SELinux De cvs daemon draait als cvs_t. Het is CVS standaard in Fedora alleen maar toegestaan in bepaalde mappen te lezen en te schrijven. De label cvs_data_t definieert tot welke gebieden de cvs daemon lees en schrijf toegang heeft. Als CVS gebruikt wordt met SELinux, is het toekennen van de correcte label essentieel voor cliënten om volledige toegang te hebben naar het gebied gereserveerd voor CVS data.
9.2. Types De volgende types worden gebruikt met CVS. Verschillende types staan je toe om een flexibele toegang te configureren. cvs_data_t Dit type wordt gebruikt voor data in een CVS repository. CVS heeft alleen volledige toegang tot data als het dit type heeft. cvs_exec_t Dit type wordt gebruikt voor het /usr/bin/cvs binaire programma.
9.3. Booleans SELinux is gebaseerd op het laagste niveau van toegang vereist door een service om te draaien. Services kunnen op verschillende manieren gedraaid worden; je moet daarom SELinux vertellen hoe je services draait. De volgende Booleans staan je toe om SELinux te vertellen hoe je CVS draait: allow_cvs_read_shadow Deze Boolean staat de cvs daemon toegang toe tot het /etc/shadow bestand voor gebruiker authenticatie.
9.4. Configuratie voorbeelden 9.4.1. CVS instellen Dit voorbeeld beschrijft een eenvoudige CVS instelling en en SELinux configuratie welke toegang op afstand toestaat. Twee hosts worden gebruikt in dit voorbeeld; een CVS server met de host
53
Hoofdstuk 9. Concurrent Versioning System
naam cvs-srv en een IP adres 192.168.1.1 en een cliënt met een host naam cvs-client en een IP adres 192.168.1.100. Dit is slechts een voorbeeld en neemt aan dat de cvs en xinetd pakketten geïnstalleerd zijn, dat de SELinux gerichte tactiek gebruikt wordt, en dat SELinux draait in de afdwingende mode. Dit voorbeeld zal laten zien dat zelfs met volledige DAC rechten, SELinux nog steeds tactiek regels kan forceren die gebaseerd zijn op bestand labels en alleen toegang toestaan tot bepaalde gebieden die specifiek gelabeld zijn voor toegang door CVS.
9.4.2. Server instelling Opmerking De stappen 1-9 moeten uitgevoerd worden op de CVS server, cvs-srv.
1. Als de root gebruiker installeer je de cvs and xinetd pakketten. Voer rpm -q cvs uit om te kijken of het cvs pakket geïnstalleerd is. Als het niet geïnstalleerd is voer je yum install cvs uit als de root gebruiker om het te installeren. Voer rpm -q xinetd uit om te kijken of het xinetd pakket geïnstalleerd is. Als het niet geïnstalleerd is voer je yum install xinetd uit als de root gebruiker om het te installeren. 2. Maak een groep aan met de naam CVS. Dit kan gedaan worden met het groupadd CVS commando als de root gebruiker, of met gebruik van het system-config-users gereedschap. 3. Maak een gebruiker aan met een gebruikersnaam cvsuser en maak deze gebruiker lid van de CVS groep. Dit kan gedaan worden met het system-config-users gereedschap. 4. Bewerk het /etc/services bestand en wees er zeker van dat de CVS server nietuitgecommentatieerde ingangen heeft die lijken op de volgende:
cvspserver\t2401/tcp\t\t\t# CVS client/server operations cvspserver\t2401/udp\t\t\t# CVS client/server operations
5. Maak de CVS repository aan in het root gebied van het bestandssysteem. Als SELinux gebruikt wordt, is het het beste om de repository in het root bestandssysteem te plaatsen zodat er recursieve labels aangegeven kunnen worden zonder dat andere sub-mappen beïnvloed worden. Bijvoorbeeld, als de root gebruiker maak je een /cvs map aan om de repository te huisvesten:
[root@cvs-srv]# mkdir /cvs
6. Geef volledige rechten aan de /cvs map voor alle gebruikers:
[root@cvs-srv]# chmod -R 777 /cvs
54
Server instelling
Waarschuwing Dit is slechts een voorbeeld en deze rechten moeten niet gebruikt worden in een productie systeem. 7. Bewerk het /etc/xinetd.d/cvs bestand en wees er zeker van dat de CVS sectie niet uitgecommentatieerd is en geconfigureerd om de /cvs map te gebruiken. Dit bestand moet op het volgende lijken:
service cvspserver { \tdisable\t= no \tport\t\t\t= 2401 \tsocket_type\t\t= stream \tprotocol\t\t= tcp \twait\t\t\t= no \tuser\t\t\t= root \tpassenv\t\t\t= PATH \tserver\t\t\t= /usr/bin/cvs \tenv\t\t\t= HOME=/cvs \tserver_args\t\t= -f --allow-root=/cvs pserver #\tbind\t\t\t= 127.0.0.1
8. Start de xinetd daemon door het uitvoeren van service xinetd start als de root gebruiker. 9. Voeg een regel toe welke binnenkomende verbindingen toestaat om TCP te gebruiken op poort 2401 met gebruik van het system-config-firewall gereedschap. 10. Als de cvsuser gebruiker, voer je het volgende commando uit:
[cvsuser@cvs-client]$ cvs -d /cvs init
11. Op dit punt aangekomen is CVS geconfigureerd maar SELinux zal nog steeds inloggen en bestand toegang weigeren. Om dit te laten zien, stel je de $CVSROOT variabele in op cvsclient en je probeert op aftand in te loggen. De volgende stap moet uitgevoerd worden op cvsclient:
[cvsuser@cvs-client]$ export CVSROOT=:pserver:
[email protected]:/cvs [cvsuser@cvs-client]$ [cvsuser@cvs-client]$ cvs login Logging in to :pserver:
[email protected]:2401/cvs CVS password: ******** cvs [login aborted]: unrecognized auth response from 192.168.100.1: cvs pserver: cannot open /cvs/CVSROOT/config: Permission denied
SELinux heeft toegang geblokkeerd. Om SELinux deze toegang toe te laten staan, moet de volgende stap uitgevoerd worden op cvs-srv: 12. Verander de context van de /cvs map als de root gebruiker om alle bestaande en nieuwe data in de /cvs map recursief te labelen met het cvs_data_t type:
55
Hoofdstuk 9. Concurrent Versioning System
[root@cvs-srv]# semanage fcontext -a -t cvs_data_t '/cvs(/.*)?' [root@cvs-srv]# restorecon -R -v /cvs
13. De cliënt, cvs-client moet nu in staat zijn om in te loggen en toegang te krijgen tot alle CVS hulpbronnen in de repository:
[cvsuser@cvs-client]$ export CVSROOT=:pserver:
[email protected]:/cvs [cvsuser@cvs-client]$ [cvsuser@cvs-client]$ cvs login Logging in to :pserver:
[email protected]:2401/cvs CVS password: ******** [cvsuser@cvs-client]$
56
Squid Caching Proxy 1
Uit de Squid Caching Proxy project pagina: "Squid is een caching proxy voor het Web met ondersteuning van HTTP, HTTPS, FTP, en andere. Het reduceert bandbreedte en verbetert response tijden door het opslaan en hergebruiken van vaak aangevraagde web pagina's. Squid heeft uitgebreide toegang controles en is een goede server versneller." In Fedora biedt het squid pakket de Squid Caching Proxy. Voer rpm -q squid uit om te kijken of het squid pakket geïnstalleerd is. Als het niet geïnstalleerd is en je wilt squid gebruiken, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install squid
10.1. Squid Caching Proxy en SELinux Als SELinux is aangezet, draait squid standaard beperkt. Beperkte processen draaien in hun eigen domein, en zijn gescheiden van andere beperkte processen. Als een beperkt proces in gevaar wordt gebracht door een aanvaller is de toegang van een aanvaller tot hulpbronnen en de mogelijke schade die ze kunnen veroorzaken beperkt, afhankelijk van de SELinux tactiek configuratie. Het volgende voorbeeld laat zien hoe squid processen in hun eigen domein draaien. Dit voorbeeld veronderstelt dat het squid pakket geïnstalleerd is: 1. Voer getenforce uit om te bevestigen dat SELinux in de afdwingende mode draait:
$ getenforce Enforcing
Het getenforce commando geeft Enforcing terug als SELinux in de afdwingende mode draait. 2. Voer service squid start uit als de rot gebruiker om squid te starten:
# service squid start Starting squid:
[
OK
]
3. Voer ps -eZ | grep squid uit om de squid processen te bekijken:
$ ps -eZ | grep squid unconfined_u:system_r:squid_t:s0 unconfined_u:system_r:squid_t:s0 unconfined_u:system_r:squid_t:s0 unconfined_u:system_r:squid_t:s0 unconfined_u:system_r:squid_t:s0 unconfined_u:system_r:squid_t:s0 unconfined_u:system_r:squid_t:s0 unconfined_u:system_r:squid_t:s0 1
2522 2524 2526 2527 2528 2529 2530 2531
? ? ? ? ? ? ? ?
00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00
squid squid ncsa_auth ncsa_auth ncsa_auth ncsa_auth ncsa_auth unlinkd
http://www.squid-cache.org/
57
Hoofdstuk 10. Squid Caching Proxy
De SELinux context geassocieerd met de squid processen is unconfined_u:system_r:squid_t:s0. Het een na laatste deel van de context, squid_t, is het type. Een type definieert een domein voor processen en een type voor bestanden. In dit geval draaien de squid processen in het squid_t domein. SELinux tactiek definieert hoe processen draaien in beperkte domeinen, zoals squid_t, hoe ze interactie hebben met bestanden, andere processen, en het systeem in het algemeen. Bestanden moeten correct gelabeld zijn om squid toe te staan er toegang tot te hebben. Als /etc/squid/squid.conf geconfigureerd is zodat squid luistert op een poort anders dan de standaard TCP poorten 3128, 3401 of 4827, moet het semanage port commando gebruikt worden om het vereiste poort nummer toe te voegen aan de SELinux tactiek configuratie. Het volgende voorbeeld demonstreert het configureren van squid om te luisteren op een poort die initieel niet gedefinieerd is in de SELinux configuratie voor squid, en daarom zal squid niet opstarten. Dit voorbeeld laat ook zien hoe je daarna het SELinux systeem configureert om squid toe te staan om met succes te luisteren op een niet-standaard poort die nog niet in de tactiek gedefinieerd is. Dit voorbeeld neemt aan dat het squid pakket geïnstalleerd is. Voer elk commando in dit voorbeeld uit als de root gebruiker: 1. Voer service squid status uit om te bevestigen dat squid niet draait:
# service squid status squid is stopped
Als de output ander is, voer je service squid stop uit om het proces te stoppen:
# service squid stop Stopping squid:
[
OK
]
2. Voer semanage port -l | grep -w squid_port_t uit om de poorten te bekijken waarop SELinux squid toestaat om te luisteren:
semanage port -l | grep -w -i squid_port_t squid_port_t tcp 3128, 3401, 4827 squid_port_t udp 3401, 4827
3. Bewerk /etc/squid/squid.conf als de root gebruiker. Configureer de http_port optie zodat het een poort laat zien die niet geconfigureerd is in de SELinux tactiek configuratie voor squid. In dit voorbeeld wordt squid geconfigureerd om te luisteren op poort 10000:
# Squid normally listens to port 3128 http_port 10000
4. Voer service squid start uit om squid te starten:
# service squid start Starting squid: ....................
58
[FAILED]
Types
Een SELinux weigering lijkend op het volgende wordt gelogd naar /var/log/messages:
localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port 1000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982
5. Om SELinux squid toe te staan te luisteren op poort 10000, zoals gebruikt in dit voorbeeld, is het volgende commando vereist:
# semanage port -a -t squid_port_t -p tcp 10000
6. Voer service squid start opnieuw uit om squid te starten en het op de nieuwe poort te laten luisteren:
# service squid start Starting squid:\t\t\t\t\t\t
[
OK
]
7. Nu SELinux geconfigureerd is om squid toe te staan om op een niet-standaard poort (TCP 10000 in dit geval) te luisteren, start squid met succes op voor deze poort.
10.2. Types Type afdwinging is de hoofd rechten controle gebruikt in de SELinux gerichte tactiek. Alle bestanden worden gelabeld met een type: types definiëren een domein voor processen en een type voor bestanden. SELinux tactiek regels definiëren hoe types toegang tot elkaar hebben, of het nu een domein is dat toegang heeft tot een type of een domein dat toegang heeft tot een ander domein. Toegang wordt alleen toegestaan als er een specifieke SELinux tactiek regel bestaat die dat toestaat. De volgende types worden gebruikt voor squid. Verschillende types staan je toe om toegang flexibel te configureren: httpd_squid_script_exec_t Dit type wordt gebruikt voor gereedschappen zoals cachemgr.cgi, welke een verscheidenheid aan statistiek geeft over squid en zijn configuratie. squid_cache_t Gebruik dit type voor data die opgeslagen wordt door squid, zoals gedefinieerd door de cache_dir instructie in /etc/squid/squid.conf. Standaard worden bestanden aangemaakt in of gekopieerd naar /var/cache/squid en /var/spool/squid gelabeld 2 met het squid_cache_t type. Bestanden voor de squidGuard URL redirector plug-in voor squid aangemaakt in of gekopieerd naar /var/squidGuard worden ook gelabeld met het squid_cache_t type. Squid is alleen in staat om bestanden en mappen te gebruiken die gelabeld zijn met dit type voor de opgeslagen data. squid_conf_t Dit type wordt gebruikt voor de mappen en bestanden die squid gebruikt voor zijn configuratie. Bestaande bestanden, of degene die aangemaakt worden in of gekopieerd naar /etc/squid en /usr/share/squid worden gelabeld met dit type, inclusief fout boodschappen en iconen. 2
http://www.squidguard.org/
59
Hoofdstuk 10. Squid Caching Proxy
squid_exec_t Dit type wordt gebruikt voor het squid binaire programma, /usr/sbin/squid. squid_log_t Dit type wordt gebruikt voor logs. Bestaande bestanden, of degene die aangemaakt worden in of gekopieerd naar /var/log/squid of /var/log/squidGuard moeten gelabeld zijn met dit type. squid_initrc_exec_t Dit type wordt gebruikt voor het initialisatie bestand vereist om squid op te starten, welke zich bevindt in /etc/rc.d/init.d/squid. squid_var_run_t Dit type wordt gebruikt door bestanden in /var/run, in het bijzonder de proces id (PID) met de naam /var/run/squid.pid welke wordt aangemaakt door squid als deze draait.
10.3. Booleans SELinux is gebaseerd op het laagste niveau van toegang vereist voor een service om te draaien. Services kunnen draaien op een aantal manieren, je moet daarom SELinux vertellen hoe je services draait. De volgende Booleans staan je toe om SELinux te vertellen hoe je Squid draait: squid_connect_any Als deze Boolean aangezet is heeft squid toestemming om een verbinding te initiëren naar een host op afstand op elke poort. squid_use_tproxy Als deze Boolean aangezet is kan Squid draaien als een transparante proxy.
10.4. Configuratie voorbeelden 10.4.1. Squid laten verbinden met niet-standaard poorten Het volgende voorbeeld biedt een praktijk demonstratie hoe SELinux Squid completeert door het afdwingen van bovenstaande Boolean en standaard alleen toegang toestaat tot bepaalde poorten. Dit voorbeeld zal dan laten zien hoe je de Boolean verandert en laat zien dat toegang dan wel toegestaan is. Merk op dat dit slechts een voorbeeld is en laat zien hoe SELinux invloed kan hebben op een eenvoudige configuratie van Squid. Uitvoerige documentatie is buiten het bestek van dit document. 3 Refereer naar de officiële Squid documentatie voor verdere details. Dit voorbeeld neemt aan dat de Squid host twee netwerk interfaces heeft, Internet toegang, en dat de firewall geconfigureerd is om toegang toe te staan op de interne interface met gebruik van de standaard TCP poort waarop Squid luistert (TCP 3128). 1. Als de root gebruiker installeer je het squid pakket. Voer rpm -q squid uit om te kijken of het squid pakket geïnstalleerd is. Als het niet geïnstalleerd is, voer je yum install squid uit als de root gebruiker om het te installeren. 3
http://www.squid-cache.org/Doc/
60
Squid laten verbinden met niet-standaard poorten
2. Bewerk het hoofd configuratie bestand /etc/squid/squid.conf en bevestig dat de cache_dir instructie niet uitgecommentarieerd is en lijkt op het volgende:
cache_dir ufs /var/spool/squid 100 16 256
Deze regel specificeert de standaard instelling voor de cache_dir instructie die gebruikt wordt in dit vorbeeld, het bestaat uit het Squid opslag formaat (ufs), de map op het systeem waar de cache zich bevindt (/var/spool/squid), de hoeveelheid schijf ruimte in megabytes die gebruikt wordt voor de cache (100), en tenslotte het aantal eerste-niveau en tweede-niveau cache mappen die gemaakt worden (respectievelijk 16 en 256). 3. Wees er zeker van dat in hetzelfde configuratie bestand de http_access allow localnet instructie niet uitgecommentarieerd is. Dit staat verkeer toe van de localnet ACL welke automatisch geconfigureerd wordt in een standaard installatie in Fedora 13. Het zal cliënt machines op elk bestaand RFC1918 netwerk toestaan om toegang te krijgen met behulp van de proxy, wat voldoende is voor dit eenvoudige voorbeeld. 4. Wees er zeker van dat in hetzelfde configuratie bestand de visible_hostname uitgecommentarieerd is en geconfigureerd is voor de host naam van de machine. De waarde moet de volledig gekwalificeerde domein naam (FQDN) van de host zijn:
visible_hostname squid.example.com
5. Als de root gebruiker voer je service squid start uit om squid te starten. Als dit de eerste keer is dat squid wordt opgestart, zal dit commando de cache mappen initialiseren zoals hierboven gespecificeerd met de cache_dir instructie en het zal daarna de squid daemon starten. De output is als volgt als squid met succes opgestart is:
# /sbin/service squid start init_cache_dir /var/spool/squid... Starting squid: .
[
OK
]
6. Bevestig dat de squid proces ID (PID) is gestart als een beperkte service, zoals hier te zien is door de squid_var_run_t waarde:
# ls -lZ /var/run/squid.pid -rw-r--r--. root squid unconfined_u:object_r:squid_var_run_t:s0 /var/run/squid.pid
7. Op dit punt aangekomen is een cliënt machine verbonden met de localnet ACL zoals eerder geconfigureerd met succes in staat om de interne interface van deze host als proxy te gebruiken. Dit kan geconfigureerd worden in de instellingen voor alle web browsers, of systeem breed. Squid luistert nu op de standaard poort van de doel machine (TCP 3128), maar de doel machine zal alleen uitgaande verbindingen toestaan naar andere services op het Internet via algemene poorten. Dit is een tactiek die door SELinux gedefinieerd wordt. SELinux zal toegang tot nietstandaard poorten weigeren, zoals de volgende stap laat zien: 8. Als een cliënt een aanvraag doet met gebruik van een niet-standaard poort voor de Squid proxy zoals een website die luistert op poort 10000, zal een weigering lijkend op de volgende gelogd worden:
61
Hoofdstuk 10. Squid Caching Proxy
SELinux is preventing the squid daemon from connecting to network port 10000
9. Om deze toegang toe te staan, moet de squid_connect_any Boolean veranderd worden omdat het standaard uitgezet is. Om de squid_connect_any Boolean aan te zetten, voer je het volgende commando uit als de root gebruiker: # setsebool -P squid_connect_any on
Opmerking Gebruik de -P optie niet als je niet wilt dat setsebool veranderingen opnieuw opstarten kunnen overleven. 10. De cliënt zal nu in staat zijn om toegang te krijgen op niet-standaard poorten op het Internet omdat Squid nu toestaat om ten behoeve van zijn cliënten verbindingen op alle poorten te initiëren.
62
MySQL 1
Uit de MySQL project pagina: "De MySQL® database is de meest populaire open bron database ter wereld geworden dankzij zijn consistente snelle performance, hoge betrouwbaarheid en gemak in het gebruik. Het wordt op elk continent gebruikt -- Ja, zelfs op de Zuidpool! -- door zowel individuele Web ontwikkelaars als door vele van grootste en snelst groeiende organisaties ter wereld om tijd en geld te besparen bij het gebruik van hun Web sites met veel verkeer, kritieke systemen voor bedrijven en ingepakt software -waaronder industrie leiders zoals Yahoo!, Alcatel-Lucent, Google, Nokia, YouTube, en Zappos.com." In Fedora biedt het mysql-server pakket MySQL. Voer rpm -q mysql-server uit om te kijken of het mysql-server pakket geïnstalleerd is. Als het niet geïnstalleerd is, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install mysql-server
11.1. MySQL en SELinux Als SELinux is aangezet, draait MySQL standaard beperkt. Beperkte processen draaien in hun eigen domein, en zijn gescheiden van andere beperkte processen. Als een beperkt proces in gevaar wordt gebracht door een aanvaller is de toegang van een aanvaller tot hulpbronnen en de mogelijke schade die ze kunnen veroorzaken beperkt, afhankelijk van de SELinux tactiek configuratie. Het volgende voorbeeld laat zien hoe MySQL processen in hun eigen domein draaien. Dit voorbeeld veronderstelt dat het mysql pakket geïnstalleerd is: 1. Voer getenforce uit om te bevestigen dat SELinux in de afdwingende mode draait:
$ getenforce Enforcing
Het getenforce commando geeft Enforcing terug als SELinux in de afdwingende mode draait. 2. Voer service mysqld start uit als de root gebruiker om mysqld te starten:
# service mysqld start Initializing MySQL database: Starting MySQL:
Installing MySQL system tables... [ OK \t[ OK ]
]
3. Voer ps -eZ | grep mysqld uit om de mysqld processen te bekijken:
$ ps -eZ | grep mysqld unconfined_u:system_r:mysqld_safe_t:s0 6035 pts/1 00:00:00 mysqld_safe unconfined_u:system_r:mysqld_t:s0 6123 pts/1 00:00:00 mysqld
1
http://www.mysql.com/why-mysql/
63
Hoofdstuk 11. MySQL
De SELinux context geassocieerd met de mysqld processen is unconfined_u:system_r:mysqld_t:s0. Her een na laatste deel van de context, mysqld_t, is het type. Een type definieert een domein voor processen en een type voor bestanden. In dit geval draaien de mysqld processen in het mysqld_t domein.
11.2. Types Type afdwinging is de hoofd rechten controle gebruikt in de SELinux gerichte tactiek. Alle bestanden worden gelabeld met een type: types definiëren een domein voor processen en een type voor bestanden. SELinux tactiek regels definiëren hoe types toegang tot elkaar hebben, of het nu een domein is dat toegang heeft tot een type of een domein dat toegang heeft tot een ander domein. Toegang wordt alleen toegestaan als er een specifieke SELinux tactiek regel bestaat die dat toestaat. De volgende types worden gebruikt voor mysql. Verschillende types staan je toe om toegang flexibel te configureren: mysqld_db_t Dit type wordt gebruikt voor de locatie van de MySQL database. In Fedora 12 is de standaard locatie voor de database /var/lib/mysql, dit kan echter veranderd worden. Als de locatie van de MySQL database veranderd is, moet de nieuwe locatie gelabeld worden met dit type. Refereer naar het volgende voorbeeld voor instructies over het veranderen van de standaard database locatie en hoe je de nieuwe plaats correct labelt. mysqld_etc_t Dit type wordt gebruikt voor het MySQL hoofd configuratie bestand /etc/my.cnf en alle andere configuratie bestanden in de /etc/mysql map. mysqld_exec_t Dit type wordt gebruikt voor de mysqld daemon gelokaliseerd in /usr/libexec/mysqld, wat de standaard locatie is voor de MySQL daemon in Fedora 12. Andere systemen kunnen deze daemon gelokaliseerd hebben in /usr/sbin/mysqld welke ook gelabeld moeten worden met dit type. mysqld_initrc_exec_t Dit type wordt gebruikt voor het initialisatie bestand voor MySQL, die zich standaard in Fedora 12 bevindt op /etc/rc.d/init.d/mysqld. mysqld_log_t Log's voor MySQL moeten gelabeld worden met dit type voor juiste werking. Alle log bestanden in /var/log/ die overeen komen met de mysql.* wildcard moeten gelabeld zijn met dit type. mysqld_var_run_t Dit type wordt gebruikt voor bestanden in /var/run/mysqld, in het bijzonder de proces id (PID) met de naam /var/run/mysqld/mysqld.pid welke aangemaakt wordt door de mysqld daemon als deze draait. Dit type wordt ook gebruikt voor gerelateerde socket bestanden zoals / var/lib/mysql/mysql.sock. Bestanden zoals deze moeten correct gelabeld zijn voor een juiste werking als beperkte service.
64
Booleans
11.3. Booleans SELinux is gebaseerd op het laagste niveau van toegang vereist voor een service om te draaien. Services kunnen draaien op een aantal manieren, je moet daarom SELinux vertellen hoe je services draait. De volgende Booleans staan je toe om SELinux te vertellen hoe je MySQL draait: exim_can_connect_db Als deze Boolean aangezet is wordt het de exim mailer toegestaan om verbindingen naar een database server te initiëren. ftpd_connect_db Als deze Boolean aangezet is wordt het de ftp daemon toegestaan om verbindingen naar een database server te initiëren. httpd_can_network_connect_db Het aanzetten van deze Boolean is vereist voor een web server te laten communiceren met een database server.
11.4. Configuratie voorbeelden 11.4.1. Veranderen van de MySQL database locatie Bij gebruik van Fedora 12 is de standaard locatie waar MySQL zijn database opslaat /var/lib/ mysql. Dit is waar SELinux het standaard verwacht, en daarom is dit gebied al correct voor jou gelabeld met gebruik van het mysqld_db_t type. Het gebied waar de database zich bevindt kan gewijzigd worden afhankelijk van de individuele omgeving vereisten of voorkeuren, maar het is echter belangrijk dat SELinux af weet van deze nieuwe locatie - dus dat het correct gelabeld is. Dit voorbeeld legt uit hoe je de locatie van een MySQL database verandert en hoe je de nieuwe locatie labelt zodat SELinux zijn bescherming mechanismes nog steeds kan aanbieden aan de nieuwe locatie gebaseerd op zijn inhoud. Merk op dat dit slechts een voorbeeld is en laat zien hoe SELinux van invloed kan zijn op MySQL. Uitgebreide documentatie van MySQL valt buiten het bestek van dit document. Refereer naar de 2 officiële MySQL documentatie voor verdere details. Dit voorbeeld neemt aan dat het mysql-server pakket geïnstalleerd is en dat er een geldige databse is in de standaard locatie /var/lib/mysql. 1. Voer ls -lZ /var/lib/mysql uit om de SELinux context van de standaard database locatie voor mysql te bekijken:
# ls -lZ /var/lib/mysql drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 mysql
Dit laat mysqld_db_t zien wat het standaard context element is voor de locatie van database bestanden. Voor een juiste werking zal deze context handmatig toegepast moeten worden op de nieuwe database locatie die in dit voorbeeld gebruikt wordt: 2. Type mysqlshow -u root -p in en type het mysqld root wachtwoord in om de beschikbare databases te laten zien: 2
http://dev.mysql.com/doc/
65
Hoofdstuk 11. MySQL
# mysqlshow -u root -p Enter password: ******* +--------------------+ | Databases | +--------------------+ | information_schema | | mysql | | test | | wikidb | +--------------------+
3. Sluit de mysqld daemon af met service mysqld stop als de root gebruiker:
# service mysqld stop Stopping MySQL:
[
OK
]
4. Maak een nieuwe map aan voor de nieuwe locatie van de database(s). In dit voorbeeld wordt / opt/mysql gebruikt:
# mkdir -p /opt/mysql
5. Kopieer de database bestanden van de oude naar de nieuwe locatie:
# cp -R /var/lib/mysql/* /opt/mysql/
6. Verander de eigenaar van deze locatie om toegang toe te staan door de mysql gebruiker en groep. Dit stelt de traditionele Unix rechten in die SELinux nog steeds zal respecteren.
# chown -R mysql:mysql /opt/mysql
7. Voer ls -lZ /opt uit om de initiële context van de nieuwe map te bekijken:
# ls -lZ /opt drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0
mysql
De context usr_t van deze pas aangemaakte map is op dit moment niet geschikt voor SELinux als een locatie voor MySQL database bestanden. Zodra de context veranderd is, zal MySQL in dit gebuid correct werken. 8. Open het hoofd MySQL configuratie bestand /etc/my.cnf met een tekstverwerker en verander de datadir optie zodat het refereeert naar de nieuwe locatie. In dit voorbeeld moet de ingevulde waarde /opt/mysql zijn.
# ls -lZ /opt drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0
Sla dit bestand op en sluit af.
66
mysql
Veranderen van de MySQL database locatie
9. Voer service mysqld start uit als de root gebruiker om mysqld te starten. Nu zal een weigering gelogd worden naar /var/log/messages:
# service mysqld start Timeout error occurred trying to start MySQL Daemon. Starting MySQL:
[FAILED]
# tail -f /var/log/messages localhost setroubleshoot: SELinux is preventing mysqld (mysqld_t) "write" usr_t. For complete SELinux messages. run sealert -l 50d8e725-994b-499c-9caf-a676c50fb802
De reden voor deze weigering is dat /opt/mysql niet correct gelabeld is voor MySQL data bestanden. SELinux verhindert MySQL om toegang te krijgen tot de inhoud gelabeld met usr_t. Voer de volgende stappen uit om dit probleem op te lossen: 10. Voer het semanage commando uit om een context afbeelding voor /opt/mysql toe te voegen:
semanage fcontext -a -t mysqld_db_t "/opt/mysql(/.*)?"
11. Deze afbeelding wordt geschreven naar het /etc/selinux/targeted/contexts/files/ file_contexts.local bestand:
# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local /opt/mysql(/.*)?
system_u:object_r:mysqld_db_t:s0
12. Gebruik nu het restorecon commando om deze context afbeelding toe te passen op het draaiende systeem:
restorecon -R -v /opt/mysql
13. Nu de /opt/mysql locatie gelabeld is met de juiste context voor MySQL, start je de mysqld daemon:
# service mysqld start Starting MySQL:
[
OK
]
14. Bevestig dat de context voor /opt/mysql veranderd is:
ls -lZ /opt drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
15. De locatie is veranderd en gelabeld, en de mysqld daemon is met succes opgestart. Nu moeten alle draaiende services getest worden om hun normale werking te bevestigen.
67
68
PostgreSQL 1
Uit de PostgreSQL project pagina: "PostgreSQL is een krachtig, open bron object-relational database systeem. Het heeft meer dan 15 jaar actieve ontwikkeling en een bewezen architectuur dat een sterke reputatie voor betrouwbaarheid, data integriteit, en juistheid heeft verdiend." In Fedora biedt het postgresql-server pakket PostgreSQL. Voer rpm -q postgre-server uit om te kijken of het postgresql-server pakket geïnstalleerd is. Als het niet geïnstalleerd is, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install postgresql-server
12.1. PostgreSQL en SELinux Als SELinux is aangezet, draait PostgreSQL standaard beperkt. Beperkte processen draaien in hun eigen domein, en zijn gescheiden van andere beperkte processen. Als een beperkt proces in gevaar wordt gebracht door een aanvaller is de toegang van een aanvaller tot hulpbronnen en de mogelijke schade die ze kunnen veroorzaken beperkt, afhankelijk van de SELinux tactiek configuratie. Het volgende voorbeeld laat zien hoe PostgreSQL processen in hun eigen domein draaien. Dit voorbeeld veronderstelt dat het postgresql-server pakket geïnstalleerd is: 1. Voer getenforce uit om te bevestigen dat SELinux in de afdwingende mode draait:
$ getenforce Enforcing
Het getenforce commando geeft Enforcing terug als SELinux in de afdwingende mode draait. 2. Voer service postgresql start uit als de root gebruiker om postgresql te starten:
service postgresql start Starting postgresql service:
[
OK
]
3. Voer ps -eZ | grep postgres uit om de postgresql processen te bekijken:
ps -eZ | grep postgres unconfined_u:system_r:postgresql_t:s0 unconfined_u:system_r:postgresql_t:s0 unconfined_u:system_r:postgresql_t:s0 unconfined_u:system_r:postgresql_t:s0 unconfined_u:system_r:postgresql_t:s0 unconfined_u:system_r:postgresql_t:s0
395 397 399 400 401 402
? ? ? ? ? ?
00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00
postmaster postmaster postmaster postmaster postmaster postmaster
De SELinux context geassocieerd met de postgresql processen is unconfined_u:system_r:postgresql_t:s0. Her een na laatste deel van de context, 1
http://www.postgresql.org/about/
69
Hoofdstuk 12. PostgreSQL
postgresql_t, is het type. Een type definieert een domein voor processen en een type voor bestanden. In dit geval draaien de postgresql processen in het postgresql_t domein.
12.2. Types Type afdwinging is de hoofd rechten controle gebruikt in de SELinux gerichte tactiek. Alle bestanden worden gelabeld met een type: types definiëren een domein voor processen en een type voor bestanden. SELinux tactiek regels definiëren hoe types toegang tot elkaar hebben, of het nu een domein is dat toegang heeft tot een type of een domein dat toegang heeft tot een ander domein. Toegang wordt alleen toegestaan als er een specifieke SELinux tactiek regel bestaat die dat toestaat. De volgende types worden gebruikt voor postgresql. Verschillende types staan je toe om toegang flexibel te configureren: postgresql_db_t Dit type wordt gebruikt voor meerdere locaties. De locaties gelabeld met dit type worden gebruikt als data bestanden voor PostgreSQL: • /usr/lib/pgsql/test/regres • /usr/share/jonas/pgsql • /var/lib/pgsql/data • /var/lib/postgres(ql)? postgresql_etc_t Dit type wordt gebruikt voor configuratie bestanden in /etc/postgresql. postgresql_exec_t Dit type wordt gebruikt voor meerdere locaties. De locaties gelabeld met dit type worden gebruikt voor binaire programma's voor PostgreSQL: • /usr/bin/initdb(.sepgsql)? • /usr/bin/(se)?postgres • /usr/lib(64)?/postgresql/bin/.* • /usr/lib/phsql/test/regress/pg_regress postgresql_initrc_exec_t Dit type wordt gebruikt voor het PostgreSQL initialisatie bestand gelokaliseerd in /etc/rc.d/ init.d/postgresql. postgresql_log_t Dit type wordt gebruikt voor meerdere locaties. De locaties gelabeld met dit type worden gebruikt voor log bestanden: • /var/lib/pgsql/logfile • /var/lib/pgsql/pgstartup.log • /var/lib/sepgsql/pgstartup.log • /var/log/postgresql • /var/log/postgres.log.*
70
Booleans
• /var/log/rhdb/rhdb • /var/log/sepostgresql.log.* postgresql_var_run_t Dit type wordt gebruikt voor run-time bestanden voor PostgreSQL, zoals het proces id (PID) in / var/run/postgresql.
12.3. Booleans SELinux is gebaseerd op het laagste niveau van toegang vereist voor een service om te draaien. Services kunnen draaien op een aantal manieren, je moet daarom SELinux vertellen hoe je services draait. De volgende Booleans staan je toe om SELinux te vertellen hoe je PostgreSQL draait: allow_user_postgresql_connect Het aanzetten van deze Boolean staat elk gebruiker domein (zoals gedefinieerd ddor PostgreSQL) toe om verbindingen te maken met de database server.
12.4. Configuratie voorbeelden 12.4.1. Veranderen van de PostgreSQL database locatie Bij gebruik van Fedora 12 is de standaard locatie waar PostgreSQL zijn database opslaat /var/ lib/pgsql. Dit is waar SELinux het standaard verwacht, en daarom is dit gebied al correct voor jou gelabeld met gebruik van het postgresql_db_t type. Het gebied waar de database zich bevindt kan gewijzigd worden afhankelijk van de individuele omgeving vereisten of voorkeuren, maar het is echter belangrijk dat SELinux af weet van deze nieuwe locatie - dus dat het correct gelabeld is. Dit voorbeeld legt uit hoe je de locatie van een PostgreSQL database verandert en hoe je de nieuwe locatie labelt zodat SELinux zijn bescherming mechanismes nog steeds kan aanbieden aan de nieuwe locatie gebaseerd op zijn inhoud. Merk op dat dit slechts een voorbeeld is en laat zien hoe SELinux PostgreSQL kan beïnvloeden. Uitgebreide documentatie van PostgreSQL is buiten het bestek van dit document. Refereer naar de 2 officiële PostgreSQL documentatie voor verdere details. Dit voorbeeld neemt aan dat het postgresqlserver pakket geïnstalleerd is. 1. Voer ls -lZ /var/lib/pgsql uit om de SELinux context van de standaard database locatie voor postgresql te bekijken: # ls -lZ /var/lib/pgsql drwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 data
Dit laat postgresql_db_t zien wat het standaard context element is voor de locatie van database bestanden. Voor een juiste werking zal deze context handmatig toegepast moeten worden op de nieuwe database locatie die in dit voorbeeld gebruikt wordt: 2. Maak een nieuw map voor de nieuwe locatie van de database(s). In dit voorbeeld wordt /opt/ postgresql/data gebruikt. Als je een andere locatie gebruikt, vervang je de tekst in de volgende stappen met jouw locatie: 2
http://www.postgresql.org/docs/
71
Hoofdstuk 12. PostgreSQL
# mkdir -p /opt/postgresql/data
3. Maak een map lijst van de nieuwe locatie. Merk op dat de initiële context van deze nieuwe map usr_t is. Deze context is niet voldoende voor SELinux om zijn bescherming mechanismes aan te bieden aan PostgreSQL. Zodra de context is veranderd, zal het in staat zijn om correct te werken in het nieuwe gebied.
# ls -lZ /opt/postgresql/ drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0
data
4. Verander de eigenaar van de nieuwe locatie om toegang toe te staan door de postgres gebruiker en groep. Dit stelt de traditionele Unix rechten in die SELinux nog steeds zal respecteren.
# chown -R postgres:postgres /opt/postgresql
5. Open het PostgreSQL init bestand /etc/rc.d/init.d/postgresql met een tekstverwerker en verander alle PGDATA en PGLOG variabelen om naar de nieuwe locatie te wijzen:
# vi /etc/rc.d/init.d/postgresql PGDATA=/opt/postgresql/data PGLOG=/opt/postgresql/data/pgstartup.log
Sla dit bestand op en verlaat de tekstverwerker. 6. Initialiseer de database in de nieuwe locatie.
su - postgres -c "initdb -D /opt/postgresql/data"
7. Voer het semanage commando uit om een context afbeelding voor /opt/postgresql, en alle andere mappen/bestanden hierin, toe te voegen.
semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
8. Deze afbeelding wordt geschreven naar het /etc/selinux/targeted/contexts/files/ file_contexts.local bestand:
# grep -i postgresql /etc/selinux/targeted/contexts/files/file_contexts.local /opt/postgresql(/.*)?
system_u:object_r:postgresql_db_t:s0
9. Gebruik nu het restorecon commando om deze context afbeelding toe te passen op het draaiende systeem:
restorecon -R -v /opt/postgresql
72
Veranderen van de PostgreSQL database locatie
10. Nu de /opt/postgresql locatie gelabeld is met de juiste context voor PostgreSQL, zal de postgresql daemon succesvol starten:
# service postgresql start Starting postgreSQL service:
[
OK
]
11. Bevestig dat de context correct is voor /opt/postgresql:
ls -lZ /opt drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
12. Controleer met het ps commando dat het postgresql proces de nieuwe locatie laat zien:
# ps aux | grep -i postmaster postgres 21564 0.3 0.3 42308 5432 -D /opt/postgresql/data
4032 ?
S
10:13
0:00 /usr/bin/postmaster -p
13. De locatie is veranderd en gelabeld, en de postgresql daemon is met succes opgestart. Nu moeten alle draaiende services getest worden om hun normale werking te bevestigen.
73
74
rsync 1
Uit de Rsync project pagina: "rsync is een open bron gereedschap dat snelle incrementele bestand overdracht biedt." In Fedora biedt het rsync pakket rsync. Voer rpm -q rsync uit om te kijken of het rsync pakket geïnstalleerd is. Als het niet geïnstalleerd is, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install rsync
13.1. rsync en SELinux Uit de Fedora 12 SELinux rsync_selinux(8) manual pagina: "SELinux vereist dat bestanden een uitgebreid attribuut hebben om het bestand type te definiëren. Tactiek bepaalt de toegang die daemons tot deze bestanden hebben. Als je bestanden wilt delen met gebruik van de rsync daemon, moet je de bestanden en mappen labelen met public_content_t." Zoals met de meeste services, wordt correcte labeling vereist door SELinux om zijn bescherming mechanismes uit te voeren voor rsync.
13.2. Types Type afdwinging is de hoofd rechten controle gebruikt in de SELinux gerichte tactiek. Alle bestanden worden gelabeld met een type: types definiëren een domein voor processen en een type voor bestanden. SELinux tactiek regels definiëren hoe types toegang tot elkaar hebben, of het nu een domein is dat toegang heeft tot een type of een domein dat toegang heeft tot een ander domein. Toegang wordt alleen toegestaan als er een specifieke SELinux tactiek regel bestaat die dat toestaat. De volgende types worden gebruikt met rsync. Verschillende types staan je toe flexibele toegang te configureren: public_content_t Dit is een algemeen type gebruikt voor locaties van bestanden (en de actuele bestanden) om gedeeld te worden met rsync. Als een speciale map aangemaakt wordt om bestanden te bevatten die gedeeld moeten worden met rsync, moeten de map en zijn inhoud deze label hebben. rsync_exec_t Dit type wordt gebruikt voor het /usr/bin/rsync systeem binaire programma. rsync_log_t Dit type wordt gebruikt voor het rsync log bestand, die zich standaard in /var/log/rsync.log bevindt. Om de locatie van het bestand waarnaar rsync logt te veranderen, gebruik je de --logfile=BESTAND optie voor het rsync commando tijdens het draaien.
1
http://www.samba.org/rsync/
75
Hoofdstuk 13. rsync
rsync_var_run_t Dit type wordt gebruikt voor het rsyncd lock bestand, die zich bevindt in /var/run/ rsyncd.lock. Dit lock bestand wordt gebruikt door de rsync server om verbinding limieten te beheren.
13.3. Booleans SELinux is gebaseerd op het laagste niveau van toegang vereist voor een service om te draaien. Services kunnen draaien op een aantal manieren, je moet daarom SELinux vertellen hoe je services draait. De volgende Booleans staan je toe om SELinux te vertellen hoe je rsync draait: allow_rsync_anon_write Het aanzetten van deze Boolean laat rsync in het rsync_t domein bestanden, links en mappen beheren die het type public_content_rw_t hebben. Dit zijn vaak publieke bestanden gebruikt voor publieke bestand overdracht services. Bestanden en mappen moeten gelabeld zin met public_content_rw_t. rsync_client Het aanzetten van deze Boolean staat rsync toe om verbindingen te initiëren naar poorten gedefinieerd als rsync_port_t, en staat ook het beheer toe van bestanden, links en mappen die het type rsync_data_t hebben. Merk op dat de rsync daemon in het rsync_t domein moet zijn om SELinux zijn controle over rsync uit te voeren. Het configuratie voorbeeld in dit hoofdstuk laat rsync zien draaiende in het rsync_t domein. rsync_export_all_ro Het aanzetten van deze Boolean staat rsync toe om in het rsync_t domein NFS en CIFS bestandssystemen te exporteren met alleen-lezen toegang voor cliënten.
13.4. Configuratie voorbeelden 13.4.1. Rsync als een daemon Bij gebruik van Fedora kan rsync gebruikt worden als een daemon zodat meerdere cliënten er direct mee kunnen communiceren als een centrale server, om gecentraliseerde bestanden te bevatten en ze gesynchroniseerd te houden. Het volgende voorbeeld zal laten zien hoe rsync draait als een daemon over een netwerk socket in het juiste domein, en hoe SELinux verwacht dat deze daemon draait op een voor-gedefinieerde (in SELinux tactiek) TCP poort. Dit voorbeeld zal dan laten zien hoe je de SELinux tactiek kunt veranderen om de rsync daemon normaal te laten draaien op een nietstandaard poort. Dit voorbeeld zal uitgevoerd worden op een enkel systeem voor het demonstreren van de SELinux tactiek en zijn controle over locale daemons en processen. Merk op dat dit slechts een voorbeeld is en laat zien hoe SELinux kan beïnvloeden. Uitgebreide documentatie over rsync is buiten het bestek van 2 dit document. Refereer naar de officiële rsync documentatie voor verdere details. Dit voorbeeld neemt aan dat de rsync, setroubleshoot-server en audit pakketten geïnstalleerd zijn, dat de SELinux gerichte tactiek wordt gebruikt en dat SELinux draait in de afdwingende mode. Rsync laten starten als rsync_t 1. Voer getenforce uit om te bevestigen dat SELinux in de afdwingende mode draait: 2
http://www.samba.org/rsync/documentation.html
76
Rsync als een daemon
$ getenforce Enforcing
Het getenforce commando geeft Enforcing terug als SELinux in de afdwingende mode draait. 2. Voer het which commando uit om te bevestigen dat het rsync binaire programma zich in het systeem pad bevindt:
$ which rsync /usr/bin/rsync
3. Als rsync als een daemon draait, moet een configuratie bestand gebruikt worden en opgeslagen zijn als /etc/rsyncd.conf. Merk op dat het volgende configuratie bestand gebruikt in dit voorbeeld erg eenvoudig is en geen inficatie biedt voor alle beschikbare opties, het is slechts voldoende om de rsync daemon te demonstreren:
log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock [files] path = /srv/files comment = file area read only = false \ttimeout = 300
4. Merk op dat er een eenvoudig configuratie bestand bestaat voor rsync om te draaien in de daemon mode, deze stap laat zien dat het simpel uitvoeren van rsync --daemon niet voldoende is om SELinux bescherming te laten bieden aan rsync. Refereer naar de volgende output:
# rsync --daemon # ps x | grep rsync 8231 ? Ss 8233 pts/3 S+
0:00 rsync --daemon 0:00 grep rsync
# ps -eZ | grep rsync unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 8231 ? 00:00:00 rsync
Merk op dat in de output van het laatste ps commando, de context laat zien dat de rsync daemon in het unconfined_t domein draait. Dit geeft aan dat rsync niet over is gegaan naar het rsync_t domein omdat het opgestart werd door het rsync --daemon commando. Op dit moment kan SELinux zijn regels en tactiek over dit domein nog niet afdwingen. Refereer naar de volgende stappen om te zien hoe je dit probleem oplost. In de volgende stappen zal rsync overgaan naar het rsync_t domein door het op te starten met een correct gelabeld init script. Alleen dan kan SELinux en zijn bescherming mechanismes effect hebben op rsync. Dit rsync proces moet afgeschoten worden voor de volgende stap.
77
Hoofdstuk 13. rsync
5. Een aangepast init script voor rsync is nodig voor deze stap. Er is een voorbeeld init script beschikbaar op http://www.fredshack.com/docs/rsync.html. Sla het op naar /etc/rc.d/init.d/ rsyncd. De volgende stap laat zien hoe je dit script labelt met initrc_exec_t: 6. Voer het semanage commando uit om een context afbeelding voor /etc/rc.d/init.d/ rsyncd toe te voegen:
semanage fcontext -a -t initrc_exec_t "/etc/rc.d/init.d/rsyncd"
7. Deze afbeelding wordt geschreven naar het /etc/selinux/targeted/contexts/files/ file_contexts.local bestand:
# grep rsync /etc/selinux/targeted/contexts/files/file_contexts.local /etc/rc.d/init.d/rsyncd
system_u:object_r:initrc_exec_t:s0
8. Gebruik nu het restorecon commando om deze context afbeelding toe te passen op het draaiende systeem:
restorecon -R -v /etc/rc.d/init.d/rsyncd
9. Voer het ls commando uit om te bevestigen dat het script correct gelabeld is. Merk op dat in de volgende output het script is gelabeld met initrc_exec_t:
ls -lZ /etc/rc.d/init.d/rsyncd -rwxr-xr-x. root root system_u:object_r:initrc_exec_t:s0 /etc/rc.d/init.d/rsyncd
10. Start rsyncd met het nieuwe script. Nu rsync is opgestart met een init script dat correct gelabeld is, zal het proces starten als rsync_t:
# /etc/rc.d/init.d/rsync start Starting rsyncd: ps -eZ | grep rsync unconfined_u:system_r:rsync_t:s0 9794 ?
[
OK
]
00:00:00 rsync
SELinux kan nu zijn bescherming mechanismes toepassen op de rsync daemon omdat het nu draait in het rsync_t domein. Dit voorbeeld laat zien hoe je rsyncd aan het draaien krijgt in het rsync_t domein. Het volgende voorbeeld laat zien hoe je deze daemon kunt laten draaien op een niet-standaard poort. TCP poort 10000 wordt gebruikt in het volgende voorbeeld. De rsync daemon draaien op een niet-standaard poort 1. Verander het /etc/rsyncd.conf bestand en voeg de port = 10000 regel toe bovenaan in het bestand in het globale configuratie gebied (d.w.z. voordat bestand gebieden gedefinieerd worden). Het nieuw configuratie bestand zal op het volgende lijken:
78
Rsync als een daemon
log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock port = 10000 [files] path = /srv/files comment = file area read only = false \ttimeout = 300
2. Na het opstarten van rsync met het init script met deze nieuwe instelling, zal een weigering lijken op de volgende gelogd worden door SELinux:
Jul 22 10:46:59 localhost setroubleshoot: SELinux is preventing the rsync (rsync_t) from binding to port 10000. For complete SELinux messages. run sealert -l c371ab34-639e-45ae-9e42-18855b5c2de8
3. Voer het semanage commando uit om TCP poort 10000 toe te voegen aan de SELinux tactiek voor rsync_port_t:
# semanage port -a -t rsync_port_t -p tcp 10000
4. Nu dat TCP poort 10000 is toegevoegd aan de SELinux tactiek voor rsync_port_t, zal rsyncd opstarten en normaal op deze poort werken:
# /etc/rc.d/init.d/rsync start Starting rsyncd:
# netstat -lnp | grep 10000 tcp 0 0 0.0.0.0:10000
[
0.0.0.0:*
LISTEN
OK
]
9910/rsync
SELinux heeft zijn tactiek gewijzigd en staat nu rsyncd toe om te werken op TCP poort 10000.
79
80
Postfix 1
Uit de Postfix project pagina: "Wat is Postfix? Het is het mail programma van Wietse Venema dat ontstond in IBM research als een alternatief voor het veel gebruikte Sendmail programma. Postfix probeert snel te zijn, eenvoudig te beheren, en veilig. De buitenkant heeft duidelijke Sendmail smaak, maar de binnenkant is volledig anders." In Fedora biedt het postfix pakket postfix. Voer rpm -q postfix uit om te kijken of het postfix pakket geïnstalleerd is. Als het niet geïnstalleerd is, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install postfix
14.1. Postfix en SELinux Als SELinux is aangezet, draait Postfix standaard beperkt. Beperkte processen draaien in hun eigen domein, en zijn gescheiden van andere beperkte processen. Als een beperkt proces in gevaar wordt gebracht door een aanvaller is de toegang van een aanvaller tot hulpbronnen en de mogelijke schade die ze kunnen veroorzaken beperkt, afhankelijk van de SELinux tactiek configuratie. Het volgende voorbeeld laat zien hoe Postfix en gerelateerde processen in hun eigen domein draaien. Dit voorbeeld veronderstelt dat het postfix pakket geïnstalleerd is en dat de Postfix service opgestart is: 1. Voer getenforce uit om te bevestigen dat SELinux in de afdwingende mode draait:
$ getenforce Enforcing
Het getenforce commando geeft Enforcing terug als SELinux in de afdwingende mode draait. 2. Voer service postfix start uit als de root gebruiker om postfix te starten:
service postfix start Starting postfix:
[
OK
]
3. Voer ps -eZ | grep postfix uit om de postfix processen te bekijken:
ps -eZ | grep postfix system_u:system_r:postfix_master_t:s0 1651 ? system_u:system_r:postfix_pickup_t:s0 1662 ? system_u:system_r:postfix_qmgr_t:s0 1663 ?
00:00:00 master 00:00:00 pickup 00:00:00 qmgr
Bijvoorbeeld, de SELinux context geassocieerd met het Postfix master proces is unconfined_u:system_r:postfix_master_t:s0. Het een na laatste deel van de context, postfix_master_t, is het type voor het proces. Een type definieert een domein voor processen 1
http://www.postfix.org/
81
Hoofdstuk 14. Postfix
en een type voor bestanden. In dit geval draait het master proces in het postfix_master_t domein.
14.2. Types Type afdwinging is de hoofd rechten controle gebruikt in de SELinux gerichte tactiek. Alle bestanden worden gelabeld met een type: types definiëren een domein voor processen en een type voor bestanden. SELinux tactiek regels definiëren hoe types toegang tot elkaar hebben, of het nu een domein is dat toegang heeft tot een type of een domein dat toegang heeft tot een ander domein. Toegang wordt alleen toegestaan als er een specifieke SELinux tactiek regel bestaat die dat toestaat. De volgende types worden gebruikt bij Postfix. Verschillende types laten je flexibele toegang configureren: postfix_etc_t Dit type wordt gebruikt voor configuratie bestanden voor Postfix in /etc/postfix. postfix_data_t Dit type wordt gebruikt voor Postfix data bestanden in /var/lib/postfix.
Opmerking Om de volledige lijst van bestanden en hun types voor Postfix te bekijken voer je het volgende commando uit:
$ grep postfix /etc/selinux/targeted/contexts/files/file_contexts
14.3. Booleans SELinux is gebaseerd op het laagste niveau van toegang vereist voor een service om te draaien. Services kunnen draaien op een aantal manieren, je moet daarom SELinux vertellen hoe je services draait. De volgende Booleans staan je toe om SELinux te vertellen hoe je Postfix draait: allow_postfix_local_write_mail_spool Het aanzetten van deze Boolean stelt Postfix in staat om naar de locale mail spool op het systeem te schrijven. Postfix vereist dat deze Boolean aangezet is voor normale werking als locale spools worden gebruikt.
14.4. Configuratie voorbeelden 14.4.1. SpamAssassin en Postfix 2
Uit de SpamAssassin project pagina: "Open bron mail filter, geschreven in Perl, voor het identificeren van spam met gebruik van een brede reeks heuristiek testen op mail kopteksten en body tekst. Vrije software." 2
http://spamassassin.apache.org/
82
SpamAssassin en Postfix
In Fedora biedt het spamassassin pakket SpamAssassin. Voer rpm -q spamassassin uit om te kijken of het spamassassin pakket geïnstalleerd is. Als het niet geïnstalleerd is, voer je het volgende commando uit als de root gebruiker om het te installeren:
yum install spamassassin
SpamAssassin werkt tezamen met een mailer zoals Postfix om spam filter mogelijkheden te bieden. Om SpamAssassin effectief mail te laten onderscheppen, analyseren en filteren, moet het luisteren op een netwerk interface. De standaard poort voor SpamAssassin is TCP/783, maar dit kan veranderd worden. Het volgende voorbeeld biedt een praktijk voorbeeld hoe SELinux SpamAssassin completeert door het standaard alleen toegang te geven tot een bepaalde poort. Dit voorbeeld zal daarna laten zien hoe je de poort verandert en SpamAssassin laat werken op een niet-standaard poort. Merk op dat dit slechts een voorbeeld is en laat zien hoe SELinux een eenvoudige configuratie 3 van SpamAssassin kan beïnvloeden. Refereer naar de officiële SpamAssassin documentatie voor verdere details. Dit voorbeeld neemt aan dat spamassassin geïnstalleerd is, dat de firewall geconfigureerd is om toegang op de te gebruiken poort toe te staan, dat de SELinux gerichte tactiek gebruikt wordt, en dat SELinux draait in de afdwingende mode: SpamAssassin op een niet-standaard poort draaien 1. Voer het semanage commando uit om de poort te laten zien waarop SELinux spamd standaard toestaat te luisteren:
# semanage port -l | grep spamd spamd_port_t\t\ttcp\t783
Deze output laat zien dat TCP/783 wordt gedefinieerd in spamd_port_t als de poort waarmee SpamAssassin zal werken. 2. Bewerk het /etc/sysconfig/spamassassin configuratie bestand en verander het zodat het SpamAssassin zal starten op de voorbeeld poort TCP/10000:
# Options to spamd SPAMDOPTIONS="-d -p 10000 -c m5 -H"
Deze regel specificeert nu dat SpamAssassin zal werken op poort 10000. De rest van dit voorbeeld zal laten zien hoe je de SELinux tactiek verandert om toe te staan dat deze socket geopend wordt. 3. Start SpamAssassin en een fout boodschap lijkend op het volgende zal verschijnen:
/etc/init.d/spamassassin start Starting spamd: [2203] warn: server socket setup failed, retry 1: spamd: could not create INET socket on 127.0.0.1:10000: Permission denied [2203] warn: server socket setup failed, retry 2: spamd: could not create INET socket on 127.0.0.1:10000: Permission denied [2203] error: spamd: could not create INET socket on 127.0.0.1:10000: Permission denied spamd: could not create INET socket on 127.0.0.1:10000: Permission denied 3
http://spamassassin.apache.org/doc.html
83
Hoofdstuk 14. Postfix
[FAILED]
Deze output betekent dat SELinux toegang tot deze poort geblokkeerd heeft. 4. Een weigering lijkend op het volgende zal gelogd worden door SELinux:
SELinux is preventing the spamd (spamd_t) from binding to port 10000.
5. Als de root gebruiker voer je het semanage commando uit om de SELinux tactiek te veranderen om toe te staan dat SpamAssassin werkt op de voorbeeld poort (TCP/10000):
semanage port -a -t spamd_port_t -p tcp 10000
6. Bevestig dat SpamAssassin nu zal starten en werkt op TCP poort 10000:
# /etc/init.d/spamassassin start Starting spamd:\t\t\t\t\t[ OK ] # netstat -lnp | grep 10000 tcp\t0\t0 127.0.0.1:10000\t0.0.0.0:*\tLISTEN\t2224/spamd.pid
7. Op dit punt aangekomen, werkt spamd correct op TCP poort 10000 omdat het toegang heeft verkregen tot die poort door de SELinux tactiek.
84
Referenties De volgende referenties zijn verwijzingen naar extra informatie die relevant is voor SELinux maar die buiten het bestek van dit document valt. Merk op dat door de snelle ontwikkeling van SELinux een deel van deze informatie alleen van toepassing kan zijn op specifieke vrijgaves van Fedora. Boeken SELinux by Example Mayer, MacMillan, en Caplan Prentice Hall, 2007 SELinux: NSA's Open Source Security Enhanced Linux Bill McCarty O'Reilly Media Inc., 2004 Handleidingen en hulp Handleidingen een voordrachten van Russell Coker http://www.coker.com.au/selinux/talks/ibmtu-2004/ Dan Walsh's Journal http://danwalsh.livejournal.com/ Red Hat Knowledgebase http://kbase.redhat.com/ Algemene informatie NSA SELinux hoofd website http://www.nsa.gov/research/selinux/index.shtml NSA SELinux FAQ http://www.nsa.gov/research/selinux/faqs.shtml Mail lijsten NSA SELinux mail lijst http://www.nsa.gov/research/selinux/list.shtml Fedora SELinux mail lijst http://www.redhat.com/mailman/listinfo/fedora-selinux-list Gemeenschap Fedora SELinux gebruiker gids http://docs.fedoraproject.org/selinux-user-guide/ SELinux project wiki http://selinuxproject.org/page/Main_Page
85
Hoofdstuk 15. Referenties
SELinux gemeenschap pagina http://selinux.sourceforge.net/ IRC irc.freenode.net, #selinux en #fedora-selinux
86