OpenSnitch ενα firewall σε επίπεδο εφαρμογής

Ναι το Linux είναι πιο ασφαλές από κάποια άλλα λειτουργικά, ονόματα δεν λέμε υπολήψεις δεν θίγουμε, αλλά δεν θα πρέπει να κοιμόμαστε και τον ύπνο του δικαίου. Ένας πυρότοιχος (firewall) --σικ-- που να χωρίζει τον υπολογιστή από τους ¨κακούς" εκεί έξω είναι απαραίτητος. Κάθε διανομή έχει κάποια εργαλεία να κάνουν χρήση του πυρότοιχου που έχει ενσωματωμένος ο πυρήνας. Αλλά αυτά τα κάνουν σε επίπεδο πόρτας δικτύου και όχι σε επίπεδο εφαρμογής. Το μοντέλο αυτό είναι μια χαρά για servers αλλά σε επίπεδο desktop κάποιες φορές δεν αρκεί.

Γιατί σε επίπεδο εφαρμογής

Κάποια διαβολική επέκταση του chrome μπορεί να στέλνει δεδομένα σε τρίτους κάτω από την μύτη μας. Με τον τρόπο αυτό μπορείς να το δεις και να το εμποδίσεις. Παράδειγμα εδώ. Η μπορείς να δεις πως το eBay κάνει scan για ανοικτές πόρτες στον υπολογιστή σου 1 2 .

Η μπορεί να παρατηρήσεις η εγκατάσταση κάποιου πακέτου deb να κατεβάζει πράγματα από το Internet. Η τον firefox να στέλνει αναφορές κατάρρευσης ακόμα και αν του είπες να μην το κάνει :astonished:

Στις παραπάνω περιπτώσεις θέλεις να έχεις τον έλεγχο. Αρκεί να ξέρεις τι θα πρέπει να επιτρέψεις και τι όχι. Και μπορεί μια μέρα να βρεθεί να τρέχεις κάτι διαβολικό (είπε κανείς πως αν έχεις Linux είσαι άτρωτος;)

Εγκατάστση

Το OpenSnitch αποτελείται από δυο κομμάτια: Μια υπηρεσία συστήματος και ένα γραφικό περιβάλλον διασύνδεσης.

Συμβουλευτείτε τις οδηγίες εγκατάστασης για την διανομή σας εδώ, πιθανά να χρειαστούν κάποια πρόσθετα βήματα. Εναλλακτικά μπορούμε να το κτίσουμε με το χέρι από τον κώδικά, είναι γραμμένο σε γλώσσα go, ακολουθώντας τις οδηγίες εδώ.

Για το σύστημα μου κατέβασα τα σχετικά πακέτα από την σελίδα του στο github. Αυτό που δεν καταλαβαίνω είναι γιατί στο πακετάρισμα του deb θεώρησαν καλό να βάλουν και τον πηγαίο κώδικα στο /usr/share/gocode/src/github.com/evilsocket. Αν ήθελα να τον κώδικα το έκανα compile με το χέρι. Θα μπορούσε και χειρότερα, τουλάχιστον δεν είναι σε flathub :joy:.

Firewall σε επίπεδο εφαρμογής

Αν κάποια εφαρμογή/πρόγραμμα θέλει να κάνει χρήση του δικτύου θα ανοίξει ένα παράθυρο με κάποιες πληροφορίες, όπως το όνομα της εφαρμογής, η διεύθυνση προορισμού, ο χρήστης η πόρτα κλπ. Θα πρέπει να επιλέξουμε μέσα σε ένα σύντομο χρονικό διάστημα αν θα το επιτρέψουμε ή όχι, διαφορετικά θα επιλέγει αυτόματα τι θα γίνει.

Βασικές ρυθμίσεις

Όταν ξεκινήσουμε την γραφική διασύνδεση, θα δούμε ένα εικονίδιο στην γραμμή εργασιών. Από εκεί μπορούμε να ανοίξουμε το γραφικό περιβάλλον και να κάνουμε ρυθμίσεις.

