Εμφάνιση Πλήρους Έκδοσης : Application Firewall:συγκεκριμένα προγράμματα αποκτούν πρόσβάση σε συγκεκριμένα ports
Ρυθμίζοντας τα iptables επιτρέπω σε όλα τα προγράμματα να έχουν πρόσβαση σε συγκεκριμένα ports. Πως όμως μπορώ να επίλεξω ποιά προγράμματα θα έχουν πρόσβαση και σε ποιά ports;
Π.χ. ο Firefox μπορεί να έχει προσβαση στα ports 80, 53, και 443. To Gaim/Pidgin μόνο στο port 80, κτλ. Δηλαδη, πάνω-κάτω ότι κάνει το ZoneAlarm στα Windows.
Θα πρέπει να χρησιμοποιήσεις το Owner-Match module των iptables (συμπεριλαμβάνεται στον kernel με όνομα CONFIG_IP_NF_OWNER, το module ονομάζεται ipt_owner). Αυτό δίνει την δυνατότητα να κάνεις match πακέτα που στάλθηκαν από συγκεκριμένο user ή process μέσα από τα iptables. Για τη σύνταξη δες εδώ (http://iptables-tutorial.frozentux.net/iptables-tutorial.html#OWNERMATCH). Η επιλογή που σε ενδιαφέρει είναι η --cmd-owner. Δεν έχει ακριβώς το interface του zonealarm, αλλά σίγουρα περισσότερες δυνατότητες :)
firewalker
19-05-2007, 19:48
nske, θα ταίριαζε να βάλεις και τα iptables στο Unix Basics ή ξεφεύγουμε; Απλά παραδειγματάκια ίσως.
Έχει κάνει πολύ καλύτερη δουλειά ο apoikos στον δικό του οδηγό (http://www.insomnia.gr/vb3/showthread.php?t=170844) από ότι θα μπορούσα να κάνω. Όποιος διαβάσει αυτά που εξηγεί πολύ κατανοητά αυτός ο οδηγός και έχει μια ιδέα για το πως δουλεύει το TCP/IP (http://en.wikipedia.org/wiki/Internet_protocol_suite) μπορεί να φτιάξει τα πάντα, μιας και όλα αυτά τα εξωτικά extensions υπάγονται την ίδια λογική (επιλέγω τα πακέτα με τα κριτήρια που παρέχει ένα συγκεκριμένο match και τα στέλνω σε έναν target ο οποίος τυπικά ορίζει τι θα απογίνουν).
firewalker
20-05-2007, 14:00
Έχει κάνει πολύ καλύτερη δουλειά ο apoikos στον δικό του οδηγό (http://www.insomnia.gr/vb3/showthread.php?t=170844) από ότι θα μπορούσα να κάνω. Όποιος διαβάσει αυτά που εξηγεί πολύ κατανοητά αυτός ο οδηγός και έχει μια ιδέα για το πως δουλεύει το TCP/IP (http://en.wikipedia.org/wiki/Internet_protocol_suite) μπορεί να φτιάξει τα πάντα, μιας και όλα αυτά τα εξωτικά extensions υπάγονται την ίδια λογική (επιλέγω τα πακέτα με τα κριτήρια που παρέχει ένα συγκεκριμένο match και τα στέλνω σε έναν target ο οποίος τυπικά ορίζει τι θα απογίνουν).
Εγώ έγραψα μαλακία. Στο iproute - iproute2 ήθελα να αναφερθώ. Είχες πει κάπου και για έλεγχο bandwith εφαρμογών μέσω iproute2 αλλά σε έχασα λίγο...
Το iproute με το iproute2 είναι ένα και το αυτό;
Ναι, δεν υπάρχει iproute μόνο iproute2. Η αλήθεια είναι ότι το επίσημο howto (http://lartc.org/howto/) του iproute2 αρκετά πρόχειρο και αφήνει πολλά πράγματα να εννοούνται.
Δεν τα ξέρω καλά τα εργαλειά του -ειδικά τις τεχνικές queing- οπότε θα μου πάρει χρόνο να τα βάλω σε μια σειρά για να τα εξηγήσω αλλά θα προσπαθήσω.
Ευχαριστώ nske. Έχω δουλεία μπροστά μου. Όταν τελειώσω με αυτά που έχω να κάνω θα post-άρω το παλιό και το καινούριο firewall script να πάρω μια κριτική.
Έχω ένα μικρό πρόβλημα. Είμαι σε Ubuntu 6.10, πλήρως updated με stock kernel:
Linux ubuntu 2.6.17-10-generic #2 SMP Tue Dec 5 22:28:26 UTC 2006 i686 GNU/Linux
Αφού γίνω root με sudo su ξεκινήσω το module ipt_owner με:
modprobe ipt_owner
(και δίχως να λάβω error message κατά το load του module) δίνω την ακόλουθη γραμή, η οποία υποτίθεται πως θα μπλοκάρει όλες τις εξόδους του Firefox:
iptables -A OUTPUT -m owner --cmd-owner firefox-bin -j DROP
και λαμβάνω αυτό το error:
iptables: Unknown error 4294967295
Τι κάνω λάθος;
Τίποτα, απ' ότι φαίνεται δεν υποστηρίζεται πια. Στο kernel log πετάει το εξής μήνυμα:
ipt_owner: pid, sid and command matching not supported anymore
άρα πια κάνει match μόνο τον owner :(
Θα ψάξω μήπως υπάρχει κάτι άλλο εκεί έξω.
Δεν βλέπω να υπάρχει κάτι αντίστοιχο. Από ότι διαβάζω αυτές οι δυνατότητες του ipt_owner καταργήθηκαν γιατί δεν ήχαν ενσωματωθεί σωστά (ήταν εύκολο για μια εφαρμογή να τις ξεγελάσει) και δεν υπήρχε εύκολος τρόπος να ενσωματωθούν σωστά.
Αν θέλεις δες το snort (http://www.snort.org) που επιτρέπει την ανίχνευση ύποπτων patterns πακέτων ή του περιεχομένου τους και μπορεί να περάσει αυτόματα κανόνες στα iptables για την απόρριψη αυτών των πακέτων. Εδώ (http://www.snort.org/rules/) και εδώ (http://www.bleedingsnort.com/) διατίθενται set κανόνων που ανανεώνονται διαρκώς για να περιλαμβάνουν τα τελευταία malware που βρίσκονται κάθε μέρα.
Είναι κρίμα να μην υπάρχει κάτι τόσο χρήσιμο. Ελπίζω πως κάτι άλλο θα το αντικαστήσει. Μήπως βλέπεις κάποιο υποσχόμενο project στον ορίζοντα;
Το Snort μου προκαλεί (http://it.slashdot.org/it/07/02/20/2319225.shtml) νευρικότητα (http://www.google.com/search?hl=en&safe=off&c2coff=1&q=snort+vulnerability+remotely+exploitable&btnG=Search
) και προτιμώ να μην ενδόσω. Τουλαχιστόν για τώρα που είμαι ακόμα αρχάριος. Έχω ακούσει για ένα πράγμα που λεγεται Mandatory Access Control. Δεν έχω κατανοήσει πλήρως τι ακριβώς κάνει, και δεν ξέρω ακόμα αν μπορεί να κάνει πράγματα στο networking. Ακούγεται και προχωριμένο για μένα. Θα πρέπει να το κοιτάξω.
Ευχαριστώ nske.
Μια ακόμα ερώτηση. Εφορμόμενος από το avatar που έχεις (τον χαριτωμένο BSD deamon :P), μήπως μπορείς να μου πεις αν υπάρχει αυτό που ψάχνω στα BSD (Free, Open, Net);
Μια ακόμα ερώτηση. Εφορμόμενος από το avatar που έχεις (τον χαριτωμένο BSD deamon :P), μήπως μπορείς να μου πεις αν υπάρχει αυτό που ψάχνω στα BSD (Free, Open, Net);Όχι απ' όσο ξέρω (τουλάχιστον όχι μέσα από το firewall τους ή με κάποιον άλλον απλό τρόπο). Αν γίνεται μάλλον θα γίνεται μόνο στο FreeBSD μέσω του TrustedBSD (http://www.trustedbsd.org/home.html).
Έχω ακούσει για ένα πράγμα που λεγεται Mandatory Access Control. Δεν έχω κατανοήσει πλήρως τι ακριβώς κάνει, και δεν ξέρω ακόμα αν μπορεί να κάνει πράγματα στο networking.
Ένα MAC system ορίζει σε ποιους πόρους του λειτουργικού θα έχει πρόσβαση μια εφαρμογή ή ένας χρήστης. Ένας από αυτούς τους πόρους είναι τα sockets, τα οποία είναι υπεύθυνα για την δικτυακή επικοινωνία. Από ότι βλέπω εδώ (http://seedit.sourceforge.net/doc/access_vectors/), το SELinux επιτρέπει αρκετά αναλυτικό έλεγχο στα sockets για τα κριτήρια που σε ενδιαφέρουν (διευθύνσεις και ports προορισμού ) και το ίδιο επιτρέπει και το GRsecurity μέσω των IP Access Control Lists, όμως δεν τα έχω δοκιμάσει. Πάντως το GRsecurity μου φαίνεται πιο κατανοητό και έχει και ένα εργαλείο, το Gradmin, για την αυτόματη παραμετροποίηση τον ACLs.
Ένα άρθρο (http://www.cs.virginia.edu/~jcg8f/GrsecuritySELinuxCaseStudy.pdf) που συνοψίζει τις δυνατότητες της κάθε τεχνολογίας.
γίνεται και στα *BSD:
- ipfw
gid group
Matches all TCP or UDP packets sent by or received for a group.
A group may be specified by name or number. This option should
be used only if debug.mpsafenet=0 to avoid possible deadlocks due
to layering violations in its implementation.
uid user
Match all TCP or UDP packets sent by or received for a user. A
user may be matched by name or identification number. This
option should be used only if debug.mpsafenet=0 to avoid possible
deadlocks due to layering violations in its implementation.
- pf
group <group>
Similar to user, this rule only applies to packets of sockets owned
by the specified group.
The use of group or user in debug.mpsafenet=1 environments may
result in a deadlock. Please see the BUGS section for details.
user <user>
This rule only applies to packets of sockets owned by the specified
user. For outgoing connections initiated from the firewall, this
is the user that opened the connection. For incoming connections
to the firewall itself, this is the user that listens on the desti-
nation port. For forwarded connections, where the firewall is not
a connection endpoint, the user and group are unknown.
O jsmith6 όμως ήθελε να κάνει match το όνομα του process που άνοιξε το socket, όχι τον ιδιοκτήτη του process. Για να έχει εφαρμογή το user/group match, θα έπρεπε να ρυθμιστεί κάθε εφαρμογή που κάνει χρήση δικτύου να τρέχει με δικαιώματα διαφορετικού user/group, το οποίο είναι λίγο άβολο και ανορθόδοξο.
[EDIT:] Αν και τώρα που το ξανασκέφτομαι, ίσως δεν είναι τόσο ακραίο όσες εφαρμογές θέλουν πρόσβαση στο δίκτυο να έχουν setgid bit και το εκτελέσιμο τους να ανοίκει υποχρεωτικά σε συγκεκριμένο group. Μήπως έχει επιπλοκές στην πράξη; Δε μπορώ να σκεφτώ.
O jsmith6 όμως ήθελε να κάνει match το όνομα του process που άνοιξε το socket, όχι τον ιδιοκτήτη του process.
Δεν απάντησα στον jsmith6, σε εσένα απάντησα, που είπες οτι δεν γίνεται με BSD, και σου έδωσα 2 διακριτούς τρόπους εφαρμόσιμους ανά τα 4 BSD (MACOSX inlcuded).
[EDIT:] Αν και τώρα που το ξανασκέφτομαι, ίσως δεν είναι τόσο ακραίο όσες εφαρμογές θέλουν πρόσβαση στο δίκτυο να έχουν setgid bit και το εκτελέσιμο τους να ανοίκει υποχρεωτικά σε συγκεκριμένο group. Μήπως έχει επιπλοκές στην πράξη; Δε μπορώ να σκεφτώ.
Προγανώς γίνεται, γι αυτό βγήκε.
Επιπλέον, στο FreeBSD/MACOSX υπάρχει και βάσει του JailID :
jail prisonID
Matches all TCP or UDP packets sent by or received for the jail
whos prison ID is prisonID.
Αυτά.
Προγανώς γίνεται, γι αυτό βγήκε.
Πιο πιθανό να βγήκε για να ελέγχεται το traffic ανάλογα τον χρήστη σε μηχανήματα που χρησιμοποιούνται από πολλούς χρήστες. Το ότι μπορεί να γίνει αυτό που λες είναι μάλλον αποτέλεσμα της ευελιξίας του unix που επιτρέπει τον εφευρετικό συνδιασμό διαφορετικών τεχνολογιών για σκοπούς που δεν είχε προβλέψει ο σχεδιαστής τους.
Όμως έχεις δίκιο, θεωρητικά είναι μια δυνατή λύση -απλά από όσο τη δοκίμασα δεν είναι καθόλου πρακτική, ειδικά για ένα desktop μηχάνημα όπου οι περισσότερες εφαρμογές δεν υποστηρίζουν εσωτερικά setgid():
- πολλές εφαρμογές διαμαρτύρονται αν πας να τις τρέξεις άμεσα με setuid/setgid (βλ. GTK)
- κάθε φορά που γίνεται update μια σχετική εφαρμογή από τον package manager χρειάζονται διόρθωση τα permissions της
- ο χρόνος και ο κόπος που χρειάζεται για να ρυθμιστεί κάθε μια εφαρμογή να εκτελείται έτσι μπορεί να γίνει πολύ μεγάλος, ειδικά αν έκτελείται μέσα από κάποιο helper script και έχει πολλά εκτελέσιμα.
Πιο πιθανό να βγήκε για να ελέγχεται το traffic ανάλογα τον χρήστη σε μηχανήματα που χρησιμοποιούνται από πολλούς χρήστες. Το ότι μπορεί να γίνει αυτό που λες είναι μάλλον αποτέλεσμα της ευελιξίας του unix που επιτρέπει τον εφευρετικό συνδιασμό διαφορετικών τεχνολογιών για σκοπούς που δεν είχε προβλέψει ο σχεδιαστής τους.
Όμως έχεις δίκιο, θεωρητικά είναι μια δυνατή λύση -απλά από όσο τη δοκίμασα δεν είναι καθόλου πρακτική, ειδικά για ένα desktop μηχάνημα όπου οι περισσότερες εφαρμογές δεν υποστηρίζουν εσωτερικά setgid():
- πολλές εφαρμογές διαμαρτύρονται αν πας να τις τρέξεις άμεσα με setuid/setgid (βλ. GTK)
- κάθε φορά που γίνεται update μια σχετική εφαρμογή από τον package manager χρειάζονται διόρθωση τα permissions της
- ο χρόνος και ο κόπος που χρειάζεται για να ρυθμιστεί κάθε μια εφαρμογή να εκτελείται έτσι μπορεί να γίνει πολύ μεγάλος, ειδικά αν έκτελείται μέσα από κάποιο helper script και έχει πολλά εκτελέσιμα.
Γι όλους αυτούς τους δύσκολους λεκέδες πρέπει να βάλεις sudo (http://www.gratisoft.us/sudo/) πριν την πλύση.
Όμως η sudo δε μπορεί να επιβάλει effective gid, μόνο uid (gid πάει το default του user). Και το να έχεις 20 διαφορετικούς user accounts (και 20 environments) για 20 διαφορετικές εφαρμογές που θα εκτελούνται από το ίδιο άτομο μου φαίνεται άκομψο και ότι καταργεί τον παραδοσιακό σκοπό των ιδιοκτησιών. Όπως το βλέπω, όλα τα αρχεία ενός χρήστη (π.χ. αρχεία ρυθμίσεων ή άλλα αρχεία που αποθηκεύουν οι εφαρμογές που τρέχει) πρέπει να ανοίκουν στον ίδιο χρήστη και να έχει αυτός άμεσα πρόσβαση σε αυτά.
Όμως η sudo δε μπορεί να επιβάλει effective gid, μόνο uid (gid πάει το default του user).
Κανεις λάθος. Μπορεί.
http://www.gratisoft.us/sudo/man/sudoers.html
Runas_User έχει και group.
Και το να έχεις 20 διαφορετικούς user accounts (και 20 environments) για 20 διαφορετικές εφαρμογές που θα εκτελούνται από το ίδιο άτομο μου φαίνεται άκομψο και ότι καταργεί τον παραδοσιακό σκοπό των ιδιοκτησιών. Όπως το βλέπω, όλα τα αρχεία ενός χρήστη (π.χ. αρχεία ρυθμίσεων ή άλλα αρχεία που αποθηκεύουν οι εφαρμογές που τρέχει) πρέπει να ανοίκουν στον ίδιο χρήστη και να έχει αυτός άμεσα πρόσβαση σε αυτά.
Νταξ, οταν ΠΡΕΠΕΙ να δώσεις λύση (και πληρώνεσε γι αυτό) τότε δεν σε νοιάζει η μόδα αλλά η ουσία.
τέσπα, δεν είναι debate το thread, απλά κάποια πράματα, αν δεν γνωρίζουμε πως γίνονται καλό θα ήταν να μην λέμε οτι δεν γίνονται στους νεοεισερχόμενους χρήστες.
Runas_User έχει και group.
Αυτό δεν προσδιορίζει το group id του process, απλά κάνει match όλους τους users που είναι μέλη στο ορισμένο group ως δυνατούς χρήστες με των οποίων τα δικαιώματα θα μπορούσε να τρέξει κατά βούληση η εφαρμογή. Όχι;
απλά κάποια πράματα, αν δεν γνωρίζουμε πως γίνονται καλό θα ήταν να μην λέμε οτι δεν γίνονται στους νεοεισερχόμενους χρήστες.
Δε νομίζω να άφησα πουθενά να εννοηθεί ότι είμαι σίγουρος πώς δε γίνεται. Απάντησα απλά σε μια ευθεία ερώτηση όσο καλύτερα μπορούσα. Συγκεκριμένα:
Μια ακόμα ερώτηση. Εφορμόμενος από το avatar που έχεις (τον χαριτωμένο BSD deamon :P), μήπως μπορείς να μου πεις αν υπάρχει αυτό που ψάχνω στα BSD (Free, Open, Net);Όχι απ' όσο ξέρω (τουλάχιστον όχι μέσα από το firewall τους ή με κάποιον άλλον απλό τρόπο). Αν γίνεται μάλλον θα γίνεται μόνο στο FreeBSD μέσω του TrustedBSD.
Φυσικά έχεις δίκιο στο ότι γίνεται θεωρητικά με τον τρόπο που πρότεινες, δεν προσπαθώ να σε βγάλω λάθος! Απλά λέω τη γνώμη μου ότι δε μου φαίνεται βιώσιμη λύση για ένα desktop μηχάνημα και ότι, επειδή είναι πολύ πατέντα, θα σου βγάλει την πίστη για να στηθεί όπως πρέπει και πάλι είναι πιθανό να υπάρξουν παρενέργειες σε κάποιες εφαρμογές (τουλάχιστον στην περίπτωση που χρησιμοποιηθούν user accounts για διαχωρισμό).
Νταξ, οταν ΠΡΕΠΕΙ να δώσεις λύση (και πληρώνεσε γι αυτό) τότε δεν σε νοιάζει η μόδα αλλά η ουσία.
Το να επιδιώκεις να χρησιμοποιείς κάτι όπως σχεδιάστηκε δεν είναι θέμα μόδας αλλά ουσίας. Νομίζω ότι ιδιαίτερα όταν πληρώνεσαι πρέπει να κοιτάς μακριά και να υιοθετείς όσο το δυνατόν πιο δοκιμασμένες και σωστές λύσεις που θα παίζουν και αύριο, υπό όσο το δυνατόν πιο διαφορετικές/απρόβλεπτες συνθήκες. Η υλοποίηση μέσω ενός MAC system είναι πιο σωστή σχεδιαστικά, οπότε μάλλον θα ήταν μονόδρομος για ένα επαγγελματικό περιβάλλον.