Posledná zmena: 7/9/2021
Program "netstat
" je ozajstný klenot medzi programami na správu
servera. Dokáže zobraziť sieťové spojenia (otvorené porty, prebiehajúce
spojenia), routovacie tabuľky a ďalšie podrobnosti týkajúce sa siete. Ak ste
doteraz často používali programy "ping
"
a "traceroute
", pripravte sa rozšíriť zbierku obľubených
programov i vášho poznania.
Ja sa budem zaoberať programom "netstat
" s cieľom ukázať vám, čo všetko môžete
zistiť o vašich démonoch a sieťových spojeniach. Ako sme už hovorili, každý
démon zabezpečujúci nejakú sieťovú službu musí počúvať na nejakom porte.
"netstat
" vám tieto porty dokáže zobraziť spolu s menom procesu
(démona), ktorý na porte počúva. Okrem toho dokáže vypísať adresu pripojeného
klienta a vlastníka procesu. Týmto spôsobom môžete zistiť, či na vašom serveri
nebežia nejaké démony, o ktorých neviete a ktoré môžu byť pokojne zadnými
dvierkami používateľov. Celkom nedávno som si takto všimol, že na niektorom
vysokom porte (okolo 30000) počúva proces označený ako "bash
",
ktorý tam vonkoncom nemal čo robiť. Boli to zadné vrátka spustené nejakým
šikovným chlapíkom, ktoré každému, kto sa pripojil na daný port, umožnili
pracovať s príkazovým interpreterom "bash
" s právami používateľa,
pod ktorým beží Apache... No srandy kopec. Bez "netstat-u
" by som
na to nikdy neprišiel.
Dosť bolo slov, prejdime k veci. Spustite program "netstat
"
(parametre: -p: zobraziť mená procesov, -e: zobraziť meno používateľa, -v:
verbose, -a: zobraziť všetky spojenia) pod rootom:
netstat -peva
Zobrazí sa výpis podobný tomuto:
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 *:mysql *:* LISTEN root 1216 905/mysqld tcp 0 0 *:6000 *:* LISTEN root 1244 976/X tcp 0 0 *:www-http *:* LISTEN root 1082 830/httpd tcp 0 0 *:ipp *:* LISTEN root 1330 590/cupsd tcp 0 0 *:https *:* LISTEN root 1081 830/httpd tcp 0 0 hudson.marine.:www-http hudson.mari:filenet-tms FIN_WAIT2 root 0 - tcp 1 0 hudson.mari:filenet-tms hudson.marine.:www-http CLOSE_WAIT vix 49882 1321/galeon-bin udp 0 0 *:ipp *:* root 1331 590/cupsd
Podľa hlavičky sa zobrazujú aktívne internetové spojenia (čakajúce servery a prebiehajúce spojenia). Dôležité stĺpce:
Ak chcete vidieť číselné hodnoty portov a IP adresy (ako ste videli, adresy sa nezobrazili celé), pridajte parameter "n":
netstat -pevan Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 0 1216 905/mysqld tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 0 1244 976/X tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 1082 830/httpd tcp 0 0 0.0.0.0:631 0.0.0.0:* LISTEN 0 1330 590/cupsd tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 0 1081 830/httpd tcp 1 0 127.0.0.1:32768 127.0.0.1:80 CLOSE_WAIT 501 49882 1321/galeon-bin udp 0 0 0.0.0.0:631 0.0.0.0:* 0 1331 590/cupsd
Jednotlivé riadky výpisu znamenajú:
Príkaz "netstat
" normálne vypisuje aj ďalšie riadky, tie vás však
teraz nemusia zaujímať. Ak by ste chceli vidieť iba procesy čakajúce na
požiadavky, stačí použiť parameter "-l":
netstat -plen Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 0 1216 905/mysqld tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 0 1244 976/X tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 1082 830/httpd tcp 0 0 0.0.0.0:631 0.0.0.0:* LISTEN 0 1330 590/cupsd tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 0 1081 830/httpd
Cieľom krátkej ukážky výpisu "netstat
" bolo ukázať vám, ako
jednoducho zistiť, aké procesy na vašom serveri "počúvajú" na portoch
a obsluhujú prichádzajúce požiadavky. Ako ste si všimli, pre tento účel sa
stačí koncentrovať na parameter "-l". Ak budete "netstat
"
používať pravidelne, napríklad každú noc v nejakom jednoduchom skripte, ktorý
pošle výsledky mailom, budete vidieť každú zmenu.
Program "logcheck
"
slúži na filtrovanie logov servera a upozorňovanie na podozrivé udalosti.
Ak ste doteraz nikdy nekontrolovali
logy, nie ste skutočným správcom servera :). A ak ste to robili, určite ste si
priali, aby existovala nejaká možnosť, ako logy čítať "lepším spôsobom",
najmä, ak hľadáte nejakú skutočne podozrivú udalosť. V logoch servera sú
totiž obyčajne aj celkom neškodné riadky, ktoré vám pri hľadaní komplikujú
život.
Program "logcheck
" je určený na pravidelnú kontrolu logovacích
súborov servera. Pri každom spustení analyzuje vami určené logy, odfiltruje
nepodstatné riadky (niekedy ich volám "balast") a naopak, upozorní vás na
zaujímavé výrazy (ja to volám "Reader's Digest :)"), ktoré pošle mailom na
vami určenú adresu (najčastejšie "root"). Takže už nemusíte čítať celé logy,
ale len to, čo program (na základe vašich nastavení) považuje za
dôležité. Program si po skončení práce uloží pozície pre každý spracovaný
log, aby nabudúce nemusel analyzovať opäť od začiatku a skončí.
"logcheck
" počíta aj s tým, že sa logy občas "rotujú"
a v takom prípade pracuje od začiatku logu.
Definície zaujímavých výrazov sú súčasťou
konfigurácie "logchecku
" (rôzne udalosti a klasické chybové hlásenia, texty typu
"denied", "refused", "denied", "warning" a tak podobne), ale môžete ich kedykoľvek
upraviť či doplniť, ide o textové súbory. Ak viete pracovať s regulárnymi výrazmi, bude
to pre vás hračka, ak aj nie, rýchlo odkukáte spôsob, akým si pridať vlastné
hlásenia.
Mailom zasielané upozornenia majú tri časti: udalosti typické pre aktívny útok (cracking), udalosti typické pre porušenie bezpečnosti (violations) a udalosti pre "nezvyčajné udalosti" v systéme - čo je v podstate všetko, čo filtre z logov explicitne neodstránili.
Najjednoduchší spôsob je nainštalovať balíček "logcheck
", na
Debiane pomocou:
apt-get install logcheck
Počas inštalácie sa vás Debian spýta, akú citlivosť balastných filtrov má nastaviť: na výber máte "paranoid", "server" a "workstation", pričom "paranoid" odfiltruje iba malý počet balastných výrazov. "server" aplikuje filtre na balast pre "paranoid" a súčasne "server". Nastavenie "workstation" je ešte benevolentnejšie, aplikuje filtre pre "paranoid", "server" aj "workstation".
Ja osobne používam nastavenie "server" pre počítač, ktorý funguje ako server so službami a súčasne aj firewall.
Po inštalácii môžete skontrolovať spúšťací súbor pre démona
"crond
" "/etc/cron.d/logcheck
". Ja ho mám v tomto
tvare, ktorý definuje spúšťanie programu denne o 6:00 a po každom reštarte
systému:
# /etc/cron.d/logcheck: crontab entries for the logcheck package PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root @reboot logcheck if [ -x /usr/sbin/logcheck ]; then nice -n10 /usr/sbin/logcheck -R; fi 0 6 * * * logcheck if [ -x /usr/sbin/logcheck ]; then nice -n10 /usr/sbin/logcheck; fi # EOF
To znamená, že sa vás každé ráno okrem novín a čerstvej kávy bude čakať aj
mail od "logchecku
". Mail vás bude čakať aj v prípade, že dôjde
k reštartovaniu servera - ak nepoužívate iný monitoring, dozviete sa tak
o každom jeho reboote.
Konfigurácia programu sa nachádza v adresári "/etc/logcheck
".
V súbore "/etc/logcheck/logcheck.logfiles
" sa nachádza zoznam
logovacích súborov, ktoré sa budú prezerať. Upravte si súbor ako chcete, ja
používam takéto nastavenie:
# these files will be checked by logcheck /var/log/syslog /var/log/auth.log
Konfiguračný súbor "/etc/logcheck/logcheck.conf
" vyzerá takto:
# The following variable settings are the initial default values, # which can be uncommented and modified to alter logcheck's behaviour # Controls the format of date-/time-stamps in subject lines: # Alternatively, set the format to suit your locale #DATE="$(date +'%Y-%m-%d %H:%M')" # # Controls the presence of boilerplate at the top of each message: # Alternatively, set to "0" to disable the introduction. # # If the files /etc/logcheck/header.txt and /etc/logcheck/footer.txt # are present their contents will be read and used as the header and # footer of any generated mails. # #INTRO=1 # Controls the level of filtering: # Can be Set to "workstation", "server" or "paranoid" for different # levels of filtering. Defaults to server if not set. REPORTLEVEL="server" # Controls the address mail goes to: # *NOTE* the script does not set a default value for this variable! # Should be set to an offsite "emailaddress@some.domain.tld" SENDMAILTO="root" # Should the hostname of the generated mails be fully qualified? FQDN=1 # Controls whether "sort -u" is used on log entries (which will # eliminate duplicates but destroy the original ordering); the # default is to use "sort -k 1,3 -s": # Alternatively, set to "1" to enable unique sorting #SORTUNIQ=0 # Controls whether /etc/logcheck/cracking.ignore.d is scanned for # exceptions to the rules in /etc/logcheck/cracking.d: # Alternatively, set to "1" to enable cracking.ignore support #SUPPORT_CRACKING_IGNORE=0 # Controls the base directory for rules file location # This must be an absolute path #RULEDIR="/etc/logcheck" # Controls if syslog-summary is run over each section. # Alternatively, set to "1" to enable extra summary. #SYSLOGSUMMARY=0 # Controls Subject: lines on logcheck reports: #ATTACKSUBJECT="Attack Alerts" #SECURITYSUBJECT="Security Events" #EVENTSSUBJECT="System Events" # Controls [logcheck] prefix on Subject: lines ADDTAG="yes"
Kde najdôležitejšie direktívy znamenajú:
REPORTLEVEL="server"
SENDMAILTO="root"
Pri konfigurácii je najdôležitejšie odfiltrovať z logov balast, na ktorý nie je
potrebné upozorňovať administrátora. V závislosti od nastavenia citlivosti sa
používajú filtrovacie výrazy z adresárov
"/etc/logcheck/ignore.d.XXX
", kde XXX je "paranoid", "server"
alebo "workstation". V každom z adresárov sa nachádzajú súbory s filtrovacími
výrazmi pre podporované balíčky, ktoré logujú do systémových logov. Tieto
súbory sú automatické brané do úvahy pre dané nastavenie citlivosti. Vlastné
filtre pridávajte do súboru "/etc/logcheck/ignore.d.XXX/local
".
Súbory s filtrami, ktoré detekujú pokusy o útok na server alebo útok samotný,
nájdete v adresári "/etc/logcheck/cracking.d
".
Súbory s filtrami, ktoré detekujú rôzne systémové problémy nájdete v adresári
"/etc/logcheck/violations.d
". Vlastné filtre pridávajte do súboru
"/etc/logcheck/violations.d/local
".
No a napokon súbory s filtrami, ktoré dodatočne filtrujú záznamy o systémových
problémoch nájdete v adresári
"/etc/logcheck/violations.ignore.d
". Vlastné filtre pridávajte do súboru
"/etc/logcheck/violations.ignore.d/local
".
Ukážka konfiguračného súboru "/etc/logcheck/cracking.d/logcheck
"
(hlásenia typické pre aktívny útok na server):
uucico\[[0-9]+\]: refused connect from tftpd\[[0-9]+\]: refused connect from kernel: Oversized packet received from attackalert attack
Ukážka konfiguračného súboru "/etc/logcheck/violations.d/logcheck
"
(negatívne a potenciálne nebezpečné hlásenia):
!= -ERR Password CWD etc DEBUG ERROR EXPN FAILURE Failed ILLEGAL PERMITTED REFUSED RETR group RETR passwd RETR pwd.db ROOT LOGIN SITE EXEC VRFY \bBAD\b admin alias database debug denied deny expn failed failure illegal kernel: Packet log: .* DENY kernel: Packet log: .* REJECT kernel: martian source permitted promisc reject rexec rshd securityalert setsender shutdown smrsh sucked unapproved unauthorized vrfy
Ukážka konfiguračného súboru
"/etc/logcheck/violations.ignore.d/logcheck-postfix
" (filtrovanie
hlásení Postfixu o odmietnutí mailu pomocou niektorej RBL služby - filter
neguje výraz "reject", na ktorý inak upozorňujeme):
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ postfix/smtpd\[[0-9]+\]: [[:upper:]0-9]+: reject: RCPT from [^[:space:]]+: [45][0-9][0-9] Service unavailable; Sender address \[[^[:space:]]+\] blocked using [._[:alnum:]-]+; .*; from=<[^[:space:]]*> to=<[^[:space:]]+> proto=(ESMTP|SMTP) helo=<[^[:space:]]+>$
Ukážka konfiguračného súboru
"/etc/logcheck/ignore.d.server/postfix
" (filtrovanie hlásení
Postfixu o neodoslanom maili kvôli nefungujúcemu spojeniu so vzdialeným
serverom - takéto udalosti nás tak veľmi nezaujímajú, ide o pomerne bežnú vec):
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ postfix/n?qmgr\[[0-9]+\]: [[:alnum:]]+: to=<[^[:space:]]+>, relay=none, delay=[0-9]+, status=deferred \(delivery temporarily suspended: connect to [^[:space:]]+: (Connection timed out|read timeout|Connection refused)\)$
Všimnite si, že súbory
v "/etc/logcheck/cracking.d
"
a v "/etc/logcheck/violations.d
" obsahujú všeobecnejšie
definované výrazy, na ktoré má "logcheck
" upozorňovať a súbory
v "/etc/logcheck/violations.ignore.d
"
a v "/etc/logcheck/ignore.d.XXX
" zasa naopak čo najkonkrétnejšie
s využitím regulárnych výrazov. Je to celkom logické - chceme upozorňovať na
podozrivé udalosti, ale ignorovať falošné poplachy, ktoré vieme presne
špecifikovať. A ak odfiltrujeme falošné poplachy, zostanú už len "zaujímavé".
Všimnite si, že súbory, ktoré majú vylučovať falošné poplachy (posledné dva),
obsahujú konkrétnejšie definované hlásenia, ako som spomínal. V texte môžete
používať regulárne výrazy, z nich najjednoduchší a najpoužívanejší je ".*", čo
znamená "ľubovoľný počet ľubovoľných znakov". Ak budete mať denne falošné
poplachy a veľké maily od "logchecku
", budete musieť v prvom rade
vytvoriť podľa skutočných logovacích súborov riadky v súbore
"ignore
". Pri tom vám regulárne výrazy veľmi pomôžu.
Príklad:
"logcheck
" vás denne bude dennodenne upozorňovať na márne pokusy
počítačov s Windows vo vašej sieti (10.0.0.x) aktualizovať zónu DNS servera:
Mar 30 07:26:22 twin named[24148]: client 10.0.0.99#4990: update '0.0.10.in-addr.arpa/IN' denied
Na odfiltrovanie pomôže regulárny výraz (konštanta nepomôže, pretože číslo
procesu, IP adresa počítača a zóna sa menia) v súbore
"/etc/logcheck/violations.ignore.d/local
":
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ named\[[0-9]+\]: client [.[:alnum:]#-]+: update '[._[:alnum:]-]+/IN' denied
A máte po (jednom) probléme.
Spočiatku budete mať s "logcheckom
" trochu práce, kým si ho "vyladíte" pre váš
server - budete sa musieť hrať s regulárnymi výrazmi. Ale odmenou za vašu snahu
budú každodenné (nie príliš dlhé) maily, z ktorých sa dozviete, čo sa v noci
udialo na serveri. Takto odhalíte veľa problémov a pokusov o hacknutie, čo vám
v konečnom dôsledku uľahčí správu servera.
Program "ippl
"
(IP protocols logger) slúži na logovanie pokusov o prístupy na porty vášho
servera pomocou protokolov TCP, UDP a ICMP. Pre každý prístup zaznamenáva
zdrojovú a cieľovú adresu a zdrojový a cieľový port. Program beží ako démon
s právami bežného používateľa, je teda relatívne bezpečný. Výhodou je, že
umožňuje zaznamenať aj pokusy o pripojenie, ktoré neprejdú pravidlami vášho
firewallu. Spolu so systémovými logmi vám preto poskytne cenné doplnkové
informácie pri hľadaní stôp po útočníkovi.
"ippl
" je konfigurovateľný a flexibilný, umožňuje:
Konfiguračný súbor "/etc/ippl.conf
" obsahuje direktívy
nastavujúce všeobecné vlastnosti logovania a pravidlá, ktoré upresňujú, aké
pakety sa budú/nebudú logovať. Štandardne sa logujú všetky prichádzajúce
pakety, pokiaľ nie je povedané inak.
Text začínajúci znakom "#" sa ignoruje a považuje za komentár.
runas user
ippl
". Default:
nobody.run protokol
tcp
", "udp
",
"icmp
" a "all
" (všetky protokoly).resolve [protokol] [protokol] ...
noresolve [protokol] [protokol]
logformat [format] [protokol] [protokol] ...
short
", "normal
" a "detailed
".ident
noident
logclosing
nologclosing
log-in [protokol] [cesta]
tcp", "udp",
"icmp
" alebo "all
")Pomocou direktív sa určujú všeobecné pravidlá logovania paketov (protokoly, možnosti reverzného DNS, ident atď). Pokiaľ ich bude treba upraviť pre určitý druh spojenia, pridáte do konfiguračného súboru nový riadok, t.j. pravidlo. Pravidlá logovania majú všeobecný tvar:
ignore|log {option [option,[option],...}
[protokol] [popis]
Každé pravidlo musí začínať kľúčovým slovom "ignore
" alebo
"log
", ktorým definujete, či to bude pravidlo na logovanie alebo
ignorovanie logovania paketov. Až na špeciálne výnimky budete chcieť zmenšovať
počet informácií v logu a bude vás zaujímať najmä "ignore
".
Pomocou parametra "options
" môžete nastaviť možnosti logovania
platné iba pre toto pravidlo. Možnosti: "resolve", "noresolve", "ident",
"noident", "logclosing
", "nologclosing", "short", "normal",
"detailed
".
Ďalší parameter určuje protokol, pre ktorý definujete pravidlo. Je to buď
"tcp
", "udp
", "icmp
" alebo
"all
".
Parameter "popis" určuje typ paketu, ktorý sa má logovať alebo ignorovať. Má tieto časti:
type číslo
port číslo
/etc/services
". Ak neuvediete cieľový port,
pravidlo platí pre všetky.srcport číslo
/etc/services
". Ak neuvediete zdrojový port,
pravidlo platí pre všetky.
from adresa
server.example.com
", IP
adresa alebo IP adresa v tvare "ADRESA/MASKA
". Ak neuvediete
adresu, pravidlo platí pre každú adresu.expire čas_v_sekundách
Príklad 1: Ignoruj TCP pripojenia na port 3128 z adries 192.168.0.0/255.255.255.0:
ignore tcp port 3128 from 192.168.0.0/255.255.255.0
Príklad 2: Ignoruj pripojenia na DNS server (port 53, teda "domain"):
ignore tcp port domain
Príklad 3: Ignoruj pripojenia na DNS server Z portu 53, teda "domain" (takéto požiadavky prichádzajú zo sekundárneho DNS servera pri prenose zónových informácií):
ignore tcp srcport domain
Príklad 4: Pri pripojení na port "ssh" loguj okrem štandardných možností aj informácie z ident a spätný preklad adresy:
log options ident,resolve tcp port ssh
Ukážka konfiguračného súboru s niektorými mojimi zmenami a komentármi (pre vnútornú sieť 192.168.0.0/255.255.255.0):
# IP protocols logger - Configuration file # See ippl.conf(5) # User used # --------- # Specify the user (declared in /etc/passwd) used to run the # logging threads. # pouzivatel, pod ktorym bezi "ippl", tu: nobody runas nobody # Resolve hostnames? # ------------------ # Uncomment the line below to disable DNS lookups # VYPINAME spatne preklady IP adries v logoch: zbytocne by sme si spomalovali # server... noresolve all # Use ident? # ---------- # Uncomment the line below to enable IDENT lookups # kvoli bezpecnosti budeme pouzivat sluzbu ident! ident # Log end of TCP connections ? # ---------------------------- # Uncomment the line below to enable logging of closing TCP connections # See the BUGS file. # NEBUDEME logovat ukoncenie TCP spojeni #logclosing # Expiration of DNS data # ---------------------- # cas, po ktorom vyprsia cachovane udaje z DNS, ak ho pouzivate expire 3600 # Log in a file # ------------- # Uncomment this line if you want to log messages into a /var/log/ippl.log # See ippl.conf(5) for the syntax. # subory, do ktorych sa loguje: # vsetky protokoly idu do tohto suboru (tu: vypnute) #log-in all /var/log/ippl/all.log # UDP ide do tohto suboru (tu: vypnute) #log-in udp /var/log/ippl/udp.log # TCP ide do tohto suboru log-in tcp /var/log/ippl/tcp.log # ICMP ide do tohto suboru log-in icmp /var/log/ippl/icmp.log # Protocols logged # ---------------- # ktore protokoly budeme vlastne logovat? # tu: ICMP a TCP run icmp tcp # Uncomment the line below to log UDP traffic. # See ippl.conf(5) for recommandations. # ak chcete logovat aj UDP, odkomentujte nasledujuci riadok #run udp # Logging format # ---------------- # If you want to see the destination address, the ports, etc # Or if you want to log the minimal information. # See ippl.conf(5) for details. # format logovania: detailny pre vsetky protokoly logformat detailed all # Filtering of packets logged # --------------------------- # pravidla na ignorovanie zaznamov o paketoch # Do not log answers to echo requests # neloguj odpovede na ICMP echo ignore icmp type echo_reply # Log telnet connections using ident and name resolution # loguj pripojenia na telnet a ssh s pouzitim DNS a ident log options ident,resolve tcp port telnet log options ident,resolve tcp port ssh # Do not log UDP from localhost # neloguj nic UDP z localhost #ignore udp from localhost # Do not log DNS queries # neloguj poziadavky na DNS ignore udp port domain ignore udp srcport domain # by VIX # ignoruj pripojenia na proxy z vnut. siete, pretoze ich je vela a z vnutornej # siete proxy povolujete aj tak vsetkym ignore tcp port 3128 from 192.168.0.0/255.255.255.0 # ignoruj pripojenia na ssh z vnut. siete ignore tcp port ssh from 192.168.0.0/255.255.255.0 # ignoruj pripojenia na pop3 z vnut. siete, inak vam Outlook zaplni logy velmi # rychlo :) ignore tcp port pop3 from 192.168.0.0/255.255.255.0 # ignoruj pripojenia na ftp z vnut. siete ignore tcp port ftp from 192.168.0.0/255.255.255.0 ignore tcp port ftp-data from 192.168.0.0/255.255.255.0 # ignoruj pripojenia na imap z localhostu (kvoli webmailu IMP, ktory sa takto # pripaja na imap server) ignore tcp port imap2 from 127.0.0.1 # ignoruj pripojenia sposobene sambou z lokalnej siete ignore tcp port 137--139 from 192.168.0.0/255.255.255.0 # ignoruj vsetky pripojenia na sluzby, ktore povolujeme aj tak odvsadial: # http (80), https, smtp (25), nameserver, ident, finger, pop3s ignore tcp port 80 ignore tcp port https ignore tcp port 25 ignore tcp port domain ignore tcp srcport domain ignore tcp port auth ignore tcp port finger ignore tcp port pop3s # a ignoruj vsetko z localhostu, pretoze by sme toho mali plne logy ignore tcp from 127.0.0.1 # End of configuration # Copyright (C) 1998-1999 Hugo Haas - Etienne Bernard
Démon "ippl
" by som vám jednoznačne odporučil. Ak budete hľadať
problémy v bežných systémových logoch, ktoré vytvára "syslogd
",
môže vám pomôcť v odhalení takých pokusov o pripojenie, ktoré ani neprešli
vašim firewallom, alebo pokusy o pripojenie na porty, ktoré ani nie sú
využité. Ľahko si môžete potvrdiť prípadný portscan.
Pod kontrolou integrity súborových systémov rozumieme kontrolu obsahu súborových systémov servera s cieľom zistiť zmeny, ktoré sú nebezpečné, alebo ktoré sú priamym dôsledkom útoku na server. Pri kontrole je dôležité odlíšiť súbory a adresáre, ktorých obsah sa mení počas bežnej prevádzky servera od tých, ktoré by mali zostať nemenné (do odinštalovania alebo upgradu balíčka, ktorý obsahuje daný súbor).
Pojmom "setuid súbor" (tiež "s-kový súbor") sa v unixových systémoch označuje jeden špeciálny prípad, kedy má súbor okrem prístupových práv pre čítanie, zápis a spúšťanie, nastavený ešte ďalší príznak. Vo výpise súborov sa označuje písmenom "s", a znamená asi toľko, že pri spustení programu sa tento bude spúšťať s právami vlastníka súboru! (set user id).
Ak ste to ešte nepostrehli, ukážeme si to na nejakom príklade.
Príklad 1: bežný program ("find
")
Program "find
" sa používa v unixových systémoch veľmi často,
pretože slúži na hľadanie súborov s nejakými požadovanými vlastnosťami.
Štandardne je prístupný všetkým používateľom, čo vidíme aj na výstupe príkazu
ls -la /usr/bin/find -rwxr-xr-x 1 root root 74492 jan 22 2001 /usr/bin/find
Vlastníkom súboru je samozrejme root (skupina root), prístupové práva
zabezpečujú čítanie a spúšťanie každému a zápis iba vlastníkovi. Keď program
"find
" spustíte, bude sa spúšťať s vašimi právami, preto
napríklad nebude môcť hľadať súbory v adresároch, kam nemáte prístup.
Všetko jasné? OK.
Príklad 2: setuid program ("passwd
")
Program "passwd
" hádam ani netreba predstavovať, pretože slúži na
zmenu hesla používateľa. Určite ste si všimli, že root môže zmeniť heslo
každému, kým bežný používateľ iba sám sebe. Zamyslite sa teraz nad jedným
faktom: ako je možné, že bežný používateľ vôbec môže zmeniť svoje heslo, keď
sa pritom vyžaduje právo zápisu do súboru s heslami
"/etc/shadow
", ktorý má dokonca aj pre roota iba právo na
čítanie?
ls -la /etc/shadow -r-------- 1 root root 1261 dec 10 19:23 /etc/shadow
Odpoveďou je práve výpis príkazu
ls -la /usr/bin/passwd -r-s--x--x 1 root root 13044 jan 5 2001 /usr/bin/passwd*
Vlastníkom súboru je root (skupina root), prístupové práva - aha, je tu nejaké čudné "s" na mieste "x" pre vlastníka! Inak je všetko v poriadku, bežný používateľ má právo program spustiť. Ale čo je to "s"?
Ak má program (pre nespustiteľný súbor to nemá zmysel) príznak "s" na mieste
vlastníka, znamená to, že sa nebude spúšťať s právami používateľa, ktorý ho
spustil, ale s právami vlastníka súboru, čo je v tomto prípade root! Preto
po spustení programu môžete zapisovať do súboru "/etc/shadow
",
pretože počas spustenia programu ste de facto root. Keďže program si
skontroluje, kto ho skutočne spustil, umožní vám zmenu hesla iba
pre vás.
A to je v podstate všetko. Ešte spomeniem, že program môže mať príznak "s" aj na mieste skupiny, v takom prípade po spustení preberáte privilégiá skupiny, ktorá vlastní program.
Setuid programy majú jednu veľkú výhodu: umožnia vám vykonávať isté operácie,
na ktoré za normálnych okolností nemáte právo, pričom vám nedávajú automaticky
práva vykonávať iné operácie. Videli ste to na príklade programu
"passwd
", kde ste ako bežný používateľ získali právo zápisu
(svojho hesla) do súboru s heslami. Neznamenalo to však, že môžete do tohto
súboru zapisovať aj cudzie heslá alebo ich čítať. Setuid program vám teda
prepožičiava (najčastejšie rootovské) privilégiá na jeden konkrétny druh
činnosti. Keby neexistovali, musel by tieto operácie vykonávať výhradne root.
Dobrý setuid program musí byť napísaný tak, že neumožní vykonať inú operáciu okrem tej, na ktorú je určený.
Ak však niekto zneužije vlastnosť (chybu) v setuid programe, ktorá mu
napríklad umožní spustiť z neho shell, automaticky získavá všetky práva
vlastníka programu (a keďže sa bavíme o rootovi, tak je to sakramentsky
nebezpečné). Potom si už môže robit, čo len chce. Napríklad si skopíruje shell
k sebe do homediru a nastaví si k nemu s-kový príznak a vlastníka root (chown root
subor ; chmod u+s subor
). Ak aj prídete na to, že vám niekto
šarapatil v systéme a odstránite cestu, ktorou sa do systému dostal, ak aj
zmeníte rootovské heslo, hacker sa môže kedykoľvek stať rootom jednoduchým
spustením tohto rootovského shellu.
Bohužiaľ, neexistuje systémové opatrenie, ako odstrániť zo svojho servera všetky rootovské setuid súbory, aby ste zároveň neodstránili aj funkčnosť samotného servera. :) Niekoľko pomôcok a vtipných riešení však našťastie máme!
Ak je to možné, nepoužívajte (neinštalujte) programy, ktoré k svojej činnosti
potrebujú s-kové rootovské súbory a nahraďte ich bezpečnejším variantom.
Napríklad program "sendmail
" je setuid, ale existuje viacero
bezpečnejších (aj z iných hľadísk) programov na obsluhu pošty, napr.
"postfix
" a "qmail
".
/etc/fstab
"
Proti setuid programom vytváraným používateľmi existuje pomerne jednoduché
protiopatrenie: stačí pre súborové systémy, kde sa nachádzajú domáce adresáre
používateľov, maily, dočasné súbory a všetko, kam bežný používateľ môže
zapisovať, nastaviť parametre "nosuid,nodev" v súbore
"/etc/fstab
", ktorý obsahuje informácie o súborových systémoch.
Parameter "nosuid" znamená, že na danom súborovom systéme sa budú ignorovať
setuid príznaky pre súbory. "nodev" zasa znamená, že sa na danom súborovom
systéme nebudú dať vytvárať systémové zariadenia (devices), čo síce s setuid
súbormi vôbec nesúvisí, ale je to dobrá bezpečnostná voľba pre domáce adresáre.
Napr. pre domáce adresáre používateľov (zariadenie "/dev/hda6
"
môže byť vo vašom prípade celkom iné)
/dev/hda6 /home ext2 defaults 1 2
upravíme riadok na:
/dev/hda6 /home ext2 defaults,nosuid,nodev 1 2
To isté môžete urobiť aj pre súborové systémy, do ktorých majú používatelia
prístup. Ak máte pekne rozdelený disk, pripadajú
do úvahy "/var/tmp
" resp. "/var/spool/mail
"
a "/tmp
". Pre tie môžete pridať aj parameter "noexec", aby sa
z daného súborového systému nedalo nič spúšťať. Medzi mailami
a v "/tmp
" nemajú zariadenia a programy čo hľadať.
/dev/hda7 /tmp ext2 defaults,nosuid,nodev,noexec 1 2
Po uložení súboru "/etc/fstab
" treba znovu pripojiť súborové
systémy:
mount -a -o remount
Upozornenie: takto sa môžete chrániť pred setuid programami bežných
používateľov alebo pred ich už existujúcimi zadnými vrátkami typu "rootovský
setuid shell". Príznak "nosuid" však nemôžete určiť pre súborové systémy, na
ktorých sa nachádzajú systémové programy (najčastejšie je to len hlavný
súborový systém "/", ale niekto zvykne mať aj "/usr
" a pod.)
- keby ste to urobili, server by začal robiť problémy, pretože mnoho
systémových programov potrebuje byť setuid.
Druhým spôsobom zneužitia setuid programov sú trójske kone. Existuje ich
celá kopa, napr. program, čo sa tvári ako "ping
", ale
v skutočnosti robí niečo iné. V dnešnej dobe sa vám zriedka podarí
nainštalovať si čosi také, ak inštalujete distribúciu Linuxu a upgradujete ju
z dôveryhodných zdrojov (ak sa dá, kontrolujte kontrolné súčty - ak
používate program "rpm
", môžete použiť "rpm -V
meno_balika
").
Iná vec je, keď vám útočník po úspešnom prieniku zanechá na serveri niekoľko
takýchto trójskych koní. Aby nevyvolal zvýšenú pozornosť, zvyknú ich útočníci
maskovať za seriózne a potrebné programy - napríklad za už spomínaný
"ping
", ktorý je setuid root a ktorý som jedného dňa našiel
zmenený. (Pripomínam, že hlavný súborový systém nemôžete chrániť pomocou
"nosuid"). V budúcnosti sa môže hacker vrátiť, spustiť svoj program (napríklad
s nejakým špeciálnym parametrom) a už má opäť rootovské práva. V princípe sa
trójske kone používajú najmä ako zadné vrátka.
Teraz sa teda pozrieme, čo s setuid súbormi v hlavnom adresári a na iných
miestach, ktoré nemôžeme chrániť pomocou "nosuid". Máme na sklade ešte pasívne
riešenie - môžeme ich kontrolovať a to ich výskyt na disku a tiež každú zmenu
v takýchto súboroch. Existujú na to špecializované programy (Nabou (http://www.daemon.de/Nabou) a chystám
sa vyskúšať "tripwire
", ktorý okrem setuid súborov kontroluje
aj všetky ostatné), ale teraz si ukážeme, ako to urobiť bez nich.
Ak chcete na disku nájsť všetky súbory, ktoré majú nastavený príznak "s" pre
vlastníka, použite príkaz "find
":
find / -type f -perm -04000
ak vás zaujíma aj príznak "s" pre skupiny:
find / -type f \( -perm -04000 -o -perm -02000 \)
iba s-kové súbory s vlastníkom root:
find / -type f -user root -perm -04000
Nebudem vás napínať, ponúkam vám jeden hotový skript, ktorý vyhľadáva setuid
súbory s vlastníkom alebo skupinou "root" na celom disku (okrem
"/proc
"). Skript zisťuje, či sa zmenil kontrolný súčet (a teda či
došlo k zmene) setuid programu. Výsledný zoznam zašle mailom používateľovi
"root". Pre tých, čo nerozumejú shellu, napísal som dovnútra
pár komentárov (za znakom "#").
Celý skript si môžete aj stiahnuť.
#!/bin/bash # check root suid/sgid files and md5 checksum # VIX, 25/3/2001 # thanks to "msec" by Mandrake # subory, ktore budeme potrebovat: # pre porovnavanie so vcerajskom si musime ponechat aj vcerajsi stav SUID_FILES_TODAY=/var/log/s-files.today SUID_FILES_YESTERDAY=/var/log/s-files.yesterday SUID_FILES_TMP=/var/log/s-files.tmp SUID_FILES_DIFF=/var/log/s-files.diff # subory s "kontrolnymi suctami" (MD5) SUID_MD5_TODAY=/var/log/s-md5.today SUID_MD5_YESTERDAY=/var/log/s-md5.yesterday SUID_MD5_TMP=/var/log/s-md5.tmp OUTPUT_FILE=/var/log/s-output.tmp echo "Searching for SUID/SGID files..." >>$OUTPUT_FILE # najvacsia magia: hladanie programov na disku find / -path '/proc' -prune -o \( \( -user root -and -perm +04000 \) -or \ \( -group root -and -perm +02000 \) \) -type f -print \ | sort > "$SUID_FILES_TMP" # vypocita sa MD5 cat $SUID_FILES_TMP |xargs md5sum > "$SUID_MD5_TMP" # vznikaju "dnesne" subory mv -f $SUID_FILES_TMP $SUID_FILES_TODAY mv -f $SUID_MD5_TMP $SUID_MD5_TODAY # ak mame s cim porovnavat, porovnavame so vcerajsim stavom if [ -f $SUID_FILES_YESTERDAY ]; then if ! diff -u $SUID_FILES_YESTERDAY $SUID_FILES_TODAY > \ "$SUID_FILES_DIFF"; then grep -w "^+" $SUID_FILES_DIFF | grep -vw "^+++ " | sed 's/^.//' |\ while read file; do printf "Added s-file: ${file}\n`ls -l ${file}`\n" >>$OUTPUT_FILE done grep -w "^-" $SUID_FILES_DIFF | grep -vw "^--- " | sed 's/^.//' |\ while read file; do echo "Removed s-file: ${file}" >>$OUTPUT_FILE done else echo "NO CHANGES in s-files list found." >>$OUTPUT_FILE fi else echo "No yesterday's data available." >>$OUTPUT_FILE fi if [ -f $SUID_MD5_YESTERDAY ]; then echo "Checking MD5 checksums..." >>$OUTPUT_FILE md5sum -cv $SUID_MD5_YESTERDAY >>$OUTPUT_FILE 2>&1 else echo "First run, no md5 checks." >>$OUTPUT_FILE fi # pamatame na zajtra a dnesne subory prehlasime za vcerajsie cp -f $SUID_FILES_TODAY $SUID_FILES_YESTERDAY cp -f $SUID_MD5_TODAY $SUID_MD5_YESTERDAY # All done, now mail it to the sysadmin! /usr/bin/mail -s "S-FILES security scan at `date`" root < $OUTPUT_FILE rm $OUTPUT_FILE ##netstat -pevan 2>/dev/null |grep LISTEN | grep -v ^unix | mail -s LISTEN root # ako bonus zistime aktivne spojenia a servery beziace na nasom pocitaci netstat -pevln 2>/dev/null | grep -v ^unix | mail -s LISTEN root netstat -pevan 2>/dev/null |grep ESTABLISHED | grep -v ^unix | mail -s ESTABLISHED root
Ak tento program nastavíte na spúšťanie každú noc (pomocou
"crond
"), každý deň vás bude čakať mail so zoznamom s-kových
súborov a prípadnými zmenami. Pokiaľ nejaký program upgradujete, počítajte
s tým, že sa jeho kontrolný súčet zmení ;-)
Ak necháte odkomentované aj posledné dva riadky skriptu, dostanete ďalšie dva
maily, ktoré vám prezradia, aké sieťové spojenia boli v čase spustenia skriptu
aktívne a aké démony počúvali na akých portoch. Na tieto testy sa používa
program netstat
.
Ak ste väčší paranoici ako ja, mali by ste si mail nechať posielať na iný počítač, pretože ak vám niekto hackne server, môže sa poobzerať a pozametať za sebou stopy aj v mailboxoch... ;-)
Ako vidíte, setuid súbory sú ako malé deti - treba na ne dávať dobrý pozor,
lebo by mohli veľmi rýchlo vyrásť. Ak ste doteraz setuid súbory
nekontrolovali, mali by ste s tým začať čím skôr. Či už použijete môj skript,
alebo nejaký oficiálny program, hlavné je, aby ste sa s-kovým súborom venovali.
Ak totiž zistíte zmenu v niektorom z nich a naisto viete, že ste neinštalovali
jeho novú verziu (alebo novú verziu balíka, ktorý zahŕňa tento súbor), je
takmer isté, že máte v systéme hackera.
Ak zmeny v setuid súboroch nezisťujete, neznamená to, že ho tam nemáte.
Ďalším rizikovým faktorom súborového systému sú súbory a adresáre zapisovateľné pre všetkých používateľov. Adresáre sú nebezpečnejšie, pretože umožňujú komukoľvek zmazať obsah adresára (bez ohľadu na práva súborov v adresári)!
Za normálnych okolností existuje niekoľko súborov (v "/dev
")
a adresárov zapisovateľných pre všetkých používateľov. Tieto som našiel doma
ja:
Systémové súbory:
/dev/null
/dev/full
/dev/zero
Systémové adresáre:
/tmp
/var/tmp
/var/spool/postfix/maildrop
(iba ak používate postfix)
O vymenované systémové súbory v "/dev
" sa nebojte, sú určené
práve na zápis. Napríklad "/dev/null
" je súbor - zariadenie, do
ktorého môžete čokoľvek zapísať, pričom sa výsledok nikam neuchová.
"null
" sa správa ako čierna diera a používa sa pri presmerovaní
výstupu z programov. Horšie by bolo, keby ste objavili povedzme voľne
zapisovateľný súbor "/dev/hda
". Znamenalo by to, že vám ktokoľvek
bez námahy môže vymazať (prvý IDE) harddisk.
Adresáre "/tmp
" a "/var/tmp
" sa nachádzajú na každom
unixovom systéme a služia ako miesto na dočasné súbory. Môže do nich zapisovať
každý používateľ (pozrite aj ako sa v takýchto adresároch
chrániť proti setuid programom). Proti vymazaniu cudzích súborov existuje
jednoduchá ochrana
- atribút "t" použitý pri zmene prístupových práv. Ak sa pozriete na dočasné
adresáre, mali by ste vidieť asi toto:
ls -lad /tmp drwxrwxrwt 11 root root 4096 jan 29 22:40 /tmp
Atribút "t" spôsobí, že používateľ do neho síce môže zapísať, čo len chce, ale vymazať môže iba svoje súbory. Hore uvedené práva nastavíte pomocou:
chmod 1777 /tmp
Pred samotným hľadaním si treba uvedomiť, že všetky symbolické linky sú
zapisovateľné pre všetkých (čo však nevadí, pretože práva symbolických liniek
sa nikdy neberú do úvahy). Vo výraze pre "find
" ich teda
odignorujeme pomocou "! -type l
":
find / -perm -2 ! -type l -ls
Výstup príkazu bude obsahovať aj súbory a adresáre, ktoré som uviedol ja,
okrem nich veľa ďalších zariadení v "/dev
" a niekoľko socketov
(často vo "/var
"). Na prípadné ďalšie adresáre a súbory treba dať
dobrý pozor a zistiť, kto ich vytvoril a načo slúžia.
crond
".