Μια βασική ρύθμιση που θα πρέπει να γίνει είναι να ορίσουμε την βασική λειτουργία είναι να επιτρέπει την πρόσβαση όταν δεν πατήσουμε κάτι (allow) είτε -προτεινόμενο- να την αγνοεί (deny). Επίσης το χρονικό διάστημα που θα περιμένει (εξ ορισμού 15 δευτερόλεπτα). Επίσης την χρονική διάρκεια που θα έχει ισχύ. Μπορεί να είναι μέχρι την επόμενη επανεκκίνηση, κάποιο χρονικό διάστημα ή για πάντα (forever).

Αν κάνουμε λάθος μπορούμε πάντα να ανοίξουμε το γραφικό περιβάλλον και να κάνουμε ότι αλλαγές θέλουμε ή ακόμα και να σβήσουμε εντελώς τον κανόνα.

Την πρώτη φορά που θα το τρέξουμε θα δούμε μια πληθώρα από παράθυρα, αλήθεια τόσα πολλά προγράμματα κάνουν χρήση υπηρεσιών δικτύωσης; Αλλά αυτό θα συμβεί μόνο την πρώτη φορά. Υπομονή.

Προχωρημένη χρήση

Για απόλυτη ασφάλεια μπορεί να θέλεις ένας υπολογιστής να μπορεί να συνδεθεί μόνο σε συγκεκριμένα sites. Με τον ίδιο τρόπο μπορεί να θέλεις να απαγορεύσεις κάποια άλλα, όπως να κόβεις τις διαφημίσεις για παράδειγμα. Οδηγίες υπάρχουν εδώ.

Προβλήματα

Ένα πρόβλημα υπάρχει με τις εφαρμογές τύπου flatpak καθώς τρέχουν μέσα από ένα διαφορετικό κατάλογο κάθε φορά. Λύση για αυτό υπάρχει στο FAQ.

Μπλοκάρει και δεν δείχνει καν ότι τρέχει σε άλλα πρωτόκολλα όπως πχ ICMP, IGMP or SCTP. Για να τα ενεργοποιήσουμε πρέπει να προσθέσουμε στο iptables κανόνες πχ iptables -t mangle -I OUTPUT -p icmp -j ACCEPT

Δεν μπορεί να δει κυκλοφορία μέσω του wireguard. Δείτε επίσης για άλλα προβλήματα που μπορεί να προκύψουν εδώ.

Δεν έχει πρόβλημα και μπορεί να συνυπάρχει με το άλλο firewall που χρησιμοποιείτε firewalld, ufw, gufw κλπ. Δεν θα πρέπει να προκύψει κάποιο πρόβλημα με το VPN.

Εμπειρία

Στην λίγη χρήση που του έκανα δεν έχω καταλήξει ακόμα αν θα μείνει ή όχι στον υπολογιστή. Κάπου θυμίζει τις παλιές κακές εποχές με άλλα λειτουργικά. Τουλάχιστον έχω αρκετές πληροφορίες, που ξέρω να αξιολογήσω για να πάρω μια απόφαση. Μάλλον θα το κρατήσω αλλά όχι για τον ρόλο του σαν firewall αλλά περισσότερο σαν κάποιο monitor του δικτύου.

Θα πρέπει να το χρησιμοποιήσεις; Αυτό θα πρέπει να το απαντήσεις εσύ και μόνον εσύ. Κανένα πρόγραμμα και κανένα λειτουργικό δεν θα σου δώσει 100% ασφάλεια αν δεν ξέρεις να το χρησιμοποιήσεις και δεν κατανοείς τους κινδύνους.
Επίσης είναι ένα σχετικά αδοκίμαστο πρόγραμμα, ακόμα σε ανάπτυξη. Σίγουρα θα προκύψουν προβλήματα κάποια στιγμή στο μέλλον και θα πρέπει να ξέρεις να τα αντιμετωπίσεις. Δεν σου το συνιστώ αν δεν είσαι ένας έμπειρος χρήστης και απλά θέλεις να το εγκαταστήσεις γιατί σε έχουν τρομάξει κάποιοι, συνήθως υπερ-άσχετοι – ονόματα δεν λέμε, υπολήψεις δεν θίγουμε – στην τηλεόραση,

