**Azure Cosmos DB** είναι μια πλήρως **διαχειριζόμενη NoSQL, σχεσιακή και διανυσματική βάση δεδομένων** που προσφέρει χρόνους απόκρισης σε χιλιοστά του δευτερολέπτου, αυτόματη κλιμάκωση και διαθεσιμότητα υποστηριζόμενη από SLA με ασφάλεια επιπέδου επιχείρησης. Διευκολύνει την ταχύτερη ανάπτυξη εφαρμογών μέσω έτοιμης διανομής δεδομένων σε πολλές περιοχές, ανοιχτών API, SDK για δημοφιλείς γλώσσες και χαρακτηριστικών βάσης δεδομένων AI όπως η ενσωματωμένη υποστήριξη διανυσμάτων και η απρόσκοπτη ενσωμάτωσή της με Azure AI.
**Azure Cosmos DB** είναι μια πλήρως **διαχειριζόμενη NoSQL, σχεσιακή και διανυσματική βάση δεδομένων** που προσφέρει χρόνους απόκρισης σε χιλιοστά του δευτερολέπτου, αυτόματη κλιμάκωση και διαθεσιμότητα υποστηριζόμενη από SLA με ασφάλεια επιπέδου επιχείρησης. Διευκολύνει την ταχύτερη ανάπτυξη εφαρμογών μέσω έτοιμης διανομής δεδομένων σε πολλές περιοχές, ανοιχτών API, SDK για δημοφιλείς γλώσσες και χαρακτηριστικά βάσης δεδομένων AI όπως η ενσωματωμένη υποστήριξη διανυσμάτων και η απρόσκοπτη ενσωμάτωσή της με Azure AI.
Η Azure Cosmos DB παρέχει πολλαπλά API βάσεων δεδομένων για την μοντελοποίηση πραγματικών δεδομένων χρησιμοποιώντας έγγραφα, σχεσιακά, key-value, γραφήματα και μοντέλα δεδομένων column-family, με αυτά τα API να είναι NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin και Table.
Μέσα σε έναν λογαριασμό, μπορείτε να δημιουργήσετε μία ή περισσότερες βάσεις δεδομένων, οι οποίες λειτουργούν ως λογικές ομάδες κοντέινερ. Μια βάση δεδομένων λειτουργεί ως όριο για τη διαχείριση πόρων και τα δικαιώματα χρηστών. Οι βάσεις δεδομένων μπορούν είτε να μοιράζονται την παρεχόμενη απόδοση μεταξύ των κοντέινερ τους είτε να εκχωρούν αποκλειστική απόδοση σε μεμονωμένα κοντέινερ.
Μέσα σε έναν λογαριασμό, μπορείτε να δημιουργήσετε μία ή περισσότερες βάσεις δεδομένων, οι οποίες λειτουργούν ως λογικές ομάδες κοντέινερ. Μια βάση δεδομένων λειτουργεί ως όριο για τη διαχείριση πόρων και τα δικαιώματα χρηστών. Οι βάσεις δεδομένων μπορούν είτε να μοιράζονται την παρεχόμενη απόδοση σε όλα τα κοντέινερ τους είτε να εκχωρούν αποκλειστική απόδοση σε μεμονωμένα κοντέινερ.
#### Κοντέινερ
Η βασική μονάδα αποθήκευσης δεδομένων είναι το κοντέινερ, το οποίο περιέχει έγγραφα JSON και είναι αυτόματα ευρετηριασμένο για αποδοτική αναζήτηση. Τα κοντέινερ είναι ελαστικά κλιμακούμενα και κατανεμημένα σε κατατμήσεις, οι οποίες καθορίζονται από ένα κλειδί κατατμήσεων που ορίζει ο χρήστης. Το κλειδί κατατμήσεων είναι κρίσιμο για την εξασφάλιση βέλτιστης απόδοσης και ομοιόμορφης κατανομής δεδομένων. Για παράδειγμα, ένα κοντέινερ μπορεί να αποθηκεύει δεδομένα πελατών, με το "customerId" ως το κλειδί κατατμήσεων.
@@ -173,7 +173,7 @@ print(item)
```
{% endcode %}
Ένας άλλος τρόπος γιανα καθιερώσετε μια σύνδεση είναι να χρησιμοποιήσετε το **DefaultAzureCredential()**. Απλώς χρειάζεται να συνδεθείτε (az login) με τον λογαριασμό που έχει τις άδειες και να το εκτελέσετε. Για αυτή την περίπτωση, πρέπει να γίνει μια ανάθεση ρόλου, δίνοντας τις απαραίτητες άδειες (δείτεγια περισσότερα)
Ένας άλλος τρόπος γιανα καθιερώσετε μια σύνδεση είναι να χρησιμοποιήσετε το **DefaultAzureCredential()**. Απλώς χρειάζεται να συνδεθείτε (az login) με τον λογαριασμό που έχει τις άδειες και να το εκτελέσετε. Για αυτή την περίπτωση, πρέπει να γίνει μια ανάθεση ρόλου, δίνοντας τις απαραίτητες άδειες (βλ.για περισσότερα)
{% code overflow="wrap" %}
```python
@@ -203,7 +203,7 @@ print("Document inserted.")
{% endcode %}
### MongoDB
Η API NoSQL του MongoDB είναι μια API βασισμένη σε έγγραφα που χρησιμοποιεί το BSON (Binary JSON) σε μορφή δεδομένων παρόμοια με το JSON. Παρέχει μια γλώσσα ερωτήσεων με δυνατότητες συγκέντρωσης, καθιστώντας την κατάλληλη για εργασία με δομημένα, ημι-δομημένα και αδόμητα δεδομένα. Το endpoint της υπηρεσίας συνήθως ακολουθεί αυτή τη μορφή:
Η API MongoDB NoSQL είναι μια API βασισμένη σε έγγραφα που χρησιμοποιεί το BSON (Binary JSON) σε μορφή δεδομένων παρόμοια με το JSON. Παρέχει μια γλώσσα ερωτήσεων με δυνατότητες συγκέντρωσης, καθιστώντας την κατάλληλη για εργασία με δομημένα, ημι-δομημένα και αδόμητα δεδομένα. Το endpoint της υπηρεσίας συνήθως ακολουθεί αυτή τη μορφή:
{% code overflow="wrap" %}
```bash
@@ -334,7 +334,7 @@ print(f"Inserted document with ID: {result.inserted_id}")
@@ -348,8 +348,8 @@ print(f"Inserted document with ID: {result.inserted_id}")
## ToDo
*Η υπόλοιπη βάση δεδομένων εδώ, πίνακες, cassandra, gremlin...
* Ρίξτε μια ματιά στην εκμετάλλευση "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" και τους ορισμούς ρόλων γιατί εδώ μπορεί να υπάρχει ανύψωση δικαιωμάτων
*Η υπόλοιπη DB εδώ, πίνακες, cassandra, gremlin...
* Ρίξτε μια ματιά στην εκμετάλλευση "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" και τους ορισμούς ρόλων γιατί εδώ μπορεί να υπάρχει ανύψωση προνομίων
Εδώ μπορείτε να βρείτε κάποιες δυνητικά επικίνδυνες ρυθμίσεις Ρόλων και ClusterRoles.\
Θυμηθείτε ότι μπορείτε να αποκτήσετε όλους τους υποστηριζόμενους πόρους με `kubectl api-resources`
Εδώ μπορείτε να βρείτε κάποιες δυνητικά επικίνδυνες ρυθμίσεις Roles και ClusterRoles.\
Θυμηθείτε ότι μπορείτε να αποκτήσετε όλους τους υποστηριζόμενους πόρους με το`kubectl api-resources`
## **Αύξηση Προνομίων**
## **Privilege Escalation**
Αναφερόμενη ως η τέχνη του να αποκτάς **πρόσβαση σε έναν διαφορετικό κύριο** εντός του cluster **με διαφορετικά προνόμια** (εντός του kubernetes cluster ή σε εξωτερικά νέφη) από αυτά που ήδη έχεις, στο Kubernetes υπάρχουν βασικά **4 κύριες τεχνικές για την αύξηση προνομίων**:
Αναφερόμενος ως η τέχνη του να αποκτάς **πρόσβαση σε έναν διαφορετικό κύριο** εντός του cluster **με διαφορετικά προνόμια** (εντός του kubernetes cluster ή σε εξωτερικά νέφη) από αυτά που ήδη έχετε, στο Kubernetes υπάρχουν βασικά **4 κύριες τεχνικές για την κλιμάκωση προνομίων**:
-Ναμπορείςνα**παριστάνεις** άλλους χρήστες/ομάδες/SAs με καλύτερα προνόμια εντός του kubernetes cluster ή σε εξωτερικά νέφη
-Ναμπορείςνα**δημιουργείς/διορθώνεις/εκτελείς pods** όπου μπορείςνα**βρεις ή να συνδέσεις SAs** με καλύτερα προνόμια εντός του kubernetes cluster ή σε εξωτερικά νέφη
-Ναμπορείςνα**διαβάζεις μυστικά** καθώς τα tokens των SAs αποθηκεύονται ως μυστικά
-Ναμπορείςνα**διαφύγεις στον κόμβο** από ένα κοντέινερ, όπου μπορείςνα κλέψεις όλα τα μυστικά των κοντέινερ που εκτελούνται στον κόμβο, τα διαπιστευτήρια του κόμβου και τα δικαιώματα του κόμβου εντός του νέφους στο οποίο εκτελείται (αν υπάρχει)
-Μια πέμπτη τεχνική που αξίζει να αναφερθεί είναι η ικανότητα να**τρέχεις port-forward** σε ένα pod, καθώς μπορεί ναέχεις πρόσβαση σε ενδιαφέροντες πόρους εντός αυτού του pod.
-Ναείστε σε θέσηνα**παριστάνετε** άλλους χρήστες/ομάδες/SAs με καλύτερα προνόμια εντός του kubernetes cluster ή σε εξωτερικά νέφη
-Ναείστε σε θέσηνα**δημιουργείτε/διορθώνετε/εκτελείτε pods** όπου μπορείτενα**βρείτε ή να συνδέσετε SAs** με καλύτερα προνόμια εντός του kubernetes cluster ή σε εξωτερικά νέφη
-Ναείστε σε θέσηνα**διαβάζετε μυστικά** καθώς τα tokens των SAs αποθηκεύονται ως μυστικά
-Ναείστε σε θέσηνα**διαφύγετε στον κόμβο** από ένα κοντέινερ, όπου μπορείτενα κλέψετε όλα τα μυστικά των κοντέινερ που εκτελούνται στον κόμβο, τα διαπιστευτήρια του κόμβου και τα δικαιώματα του κόμβου εντός του νέφους στο οποίο εκτελείται (αν υπάρχει)
-Μια πέμπτη τεχνική που αξίζει να αναφερθεί είναι η ικανότητα να**τρέχετε port-forward** σε ένα pod, καθώς μπορεί ναείστε σε θέση να αποκτήσετε πρόσβαση σε ενδιαφέροντες πόρους εντός αυτού του pod.
### Πρόσβαση σε Οποιονδήποτε Πόρο ή Ρήμα (Wildcard)
### Access Any Resource or Verb (Wildcard)
Η**άγρια κάρτα (\*) δίνει άδεια σε οποιονδήποτε πόρο με οποιοδήποτε ρήμα**. Χρησιμοποιείται από διαχειριστές. Μέσα σε ένα ClusterRole αυτό σημαίνει ότι ένας επιτιθέμενος θα μπορούσε νακαταχραστεί οποιοδήποτε namespace στο cluster
Η**άγρια κάρτα (\*) δίνει άδεια σε οποιονδήποτε πόρο με οποιοδήποτε ρήμα**. Χρησιμοποιείται από τους διαχειριστές. Μέσα σε ένα ClusterRole αυτό σημαίνει ότι ένας επιτιθέμενος θα μπορούσε ναεκμεταλλευτεί οποιοδήποτε namespace στο cluster
```yaml
apiVersion:rbac.authorization.k8s.io/v1
kind:ClusterRole
@@ -33,7 +33,7 @@ verbs: ["*"]
Στο RBAC, ορισμένες άδειες ενέχουν σημαντικούς κινδύνους:
1.**`create`:** Δίνει τη δυνατότητα δημιουργίας οποιουδήποτε πόρου του cluster, θέτοντας σε κίνδυνο την κλιμάκωση προνομίων.
1.**`create`:** Χορηγεί τη δυνατότητα δημιουργίας οποιουδήποτε πόρου του cluster, θέτοντας σε κίνδυνο την κλιμάκωση προνομίων.
2.**`list`:** Επιτρέπει την καταγραφή όλων των πόρων, ενδεχομένως διαρρέοντας ευαίσθητα δεδομένα.
3.**`get`:** Επιτρέπει την πρόσβαση σε μυστικά από λογαριασμούς υπηρεσιών, θέτοντας σε κίνδυνο την ασφάλεια.
Πιθανώς θέλετε να είστε **πιο διακριτικοί**, στις επόμενες σελίδες μπορείτε να δείτε τι θα μπορούσατε να έχετε πρόσβαση αν δημιουργήσετε ένα pod ενεργοποιώντας μόνο ορισμένα από τα αναφερόμενα δικαιώματα στο προηγούμενο πρότυπο:
Πιθανώς θέλετε να είστε **πιο διακριτικοί**. Στις επόμενες σελίδες μπορείτε να δείτε τι θα μπορούσατε να έχετε πρόσβαση αν δημιουργήσετε ένα pod ενεργοποιώντας μόνο ορισμένα από τα προνόμια που αναφέρθηκαν στο προηγούμενο πρότυπο:
- **Privileged + hostPID**
- **Privileged μόνο**
- **Privileged only**
- **hostPath**
- **hostPID**
- **hostNetwork**
- **hostIPC**
_Μπορείτε να βρείτε παραδείγματα για το πώς να δημιουργήσετε/εκμεταλλευτείτε τις προηγούμενες ρυθμίσεις privileged pods στο_ [_https://github.com/BishopFox/badPods_](https://github.com/BishopFox/badPods)
_Μπορείτε να βρείτε παραδείγματα για το πώς να δημιουργήσετε/καταχραστείτε τις προηγούμενες ρυθμίσεις privileged pods στο_ [_https://github.com/BishopFox/badPods_](https://github.com/BishopFox/badPods)
### Pod Create - Μετακίνηση στο cloud
### Pod Create - Move to cloud
Αν μπορείτε να **δημιουργήσετε** ένα **pod** (και προαιρετικά έναν **λογαριασμό υπηρεσίας**) μπορεί να είστε σε θέση να **αποκτήσετε δικαιώματα σε περιβάλλον cloud** αναθέτοντας **ρόλους cloud σε ένα pod ή σε έναν λογαριασμό υπηρεσίας** και στη συνέχεια να έχετε πρόσβαση σε αυτό.\
Αν μπορείτε να **δημιουργήσετε** ένα **pod** (και προαιρετικά έναν **λογαριασμό υπηρεσίας**) μπορεί να είστε σε θέση να **αποκτήσετε προνόμια σε περιβάλλον cloud** αναθέτοντας **ρόλους cloud σε ένα pod ή σε έναν λογαριασμό υπηρεσίας** και στη συνέχεια να έχετε πρόσβαση σε αυτό.\
Επιπλέον, αν μπορείτε να δημιουργήσετε ένα **pod με το namespace δικτύου του host**, μπορείτε να **κλέψετε τον ρόλο IAM** της **περίπτωσης** του **κόμβου**.
Για περισσότερες πληροφορίες ελέγξτε:
@@ -149,9 +149,9 @@ _Μπορείτε να βρείτε παραδείγματα για το πώς
pod-escape-privileges.md
{{#endref}}
### **Δημιουργία/Επικαιροποίηση Ανάπτυξης, Daemonsets, Statefulsets, Replicationcontrollers, Replicasets, Jobs και Cronjobs**
### **Create/Patch Deployment, Daemonsets, Statefulsets, Replicationcontrollers, Replicasets, Jobs and Cronjobs**
Είναι δυνατόν ναεκμεταλλευτείτε αυτές τις άδειεςγιανα **δημιουργήσετε ένα νέο pod** και να εδραιώσετε δικαιώματα όπως στο προηγούμενο παράδειγμα.
Είναι δυνατόν νακαταχραστείτε αυτά τα δικαιώματαγιανα **δημιουργήσετε ένα νέο pod** και να εδραιώσετε προνόμια όπως στο προηγούμενο παράδειγμα.
Το παρακάτω yaml **δημιουργεί ένα daemonset και εξάγει το token του SA** μέσα στο pod:
```yaml
@@ -211,7 +211,7 @@ As [**indicated in this research**](https://jackleadford.github.io/containers/20
Επομένως, ένας επιτιθέμενος με **access to write in the /var/log/ folder** του container θα μπορούσε να εκμεταλλευτεί αυτή τη συμπεριφορά με 2 τρόπους:
- Modifying the `0.log` file of its container (συνήθως βρίσκεται στο `/var/logs/pods/namespace_pod_uid/container/0.log`) ώστε να είναι ένα **symlink pointing to `/etc/shadow`** για παράδειγμα. Τότε, θα μπορείτε ναεξάγετε το αρχείο shadow των hosts κάνοντας:
- Modifying the `0.log` file of its container (συνήθως βρίσκεται στο `/var/logs/pods/namespace_pod_uid/container/0.log`) ώστε να είναι ένα **symlink pointing to `/etc/shadow`** για παράδειγμα. Τότε, θα μπορείτε ναexfiltrate hosts shadow file κάνοντας:
```bash
kubectl logs escaper
failed to get parse function: unsupported log format: "root::::::::\n"
Όπως αναφέρεται σε [**αυτή την έρευνα**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html), είναι δυνατόν να παρακαμφθεί η προστασία:
```yaml
@@ -247,7 +247,7 @@ allowedHostPaths:
- pathPrefix: "/foo"
readOnly: true
```
Που προοριζόταν να αποτρέψει τις διαφυγές όπως οι προηγούμενες, χρησιμοποιώντας, αντί για μια προσάρτηση hostPath, έναν PersistentVolume και έναν PersistentVolumeClaim γιανα προσθέσει έναν φάκελο του host στο κοντέινερ με δικαιώματα εγγραφής:
Που προοριζόταν να αποτρέψει τις διαφυγές όπως οι προηγούμενες, χρησιμοποιώντας, αντί για μια προσάρτηση hostPath, έναν PersistentVolume και μια PersistentVolumeClaim γιανα προσθέσει έναν φάκελο του host στο κοντέινερ με δικαιώματα εγγραφής:
```yaml
apiVersion: v1
kind: PersistentVolume
@@ -295,7 +295,7 @@ name: task-pv-storage-vol
```
### **Υποκατάσταση προνομιακών λογαριασμών**
Με ένα [**δικαίωμα υποκατάστασης χρήστη**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation), ένας επιτιθέμενος θα μπορούσε να υποκαταστήσει έναν προνομιακό λογαριασμό.
Με ένα [**προνόμιο υποκατάστασης χρήστη**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation), ένας επιτιθέμενος θα μπορούσε να υποκαταστήσει έναν προνομιακό λογαριασμό.
Απλά χρησιμοποιήστε την παράμετρο `--as=<username>` στην εντολή `kubectl` γιανα υποκαταστήσετε έναν χρήστη, ή `--as-group=<group>` γιανα υποκαταστήσετε μια ομάδα:
Υπάρχει ένας ειδικός τύπος μυστικού Kubernetes του τύπου **kubernetes.io/service-account-token** που αποθηκεύει τα tokens του serviceaccount.
Αν έχετε άδειες γιανα δημιουργείτε και να διαβάζετε μυστικά, και γνωρίζετε επίσης το όνομα του serviceaccount, μπορείτε να δημιουργήσετε ένα μυστικό ως εξής και στη συνέχεια να κλέψετε το token του serviceaccount του θύματος από αυτό:
Αν έχετε άδειες γιανα δημιουργείτε και να διαβάζετε μυστικά, και γνωρίζετε επίσης το όνομα του serviceaccount, μπορείτε να δημιουργήσετε ένα μυστικό ως εξής και στη συνέχεια να κλέψετε το token του θύματος serviceaccount από αυτό:
Σημειώστε ότι αν έχετε άδεια να δημιουργείτε και να διαβάζετε μυστικά σε ένα συγκεκριμένο namespace, ο λογαριασμός υπηρεσίας του θύματος πρέπει επίσης να βρίσκεται σε αυτό το ίδιο namespace.
### Ανάγνωση ενός μυστικού –brute-forcing token IDs
### Ανάγνωση ενός μυστικού –βίαιη επίθεση σε αναγνωριστικά token
Ενώ ένας επιτιθέμενος που κατέχει ένα token με δικαιώματα ανάγνωσης απαιτεί το ακριβές όνομα του μυστικού γιανα το χρησιμοποιήσει, σε αντίθεση με το ευρύτερο προνόμιο _**listing secrets**_, υπάρχουν ακόμα ευπάθειες. Οι προεπιλεγμένοι λογαριασμοί υπηρεσίας στο σύστημα μπορούν να καταμετρηθούν, καθένας συνδεδεμένος με ένα μυστικό. Αυτά τα μυστικά έχουν μια δομή ονόματος: ένα στατικό πρόθεμα ακολουθούμενο από έναν τυχαίο αλφαριθμητικό token πέντε χαρακτήρων (εξαιρουμένων ορισμένων χαρακτήρων) σύμφωνα με τον [κώδικα πηγής](https://github.com/kubernetes/kubernetes/blob/8418cccaf6a7307479f1dfeafb0d2823c1c37802/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go#L83).
Ενώ ένας επιτιθέμενος που κατέχει ένα token με δικαιώματα ανάγνωσης απαιτεί το ακριβές όνομα του μυστικού γιανα το χρησιμοποιήσει, σε αντίθεση με το ευρύτερο προνόμιο _**καταγραφής μυστικών**_, υπάρχουν ακόμα ευπάθειες. Οι προεπιλεγμένοι λογαριασμοί υπηρεσίας στο σύστημα μπορούν να καταμετρηθούν, καθένας συνδεδεμένος με ένα μυστικό. Αυτά τα μυστικά έχουν μια δομή ονόματος: ένα στατικό πρόθεμα ακολουθούμενο από έναν τυχαίο αλφαριθμητικό κωδικό πέντε χαρακτήρων (εξαιρουμένων ορισμένων χαρακτήρων) σύμφωνα με τον [κώδικα πηγής](https://github.com/kubernetes/kubernetes/blob/8418cccaf6a7307479f1dfeafb0d2823c1c37802/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go#L83).
Το token παράγεται από ένα περιορισμένο σύνολο 27 χαρακτήρων (`bcdfghjklmnpqrstvwxz2456789`), αντί για το πλήρες αλφαριθμητικό εύρος. Αυτός ο περιορισμός μειώνει τον συνολικό δυνατό αριθμό συνδυασμών σε 14,348,907 (27^5). Ως εκ τούτου, ένας επιτιθέμενος θα μπορούσε λογικάνα εκτελέσει μια επίθεση brute-forceγιανα deduce το token μέσα σε λίγες ώρες, ενδεχομένως οδηγώντας σε κλιμάκωση προνομίων μέσω της πρόσβασης σε ευαίσθητους λογαριασμούς υπηρεσίας.
Ο κωδικός παράγεται από ένα περιορισμένο σύνολο 27 χαρακτήρων (`bcdfghjklmnpqrstvwxz2456789`), αντί για το πλήρες αλφαριθμητικό εύρος. Αυτός ο περιορισμός μειώνει τον συνολικό δυνατό αριθμό συνδυασμών σε 14,348,907 (27^5). Ως εκ τούτου, ένας επιτιθέμενος θα μπορούσε να εκτελέσει μια βίαιη επίθεση γιανα deduce τον κωδικό μέσα σε λίγες ώρες, ενδεχομένως οδηγώντας σε κλιμάκωση προνομίων μέσω της πρόσβασης σε ευαίσθητους λογαριασμούς υπηρεσίας.
### Αιτήματα Υπογραφής Πιστοποιητικών
Αν έχετε τα ρήματα **`create`** στον πόρο `certificatesigningrequests` (ή τουλάχιστον στο `certificatesigningrequests/nodeClient`). Μπορείτε να **δημιουργήσετε** ένα νέο CeSR ενός **νέου κόμβου.**
Σύμφωνα με την [τεκμηρίωση είναι δυνατό να εγκρίνετε αυτόματα αυτά τα αιτήματα](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), οπότε σε αυτή την περίπτωση **δεν χρειάζεστε επιπλέον δικαιώματα**. Αν όχι, θα χρειαστείνα μπορείτε να εγκρίνετε το αίτημα, που σημαίνει ενημέρωση στο `certificatesigningrequests/approval` και `approve` στο `signers` με resourceName `<signerNameDomain>/<signerNamePath>` ή `<signerNameDomain>/*`
Σύμφωνα με την [τεκμηρίωση είναι δυνατό να εγκρίνετε αυτόματα αυτά τα αιτήματα](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), οπότε σε αυτή την περίπτωση **δεν χρειάζεστε επιπλέον δικαιώματα**. Αν όχι, θα πρέπεινα μπορείτε να εγκρίνετε το αίτημα, που σημαίνει ενημέρωση στο `certificatesigningrequests/approval` και `approve` στο `signers` με resourceName `<signerNameDomain>/<signerNamePath>` ή `<signerNameDomain>/*`
Ένα **παράδειγμα ρόλου** με όλα τα απαιτούμενα δικαιώματα είναι:
Ένα **παράδειγμα ρόλου** με όλες τις απαιτούμενες άδειες είναι:
```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
@@ -423,10 +423,10 @@ resourceNames:
verbs:
- approve
```
Έτσι, με την έγκριση του νέου CSR κόμβου, μπορείτε να **καταχραστείτε** τις ειδικές άδειες των κόμβων γιανα **κλέψετε μυστικά** και να **αναβαθμίσετε προνόμια**.
Έτσι, με την έγκριση του νέου CSR κόμβου, μπορείτε να **καταχραστείτε** τις ειδικές άδειες των κόμβων γιανα **κλέψετε μυστικά** και να **ανεβάσετε δικαιώματα**.
Στο [**αυτό το άρθρο**](https://www.4armed.com/blog/hacking-kubelet-on-gke/) και [**σε αυτό**](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/) η διαμόρφωση TLS Bootstrap του GKE K8s είναι ρυθμισμένη με **αυτόματη υπογραφή** και καταχράται γιανα δημιουργήσει διαπιστευτήρια ενός νέου κόμβου K8s και στη συνέχεια να τα καταχραστεί γιανααναβαθμίσει προνόμια κλέβοντας μυστικά.\
Αν **έχετε τα αναφερόμενα προνόμια, μπορείτε να κάνετε το ίδιο**. Σημειώστε ότι το πρώτο παράδειγμα παρακάμπτει το σφάλμα που εμποδίζει έναν νέο κόμβο να έχει πρόσβαση σε μυστικά μέσα σε κοντέινερ, επειδή ένας **κόμβος μπορεί να έχει πρόσβαση μόνο στα μυστικά των κοντέινερ που είναι τοποθετημένα σε αυτόν.**
Στο [**αυτό το άρθρο**](https://www.4armed.com/blog/hacking-kubelet-on-gke/) και [**σε αυτό**](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/) η διαμόρφωση TLS Bootstrap του GKE K8s είναι ρυθμισμένη με **αυτόματη υπογραφή** και καταχράται γιανα δημιουργήσει διαπιστευτήρια ενός νέου κόμβου K8s και στη συνέχεια να τα καταχραστεί γιαναανεβάσει δικαιώματα κλέβοντας μυστικά.\
Αν **έχετε τα αναφερόμενα δικαιώματα, μπορείτε να κάνετε το ίδιο**. Σημειώστε ότι το πρώτο παράδειγμα παρακάμπτει το σφάλμα που εμποδίζει έναν νέο κόμβο να έχει πρόσβαση σε μυστικά μέσα σε κοντέινερ, επειδή ένας **κόμβος μπορεί να έχει πρόσβαση μόνο στα μυστικά των κοντέινερ που είναι τοποθετημένα σε αυτόν.**
Ο τρόπος γιανα παρακάμψετε αυτό είναι απλώς να **δημιουργήσετε διαπιστευτήρια κόμβου για το όνομα του κόμβου όπου είναι τοποθετημένο το κοντέινερ με τα ενδιαφέροντα μυστικά** (αλλά απλώς ελέγξτε πώς να το κάνετε στο πρώτο άρθρο):
Οι κύριοι που μπορούν να **τροποποιήσουν** **`services/status`** μπορεί να ρυθμίσουν το πεδίο `status.loadBalancer.ingress.ip` γιανα εκμεταλλευτούν το **μη διορθωμένο CVE-2020-8554** και να ξεκινήσουν **MiTM επιθέσεις κατά του cluster**. Οι περισσότερες μετρήσεις για το CVE-2020-8554 αποτρέπουν μόνο τις υπηρεσίες ExternalIP (σύμφωνα με [**αυτό**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/modify_service_status_cve_2020_8554.rego)).
Οι κύριοι που μπορούν να **τροποποιήσουν** **`services/status`** μπορεί να ρυθμίσουν το πεδίο `status.loadBalancer.ingress.ip` γιανα εκμεταλλευτούν το **μη διορθωμένο CVE-2020-8554** και να ξεκινήσουν **MiTM επιθέσεις κατά του clus**ter. Οι περισσότερες μετρήσεις για το CVE-2020-8554 αποτρέπουν μόνο τις υπηρεσίες ExternalIP (σύμφωνα με [**αυτό**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/modify_service_status_cve_2020_8554.rego)).
### Κατάσταση Κόμβων και Pods
Οι κύριοι με **`update`** ή **`patch`** δικαιώματα πάνω σε `nodes/status` ή `pods/status`, θα μπορούσαν να τροποποιήσουν τις ετικέτες γιανα επηρεάσουν τους περιορισμούς προγραμματισμού που επιβάλλονται.
## Ενσωματωμένη Πρόληψη Κλιμάκωσης Δικαιωμάτων
## Ενσωματωμένη Πρόληψη Κλιμάκωσης Προνομίων
Το Kubernetes διαθέτει έναν [ενσωματωμένο μηχανισμό](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping) για την πρόληψη της κλιμάκωσης δικαιωμάτων.
Το Kubernetes διαθέτει έναν [ενσωματωμένο μηχανισμό](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping) για την πρόληψη της κλιμάκωσης προνομίων.
Αυτό το σύστημα διασφαλίζει ότι **οι χρήστες δεν μπορούν να αυξήσουν τα δικαιώματά τους τροποποιώντας ρόλους ή δεσμεύσεις ρόλων**. Η επιβολή αυτού του κανόνα συμβαίνει σε επίπεδο API, παρέχοντας μια προστασία ακόμη και όταν ο RBAC authorizer είναι ανενεργός.
Αυτό το σύστημα διασφαλίζει ότι **οι χρήστες δεν μπορούν να αυξήσουν τα προνόμιά τους τροποποιώντας ρόλους ή δεσμεύσεις ρόλων**. Η επιβολή αυτού του κανόνα συμβαίνει σε επίπεδο API, παρέχοντας μια προστασία ακόμη και όταν ο RBAC authorizer είναι ανενεργός.
Ο κανόνας stipulates ότι ένας **χρήστης μπορεί να δημιουργήσει ή να ενημερώσει έναν ρόλο μόνο εάν κατέχει όλα τα δικαιώματα που περιλαμβάνει ο ρόλος**. Επιπλέον, το πεδίο των υπαρχόντων δικαιωμάτων του χρήστη πρέπει να ευθυγραμμίζεται με αυτό του ρόλου που προσπαθεί να δημιουργήσει ή να τροποποιήσει: είτε σε επίπεδο cluster για ClusterRoles είτε περιορισμένο στην ίδια namespace (ή σε επίπεδο cluster) για Roles.
Ο κανόνας stipulates ότι ένας **χρήστης μπορεί να δημιουργήσει ή να ενημερώσει έναν ρόλο μόνο εάν κατέχει όλα τα δικαιώματα που περιλαμβάνει ο ρόλος**. Επιπλέον, το εύρος των υφιστάμενων δικαιωμάτων του χρήστη πρέπει να ευθυγραμμίζεται με αυτό του ρόλου που προσπαθεί να δημιουργήσει ή να τροποποιήσει: είτε σε επίπεδο cluster για ClusterRoles είτε περιορισμένο στην ίδια namespace (ή σε επίπεδο cluster) για Roles.
> [!WARNING]
> Υπάρχει μια εξαίρεση στον προηγούμενο κανόνα. Εάν ένας κύριος έχει το **ρήμα `escalate`** πάνω σε **`roles`** ή **`clusterroles`** μπορεί να αυξήσει τα δικαιώματα των ρόλων και των clusterroles ακόμη και χωρίς να έχει τα δικαιώματα ο ίδιος.
> Υπάρχει μια εξαίρεση στον προηγούμενο κανόνα. Εάν ένας κύριος έχει το **ρήμα `escalate`** πάνω σε **`roles`** ή **`clusterroles`** μπορεί να αυξήσει τα προνόμια των ρόλων και των clusterroles ακόμη και χωρίς να έχει τα δικαιώματα ο ίδιος.
> **Φαίνεται ότι αυτή η τεχνική δούλευε πριν, αλλά σύμφωνα με τις δοκιμές μου δεν λειτουργεί πια για τον ίδιο λόγο που εξηγήθηκε στην προηγούμενη ενότητα. Δεν μπορείτε να δημιουργήσετε/τροποποιήσετε μια rolebinding γιανα δώσετε στον εαυτό σας ή σε έναν διαφορετικό SA κάποια δικαιώματααν δεν έχετε ήδη.**
> **Φαίνεται ότι αυτή η τεχνική λειτουργούσε πριν, αλλά σύμφωνα με τις δοκιμές μου δεν λειτουργεί πια για τον ίδιο λόγο που εξηγήθηκε στην προηγούμενη ενότητα. Δεν μπορείτε να δημιουργήσετε/τροποποιήσετε μια rolebinding γιανα δώσετε στον εαυτό σας ή σε έναν διαφορετικό SA κάποια προνόμιααν δεν έχετε ήδη.**
Τοδικαίωμανα δημιουργήσετε Rolebindings επιτρέπει σε έναν χρήστη να **δεσμεύσει ρόλους σε έναν λογαριασμό υπηρεσίας**. Αυτό το δικαίωμα μπορεί δυνητικά να οδηγήσει σε κλιμάκωση δικαιωμάτων επειδή **επιτρέπει στον χρήστη να δεσμεύσει δικαιώματα διαχειριστή σε έναν συμβιβασμένο λογαριασμό υπηρεσίας.**
Τοπρονόμιονα δημιουργήσετε Rolebindings επιτρέπει σε έναν χρήστη να **δεσμεύσει ρόλους σε έναν λογαριασμό υπηρεσίας**. Αυτό το προνόμιο μπορεί δυνητικά να οδηγήσει σε κλιμάκωση προνομίων επειδή **επιτρέπει στον χρήστη να δεσμεύσει προνόμια διαχειριστή σε έναν συμβιβασμένο λογαριασμό υπηρεσίας.**
## Άλλες Επιθέσεις
@@ -608,7 +608,7 @@ add: ["NET_ADMIN"]
# securityContext:
# allowPrivilegeEscalation: true
```
Δείτε τα αρχεία καταγραφής του διακομιστή μεσολάβησης:
Δείτε τα αρχεία καταγραφής του proxy:
```bash
kubectl logs app -C proxy
```
@@ -618,7 +618,7 @@ kubectl logs app -C proxy
Ένας ελεγκτής εισόδου **παρεμβαίνει σε αιτήματα προς τον διακομιστή API του Kubernetes** πριν από την αποθήκευση του αντικειμένου, αλλά **μετά την πιστοποίηση** **και την εξουσιοδότηση** του αιτήματος.
Εάν ένας επιτιθέμενος καταφέρει με κάποιο τρόπο να **εισάγει έναν Κακόβουλο Ελεγκτή Εισόδου**, θα είναι σε θέση να **τροποποιήσει ήδη πιστοποιημένα αιτήματα**. Έχοντας τη δυνατότητα να αποκτήσει προνόμια, και πιο συχνά να παραμείνει στο cluster.
Εάν ένας επιτιθέμενος καταφέρει με κάποιο τρόπο να **εισάγει έναν Κακόβουλο Ελεγκτή Εισόδου**, θα είναι σε θέση να **τροποποιήσει ήδη πιστοποιημένα αιτήματα**. Έχοντας τη δυνατότητα να αποκτήσει προνόμια, και πιο συχνά να παραμείνει στον κόμβο.
### **Απενεργοποίηση Αυτοματισμού των Tokens Λογαριασμού Υπηρεσίας**
- **Pods και Λογαριασμοί Υπηρεσίας**: Από προεπιλογή, τα pods τοποθετούν ένα διακριτικό λογαριασμού υπηρεσίας. Για να ενισχυθεί η ασφάλεια, το Kubernetes επιτρέπει την απενεργοποίηση αυτής της αυτόματης τοποθέτησης.
- **Pods και Λογαριασμοί Υπηρεσίας**: Από προεπιλογή, τα pods τοποθετούν ένα token λογαριασμού υπηρεσίας. Για την ενίσχυση της ασφάλειας, το Kubernetes επιτρέπει την απενεργοποίηση αυτής της λειτουργίας αυτοματισμού.
- **Πώς να Εφαρμόσετε**: Ορίστε `automountServiceAccountToken: false` στη διαμόρφωση των λογαριασμών υπηρεσίας ή των pods από την έκδοση 1.6 του Kubernetes.
### **Περιοριστική Ανάθεση Χρηστών σε RoleBindings/ClusterRoleBindings**
- **Επιλεκτική Συμπερίληψη**: Βεβαιωθείτε ότι μόνο οι απαραίτητοι χρήστες περιλαμβάνονται σε RoleBindings ή ClusterRoleBindings. Ελέγχετε τακτικά και αφαιρείτε μη σχετικούς χρήστες γιανα διατηρείτε σφιχτή ασφάλεια.
### **Ρόλοι Ειδικών Χώρων Ονομάτων σε Σύγκριση με Ρόλους Παγκόσμιας Κλάσης**
### **Ρόλοι Ειδικά για Namespace σε Σύγκριση με Ρόλους Cluster-Wide**
- **Ρόλοι vs. ClusterRoles**: Προτιμήστε τη χρήση Ρόλων και RoleBindings για άδειες ειδικών χώρων ονομάτων αντί για ClusterRoles και ClusterRoleBindings, που ισχύουν παγκοσμίως. Αυτή η προσέγγιση προσφέρει πιο λεπτομερή έλεγχο και περιορίζει την έκταση των αδειών.
- **Ρόλοι vs. ClusterRoles**: Προτιμήστε τη χρήση Ρόλων και RoleBindings για άδειες που σχετίζονται με namespace αντί για ClusterRoles και ClusterRoleBindings, που ισχύουν σε επίπεδο cluster. Αυτή η προσέγγιση προσφέρει πιο λεπτομερή έλεγχο και περιορίζει την έκταση των αδειών.
Λαμβάνεται από την [τεκμηρίωση του Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server):
_“Όταν δημιουργείτε ένα pod, αν δεν καθορίσετε μια υπηρεσία, ανατίθεται αυτόματα η_default_υπηρεσία στην ίδια namespace.”_
_“Όταν δημιουργείτε ένα pod, αν δεν καθορίσετε μια υπηρεσία, ανατίθεται αυτόματα η_προεπιλεγμένη_υπηρεσία στην ίδια namespace.”_
**ServiceAccount** είναι ένα αντικείμενο που διαχειρίζεται το Kubernetes και χρησιμοποιείται γιανα παρέχει μια ταυτότητα για τις διαδικασίες που εκτελούνται σε ένα pod.\
Κάθε service account έχει ένα μυστικό σχετικό με αυτό και αυτό το μυστικό περιέχει ένα bearer token. Αυτό είναι ένα JSON Web Token (JWT), μια μέθοδος για την ασφαλή αναπαράσταση αξιώσεων μεταξύ δύο μερών.
@@ -72,7 +72,7 @@ _**Hot pods είναι**_ pods που περιέχουν ένα προνομια
### Differences between `list` and `get` verbs
Με **`get`** άδειες μπορείτε να αποκτήσετε πληροφορίες συγκεκριμένων περιουσιακών στοιχείων (_`describe` επιλογή στο `kubectl`_) API:
Με **`get`** δικαιώματα μπορείτε να αποκτήσετε πληροφορίες συγκεκριμένων περιουσιακών στοιχείων (_`describe` επιλογή στο `kubectl`_) API:
```
GET /apis/apps/v1/namespaces/{namespace}/deployments/{name}
```
@@ -94,7 +94,7 @@ GET /apis/apps/v1/watch/deployments [DEPRECATED]
Ανοίγουν μια ροή σύνδεσης που σας επιστρέφει το πλήρες μανιφέστο μιας Ανάθεσης όποτε αλλάζει (ή όταν δημιουργείται μια νέα).
> [!CAUTION]
> Οι παρακάτω εντολές `kubectl` υποδεικνύουν απλώς πώς να καταγράψετε τα αντικείμενα. Εάν θέλετε να αποκτήσετε πρόσβαση στα δεδομένα, πρέπει να χρησιμοποιήσετε το `describe` αντί για το `get`.
> Οι παρακάτω εντολές `kubectl` υποδεικνύουν απλώς πώς να καταγράψετε τα αντικείμενα. Εάν θέλετε να αποκτήσετε πρόσβαση στα δεδομένα, πρέπει να χρησιμοποιήσετε το `describe` αντί για το `get`
# if kurl is still got cert Error, using -k option to solve this.
```
> [!WARNING]
> Από προεπιλογή, το pod μπορεί να **πρόσβαση** στον **kube-api server** στο όνομα τομέα **`kubernetes.default.svc`** και μπορείτε να δείτε το kube network στο **`/etc/resolv.config`** καθώς εδώ θα βρείτε τη διεύθυνση του DNS server του kubernetes (το ".1" της ίδιας περιοχής είναι το kube-api endpoint).
> Από προεπιλογή, το pod μπορεί να **πρόσβαση** στον **kube-api server** στο όνομα τομέα **`kubernetes.default.svc`** και μπορείτε να δείτε το kube network στο **`/etc/resolv.config`** καθώς εδώ θα βρείτε τη διεύθυνση του DNS server του kubernetes (το ".1" της ίδιας σειράς είναι το kube-api endpoint).
### Χρησιμοποιώντας το kubectl
@@ -121,7 +121,7 @@ alias k='kubectl --token=$TOKEN --server=https://$APISERVER --insecure-skip-tls-
```
> αν δεν υπάρχει `https://` στη διεύθυνση URL, μπορεί να λάβετε σφάλμα όπως Bad Request.
Μπορείτε να βρείτε ένα [**επίσημο cheatsheet kubectl εδώ**](https://kubernetes.io/docs/reference/kubectl/cheatsheet/). Ο στόχος των επόμενων τμημάτων είναι να παρουσιάσουν με οργανωμένο τρόπο διάφορες επιλογές γιανα καταγράψετε και να κατανοήσετε το νέο K8s που έχετε αποκτήσει πρόσβαση.
Μπορείτε να βρείτε ένα [**επίσημο cheatsheet kubectl εδώ**](https://kubernetes.io/docs/reference/kubectl/cheatsheet/). Ο στόχος των επόμενων τμημάτων είναι να παρουσιαστούν με οργανωμένο τρόπο διάφορες επιλογές γιανα καταγράψετε και να κατανοήσετε το νέο K8s που έχετε αποκτήσει πρόσβαση.
Για να βρείτε το HTTP αίτημα που στέλνει το `kubectl`, μπορείτε να χρησιμοποιήσετε την παράμετρο `-v=8`
## Αλληλεπίδραση με το cluster χωρίς τη χρήση του kubectl
Δεδομένου ότι το Kubernetes control plane εκθέτει ένα REST-ful API, μπορείτε να δημιουργήσετε χειροκίνητα HTTP αιτήματα και να τα στείλετε με άλλα εργαλεία, όπως το **curl** ή το **wget**.
Βλέποντας ότι το Kubernetes control plane εκθέτει ένα REST-ful API, μπορείτε να δημιουργήσετε χειροκίνητα HTTP αιτήματα και να τα στείλετε με άλλα εργαλεία, όπως το **curl** ή το **wget**.
### Διαφυγή από το pod
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.