Ved hjelp av SELinux og iptables Together

En av de tingene jeg har ønsket å gjøre med SELinux for år er å finne ut en måte å gjøre SELinux og iptables jobbe sammen, men hver gang jeg så på det, ble mine bruksmåter for komplisert. James Morris og Paul Moore jobbet med et verktøy kalt Secmark vei tilbake i Red Hat Enterprise Linux (RHEL) 5 tidsramme. Min enkel implementering av Secmark er å bruke iptables regler for å definere etiketter på pakker som de strømmer innenfor en SELinux system.

Secmark har vært brukt i mange år i Multi-level Security (MLS) skriver miljøer, men ganske mye ignorert i målrettet politikk. På en MLS-systemet, er sikkerheten etiketten på pakken viktigere enn hvilken type etikett. Det betyr at du kan forhindre en prosess som kjører som â € œ Uklassifisert â € fra å lese en og acirc; € œ Top Secret og acirc; € pakke

Merk:. Denne artikkelen er ikke om merket nettverk. (Etiketter pakker passerer mellom maskiner over nettverket).

I et målrettet system, har vi ikke vanligvis bruker nivåer, så jeg ønsket å bruke typen håndhevelse, som betyr kontrollerende hvilke prosesser kan sende /RECV pakker basert på type av fremgangsmåten og typen av pakken. Secmark kan du skrive regler som etikett pakker som kommer inn port 80 slik at du kan skrive en regel som tillater en prosess merket httpd_t å sende /RECV pakker merket httpd_packet_t. Men hva med Firefox, Squid, etc.? Min frykt om merking av pakker var en eksplosjon av pakker ville generere svært komplisert politikk. Tar dette til det ekstreme du kan ende opp med pakketyper for hver port type, httpd_packet_t, bind_packet_t, dns_packet_t .... Eller enda verre, en type for hver port_types og nettverk kombinert. httpd_internet_packet_t versus httpd_intranet_packet_t, eller httpd_eth0_packet_t og httpd_eth1_packet_t.

Som du kan se dette ville fort bli forvirrende. Og skrive politikk ville bli umulig for utdelingene.

unlabeled_t pakketype

Foreløpig standard, har vi ikke merke noen pakker i politikk, så kjernen etiketter disse pakkene som unlabeled_t. På grunn av dette hver SELinux domene på systemet som bruker nettverket, har de regler:

tillate MyDomain unlabed_t: pakke {sende recv};

Dette betyr at hvis du brukte Secmark til merket pakker , og du tar brann vegg ned, ville kjernen starte merking av alle pakker som unlabeled_t. Hver nettverksdomene ville plutselig få mer tilgang. Dette betyr å ta ned brannmuren eller omlasting brannmuren din, du ville ikke bare tillate porter å bli angrepet utenfra, du ville senke SELinux beskyttelse, noe som muliggjør begrenset domener for å begynne å sende /RECV pakker fra usikre nettverk.

Fjerne unlabeled_t regler

I de siste Fedora utgivelser jeg lagt en modul kalt unlabelednet inneholder alle regler for å tillate MyDomain unlabeled_t: pakke {sende recv}. Hvis du deaktiverer denne politikken pakken, vil alle trange domener miste muligheten til å sende /RECV unlabeled_t pakker. Jeg skal tilbake porting dette til RHEL6. Dette betyr at du kan stoppe trange domener fra å bruke nettet med mindre du skriver regler for en merket pakke.

Bruk sak

Som jeg nevnte ovenfor, hver gang jeg så inn i dette problemet, jeg endte opp med en eksplosjon av typer. Jeg endelig kom over et par bruk tilfeller hvor jeg kunne skrive noen enkle regler og policy for ytterligere å sikre min laptop. Jeg ønsket å skrive politikk for å hindre alle trange domener som startes ved oppstart (system domener) fra å snakke til det eksterne nettverket, og la alle domener startet av min innloggingsprosessen (brukerdomener) til å snakke med både interne og eksterne nettverk. Ideen her er at jeg ikke vil at prosesser som avahi, eller sssd eller sshd eller annen prosess som blir startet ved oppstart skal lytte eller påvirket av pakker fra en uklarert nettverk. Jeg ønsker prosesser startet av påloggings min, som Firefox eller min VPN å kunne snakke til nettverket. Hvis min vpn er stengt system domener er av nettverket, mens jeg fortsatt kan bruke Internett for surfing og e-post.

