Είμαστε υπό επίθεση! 23+ Βέλτιστες πρακτικές ασφαλείας Node.js

Είμαστε υπό επίθεση! 23+ Βέλτιστες πρακτικές ασφαλείας Node.js

Συλλέγονται, επιμελούνται και γράφονται από: Yoni Goldberg, Kyle Martin και Bruno Scheufler

Tech reviewer: Liran Tal (Ομάδα Εργασίας Ασφαλείας Node.js)

Καλώς ήλθατε στην ολοκληρωμένη λίστα των βέλτιστων πρακτικών ασφαλείας Node.js, οι οποίες συνοψίζουν και επιμελούν τα άρθρα που έχουν ταξινομηθεί στην κορυφή και οι θέσεις blog

Λίγα λόγια πριν ξεκινήσουμε

Οι επιθέσεις στο Web εκρήγνυνται αυτές τις μέρες καθώς η ασφάλεια έρχεται στο μέτωπο της σκηνής. Συγκεντρώσαμε πάνω από 23 βέλτιστες πρακτικές ασφαλείας Node.js (+40 άλλες γενικές πρακτικές ασφαλείας) από όλα τα κορυφαία άρθρα σε όλο τον κόσμο. Η εργασία εδώ είναι μέρος των καλύτερων πρακτικών μας Node.js GitHub repository που περιέχει περισσότερες από 80 πρακτικές Node.js. Σημείωση: Πολλά στοιχεία έχουν περισσότερες πληροφορίες σχετικά με την επεξεργασία του θέματος με παράδειγμα κώδικα και άλλες χρήσιμες πληροφορίες.

Λάβετε εβδομαδιαίες βέλτιστες πρακτικές μέσω της ροής Twitter

1. Αγκαλιάστε τους κανόνες ασφαλείας της γραμμής

TL; DR: Χρησιμοποιήστε συνδέσμους που σχετίζονται με την ασφάλεια, όπως το eslint-plugin-security για να εντοπίζετε τα θέματα ευπάθειας και τα ζητήματα ασφαλείας το συντομότερο δυνατό - όσο κωδικοποιούνται. Αυτό μπορεί να βοηθήσει στη σύλληψη αδυναμιών ασφάλειας όπως η χρήση του eval, η κλήση μιας διαδικασίας παιδιού ή η εισαγωγή μιας μονάδας με μια λέξη που δεν είναι συμβολοσειρά (π.χ. είσοδος χρήστη). Κάντε κλικ στο κουμπί "Διαβάστε περισσότερα" παρακάτω για να δείτε τα παραδείγματα κώδικα που θα αλιευθούν από μια επένδυση ασφαλείας

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

Διαβάστε περισσότερα: Κανόνες Linter

Το Linting δεν πρέπει να είναι απλώς ένα εργαλείο για την επιβολή των παιδαγωγικών κανόνων σχετικά με τα κενά, τα ερωτηματικά ή τις δηλώσεις eval. Το ESLint παρέχει ένα ισχυρό πλαίσιο για την εξάλειψη μιας μεγάλης ποικιλίας δυνητικά επικίνδυνων μοτίβων στον κώδικα σας (κανονικές εκφράσεις, επικύρωση εισόδου κλπ.). Νομίζω ότι παρέχει ένα ισχυρό νέο εργαλείο που αξίζει να εξεταστεί από τους προγραμματιστές JavaScript που έχουν επίγνωση της ασφάλειας. (Adam Baldwin)
Δείτε περισσότερα αποσπάσματα και παραδείγματα κώδικα εδώ

2. Περιορίστε ταυτόχρονες αιτήσεις χρησιμοποιώντας ένα μεσαίο λογισμικό