Απενεργοποίηση/Αφαίρεση από το σύστημα

Με τις παρακάτω εντολές α. σταματάμε και β. απενεργοποιούμε δια παντός την υπηρεσία

sudo service opensnitchd stop
sudo systemctl disable opensnitchd

Στην συνέχεια αφαιρούμε το πρόγραμμα από το σύστημα με αντίστοιχο τρόπο της εγκατάστασης του.

Διαβάστε

Το πολύ καλό wiki

2 «Μου αρέσει»

Το OpenSnitch και γενικότερα ο τομέας των application firewalls έχουν προοπτικές εξέλιξης αλλά όταν υπάρχουν «προβληματάκια» όπως το να μην εκκινεί το γραφικό περιβάλλον επειδή μια τρίτη εφαρμογή μπλοκάρει βασικές λειτουργίες του, κάτι δε γίνεται σωστά θεωρώ.

[offtopic]

Επειδή οι προγραμματιστές του OpenSnitch ερμηνεύουν -λανθασμένα- τη λειτουργία ενός τρίτου λογισμικού (του Firefox εδώ) μέσω του δικού τους, και επειδή το να αναπαράγουμε χωρίς επαλήθευση κάτι που βρήκαμε κάπου -πόσο μάλλον όταν πρόκειται για εμφανώς παλιότερη έκδοση κάποιας εφαρμογής και μάλιστα σε άλλο λειτουργικό- μόνο κακό κάνει στο ΕΛ/ΛΑΚ, να ενημερώσω ότι ο Firefox δε στέλνει καμία αναφορά κατάρρευσης αν είναι απενεργοποιημένη η σχετική επιλογή. Δημιουργεί εκκρεμείς αναφορές -με το crashreporter, προφανώς- αλλά δεν τις στέλνει πουθενά. Για να δανειστώ και μια φράση από την παρουσίαση, άλλο το «θέλω να κάνω χρήση του δικτύου» και εντελώς διαφορετικό το «κάνω όντως χρήση του δικτύου και στέλνω πράγματα κάπου». Όπως με κάθε εργαλείο, αν δεν καταλαβαίνουμε τι ακριβώς μας λέει το OpenSnitch, οδηγούμαστε σε λανθασμένα συμπεράσματα.

[/offtopic]

Δεν ξέρω αν το συμπέρασμα είναι λανθασμένο ή όχι, γεγονός είναι πως μια διεργασία του Firefox ξεκίνησε μια σύνδεση δικτύου. Δεν έχει γίνει σε δική μου μηχανή να ανοίξω κάποιο packet sniffer να δω τι ακριβώς συμβαίνει. Αλλά το παρακάτω είναι ξεκάθαρο, έχουμε δε ακόμα και το URL και port

Ας δούμε λοιπόν τι είναι αυτό το crashreporter και πως λειτουργεί

The crash reporter client performs a number of roles. There’s a lot going on, so you may want to look at main() in crashreporter.cpp . First, stack traces are extracted from the dump via the minidump analyzer tool. The resulting traces are appended to the .extra file of the crash together with the SHA256 hash of the minidump file. Once this is done a crash ping is assembled holding the same information as the one generated by the CrashManager and it’s sent to the telemetry servers via the ping sender program. The UUID of the ping is then stored in the extra file; the CrashManager will later pick it up and generate a new ping with the same UUID so that the telemetry server can deduplicate both pings. Then, the crash reporter client verifies that the dump data is sane. If it isn’t (e.g. required metadata is missing), the dump data is ignored. If dump data looks sane, the dump data is moved into the pending directory for the configured data directory (defined via the MOZ_CRASHREPORTER_DATA_DIRECTORY environment variable or from the UI). Once this is done, the main crash reporter UI is displayed via UIShowCrashUI() . The crash reporter UI is platform specific: there are separate versions for Windows, OS X, and various *NIX presentation flavors (such as GTK). The basic gist is a dialog is displayed to the user and the user has the opportunity to submit this dump data to a remote server.

Πηγή: Crash Reporter — Firefox Source Docs documentation