Det fine med dette eksempelet er at du kan bruke den til å sette opp en Apache-server som kunne bare snakke til det interne nettverket og vil avvise pakker fra det eksterne nettverket.

Jeg bestemte meg for å lage bare tre typer for mitt nettverk. Jeg vil forklare SELinux politikk senere i artikkelen

skriv internal_packet_t. Iptables vil merke alle pakker som kommer eller er bestemt for det interne nettverket som internal_packet_t;

skriv dns_external_packet_t: Iptables vil merke alle pakker som er bestemt til det eksterne nettverket på udp /tcp port 53 som dns_external_packet_t. Jeg har lagt denne typen fordi jeg ønsket å dontaudit visse avgrensede domener fra å snakke med DNS-servere eksterne til mitt private nettverk

Skriv external_packet_t. Vil være standardetikett for alle pakker på maskinen som ikke omfattes av de to første definisjoner.

Innføring secmarkgen

Jeg er ingen iptables ekspert. Kalle meg en iptables nybegynner ville være snill. Så jeg spurte Eric Paris for å skrive opp et eksempel på hvordan du kunne skrive iptables regler for å bruke en etikett til en pakke. Jeg tok hans regler og genererte en hjelper shell script kalt secmarkgen, kan du enten bruke min secmarkgen skript for å generere iptables regler eller generere dem selv

Kjører secmarkgen h vil vise deg bruken.

 Bruk: ./secmarkgen -iUsage: ./secmarkgen -s NAMEUsage: ./secmarkgen -T iptablescmd -P protokoll -p port [: ...] -N nettverk [...] -t selinux_type -m MCS NAMEUsage : ./secmarkgen -f NAVN 


Du må skrive regler for å initial secmark etiketter

./secmarkgen -i

Deretter må du navngi dine nettverk. . (Iptables kjeden)

./secmarkgen -s INTERN

Nå kan du legge til en eller flere regler om dette heter nettverket.

./secmarkgen -n 255.255.255.255, 127 /8,10.0.0.0 /8,172.16.0.0 /16.224 /24,192.168 /16 INTERN

Nå vil du fullføre secmark regler ved å tildele en pakketype etikett til nettverket.

./secmarkgen -f -t internal_packet_t INTERN

Her er manuset generert følgende iptables regler:

 ###################### ############################################## ./secmarkgen - jeg################################################# ################## iptables -F -t securityiptables -t sikkerhet -A INPUT -m state --state ETABLERT, RELATED -j CONNSECMARK --restoreiptables -t sikkerhet -A UTGANG -m state --state ETABLERT, RELATERT j CONNSECMARK --restore ################################## ################################## ./secmarkgen -s INTERN ########## ################################################## ####### iptables tl sikkerhet -X INTERN 2 > /dev /nulliptables -t sikkerhet N INTERN ######################################## ############################ ./secmarkgen -n 255.255.255.255,127 /8,10.0.0.0 /8,172.16.0.0 /16.224 /24,192.168/16 INTERN ############################################# ###################### iptables -A OUTPUT -t sikkerhet -d 255.255.255.255,127 /8,10.0.0.0 /8,172.16.0.0 /16.224 /24,192.168 /16-j INTERNALiptables -A INPUT -t sikkerhet -s 255.255.255.255,127 /8,10.0.0.0 /8,172.16.0.0 /16.224 /24,192.168 /16 -j INTERN ############# ################################################## ##### ./secmarkgen -f -t internal_packet_t INTERN #################################### ############################### iptables -t sikkerhet -A INTERN j SECMARK --selctx system_u: object_r: internal_packet_t: s0iptables -t sikkerhet -A INTERN j CONNSECMARK --saveiptables -t sikkerhet -A INTERN -J GODTA 