TL, DR: Οι επιθέσεις του DOS είναι πολύ δημοφιλείς και σχετικά εύκολο στη διεξαγωγή τους. Εφαρμόστε περιορισμό του ρυθμού χρησιμοποιώντας μια εξωτερική υπηρεσία, όπως balancers φόρτωσης σύννεφο, firewalls cloud, nginx, ευέλικτο πακέτο ή (για μικρότερες και λιγότερο κρίσιμες εφαρμογές) ένα ενδιάμεσο λογισμικό που περιορίζει την ταχύτητα (π.χ.

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

Διαβάστε περισσότερα: Εφαρμόστε περιορισμό του ρυθμού

3. Εξαγάγετε μυστικά από τα αρχεία ρυθμίσεων ή χρησιμοποιήστε πακέτα για να τα κρυπτογραφήσετε

TL; DR: Ποτέ μην αποθηκεύετε μυστικά απλού κειμένου σε αρχεία ρυθμίσεων ή πηγαίο κώδικα. Αντ 'αυτού, χρησιμοποιήστε συστήματα μυστικής διαχείρισης όπως τα προϊόντα Vault, Kubernetes / Docker Secrets ή χρησιμοποιώντας μεταβλητές περιβάλλοντος. Ως τελευταίο αποτέλεσμα, τα μυστικά που είναι αποθηκευμένα στον έλεγχο πηγής πρέπει να κρυπτογραφούνται και να διαχειρίζονται (κυλιόμενα κλειδιά, λήξη, έλεγχος κλπ.). Χρησιμοποιήστε προ-εμπλοκή / ώθηση γάντζους για να αποτρέψετε τυχαία τη διάπραξη μυστικών

Διαφορετικά: Ο έλεγχος πηγής, ακόμη και για ιδιωτικά αποθετήρια, μπορεί να δημοσιοποιηθεί λανθασμένα, οπότε εκτίθενται όλα τα μυστικά. Η πρόσβαση στον έλεγχο προέλευσης για ένα εξωτερικό μέρος θα παράσχει κατά λάθος πρόσβαση σε σχετικά συστήματα (βάσεις δεδομένων, υπηρεσίες, υπηρεσίες κ.λπ.).

Διαβάστε περισσότερα: Μυστική διαχείριση

4. Αποφύγετε τα τρωτά σημεία του ερωτήματος ένεσης με τις βιβλιοθήκες ORM / ODM

TL; DR: Για να αποτρέψετε την ένεση SQL / NoSQL και άλλες κακόβουλες επιθέσεις, πάντα να χρησιμοποιήσετε μια βιβλιοθήκη ORM / ODM ή μια βάση δεδομένων που διαφεύγει δεδομένα ή υποστηρίζει ονομασμένα ή ευρετηριακά παραμετροποιημένα ερωτήματα και φροντίζει να επικυρώνει την είσοδο χρήστη για τους αναμενόμενους τύπους. Ποτέ μην χρησιμοποιείτε μόνο συμβολοσειρές προτύπου JavaScript ή αλφαριθμητική συμβολοσειρά για να εισάγετε τιμές σε ερωτήματα, καθώς αυτό ανοίγει την εφαρμογή σας σε ένα ευρύ φάσμα ευπαθειών. Όλες οι αξιόπιστες βιβλιοθήκες πρόσβασης δεδομένων Node.js (π.χ. Sequelize, Knex, mongoose) διαθέτουν ενσωματωμένη προστασία από επιθέσεις ένεσης

Διαφορετικά: Η μη έγκυρη ή μη επιβεβαιωμένη εισαγωγή του χρήστη θα μπορούσε να οδηγήσει σε έγχυση του χειριστή όταν συνεργάζεται με το MongoDB για NoSQL και δεν χρησιμοποιεί κατάλληλο σύστημα εξυγίανσης ή το ORM θα επιτρέψει εύκολα επιθέσεις SQL injection, δημιουργώντας γιγαντιαία ευπάθεια.

Διαβάστε περισσότερα: Πρόληψη ένεσης ερωτήματος χρησιμοποιώντας βιβλιοθήκες ORM / ODM

Εκτιμήστε την προσπάθεια; Στείλτε μας το έργο στο GitHub

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

TL; DR: Η διαδικασία του κόμβου θα διακοπεί όταν τα σφάλματα δεν χειριστούν. Πολλές βέλτιστες πρακτικές συνιστούν ακόμη και την έξοδο, παρόλο που ένα λάθος έχει πιαστεί και έχει αντιμετωπιστεί. Η Express, για παράδειγμα, θα σπάσει σε οποιοδήποτε ασύγχρονο σφάλμα - εκτός και αν τυλίξετε τις διαδρομές με μια ρήτρα σύλληψης. Αυτό ανοίγει ένα πολύ γλυκό σημείο επίθεσης για τους επιτιθέμενους που αναγνωρίζουν ποια είσοδος προκαλεί τη συντριβή της διαδικασίας και αποστέλλει επανειλημμένα το ίδιο αίτημα. Δεν υπάρχει άμεση θεραπεία για αυτό, αλλά μερικές τεχνικές μπορούν να μετριάσουν τον πόνο: Alert με κρίσιμη σοβαρότητα οποτεδήποτε μια διαδικασία συντρίβεται εξαιτίας ενός μη χειρισμένου σφάλματος, επικυρώνει την είσοδο και αποφεύγει τη συντριβή της διαδικασίας λόγω μη έγκυρης εισόδου του χρήστη, σκεφτείτε να μην καταρρεύσει όταν ένα λάθος προέρχεται από ένα αίτημα (σε αντίθεση με ό, τι συμβαίνει σε παγκόσμιο επίπεδο)

Διαφορετικά: Αυτό είναι απλώς μια εκπαιδευμένη εικασία: δεδομένου ότι πολλές εφαρμογές Node.js, αν προσπαθήσουμε να περάσουμε ένα κενό σώμα JSON σε όλα τα POST αιτήματα - μια χούφτα εφαρμογών θα συντριβή. Σε αυτό το σημείο, μπορούμε απλά να επαναλάβουμε την αποστολή του ίδιου αιτήματος για να καταργήσουμε τις εφαρμογές με ευκολία

6. Προσαρμόστε τις κεφαλίδες απόκρισης HTTP για βελτιωμένη ασφάλεια

TL: DR: Η εφαρμογή σας θα πρέπει να χρησιμοποιεί ασφαλείς επικεφαλίδες για να αποτρέψει τους επιτιθέμενους από τη χρήση κοινών επιθέσεων, όπως script-script cross-site (XSS), clickjacking και άλλες κακόβουλες επιθέσεις. Αυτά μπορούν να διαμορφωθούν εύκολα χρησιμοποιώντας μονάδες όπως κράνος.

Διαφορετικά: Οι επιτιθέμενοι θα μπορούσαν να εκτελέσουν άμεσες επιθέσεις στους χρήστες της εφαρμογής σας, οδηγώντας σε τεράστιες αδυναμίες ασφαλείας

Διαβάστε περισσότερα: Χρησιμοποιώντας ασφαλείς κεφαλίδες στην εφαρμογή σας

7. Να ελέγχετε συνεχώς και αυτόματα για ευάλωτες εξαρτήσεις

TL; DR: Με το οικοσύστημα npm είναι κοινό να έχουμε πολλές εξαρτήσεις για ένα έργο. Οι εξαρτήσεις πρέπει πάντα να ελέγχονται καθώς εντοπίζονται νέες ευπάθειες. Χρησιμοποιήστε εργαλεία όπως npm audit, nsp ή snyk για την παρακολούθηση, την παρακολούθηση και την επιδιόρθωση ευάλωτων εξαρτήσεων. Ενσωματώστε αυτά τα εργαλεία με τη ρύθμιση του CI σας, ώστε να τραβήξετε μια ευάλωτη εξάρτηση πριν την πραγματοποιήσει στην παραγωγή.

Διαφορετικά: Ο εισβολέας θα μπορούσε να ανιχνεύσει το πρόγραμμά σας ιστού και να επιτεθεί σε όλες τις γνωστές ευπάθειές του.

Διαβάστε περισσότερα: Ασφάλεια εξαρτήσεων

8. Αποφύγετε τη χρήση της βιβλιοθήκης κρυπτογράφησης Node.js για τη διαχείριση κωδικών πρόσβασης, χρησιμοποιήστε το Bcrypt

TL? DR: Οι κωδικοί πρόσβασης ή τα μυστικά (κλειδιά API) θα πρέπει να αποθηκεύονται χρησιμοποιώντας ασφαλή λειτουργία hash + salt όπως bcrypt, η οποία θα πρέπει να είναι μια προτιμώμενη επιλογή σε σχέση με την υλοποίησή της JavaScript, για λόγους απόδοσης και ασφάλειας.

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

Διαβάστε περισσότερα: Χρησιμοποιήστε το Bcrypt

9. Εξαγωγή HTML, JS και CSS εξόδου

TL: DR: Τα μη αξιόπιστα δεδομένα που αποστέλλονται προς τα κάτω στο πρόγραμμα περιήγησης ενδέχεται να εκτελεστούν αντί να εμφανίζονται μόνο, κάτι που συνήθως αναφέρεται ως επίθεση κατά τη δημιουργία ιστότοπου (XSS). Μειώστε αυτό χρησιμοποιώντας αποκλειστικές βιβλιοθήκες που χαρακτηρίζουν ρητά τα δεδομένα ως καθαρό περιεχόμενο που δεν πρέπει ποτέ να εκτελεστούν (δηλαδή κωδικοποίηση, διαφυγή)

Διαφορετικά: Ένας εισβολέας μπορεί να αποθηκεύσει έναν κακόβουλο κώδικα JavaScript στο DB σας, ο οποίος στη συνέχεια θα σταλεί όπως-είναι στους κακούς πελάτες

Διαβάστε περισσότερα: Εξόδου Escape

10. Επικυρώστε τα εισερχόμενα σχήματα JSON

TL · DR: Επικυρώστε το ωφέλιμο φορτίο του εισερχόμενου αιτήματος και βεβαιωθείτε ότι πληροί τις προσδοκίες, αποτυγχάνει γρήγορα εάν δεν το κάνει. Για να αποφύγετε την κουραστική κωδικοποίηση επικύρωσης σε κάθε διαδρομή, μπορείτε να χρησιμοποιήσετε ελαφριά σχήματα επικύρωσης βασισμένα σε JSON όπως jsonschema ή joi

Διαφορετικά: Η γενναιοδωρία και η επιφυλακτική σας προσέγγιση αυξάνουν σημαντικά την επιφάνεια επίθεσης και ενθαρρύνουν τον εισβολέα να δοκιμάσει πολλές εισόδους έως ότου βρουν κάποιο συνδυασμό για να συντρίψουν την εφαρμογή

Διαβάστε περισσότερα: Επικυρώστε τα εισερχόμενα σχήματα JSON

11. Υποστηρίξτε τις μαύρες λίστες JWT tokens

TL; DR: Όταν χρησιμοποιείτε JWT tokens (για παράδειγμα, με το Passport.js), από προεπιλογή δεν υπάρχει μηχανισμός για την ανάκληση της πρόσβασης από τις εκδομένες μάρκες. Μόλις ανακαλύψετε κάποια κακόβουλη δραστηριότητα χρήστη, δεν υπάρχει τρόπος να σταματήσετε την πρόσβαση στο σύστημα, εφόσον διαθέτουν έγκυρο διακριτικό. Μειώστε αυτό με την εφαρμογή μιας μαύρης λίστας μη αξιόπιστων μαρκών που επικυρώνονται σε κάθε αίτηση.

Διαφορετικά: Οι ληξιπρόθεσμες ή οι άστοχες μάρκες θα μπορούσαν να χρησιμοποιηθούν με κακό τρόπο από τρίτους για να αποκτήσουν πρόσβαση σε μια εφαρμογή και να μιμηθούν τον ιδιοκτήτη του διακριτικού.

Διαβάστε περισσότερα: Blacklisting JWTs

12. Αποτροπή επιθέσεων βίαιης βίας κατά της εξουσιοδότησης

TL: DR: Μια απλή και ισχυρή τεχνική είναι να περιορίσετε τις προσπάθειες εξουσιοδότησης χρησιμοποιώντας δύο μετρήσεις:

  1. Ο πρώτος είναι ο αριθμός των διαδοχικών αποτυχημένων προσπαθειών από το ίδιο μοναδικό αναγνωριστικό χρήστη / όνομα και διεύθυνση IP.
  2. Ο δεύτερος είναι ο αριθμός των αποτυχημένων προσπαθειών από μια διεύθυνση IP για κάποιο μεγάλο χρονικό διάστημα. Για παράδειγμα, μπλοκάρετε μια διεύθυνση IP αν κάνει 100 αποτυχημένες προσπάθειες σε μία ημέρα.

Διαφορετικά: Ο εισβολέας μπορεί να εκδώσει απεριόριστες προσπάθειες αυτοματοποιημένου κωδικού πρόσβασης για να αποκτήσει πρόσβαση σε προνομιακούς λογαριασμούς σε μια εφαρμογή

Διαβάστε περισσότερα: Περιορισμός ρυθμού σύνδεσης

13. Εκτελέστε το Node.js ως μη-root χρήστη

TL: DR: Υπάρχει ένα κοινό σενάριο όπου το Node.js εκτελείται ως χρήστης ρίζας με απεριόριστα δικαιώματα. Για παράδειγμα, αυτή είναι η προεπιλεγμένη συμπεριφορά στα δοχεία Docker. Συνιστάται να δημιουργήσετε έναν χρήστη που δεν είναι root και να το ψήνετε στην εικόνα του Docker (παραδείγματα που δίνονται παρακάτω) ή να εκτελέσετε τη διαδικασία σε αυτό το όνομα χρηστών καλώντας το κοντέινερ με τη σημαία "-u username"

Διαφορετικά: Ένας εισβολέας που καταφέρνει να εκτελέσει μια δέσμη ενεργειών στον διακομιστή παίρνει απεριόριστη ενέργεια πάνω στο τοπικό μηχάνημα (π.χ. αλλαγή iptable και επαναφορά της κίνησης στον εξυπηρετητή του)

Διαβάστε περισσότερα: Εκτελέστε το Node.js ως μη χρήστη root

14. Περιορίστε το μέγεθος του ωφέλιμου φορτίου χρησιμοποιώντας ένα αντίστροφο διακομιστή μεσολάβησης ή ένα μεσαίο λογισμικό

TL: DR: Όσο μεγαλύτερο είναι το ωφέλιμο φορτίο του σώματος, τόσο πιο δύσκολο είναι το μοναδικό σας νήμα να το επεξεργαστεί. Αυτή είναι μια ευκαιρία για τους επιτιθέμενους να φέρουν τους διακομιστές στα γόνατά τους χωρίς τεράστιο αριθμό αιτήσεων (DOS / DDOS επιθέσεις). Περιορίστε αυτό τον περιορισμό του μεγέθους του σώματος των εισερχομένων αιτημάτων στην άκρη (π.χ. τείχος προστασίας, ELB) ή ρυθμίζοντας τον επεξεργαστή έκφρασης σώματος να δέχεται μόνο ωφέλιμα φορτία μικρού μεγέθους

Διαφορετικά: Η αίτησή σας θα πρέπει να αντιμετωπίσει μεγάλα αιτήματα, δεν είναι σε θέση να επεξεργαστεί το άλλο σημαντικό έργο που πρέπει να επιτελέσει, οδηγώντας σε επιπτώσεις στην απόδοση και ευπάθεια στις επιθέσεις DOS

Διαβάστε περισσότερα: Περιορίστε το μέγεθος του ωφέλιμου φορτίου

Λάβετε εβδομαδιαίες βέλτιστες πρακτικές μέσω της ροής Twitter

15. Αποφύγετε τις δηλώσεις eval JavaScript

TL: DR: Το eval είναι κακό καθώς επιτρέπει την εκτέλεση ενός προσαρμοσμένου κώδικα JavaScript κατά τη διάρκεια του χρόνου εκτέλεσης. Αυτό δεν είναι μόνο μια ανησυχία για την απόδοση, αλλά και μια σημαντική ανησυχία ασφάλειας λόγω κακόβουλου κώδικα JavaScript που μπορεί να προέρχεται από την είσοδο του χρήστη. Ένα άλλο χαρακτηριστικό γλώσσας που πρέπει να αποφευχθεί είναι ο νέος κατασκευαστής λειτουργιών. setTimeout και setInterval δεν πρέπει ποτέ να περάσουν δυναμικό κώδικα JavaScript.

Διαφορετικά: Ο κακόβουλος κώδικας JavaScript εντοπίζει έναν τρόπο σε ένα κείμενο που μεταβιβάζεται σε eval ή σε άλλες λειτουργίες γλώσσας JavaScript αξιολόγησης σε πραγματικό χρόνο και θα αποκτήσει πλήρη πρόσβαση στα δικαιώματα JavaScript στη σελίδα. Αυτή η ευπάθεια συχνά εκδηλώνεται ως επίθεση XSS.

Διαβάστε περισσότερα: Αποφύγετε τις δηλώσεις eval JavaScript

16. Αποτρέψτε το κακό RegEx να υπερφορτώνει την εκτέλεση ενός μοντού νήματος

TL · DR: Οι τακτικές εκφράσεις, ενώ είναι χρήσιμες, αποτελούν πραγματική απειλή για τις εφαρμογές JavaScript και τις πλατφόρμες Node.js ειδικότερα. Μια είσοδος χρήστη για το κείμενο που ταιριάζει μπορεί να απαιτεί μια εξαιρετική ποσότητα κύκλων CPU για επεξεργασία. Η επεξεργασία RegEx ενδέχεται να είναι ανεπαρκής σε βαθμό που ένα μόνο αίτημα που επικυρώνει 10 λέξεις μπορεί να μπλοκάρει ολόκληρο το βρόχο συμβάντων για 6 δευτερόλεπτα και να ρυθμίσει τη CPU στο . Για το λόγο αυτό, προτιμήστε τα πακέτα επικύρωσης τρίτων μερών όπως το validator.js αντί να γράψετε τα δικά σας μοτίβα Regex ή να χρησιμοποιήσετε το safe-regex για να ανιχνεύσετε ευαίσθητα μοτίβα επανάληψης

Διαφορετικά: Οι κακώς γραπτές επανευθύνσεις θα μπορούσαν να είναι επιρρεπείς σε επιθέσεις Regular Expression DoS που θα μπλοκάρουν πλήρως τον βρόχο συμβάντων. Για παράδειγμα, το πακέτο δημοφιλών στιγμών βρέθηκε ευάλωτο με κακόβουλη χρήση του RegEx το Νοέμβριο του 2017

Διαβάστε περισσότερα: Αποφύγετε το κακό RegEx

17. Αποφύγετε τη φόρτωση μονάδας χρησιμοποιώντας μια μεταβλητή

TL; DR: Αποφύγετε την απαίτηση / εισαγωγή ενός άλλου αρχείου με μια διαδρομή που δόθηκε ως παράμετρος λόγω της ανησυχίας ότι θα μπορούσε να προέλθει από την είσοδο του χρήστη. Αυτός ο κανόνας μπορεί να επεκταθεί για την πρόσβαση σε αρχεία γενικά (δηλ. Fs.readFile ()) ή άλλη ευαίσθητη πρόσβαση πόρων με δυναμικές μεταβλητές που προέρχονται από την είσοδο χρήστη. Το Eslint-plugin-security linter μπορεί να πιάσει τέτοια σχέδια και να προειδοποιήσει αρκετά νωρίς

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

Διαβάστε περισσότερα: Ασφαλής φόρτωση μονάδας

18. Εκτελέστε τον ασφαλή κώδικα σε ένα sandbox

TL: DR: Όταν έχεις εντολή να τρέχεις εξωτερικό κώδικα που δίνεται στο χρόνο εκτέλεσης (π.χ. plugin), χρησιμοποιήστε οποιοδήποτε περιβάλλον εκτέλεσης 'sandbox' που απομονώνει και προστατεύει τον κύριο κώδικα από το plugin. Αυτό μπορεί να επιτευχθεί χρησιμοποιώντας μια αποκλειστική διαδικασία (π.χ. cluster.fork ()), περιβάλλον serverless ή αποκλειστικά πακέτα npm που λειτουργούν ως sandbox

Διαφορετικά: Ένα plugin μπορεί να επιτεθεί μέσω μιας ατελείωτης ποικιλίας επιλογών όπως άπειρες θηλιές, υπερφόρτωση μνήμης και πρόσβαση σε ευαίσθητες μεταβλητές περιβάλλοντος διαδικασίας

Διαβάστε περισσότερα: Εκτελέστε τον ασφαλή κώδικα σε ένα sandbox

19. Προσέξτε ιδιαίτερα όταν εργάζεστε με διαδικασίες παιδιού

TL: DR: Αποφύγετε τη χρήση παιδικών διεργασιών όταν είναι δυνατόν και επικυρώστε και απολυμάνετε τις εισροές για να μετριάσετε τις επιθέσεις ένεσης κελύφους, αν εξακολουθείτε να πρέπει. Προτιμήστε τη χρήση του child_process.execFile που εξ ορισμού θα εκτελεί μόνο μία εντολή με ένα σύνολο χαρακτηριστικών και δεν θα επιτρέψει την επέκταση παραμέτρων κελύφους.

Διαφορετικά: Η αρχική χρήση παιδικών διεργασιών θα μπορούσε να οδηγήσει σε απομακρυσμένες εντολές εκτέλεσης ή επιθέσεις ένεσης κελύφους εξαιτίας των κακόβουλων εισερχομένων χρηστών που μεταβιβάστηκαν σε μια εντολή μη αφομοιωμένου συστήματος

Διαβάστε περισσότερα: Να είστε προσεκτικοί όταν εργάζεστε με διαδικασίες παιδιού

20. Απόκρυψη λεπτομερειών σφάλματος από πελάτες

TL? DR: Ένας ολοκληρωμένος χειριστής ρητής σφάλματος κρύβει τις λεπτομέρειες σφάλματος από προεπιλογή. Ωστόσο, είναι μεγάλες οι πιθανότητες να εφαρμόσετε τη δική σας λογική αντιμετώπισης σφαλμάτων με προσαρμοσμένα αντικείμενα Error (θεωρούμενα από πολλούς ως βέλτιστη πρακτική). Εάν το κάνετε αυτό, βεβαιωθείτε ότι δεν επιστρέψετε ολόκληρο το αντικείμενο Error στον πελάτη, το οποίο ενδέχεται να περιέχει μερικά ευαίσθητα στοιχεία της εφαρμογής

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

Διαβάστε περισσότερα: Απόκρυψη λεπτομερειών σφάλματος από πελάτες

21. Διαμορφώστε 2FA για npm ή Νήματα

TL: DR: Κάθε βήμα στην αναπτυξιακή αλυσίδα πρέπει να προστατεύεται με MFA (authentication πολλαπλών παραγόντων), npm / Νήματα είναι μια γλυκιά ευκαιρία για τους επιτιθέμενους που μπορούν να πάρουν τα χέρια τους σε κάποιον κωδικό του προγραμματιστή. Χρησιμοποιώντας διαπιστευτήρια προγραμματιστών, οι επιτιθέμενοι μπορούν να εισάγουν κακόβουλο κώδικα σε βιβλιοθήκες που είναι ευρέως εγκατεστημένες σε έργα και υπηρεσίες. Ίσως ακόμη και σε ολόκληρο τον ιστό, αν δημοσιευτεί δημόσια. Η ενεργοποίηση του ελέγχου ταυτότητας με 2 παράγοντες σε npm αφήνει σχεδόν μηδενικές πιθανότητες για εισβολείς να αλλάξουν τον κωδικό πακέτου.

Διαφορετικά: Έχετε ακούσει για τον προγραμματιστή του eslint ποιος κωδικός πρόσβασης έχει πειραχτεί;

22. Τροποποιήστε τις ρυθμίσεις του μεσαίου λογισμικού συνόδου

TL: DR: Κάθε πλαίσιο ιστού και τεχνολογία έχει τις γνωστές αδυναμίες του - λέγοντας σε έναν εισβολέα ποιο πλαίσιο ιστού που χρησιμοποιούμε είναι μια μεγάλη βοήθεια γι 'αυτούς. Η χρήση των προεπιλεγμένων ρυθμίσεων για middleware των συνεδριών μπορεί να εκθέσει την εφαρμογή σας σε επιθέσεις κατάχρησης που αφορούν συγκεκριμένες ενότητες και πλαίσια, με παρόμοιο τρόπο με την κεφαλίδα X-Powered-By. Δοκιμάστε να κρύψετε οτιδήποτε προσδιορίζει και αποκαλύπτει την τεχνολογική στοίβα σας (π.χ. Node.js, express)

Διαφορετικά: τα cookies θα μπορούσαν να αποστέλλονται μέσω μη ασφαλών συνδέσεων και ένας εισβολέας μπορεί να χρησιμοποιήσει τον προσδιορισμό της περιόδου σύνδεσης για να προσδιορίσει το υποκείμενο πλαίσιο της εφαρμογής ιστού,

Διαβάστε περισσότερα: Ασφάλεια cookie και περιόδου σύνδεσης

23. Αποφύγετε τις επιθέσεις του DOS ορίζοντας ρητά πότε πρέπει να συντριβεί μια διαδικασία

TL; DR: Η διαδικασία του κόμβου θα διακοπεί όταν τα σφάλματα δεν χειριστούν. Πολλές βέλτιστες πρακτικές συνιστούν ακόμη και την έξοδο, παρόλο που ένα λάθος έχει πιαστεί και έχει αντιμετωπιστεί. Η Express, για παράδειγμα, θα σπάσει σε οποιοδήποτε ασύγχρονο σφάλμα - εκτός και αν τυλίξετε τις διαδρομές με μια ρήτρα σύλληψης. Αυτό ανοίγει ένα πολύ γλυκό σημείο επίθεσης για τους επιτιθέμενους που αναγνωρίζουν ποια είσοδος προκαλεί τη συντριβή της διαδικασίας και αποστέλλει επανειλημμένα το ίδιο αίτημα. Δεν υπάρχει άμεση θεραπεία για αυτό, αλλά μερικές τεχνικές μπορούν να μετριάσουν τον πόνο: Alert με κρίσιμη σοβαρότητα οποτεδήποτε μια διαδικασία συντρίβεται εξαιτίας ενός μη χειρισμένου σφάλματος, επικυρώνει την είσοδο και αποφεύγει τη συντριβή της διαδικασίας λόγω μη έγκυρης εισόδου του χρήστη, σκεφτείτε να μην καταρρεύσει όταν ένα λάθος προέρχεται από ένα αίτημα (σε αντίθεση με ό, τι συμβαίνει σε παγκόσμιο επίπεδο)

Διαφορετικά: Αυτό είναι απλώς μια εκπαιδευμένη εικασία: δεδομένου ότι πολλές εφαρμογές Node.js, αν προσπαθήσουμε να περάσουμε ένα κενό σώμα JSON σε όλα τα POST αιτήματα - μια χούφτα εφαρμογών θα συντριβή. Σε αυτό το σημείο, μπορούμε απλά να επαναλάβουμε την αποστολή του ίδιου αιτήματος για να καταργήσουμε τις εφαρμογές με ευκολία.

24. Αποτρέψτε ανασφαλείς ανακατευθύνσεις

TL: DR: Οι ανακατευθύνσεις που δεν επικυρώνουν την εισαγωγή χρηστών μπορούν να επιτρέψουν στους εισβολείς να εκτοξεύσουν απάτες ηλεκτρονικού "ψαρέματος", να κλέψουν τα διαπιστευτήρια χρήστη και να εκτελέσουν άλλες κακόβουλες ενέργειες.

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

Διαβάστε περισσότερα: Αποτρέψτε ανασφαλείς ανακατευθύνσεις

25. Αποφύγετε τη δημοσίευση μυστικών στο μητρώο npm

TL · DR: Θα πρέπει να λαμβάνονται προφυλάξεις για να αποφεύγεται ο κίνδυνος να δημοσιεύονται τυχαία μυστικά σε δημόσια μητρώα npm. Ένα αρχείο .npmignore μπορεί να χρησιμοποιηθεί για τη μαύρη λίστα συγκεκριμένων αρχείων ή φακέλων ή η συστοιχία αρχείων στο πακέτο package.json μπορεί να λειτουργήσει ως λευκή λίστα.

Διαφορετικά: Τα κλειδιά API του έργου σας, οι κωδικοί πρόσβασης ή άλλα μυστικά είναι ανοικτά για κατάχρηση από οποιονδήποτε συναντά τους, γεγονός που μπορεί να έχει ως αποτέλεσμα οικονομικές απώλειες, πλαστοπροσωπίες και άλλους κινδύνους.

Διαβάστε περισσότερα: Αποφύγετε τη δημοσίευση μυστικών

Εκτιμήστε την προσπάθεια; Στείλτε μας το έργο στο GitHub

26. Μια λίστα με 40 γενικές συμβουλές ασφάλειας (που δεν σχετίζονται ειδικά με το Node.js)

Οι ακόλουθες κουκκίδες είναι πολύ γνωστά και σημαντικά μέτρα ασφαλείας που πρέπει να εφαρμόζονται σε κάθε εφαρμογή. Καθώς δεν συνδέονται αναγκαστικά με το Node.js και εφαρμόζονται παρόμοια ανεξάρτητα από το πλαίσιο εφαρμογής - τα συμπεριλαμβάνουμε εδώ ως παράρτημα. Τα στοιχεία ομαδοποιούνται σύμφωνα με την ταξινόμησή τους OWASP. Ένα δείγμα περιλαμβάνει τα ακόλουθα σημεία:

  • Απαιτείται MFA / 2FA για λογαριασμό root
  • Περιστρέψτε συχνά τους κωδικούς πρόσβασης και τα πλήκτρα πρόσβασης, συμπεριλαμβανομένων των πλήκτρων SSH
  • Εφαρμόστε ισχυρές πολιτικές κωδικού πρόσβασης, τόσο για ops όσο και για διαχείριση χρηστών εντός εφαρμογής, δείτε τη σύσταση κωδικού πρόσβασης OWASP
  • Μην αποστέλλετε ή αναπτύξετε με τυχόν διαπιστευτήρια προεπιλογής, ειδικά για χρήστες διαχειριστή
  • Χρησιμοποιήστε μόνο τυπικές μεθόδους ελέγχου ταυτότητας, όπως OAuth, OpenID κ.λπ. - αποφύγετε τον βασικό έλεγχο ταυτότητας
  • Περιορισμός ρυθμού εξουσιοδότησης: Απενεργοποιήστε περισσότερες από τις προσπάθειες σύνδεσης X (συμπεριλαμβανομένης της ανάκτησης κωδικού πρόσβασης κ.λπ.) σε περίοδο Y λεπτά
  • Κατά την αποτυχία σύνδεσης, μην αφήνετε στο χρήστη να γνωρίζει αν η επαλήθευση ονόματος χρήστη ή κωδικού πρόσβασης απέτυχε, απλά επιστρέψτε ένα κοινό σφάλμα auth
  • Εξετάστε τη χρήση ενός κεντρικού συστήματος διαχείρισης χρηστών για να αποφύγετε τη διαχείριση πολλαπλών λογαριασμών ανά υπάλληλο (π.χ. GitHub, AWS, Jenkins κ.λπ.) και να επωφεληθείτε από ένα σύστημα διαχείρισης χρηστών

Ο πλήρης κατάλογος των 40 γενικών συμβουλών ασφαλείας μπορείτε να βρείτε στον επίσημο χώρο αποθήκευσης βέλτιστων πρακτικών Node.js!

Διαβάστε περισσότερα: 40 Γενικές συμβουλές ασφάλειας

Άλλες καλές διαβάσεις:

  • Βέλτιστες πρακτικές παραγωγής Node.js - Yoni Goldberg
  • Επισκόπηση ασφάλειας Node.js - Gergely Nemeth
  • Βέλτιστες πρακτικές γρήγορης ασφάλειας - Γρήγορη επίσημη
  • YouTube: Οδικός χάρτης ασφαλείας Node.js - Mike Samuel

Συγγραφείς - για μας

  • Yoni Goldberg - σύμβουλος Node.js, που εξυπηρετεί πελάτες στις ΗΠΑ, την Ευρώπη και το Ισραήλ
  • Kyle Martin - Πλήρης Stack Developer με έδρα τη Νέα Ζηλανδία
  • Bruno Scheufler - Πλήρης στοίβα προγραμματιστής ιστού και ενθουσιώδης Node.js
Εκτιμήστε την προσπάθεια; Η παγίδα στο κάτω μέρος (έως και 50 φορές) μπορεί να κάνει την ημέρα μας