Basic Jenkins Information
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ο πιο κοινός τρόπος σύνδεσης στο Jenkins είναι με ένα όνομα χρήστη ή έναν κωδικό πρόσβασης.
Αν ένα εξουσιοδοτημένο cookie κλαπεί, μπορεί να χρησιμοποιηθεί για πρόσβαση στη συνεδρία του χρήστη. Το cookie συνήθως ονομάζεται JSESSIONID.*
. (Ένας χρήστης μπορεί να τερματίσει όλες τις συνεδρίες του, αλλά θα πρέπει πρώτα να ανακαλύψει ότι ένα cookie έχει κλαπεί).
Το Jenkins μπορεί να ρυθμιστεί χρησιμοποιώντας plugins για να είναι προσβάσιμο μέσω τρίτου SSO.
Οι χρήστες μπορούν να δημιουργήσουν tokens για να δώσουν πρόσβαση σε εφαρμογές να τους προσποιηθούν μέσω CLI ή REST API.
Αυτό το στοιχείο παρέχει έναν ενσωματωμένο SSH server για το Jenkins. Είναι μια εναλλακτική διεπαφή για το Jenkins CLI, και οι εντολές μπορούν να εκτελούνται με αυτόν τον τρόπο χρησιμοποιώντας οποιονδήποτε SSH client. (Από τα docs)
Στο /configureSecurity
είναι δυνατό να ρυθμίσετε τη μέθοδο εξουσιοδότησης του Jenkins. Υπάρχουν πολλές επιλογές:
Ο καθένας μπορεί να κάνει οτιδήποτε: Ακόμα και η ανώνυμη πρόσβαση μπορεί να διαχειριστεί τον server.
Legacy mode: Ίδιο με το Jenkins <1.164. Αν έχετε τον ρόλο "admin", θα έχετε πλήρη έλεγχο του συστήματος, και διαφορετικά (συμπεριλαμβανομένων των ανώνυμων χρηστών) θα έχετε πρόσβαση μόνο για ανάγνωση.
Οι συνδεδεμένοι χρήστες μπορούν να κάνουν οτιδήποτε: Σε αυτή τη λειτουργία, κάθε συνδεδεμένος χρήστης έχει πλήρη έλεγχο του Jenkins. Ο μόνος χρήστης που δεν θα έχει πλήρη έλεγχο είναι ο ανώνυμος χρήστης, ο οποίος έχει μόνο πρόσβαση για ανάγνωση.
Matrix-based security: Μπορείτε να ρυθμίσετε ποιος μπορεί να κάνει τι σε έναν πίνακα. Κάθε στήλη αντιπροσωπεύει μια άδεια. Κάθε γραμμή αντιπροσωπεύει έναν χρήστη ή μια ομάδα/ρόλο. Αυτό περιλαμβάνει έναν ειδικό χρήστη 'ανώνυμος', ο οποίος αντιπροσωπεύει μη αυθεντικοποιημένους χρήστες, καθώς και 'αυθεντικοποιημένος', ο οποίος αντιπροσωπεύει όλους τους αυθεντικοποιημένους χρήστες.
Project-based Matrix Authorization Strategy: Αυτή η λειτουργία είναι μια επέκταση της "Matrix-based security" που επιτρέπει την επιπλέον ACL matrix να ορίζεται για κάθε έργο ξεχωριστά.
Role-Based Strategy: Ενεργοποιεί τον καθορισμό εξουσιοδοτήσεων χρησιμοποιώντας μια στρατηγική βασισμένη σε ρόλους. Διαχειριστείτε τους ρόλους στο /role-strategy
.
Στο /configureSecurity
είναι δυνατό να ρυθμίσετε το security realm. Από προεπιλογή, το Jenkins περιλαμβάνει υποστήριξη για μερικά διαφορετικά Security Realms:
Delegate to servlet container: Για να αναθέσετε την αυθεντικοποίηση σε ένα servlet container που εκτελεί τον Jenkins controller, όπως το Jetty.
Jenkins’ own user database: Χρησιμοποιήστε τη δική του ενσωματωμένη βάση δεδομένων χρηστών του Jenkins για αυθεντικοποίηση αντί να αναθέσετε σε ένα εξωτερικό σύστημα. Αυτό είναι ενεργοποιημένο από προεπιλογή.
LDAP: Αναθέστε όλη την αυθεντικοποίηση σε έναν ρυθμισμένο LDAP server, συμπεριλαμβανομένων τόσο των χρηστών όσο και των ομάδων.
Unix user/group database: Αναθέτει την αυθεντικοποίηση στη βάση δεδομένων χρηστών Unix στο επίπεδο του λειτουργικού συστήματος στον Jenkins controller. Αυτή η λειτουργία θα επιτρέψει επίσης την επαναχρησιμοποίηση των ομάδων Unix για εξουσιοδότηση.
Plugins μπορούν να παρέχουν επιπλέον security realms που μπορεί να είναι χρήσιμα για την ενσωμάτωση του Jenkins σε υπάρχοντα συστήματα ταυτότητας, όπως:
Ορισμοί από τα docs:
Nodes είναι οι μηχανές στις οποίες εκτελούνται οι agents. Το Jenkins παρακολουθεί κάθε συνδεδεμένο node για ελεύθερο χώρο δίσκου, ελεύθερο χώρο temp, ελεύθερο swap, χρόνο/συγχρονισμό ρολογιού και χρόνο απόκρισης. Ένα node τίθεται εκτός λειτουργίας αν οποιαδήποτε από αυτές τις τιμές ξεπεράσει το ρυθμισμένο όριο.
Agents διαχειρίζονται την εκτέλεση εργασιών εκ μέρους του Jenkins controller χρησιμοποιώντας executors. Ένας agent μπορεί να χρησιμοποιήσει οποιοδήποτε λειτουργικό σύστημα που υποστηρίζει Java. Τα εργαλεία που απαιτούνται για τις κατασκευές και τις δοκιμές εγκαθίστανται στο node όπου εκτελείται ο agent; μπορούν να εγκατασταθούν απευθείας ή σε ένα container (Docker ή Kubernetes). Κάθε agent είναι ουσιαστικά μια διαδικασία με το δικό του PID στη μηχανή φιλοξενίας.
Ένας executor είναι μια θέση για την εκτέλεση εργασιών; ουσιαστικά, είναι ένα νήμα στον agent. Ο αριθμός των executors σε ένα node καθορίζει τον αριθμό των ταυτόχρονων εργασιών που μπορούν να εκτελούνται σε αυτό το node ταυτόχρονα. Με άλλα λόγια, αυτό καθορίζει τον αριθμό των ταυτόχρονων Pipeline stages
που μπορούν να εκτελούνται σε αυτό το node ταυτόχρονα.
Ορισμός από τα docs: Το Jenkins χρησιμοποιεί AES για την κρυπτογράφηση και την προστασία μυστικών, διαπιστευτηρίων και των αντίστοιχων κλειδιών κρυπτογράφησης τους. Αυτά τα κλειδιά κρυπτογράφησης αποθηκεύονται στο $JENKINS_HOME/secrets/
μαζί με το κύριο κλειδί που χρησιμοποιείται για την προστασία αυτών των κλειδιών. Αυτός ο φάκελος θα πρέπει να ρυθμιστεί έτσι ώστε μόνο ο χρήστης του λειτουργικού συστήματος που εκτελεί τον Jenkins controller να έχει δικαιώματα ανάγνωσης και εγγραφής σε αυτόν τον φάκελο (δηλαδή, μια τιμή chmod
0700
ή χρησιμοποιώντας κατάλληλα χαρακτηριστικά αρχείων). Το κύριο κλειδί (μερικές φορές αναφέρεται ως "κλειδί κρυπτογράφησης" στην κρυπτογραφία) είναι αποθηκευμένο _χωρίς κρυπτογράφηση_ στο σύστημα αρχείων του Jenkins controller στο $JENKINS_HOME/secrets/master.key
το οποίο δεν προστατεύει από επιτιθέμενους με άμεση πρόσβαση σε αυτό το αρχείο. Οι περισσότεροι χρήστες και προγραμματιστές θα χρησιμοποιούν αυτά τα κλειδιά κρυπτογράφησης έμμεσα μέσω είτε του Secret API για την κρυπτογράφηση γενικών μυστικών δεδομένων είτε μέσω του credentials API. Για τους κρυπτογραφικά περίεργους, το Jenkins χρησιμοποιεί AES σε λειτουργία αλυσίδας μπλοκ κρυπτογράφησης (CBC) με padding PKCS#5 και τυχαία IVs για την κρυπτογράφηση περιπτώσεων του CryptoConfidentialKey που αποθηκεύονται στο $JENKINS_HOME/secrets/
με ένα όνομα αρχείου που αντιστοιχεί στο CryptoConfidentialKey
id τους. Κοινά ids κλειδιών περιλαμβάνουν:
hudson.util.Secret
: χρησιμοποιείται για γενικά μυστικά;
com.cloudbees.plugins.credentials.SecretBytes.KEY
: χρησιμοποιείται για ορισμένους τύπους διαπιστευτηρίων;
jenkins.model.Jenkins.crumbSalt
: χρησιμοποιείται από τον μηχανισμό προστασίας CSRF; και
Τα διαπιστευτήρια μπορούν να είναι περιορισμένα σε παγκόσμιους παρόχους (/credentials/
) που μπορούν να προσπελαστούν από οποιοδήποτε έργο έχει ρυθμιστεί, ή μπορούν να περιοριστούν σε συγκεκριμένα έργα (/job/<project-name>/configure
) και επομένως να είναι προσβάσιμα μόνο από το συγκεκριμένο έργο.
Σύμφωνα με τα docs: Τα διαπιστευτήρια που είναι σε πεδίο είναι διαθέσιμα στην pipeline χωρίς περιορισμούς. Για να αποτραπεί η τυχαία έκθεση στο log κατασκευής, τα διαπιστευτήρια είναι κρυμμένα από την κανονική έξοδο, έτσι ώστε μια κλήση του env
(Linux) ή set
(Windows), ή προγράμματα που εκτυπώνουν το περιβάλλον τους ή τις παραμέτρους τους να μην τα αποκαλύπτουν στο log κατασκευής σε χρήστες που διαφορετικά δεν θα είχαν πρόσβαση στα διαπιστευτήρια.
Γι' αυτόν τον λόγο, προκειμένου να εξάγει τα διαπιστευτήρια, ένας επιτιθέμενος χρειάζεται, για παράδειγμα, να τα κωδικοποιήσει σε base64.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)