Jeg vil la det opp til leseren å undersøke og forstå iptables regler. (Jeg har alltid elsket som cop ut når jeg var på skolen.)

Den secmark_test Script

Her er min full Secmark script (secmark_test.sh) som jeg bruker til å generere reglene for å begrense min nettverk:...

 ./secmarkgen -i /secmarkgen -s INTERN /secmarkgen -n 255.255.255.255,127 /8,10.0.0.0 /8,172.16.0.0 /16.224 /24,192.168 /16 INTERN /secmarkgen - f -t internal_packet_t INTERN. /secmarkgen -s DNS. /secmarkgen -P udp -p 53 DNS. /secmarkgen -P tcp -p 53 DNS. /secmarkgen -f -t dns_external_packet_t DNS. /secmarkgen -s EKSTERN. /secmarkgen EKSTERN ./secmarkgen -f -t external_packet_t EKSTERN. /secmarkgen -T ip6tables -i. /secmarkgen -T ip6tables -s INTERN. /secmarkgen -T ip6tables -n FEC0 :: /10, :: 1/128, FF :: /8, FE80 :: /10, FC00 :: /7 INTERN. /secmarkgen -T ip6tables -f -t internal_packet_t INTERN. /secmarkgen -T ip6tables -s EKSTERN. /secmarkgen -T ip6tables EKSTERN. /secmarkgen -T ip6tables -f -t external_packet_t EKSTERN 

Nå kan jeg generere iptables regler:

# ./secmark_test.sh > /tmp /regler

Et problem er at jeg ikke kan installere reglene ennå. Siden jeg ikke har skrevet SELinux politikk å definere * _packet_t pakketyper, til iptables regler ville mislykkes installere. Hvis du prøvde å installere disse reglene vil du se en dmesg utgang si kjernen ikke vet hva en internal_packet_t type er.

SELinux Regler

