Πρώτο commit
Αυτό το commit περιλαμβάνεται σε:
commit
8ec8e9bee2
451 αρχεία άλλαξαν με 46736 προσθήκες και 0 διαγραφές
175
content/articles/30/05_lids.md
Κανονικό αρχείο
175
content/articles/30/05_lids.md
Κανονικό αρχείο
|
@ -0,0 +1,175 @@
|
|||
+++
|
||||
title = 'Linux Intrusion Detection System - μία παρουσίαση'
|
||||
date = '2000-03-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Μιχάλης Καμπριάνης'
|
||||
issue = ['Magaz 30']
|
||||
issue_weight = 5
|
||||
+++
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Το LIDS, Linux Intrusion Detection System είναι ένα add-on του πυρήνα του linux, που συνοδεύεται από ένα admin tool, το οποίο φροντίζει να κάνει το σύστημά μας
|
||||
κάπως πιο\... \"ασφαλές\"*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
**1. Εισαγωγή**
|
||||
--------------------------------------
|
||||
|
||||
**2. Capabilities**
|
||||
------------------------------------------
|
||||
|
||||
- [2.1 Τι είναι τα capabilities?](#ss2.1)
|
||||
- [2.2 Δεν κατάλαβα τι μου παρέχουν\...](#ss2.2)
|
||||
- [2.3 Δεν μου αναφέρεις μερικά capabilities;](#ss2.3)
|
||||
|
||||
**3. LIDS λοιπόν\...**
|
||||
---------------------------------------------
|
||||
|
||||
- [3.1 Το kernel-patch](#ss3.1)
|
||||
- [3.2 Το lidsadm](#ss3.2)
|
||||
|
||||
**4. Άρα\....**
|
||||
--------------------------------------
|
||||
|
||||
- [4.1 Hints and tricks](#ss4.1)
|
||||
- [4.2 Που το βρίσκω; Άλλο Documentation;](#ss4.2)
|
||||
- [4.3 Disclaimer και συμπεράσματα.](#ss4.3)
|
||||
|
||||
|
||||
### [1. Εισαγωγή]{#s1}
|
||||
|
||||
Το linux, ως unix-type λειτουργικό, κουβαλάει μαζί του κάποιες αδυναμίες των παλιών και άλλων unices. Μία από αυτές τις αδυναμίες, έχει να κάνει με το
|
||||
γενικότερα σύστημα authorization, όπου υπάρχουν πάρα πολλά πράγματα, που μπορεί να τα κάνει μόνο το παντοδύναμο root account\... Αυτό το σχήμα της ασφάλειας,
|
||||
θεωρείται ξεπερασμένο, εφόσον
|
||||
|
||||
- υπάρχουν πάρα πολλά πράγματα που γίνονται μόνο από το root account, αναγκάζοντάς μας έτσι αφενός να κάνουμε πολλά προγράμματα setuid root, αφετέρου να
|
||||
μοιράζουμε το root password σε πολλά άτομα αν μιλάμε για μία φάρμα servers με πολλούς operators.
|
||||
- αρκεί για κάποιον εισβολέα να αποκτήσει το root password για να έχει πλήρη έλεγχο στο σύστημα.
|
||||
- προγράμματα που είναι άσχετα με το λειτουργικό (π.χ. sendmail στις παλαιότερες εκδόσεις), ακριβώς επειδή πρέπει να τρέχουν με root privileges, αποτελούν
|
||||
κίνδυνο γενικότερης ασφάλειας στο σύστημα, και όχι μόνο για την υπηρεσία που εξυπηρετούν αυτή καθ\' αυτή.
|
||||
|
||||
Πολλά από αυτά τα θέματα, θα μπορούσαν να ξεπεραστούν με χρήση των capabilities, ένα \"τρικ\", το οποίο προστέθηκε στην έκδοση 2.2 του Linux kernel.
|
||||
|
||||
|
||||
### [2. Capabilities]{#s2}
|
||||
|
||||
### [2.1 Τι είναι τα capabilities?]{#ss2.1}
|
||||
|
||||
Τα capabilities είναι ένα set, όπως λέει και το όνομά τους, δυνατοτήτων, που ορίζονται μέσα στον πυρήνα, και περιορίζουν τις δυνατότητες του root που μέχρι τώρα
|
||||
ξέραμε ότι είχε (και των setuid root προγραμμάτων αντίστοιχα). Τα capabilites ορίστηκαν από κάποιο POSIX draft (το οποίο τώρα αποσύρθηκε), ενώ ο πυρήνας του
|
||||
Linux έχει και πολλά capabilities τα οποία δεν αναφέρονται στο draft αλλά είναι linux-specific.\
|
||||
Ένα παράδειγμα capability, είναι το CAP\_CHOWN το οποίο επιτρέπει την αλλαγή ιδιοκτήτη ενός αρχείου. Όπως καταλαβαίνετε, για να κάνουμε chown ένα αρχείο, πρέπει
|
||||
να είμαστε ο root, άρα ένα πρόγραμμα που θέλουμε να κάνει chown πρέπει να είναι setuid root. Κάτι τέτοιο όμως αυτόματα σημαίνει ότι το ίδιο πρόγραμμα, θα μπορεί
|
||||
να διαβάσει το αρχείο /etc/shadow, δημιουργώντας έτσι, για κάτι τόσο απλό, μία τρύπα ασφαλείας στο σύστημα. Με χρήση των capabilities, μπορεί το setuid root
|
||||
πρόγραμμα να αρχίσει να τρέχει, και μετά να \"ρίξει\" όλα τα capabilities που δεν χρειάζεται και να κρατήσει μόνο το cap\_chown. Μπορεί επίσης, να αλλάξει το
|
||||
effective uid και πλέον να μην μπορεί καν να ανακτήσει τα dropped capabilities.
|
||||
|
||||
### [2.2 Δεν κατάλαβα τι μου παρέχουν\...]{#ss2.2}
|
||||
|
||||
Λογικό, γιατί ακόμα, δεν μας παρέχουν τίποτα. Για να τα λέμε σωστά τα πράγματα, πρέπει η εφαρμογή μας να γραφτεί έτσι ώστε να χρησιμοποιεί τα capabilities,
|
||||
αλλιώς δεν κερδίζουμε τίποτα.. Γι αυτό ξεκίνησε και το project LIDS (Linux Intrusion Detection System) το οποίο παρέχει απλά ένα layer μεταξύ του συστήματος
|
||||
(kernel) και των εφαρμογών, για να επιβάλλει την χρήση capabilities σε ήδη γραμμένες εφαρμογές.
|
||||
|
||||
### [2.3 Δεν μου αναφέρεις μερικά capabilities;]{#ss2.3}
|
||||
|
||||
Αμέ\... Το CAP\_CHOWN που είδαμε πιο πάνω, το CAP\_NET\_BIND\_SERVICE που επιτρέπει σε μία εφαρμογή να ανοίξει ένα port κάτω από το 1024 (privileged ports), το
|
||||
CAP\_SYS\_PTRACE που επιτρέπει την χρήση της ptrace() σε οποιοδήποτε process\...\
|
||||
Μία πλήρη λίστα για τον δικό σας πυρήνα, θα βρείτε εδώ:
|
||||
|
||||
/usr/src/linux/include/linux/capability.h
|
||||
|
||||
|
||||
### [3. LIDS λοιπόν\...]{#s3}
|
||||
|
||||
Το LIDS αποτελείται από δύο κομμάτια: ένα (μεγαλούτσικο) kernel patch, και ένα administration πρόγραμμα, το lidsadm. Ας τα δούμε ξεχωριστά.
|
||||
|
||||
### [3.1 Το kernel-patch]{#ss3.1}
|
||||
|
||||
Παρέχει τις εξής extra παραμέτρους στον πυρήνα:
|
||||
|
||||
- CONFIG\_LIDS: όπως λέει και το όνομά του, ενεργοποίηση του LIDS.
|
||||
- CONFIG\_LIDS\_HANGUP: κάθε φορά που κάποιο πρόγραμμα προσπαθεί να κάνει κάτι που απαγορεύεται από το LIDS, τότε η κονσόλα στην οποία το πρόγραμμα είναι
|
||||
attached θα κλείνει.
|
||||
- CONFIG\_LIDS\_SA\_EXEC\_UP: κάθε φορά που εκτελείται ένα πρόγραμμα μη προστατευμένο πριν μπει σε \"λειτουργία\" το LIDS (κατά τη διάρκεια του boot προφανώς)
|
||||
θα δημιουργείται ένα security alert.
|
||||
- CONFIG\_LIDS\_NO\_EXEC\_UP: με αυτή την επιλογή το LIDS θα αρνηθεί να τρέξει μη προστατευμένα προγράμματα πριν αυτό μπει σε \"λειτουργία\".
|
||||
- CONFIG\_LIDS\_INIT\_CHILDREN\_LOCK: με αυτή την επιλογή θα προστεθεί η δυνατότητα να αποκλειστούν κάποια στιγμή (την οποία επιλέγουμε εμείς) όλοι οι τρόποι
|
||||
για να σκοτώσει κάποιος ένα process του οποίου το parent process είναι η init.
|
||||
- CONFIG\_LIDS\_NO\_FLOOD\_LOG: Αν ένα μήνυμα του LIDS επαναλαμβάνεται επί μακρόν, το LIDS θα σταματήσει να το γράφει στα logs για να μην τα γεμίσει.
|
||||
- CONFIG\_LIDS\_PORT\_SCAN\_DETECTOR: Με αυτή την επιλογή θα δημιουργηθεί μέσα στον kernel ένας port scanner detector, και για κάθε port scan το LIDS θα
|
||||
καταγράφει τα απαιτούμενα μηνύματα στα logs.
|
||||
- CONFIG\_LIDS\_TIMEOUT\_AFTER\_FLOOD: Είναι ο χρόνος τον οποίο πρέπει να απέχουν μεταξύ τους δύο διαφορετικά security alerts για να καταγραφούν.
|
||||
- CONFIG\_LIDS\_ALLOW\_SWITCH: Με αυτή την επιλογή μπορεί να \"απενεργοποιηθεί\" προσωρινά το LIDS.
|
||||
- CONFIG\_LIDS\_MAX\_TRY: Πόσες φορές θα δεχθεί λάθος password το LIDS πριν \"κλειδώσει\" για λίγο τη δυνατότητα απενεργοποίησής του.
|
||||
- CONFIG\_LIDS\_TTW\_FAIL: Πόση ώρα θα κρατάει το \"κλείδωμα\" που λέγαμε πιο πάνω.
|
||||
- CONFIG\_LIDS\_REMOTE\_SWITCH: Με αυτή η επιλογή, η απενεργοποίηση θα είναι δυνατή και από απόμακρο τερματικό, αλλιώς, μόνο από την κονσόλα.
|
||||
- CONFIG\_LIDS\_ALLOW\_ANY\_PROG\_SWITCH: Κανονικά μόνο το /sbin/lidsadm μπορεί να απενεργοποιήσει το LIDS αλλά με αυτή την επιλογή, μπορούμε να επιτρέψουμε
|
||||
και σε άλλα προγράμματα να κάνουν κάτι τέτοιο.
|
||||
- CONFIG\_LIDS\_RELOAD\_CONF: Επιτρέπει την επανανάγνωση του αρχείου ρυθμίσεων του LIDS χωρίς να χρειάζεται reboot.
|
||||
- CONFIG\_LIDS\_SA\_THROUGH\_NET: Με αυτή την επιλογή, τα security alerts στέλνονται δια μέσω του δικτύου, και γι αυτό πρέπει να οριστούν ορισμένες ρυθμίσεις,
|
||||
τις οποίες θα δούμε παρακάτω.
|
||||
- CONFIG\_LIDS\_HIDE\_KLIDS: Με αυτή την επιλογή, το process του Lids θα κρύβεται από το /proc (άρα δεν θα φαίνεται στα ps, top κλπ).
|
||||
- CONFIG\_LIDS\_NET\_MAX\_TRIES: Πόσες φορές θα προσπαθήσει το LIDS να στείλει το security alert μέσω δικτύου.
|
||||
- CONFIG\_LIDS\_NET\_TIMEOUT: Πόση ώρα θα είναι το timeoute μεταξύ των προσπαθειών να σταλεί το μήνυμα μέσω δικτύου.
|
||||
- CONFIG\_LIDS\_MSGQUEUE\_SIZE: Πόσο μεγάλη να είναι η ουρά των μηνυμάτων που θα σταλούν μέσω δικτύου. Μόλις γεμίσει η ουρά, δεν θα καταγράφονται άλλα
|
||||
μηνύματα (μέχρι να ξανααδειάσει προφανώς).
|
||||
|
||||
### [3.2 Το lidsadm]{#ss3.2}
|
||||
|
||||
Το πρόγραμμα /sbin/lidsadm είναι απαραίτητο για να μπορούμε να χρησιμοποιήσουμε σωστά και αποδοτικά το LIDS. Δεν θα μπούμε βέβαια σε λεπτομέρειες χρήσης, θα
|
||||
πούμε μόνο ότι με αυτό το πρόγραμμα:
|
||||
|
||||
- μπορούμε να θέσουμε κάποια αρχεία και directories σε read-only για όλες τις processes του συστήματος, ακόμα και τις root-owned processes. Παράδειγμα το
|
||||
/usr/lib
|
||||
- μπορούμε να θέσουμε κάποια αρχεία σε append-only mode (θυμηθείτε Windows-NT και permission to write), όπως για παράδειγμα το /var/log/messages
|
||||
- μπορούμε να θέσουμε κάποια αρχεία σε hidden για όλες τις processes, όπως το /etc/shadow\...
|
||||
- \...δίνοντας σε συγκεκριμένα προγράμματα το δικαίωμα να τα διαβάζουν, όπως το /bin/login
|
||||
- μπορούμε να ορίσουμε τα capabilities που θα αφαιρέσουμε από **όλα** τα προγράμματα, όταν θα κλειδώσουμε τον πυρήνα, π.χ. το CAP\_SYS\_MODULE
|
||||
- μπορούμε να προσθέσουμε κάποια από αυτά που αφαιρέσαμε globally, σε συγκεκριμένα executables
|
||||
- με τη δυνατότητα να γίνονται inherited στα child processes
|
||||
- μπορούμε να απενεργοποιήσουμε προσωρινά το LIDS (για να θέσουμε νέες ρυθμίσεις π.χ.)\...
|
||||
- \... και να το επανενεργοποιήσουμε αφού του ζητήσουμε να διαβάσει το configuration ξανά
|
||||
- μπορούμε να \"κρύψουμε\" processes
|
||||
- ή μπορούμε να τα κάνουμε να αγνοούν το kill
|
||||
|
||||
Νομίζω ότι πιάσατε την κεντρική ιδέα. Υπάρχουν βέβαια περιορισμοί. Συγκεκριμένα, τα file-attributes που θέτουμε, τίθενται με βάση το inode, άρα δεν μπορούμε να
|
||||
κλειδώσουμε το /etc directory και να περιμένουμε να δουλεύει η εντολή passwd (η οποία αναδημιουργεί το password file κάθε φορά, άρα αυτό αποκτά άλλο inode κάθε
|
||||
φορά, συνεπώς ΔΕΝ μπορούμε να δώσουμε full privilege στην εντολή passwd πάνω σε αυτό το αρχείο).
|
||||
|
||||
|
||||
### [4. Άρα\....]{#s4}
|
||||
|
||||
### [4.1 Hints and tricks]{#ss4.1}
|
||||
|
||||
Πολύ χρήσιμο κρίνεται το remote logging που παρέχει το LIDS. Πρέπει να δοθεί προσοχή στις ρυθμίσεις (σε ποιο server θα κάνει logging, με ποια μέθοδο κλπ) και να
|
||||
σχεδιαστεί σωστά το δίκτυο ούτως ώστε να μην έχουμε \"κομμένες\" γραμμές εκεί (π.χ. κάποιος αποφάσισε να βάλει ένα firewall ανάμεσα στα συστήματά μας :-).\
|
||||
Θέλει σοβαρή μελέτη το ποια αρχεία/directories θα κλειδώσουμε, πόσο θα τα κλειδώσουμε (όπως είπαμε μπορούμε να τα κρύψουμε εντελώς, να τα κάνουμε μόνο
|
||||
ανάγνωσης, να τα κάνουμε μόνο append ή να τα κάνουμε εγγραφής/ανάγνωσης), σε ποια προγράμματα θα δώσουμε δικαίωμα να προσπελαύνουν τα αρχεία/directories
|
||||
αυτά\... Το μόνο σίγουρο είναι ότι δεν υπάρχει συνταγή, και μάλλον είναι δύσκολο να γραφτεί μία. Μην εμπιστευτείτε καμία συνταγή, αν πρόκειται για production
|
||||
σύστημα.\
|
||||
Πρέπει επίσης να μελετηθεί σωστά το σε ποια αρχεία/executables θα δοθούν τα capabilities που θα επιτρέπουν να κάνουν unmount τα filesystems και να τερματίζουν
|
||||
διεργασίες, για να μπορεί το σύστημα να \"κατεβαίνει\" κανονικά, και να μην κάνει fsck σε κάθε boot, ούτε να βρίσκει \"ανοιχτά\" processes.\
|
||||
Σε κάθε περίπτωση, **πρέπει** να επιτραπεί το switching κατά το compile του πυρήνα, για να μπορείτε να απενεργοποιήσετε το lids προσωρινά. Αλλιώς, το root
|
||||
account, σε μία normal εγκατάσταση, θα είναι τόσο περιορισμένο που θα είναι άχρηστο.\
|
||||
Τέλος, αν δείτε ότι το σύστημα δεν καλο-δουλεύει μετά τις αλλαγές που κάνατε, ένα security=0 σαν command parameter στο lilo θα σας δώσει τη δυνατότητα να
|
||||
ξεκινήσετε το σύστημα με το LIDS απενεργοποιημένο.
|
||||
|
||||
### [4.2 Που το βρίσκω; Άλλο Documentation;]{#ss4.2}
|
||||
|
||||
Που το βρίσκετε; Μα που αλλού, εκτός από το <http://www.lids.org>. Εκεί θα βρείτε, εκτός από τα patches για τους πυρήνες της σειράς 2.4 και της σειράς 2.2, και
|
||||
διάφορα links για documentation. Το δικό τους FAQ, links για άρθρα που έχουν γραφτεί για το LIDS, links για reviews, link για εκείνο το POSIX draft\....\
|
||||
Καλό θα ήταν βέβαια να υπήρχε ένα graphical configuration utility (πεδίον δόξης λαμπρό για τους απανταχού qt ή gtk programmers) αλλά δεν έχει γραφτεί κάποιο
|
||||
τέτοιο ακόμα από ότι ξέρω. Ιδού η Ρόδος\....
|
||||
|
||||
### [4.3 Disclaimer και συμπεράσματα.]{#ss4.3}
|
||||
|
||||
Δεν χρειάζεται βέβαια να πω ότι η χρήση του LIDS δεν προτείνεται αν είστε αρχάριος. Σε κάθε περίπτωση, για ότι κάνετε με το LIDS (ή και χωρίς αυτό :-) δεν φέρω
|
||||
καμία ευθύνη. Διαβάστε το documentation, ξαναδιαβάστε το, κι αν είστε έτοιμοι, πάρτε ένα backup τα αρχεία σας και δοκιμάστε το\...
|
||||
|
||||
Το LIDS δεν μου φάνηκε ακόμα έτοιμο για production servers, κυρίως λόγω της έλλειψης documentation και ενός εύκολου configuration utility. Όπως ξαναείπα, ιδού
|
||||
πεδίο δόξης λαμπρό\...\
|
||||
Η αλήθεια είναι πάντως, ότι παρέχει ένα επίπεδο ακόμα ασφαλείας στο παλιό γνωστό και ταλαιπωρημένο Unix-security scheme\... Μόλις δοθεί η δυνατότητα υποστήριξης
|
||||
capabilities και στο filesystem, όλα θα είναι καλύτερα :-)
|
||||
|
Φόρτωση…
Προσθήκη πίνακα
Προσθήκη υπερσυνδέσμου
Παράθεση σε νέο ζήτημα