Τι μας λέει εδώ; Πως πριν οτιδήποτε άλλο συλλέγονται κάποιες πληροφορίες και φτιάχνετε ένα SHA256 που αποστέλλετε στον telemetry server. Στο τέλος μετά από πολλά " a dialog is displayed to the user and the user has the opportunity to submit this dump data to a remote server". Άρα αποστολή πληροφοριών γίνετε πριν ερωτηθεί ο χρήστης. Η συλλογή της κύριας πληροφορίας που θα αποσταλεί στο τέλος (αν αποσταλεί) έχει γίνει πιο πριν από αλλού.

Για τα περί καλής και κακής τηλεμετρίας θεωρώ πως είναι εκτός της παρούσης συζήτησης. Υπάρχει σχετική συζήτηση σε άλλο νήμα και έχω τοποθετηθεί. Και για να είμαι και ξεκάθαρος δεν εξετάζω αν κάνει καλά ή όχι εδώ πέρα. Απλά τεκμηριώνω πως πράγματι στέλνει κάποιες πληροφορίες.

Προσπάθησα να το εξετάσω παραπέρα εξετάζοντας το ίδιο τον κώδικα του crashreporter και σε γενικές γραμμές αυτά είδα στη σύντομη και τσαπατσούλικη εξέταση του. Για να δεις τι πραγματικά συμβαίνει θέλεις ανάλυση στην μηχανή σου, να έχεις πρόσβαση στο /proc και να δεις το environment.

Με βάση τα παραπάνω θεωρώ την αναφορά 100% αληθινή. Το ελεύθερο λογισμικό δεν έχει να φοβηθεί την αλήθεια, όσο και αν υπάρχουν κάποιο ελαφρώς “ψεκασμένοι” με ότι έχει να κάνει με την τηλεμετρία εκεί έξω.

Ακριβώς πάνω από την παράγραφο που παρέθεσες:

If the crash reporter client is enabled, MinidumpCallback() invokes it. It simply tries to create a new crash reporter client process (e.g. crashreporter.exe ) with the path to the written minidump file as an argument.

Και ακριβώς κάτω από αυτήν:

If a dump is submitted via the crash reporter, the raw dump files are removed from the pending directory and a file containing the crash ID from the remote server for the submitted dump is created in the submitted directory.

If the user chooses not to submit a dump in the crash reporter UI, the dump files are deleted.

Αυτό που αποστέλλεται πάντα είναι το crash ping. Το crash dump όμως αποστέλλεται μόνο αν το κάνει ενεργά ο χρήστης ή αν δεν έχει απενεργοποιήσει την αποστολή των backlogged crashes. Αν την έχει απενεργοποιήσει, όπως στην περίπτωση της εικόνας, το crash dump δεν πάει πουθενά.

Το SHA256 που αποστέλλεται με το crash ping δεν είναι η ίδια η πληροφορία. Από τεχνικής πλευράς, δεν έχει απολύτως κανένα νόημα το να γίνεται αποστολή πληροφορίας μία φορά (με το crash ping) και μετά αποστολή της ίδιας πληροφορίας ξανά (με το crash dump). Δεν εξυπηρετεί κάποιον τεχνικό και επιπλέον θα γέμιζαν οι servers με διπλότυπες πληροφορίες.

Από ηθικής πλευράς, επίσης δεν έχει απολύτως κανένα νόημα το να δίνεται στον χρήστη η δυνατότητα να απενεργοποιήσει την αποστολή συγκεκριμένων πληροφοριών αλλά παράλληλα αυτές να αποστέλλονται «κρυφά».

Ορίστε και μια σχετική (παλιότερη) παρερμηνεία, όπου ο χρήστης αναφέρει κάτι αντίστοιχο και το ακυρώνει μόνος του όταν το ψάχνει λίγο καλύτερα: firefox sends crash reports without my permission

Το να λέμε «η τάδε εφαρμογή στέλνει πληροφορίες ακόμα και όταν της λέμε να μην το κάνει», χωρίς καμία επεξήγηση, έχει ένα αρνητικό νόημα στα συμφραζόμενα, δε βρίσκεις;

1 «Μου αρέσει»

Code is the ultimate truth

image