Her er en politikk som jeg bruker, kalles secmark. te:

 policy_module (secmark, 1,0) gen_require (`attributt domene, attributt sysadm_usertype; # Domener som en bruker ansatte kunne overgang toattribute staff_usertype, attributt telepathy_domain -typen ping_t -typen vpnc_t -typen ssh_t, skriver nsplugin_t -typen mozilla_plugin_t; # System domener som ønsker å snakke med den eksterne networktype ntpd_t -typen sssd_t; ') # Type Definitionsattribute external_packet, skriver internal_packet_t; corenet_packet (internal_packet_t) type dns_external_packet_t, external_packet; corenet_packet (dns_external_packet_t) type external_packet_t, external_packet; corenet_packet (external_packet_t) # Tillat Rulesallow domene internal_packet_t: pakke {recv send}; tillate sysadm_usertype external_packet: pakke {recv send}; tillate staff_usertype external_packet: pakke {recv send}; tillate vpnc_t external_packet: pakke {recv send}; tillate ssh_t external_packet: pakke {recv send }; tillate mozilla_plugin_t external_packet: pakke {recv send}; tillate nsplugin_t external_packet: pakke {recv send}; tillate telepathy_domain external_packet: pakke {recv send}; tillate ping_t external_packet: pakke {recv send}; tillate ntpd_t external_packet: pakke {recv send }; dontaudit sssd_t dns_external_packet_t: pakke {recv send}; 

La oss se på politikken nærmere. Først er det:

policy_module (secmark, 1,0)

Dette definerer bare politikken modulen. Deretter legger vi krav:

 gen_require (`attributt domene, attributt sysadm_usertype; # Domener som en bruker ansatte kunne overgang toattribute staff_usertype; attributt telepathy_domain -typen ping_t -typen vpnc_t -typen ssh_t, skriver nsplugin_t -typen mozilla_plugin_t; # System domener som ønsker å snakke med den eksterne networktype ntpd_t -typen sssd_t; ') 

Når du skriver SELinux politikk du har å referere til alle typer /attributter før du bruker dem i en tillate regelen. Du kan enten definere nye typer eller i dette tilfellet legge en gen_requires blokk. Den gen_requires blokk forteller SELinux å ikke installere denne politikken, hvis noen av disse attributtene eller typer ikke er definert i andre deler av politikken.

Et par av attributter å se på, i SELinux policy domene, er en egenskap av alle prosesser typer. staff_usertype er en egenskap som er gitt til alle spesifikke ansatte brukerprosesser. Tilsvar sysadm_usertype er et attributt som gis til alle spesifikke sysadm brukerprosesser, hvis du har lagt til andre brukertyper som xguest eller bruker, ville du må legge tilsvarende regler i politikken. Den telepathy_domain er domenet til alle telepati applikasjoner.

I denne delen jeg definere nye typer som jeg skal bruke for å identifisere nettverkspakker på systemet mitt. Jeg har også definert et attributt external_packet, så jeg kan gruppereglene knyttet til eksterne pakker sammen. Jeg bruker corenet_packet grensesnittet, for å identifisere til SELinux at disse typene er forbundet med pakker

 attributt external_packet;. Skriv internal_packet_t; corenet_packet (internal_packet_t) type dns_external_packet_t, external_packet; corenet_packet (dns_external_packet_t) type external_packet_t, external_packet; corenet_packet (external_packet_t) 

Nå kan se på de tillater regler:

tillate domene internal_packet_t: pakke {recv send};

Denne regelen gjør at alle prosesser på systemet til å sende og motta alle interne pakker.

De neste reglene tillater alle (de fleste) stabs- og SYSADM domener, programmer utført av ansatte eller sysadm brukeren direkte, sende og RECV eksterne pakker. Merker jeg bruke attributtet external_packet stedet for de typene direkte. Dette gir de ansatte domener tilgang til både external_packet_t og dns_external_packet_t

 tillate sysadm_usertype external_packet: pakke {recv send}; tillate staff_usertype external_packet. Pakke {recv send}; tillate vpnc_t external_packet: pakke {recv send}; tillate ssh_t external_packet: pakke {recv send}; tillate mozilla_plugin_t external_packet: pakke {recv send}; tillate nsplugin_t external_packet: pakke {recv send}; tillate telepathy_domain external_packet: pakke {recv send}; tillate ping_t external_packet: pakke {recv send}; 

Den neste regelen gjør at ntpd_t domenet til å sende og motta eksterne pakker, siden ntpd snakker til tids servere på det offentlige nettet. Jeg kunne ha definert en ntp_external_packet_t, og lagt iptables regler for å gjøre dette mer sikkert, men jeg bestemte meg ikke, siden jeg ikke vil ha en eksplosjon av typer

tillate ntpd_t external_packet. Pakke {recv send};

dontaudit sssd_t dns_external_packet_t: pakke {recv send};

sssd programmet ser på alle postene i min /etc/resolv.conf og sjekker for å se om det kan bruke dem. Når jeg bruker vpn for å komme inn i mitt nettverk, ender jeg opp med DNS-poster fra det eksterne og interne nettverket i min /etc/resolv.conf fil.

Siden jeg ikke ønsker sssd snakker til ethvert system andre da på min private nettverk, jeg ønsker å dontaudit denne tilgangen.

Compile, installere og kjøre

Nå er det på tide å trekke alt sammen. Først jeg kompilere min policy:

# gjøre -f /usr /share /SELinux /devel /Makefile

Så jeg installerer policy:

# semodule -i secmark. pp

Nå kan jeg installere reglene på systemet mitt:


# sh /tmp /regler

Jeg vil tipse iptables og ip6tables å huske for neste oppstart

 # tjenesteleverandører iptables saveiptables. Lagre brannmurregler til /etc /sysconfig /iptables: [OK] # tjenesteleverandører ip6tables saveip6tables: Saving brannmurregler til /etc /sysconfig /ip6table [OK] 

På dette punktet hver pakke på min maskin bør ha en av de tre etikettene.

Nå kan jeg se for AVC meldinger som gjelder noen av disse merket pakker. Hvis jeg ser de jeg kan bestemme om jeg vil tillate /dontaudit disse AVC-meldinger, eller prøve å finne ut om noe går veldig galt på mitt system. Anmeldelser