nessie

Απομακρυσμένοι εκτελεστές

Δώστε σε έναν πράκτορα έναν πραγματικό υπολογιστή για δουλειά, σε Linux, macOS ή Windows.

Τι είναι ένας απομακρυσμένος εκτελεστής

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

Ένας εκτελεστής είναι ένα μικρό daemon που εγκαθιστάτε σε έναν υπολογιστή που ελέγχετε. Συνδέεται προς τα έξω με το δικό σας Nessie, αποδεικνύει ποιο μηχάνημα είναι με ένα κλειδί που δεν φεύγει ποτέ από τον υπολογιστή και στη συνέχεια προσφέρει ένα σταθερό, ονομασμένο σύνολο λειτουργιών, τίποτα άλλο. Η δουλειά φτάνει ως μεμονωμένες υπογεγραμμένες εντολές, και τα αποτελέσματα επιστρέφουν ως περιορισμένες, δομημένες αποδείξεις. Το μηχάνημα δεν δέχεται ποτέ εισερχόμενη σύνδεση από το Nessie.

Αξίζει να είστε ακριβείς για το τι δεν είναι ένας εκτελεστής, επειδή τα περισσότερα εργαλεία απομακρυσμένης πρόσβασης είναι κάτι από αυτά, και ο εκτελεστής σκόπιμα δεν είναι κανένα. Δεν υπάρχει SSH, δεν υπάρχει γενικό απομακρυσμένο κέλυφος, δεν υπάρχει σύνδεση σε πολυπλέκτη τερματικού που έχετε ήδη ανοιχτό, καμία τυπική είσοδος από το cloud και κανένας γενικός διακομιστής μεσολάβησης για το τοπικό δίκτυο. Δεν είναι διακομιστής MCP ούτε container ή περιβάλλον εκτέλεσης στο cloud. Το Nessie έχει ήδη τέτοια, και είναι διαφορετικό πράγμα. Ο εκτελεστής είναι ένα τελικό σημείο με συγκεκριμένα δικαιώματα και κλειστό κατάλογο λειτουργιών, και αυτός ο κατάλογος είναι ολόκληρη η επιφάνειά του.

Σε ποιον ανήκει ένας εκτελεστής

Κάθε εκτελεστής δημιουργείται με ακριβώς ένα πεδίο, και το πεδίο δεν αλλάζει μετά. Καθορίζει ποιος μπορεί να τον καλέσει και ποιος μπορεί να τον διαχειριστεί.

ΠεδίοΠοιος μπορεί να τον καλέσειΠοιος διαχειρίζεται την πρόσβαση
ΙδιωτικόΤο άτομο που ζητά την εκτέλεση και ο ακριβής πράκτορας που καλείται πρέπει και τα δύο να είναι ονομασμένοι αποδέκτες. Ο ένας από τους δύο δεν αρκεί.Ένας ανθρώπινος διαχειριστής που έχει οριστεί. Οι πράκτορες μπορούν να χρησιμοποιούν έναν ιδιωτικό εκτελεστή, αλλά ποτέ να τον διαχειρίζονται.
ΈργουΈνα άτομο με δικαίωμα στο ακριβές αυτό έργο, και μόνο από εκτέλεση μέσα σε αυτό το έργο.Διαχειριστής του οργανισμού, ή ιδιοκτήτης ή διαχειριστής του έργου.
ΟργανισμούΈνα άτομο με δικαίωμα στον οργανισμό.Διαχειριστής του οργανισμού.

Ένας ιδιωτικός εκτελεστής πρέπει πάντα να έχει τουλάχιστον έναν ενεργό ανθρώπινο διαχειριστή. Η άμεση αφαίρεση του τελευταίου αποτυγχάνει· αν μια διαδικασία αποχώρησης θα άφηνε κανέναν, ο εκτελεστής σταματά να δέχεται νέα εργασία, ολοκληρώνει ό,τι έχει ήδη και ανακαλεί τον εαυτό του. Ο ιδιοκτήτης του οργανισμού έχει διαδρομή ανάκλησης έκτακτης ανάγκης (break-glass) μόνο για ανάκληση, που τερματίζει έναν εκτελεστή που δεν διαχειρίζεται κανονικά, χωρίς να του εμφανίζει τη λίστα των ιδιωτικών μελών του, τις συνεδρίες ή το περιεχόμενό του. Η ιδιωτική πρόσβαση δεν μεταβιβάζεται ποτέ σιωπηλά σε κάποιον άλλον.

Τι μπορεί πραγματικά να κάνει ένας πράκτορας με έναν εκτελεστή

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

ΛειτουργίαΤι κάνειVM guest
file.list, file.readΕμφανίζει και διαβάζει αρχεία κάτω από τον ένα ριζικό φάκελο εργασίας που επιλέχθηκε κατά τη σύζευξη.Όχι
file.writeΓράφει σε ένα αντίγραφο copy-on-write του χώρου εργασίας. Ποτέ δεν ανοίγει τον πραγματικό ριζικό φάκελο για εγγραφή.Όχι
workspace.reviewΑναφέρει τι άλλαξε το προσχέδιο: έως 100 σχετικές διαδρομές με είδος και μέγεθος σε bytes, συν ένα αποτύπωμα (digest) του manifest. Δεν περιέχει περιεχόμενα αρχείων.Όχι
sandbox.stopΤερματίζει τη συνεδρία που ανήκει στην εκτέλεση.Όχι
command.runΕκτελεί μία εντολή ως διάνυσμα ορισμάτων χωρίς κέλυφος, μέσα σε guest χωρίς έξοδο δικτύου. Δεν υπάρχει πουθενά σε αυτή τη διαδρομή συμβολοσειρά κελύφους.Ναι
browser.open, browser.observe, browser.actΟδηγεί ένα πρόγραμμα περιήγησης μέσα στο guest, έναντι μιας λίστας προελεύσεων που έχει ρυθμίσει ο υπολογιστής. Η παρατήρηση επιστρέφει ένα περιορισμένο δέντρο προσβασιμότητας και προαιρετικά μια μικρή εικόνα. Οι ενέργειες είναι πλοήγηση, κλικ, πληκτρολόγηση, πάτημα πλήκτρου και κύλιση, πάνω σε έναν κόμβο που ο πράκτορας μόλις παρατήρησε, ποτέ σε selector, συντεταγμένη ή σενάριο.Ναι
coding.launch, coding.observeΞεκινά μια διαχειριζόμενη συνεδρία Codex στο guest και διαβάζει πίσω τυποποιημένη κατάσταση κύκλου ζωής. Δεν υπάρχει σύνδεση τερματικού και κανένα κανάλι εντολών: ο πράκτορας μαθαίνει αν η συνεδρία τρέχει, όχι τι εμφανίζεται στην οθόνη της.Ναι
workspace.promoteΕφαρμόζει ένα ελεγμένο προσχέδιο στον πραγματικό χώρο εργασίας. Είναι η μόνη λειτουργία που γράφει στον υπολογιστή, και σκόπιμα δεν προσφέρεται καθόλου στα μοντέλα.Όχι

Οι λειτουργίες που δεν χρειάζονται guest αποτελούν το πακέτο χώρου εργασίας. Ένας υπολογιστής που δεν μπορεί να ξεκινήσει guest δεν είναι χαλασμένος εκτελεστής: ολοκληρώνει κανονικά τη σύζευξη, αναφέρει το backend του sandbox ως none και διαφημίζει μόνο το πακέτο χώρου εργασίας. Σε αυτή την κατάσταση καταλήγει μια έκδοση των Windows χωρίς Hyper-V, ή ένα μηχάνημα Linux του οποίου ο χρήστης δεν μπορεί να χρησιμοποιήσει το /dev/kvm, και η διεπαφή το ονομάζει αντί να αποτύχει χωρίς εξήγηση.

Η εργασία με πρόγραμμα περιήγησης δεν ξεκινά ποτέ από πρωτοβουλία του πράκτορα. Η συνηθισμένη διαδρομή δέσμευσης μίας λειτουργίας αρνείται ρητά τα browser.open και browser.observe. Μια εκτέλεση προγράμματος περιήγησης ξεκινά από άτομο, από ένα κανάλι, ως ένα πακέτο τεσσάρων λειτουργιών σε νέα εκτέλεση, και δεν μπορεί να προστεθεί άλλη δέσμευση σε αυτήν αργότερα. Οι διαχειριζόμενες συνεδρίες κώδικα λειτουργούν με τον ίδιο τρόπο.

Υπάρχουν δύο ακόμη ομάδες στον κώδικα, που σκόπιμα δεν είναι διαθέσιμες. Οι λειτουργίες για οδήγηση μιας καρτέλας Chrome στην οποία είστε ήδη συνδεδεμένοι έχουν πλήρη τοπική υλοποίηση και μια επέκταση native messaging, όμως το επίπεδο ελέγχου αρνείται να τις διαφημίσει έως ότου ο διακομιστής μπορεί να αποδείξει ότι η αρχική συνομιλία ήταν ιδιωτική και να καταγράψει ποιος αποκάλυψε τι. Η βάση μένει ανενεργή επίτηδες, και η επέκταση δεν διανέμεται σε κανέναν από τους δύο εγκαταστάτες. Επιπλέον, αρκετές λειτουργίες κώδικα, δηλαδή οι attach, prompt, interrupt και close, αναφέρονται στο σχήμα αλλά δεν έχουν υλοποίηση, γι' αυτό δεν μπορούν να χορηγηθούν.

Πώς λειτουργεί

Η σύνδεση είναι πάντα εξερχόμενη

Το daemon κάνει εξερχόμενες συνδέσεις HTTPS και WSS μόνο προς το API του Nessie σας και σε τίποτα άλλο. Το Nessie δεν συνδέεται ποτέ με φορητό υπολογιστή, δεν κρατά διεύθυνση για αυτόν και δεν αντιμετωπίζει κανένα τελικό σημείο του καταλόγου ως μεταφορά προς μηχάνημα. Γι' αυτό ένας εκτελεστής λειτουργεί από οικιακό δίκτυο, πίσω από NAT, σε εταιρικό VPN, χωρίς προώθηση θύρας και χωρίς κανόνα εισερχόμενου τείχους προστασίας. Γι' αυτό και η διακοπή του daemon είναι πλήρης και άμεση αποσύνδεση.

Η διεύθυνση API πρέπει να είναι HTTPS. Η μόνη εξαίρεση είναι μια διεύθυνση loopback για άτομα που τρέχουν το Nessie στο δικό τους μηχάνημα, μέσω δικής της μεταβλητής περιβάλλοντος. Καμία συνηθισμένη επιλογή δεν μετατρέπει μια παραγωγική διεύθυνση σε απλό HTTP.

Η σύζευξη αποδεικνύει ένα μηχάνημα, και ένα άτομο την επιβεβαιώνει

Η σύζευξη είναι αμφίπλευρη απόδειξη. Ένα εξουσιοδοτημένο άτομο δημιουργεί τον εκτελεστή στο Nessie με το πεδίο του, και το Nessie εκδίδει μια εγγραφή: μια τυχαία πρόκληση 256 bit, της οποίας αποθηκεύεται μόνο ένα επαληθευτικό SHA-256. Η εγγραφή ισχύει για δέκα λεπτά και χρησιμοποιείται μία φορά.

Στο μηχάνημα, το daemon δημιουργεί ένα ζεύγος κλειδιών Ed25519, το αποθηκεύει σε αποθήκευση προστατευμένη από το λειτουργικό σύστημα και διαθέσιμη μόνο στον ιδιοκτήτη, και γράφει στον δίσκο το ακριβές υπογεγραμμένο αίτημα πριν κάνει οποιαδήποτε κλήση δικτύου. Έτσι, μια χαμένη απόκριση επαναλαμβάνεται με το ίδιο προετοιμασμένο κλειδί και δεν συζεύγνυται σιωπηλά δεύτερη φορά. Στη συνέχεια υποβάλλει το αναγνωριστικό της εγγραφής, την πρόκληση, το δημόσιο κλειδί του και μια υπογραφή απόδειξης. Το Nessie αποθηκεύει το δημόσιο κλειδί και το αποτύπωμά του. Ποτέ δεν αποθηκεύει το ιδιωτικό κλειδί.

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

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

Το descriptor είναι η υπογεγραμμένη δήλωση του μηχανήματος για τον εαυτό του

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

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

Να είστε σαφείς για το τι αποδεικνύει η υπογραφή. Ένας descriptor υπογεγραμμένος από το κλειδί ενός συζευγμένου εκτελεστή αποδεικνύει ότι αυτό το κλειδί έκανε τη δήλωση. Δεν αποδεικνύει ότι ο υπολογιστής είναι ανέπαφος, και η διεπαφή υποχρεούται να το δηλώνει.

Αποστολή: υποψήφιο, δέσμευση, εντολή, απόδειξη

Ένας πράκτορας δεν ονομάζει ποτέ εκτελεστή. Πριν μια εκτέλεση μπορέσει να τον χρησιμοποιήσει, το Nessie μετατρέπει τη λογική λειτουργία σε μια αδιαφανή, βραχύβια υποψήφια διαθεσιμότητα. Η απάντηση δεν περιέχει αναγνωριστικό εκτελεστή. Η βάση δεδομένων κρατά μόνο ένα αποτύπωμα του χειριστή, μαζί με το ποιος και για ποιο πράγμα επιλύθηκε. Τα μοντέλα και οι πελάτες λαμβάνουν έναν χειριστή, όχι ένα μηχάνημα προς επιλογή.

Η διαθεσιμότητα υλοποιείται από έναν μόνο επιλυτή, που χρησιμοποιείται πανομοιότυπα από το API, τον worker, τη διεπαφή και τον βοηθό:

available(operation, human, agent, immutableRunContext) =
  human may discover executor
  ∩ exact executor-agent-operation grant allows operation
  ∩ stable logical tool grant allows operation
  ∩ scope matches immutable run context
  ∩ executor is online and descriptor is approved
  ∩ local policy permits operation

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

Η ίδια η εντολή ταξιδεύει μέσω της κανονικής ουράς εργασιών του Nessie και του κύκλου ζωής κλήσεων εργαλείων, αντί για δική της δεύτερη. Το daemon ζητά εργασία από το πιστοποιημένο κανάλι ελέγχου του· ποτέ δεν του την στέλνουν. Μια εντολή περνά από τέσσερις αποδείξεις και καμία άλλη:

leased → accepted → started → result-acknowledged

Κάθε πλαίσιο δένει το αναγνωριστικό της εντολής, την προέλευση της εκτέλεσης, τη μέτρηση της δέσμευσης, την αναθεώρηση της δυνατότητας, μια λήξη, ένα κλειδί ιδεμποτεντότητας και τα digest των ορισμάτων και του φορτίου. Το daemon απορρίπτει μια αναντιστοιχία, μια παρωχημένη πολιτική, μια επανάληψη ή δεύτερο αποτέλεσμα για εντολή που έχει ήδη ολοκληρωθεί. Τα ορίσματα και τα τελικά αποτελέσματα κρυπτογραφούνται με AES-256-GCM κατά την αποθήκευση. Η βάση δεδομένων κρατά περιορισμένο κρυπτογραφημένο κείμενο και κανονικοποιημένα digest, όχι περιεχόμενο.

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

Όριο εμπιστοσύνης

ΥποκείμενοΜπορείΔεν μπορεί
ΆτομοΝα συζεύξει έναν εκτελεστή, να τον διαχειριστεί όταν έχει δικαίωμα, να επιβεβαιώσει αλλαγές πρόσβασης και πολιτικής.Να διευρύνει μια πολιτική που το ίδιο το μηχάνημα απαγορεύει, ή να ενεργήσει χωρίς τρέχον δικαίωμα.
Πράκτορας, συμπεριλαμβανομένου του προσωπικού βοηθούΝα καλέσει μια λειτουργία που ήδη του είναι διαθέσιμη· να προετοιμάσει μια προτεινόμενη αλλαγή πρόσβασης για το άτομο που ζήτησε.Να διαχειριστεί πρόσβαση, να εγκρίνει τον εαυτό του, να επιλέξει μηχάνημα, να αλλάξει τοπική πολιτική ή να εφαρμόσει αλλαγή που ο ίδιος προετοίμασε.
Επίπεδο ελέγχου του NessieΝα επιλύει τη διαθεσιμότητα, να δεσμεύει μια εκτέλεση, να παραδίδει εντολές, να κρατά καταγραφές ελέγχου χωρίς ευαίσθητα στοιχεία.Να συνδεθεί με το μηχάνημα, να διευρύνει την τοπική πολιτική, να φτάσει σε διαπιστευτήρια του υπολογιστή ή να αντιμετωπίσει το κείμενο τερματικού ως εξουσιοδότηση ή ως αποτέλεσμα.
Daemon του εκτελεστήΝα επιβάλλει την τοπική πολιτική, να συνδέεται προς τα έξω, να εκτελεί το guest και την πύλη, να επιβεβαιώνει εντολές.Να επεκτείνει το δικό του πεδίο, να δεχτεί παρωχημένη ή επαναλαμβανόμενη εργασία, να εκθέσει άμεσα τον χώρο εργασίας ή τα διαπιστευτήρια του υπολογιστή, ή να στείλει ακατέργαστα τοπικά δεδομένα στο ίχνος ελέγχου.
Το guest VM και τα εργαλεία μέσα τουΝα εργάζονται σε sandbox copy-on-write, φτάνοντας στο δίκτυο μόνο μέσω της πύλης.Να φτάσουν σε αρχεία του υπολογιστή, σε διαπιστευτήρια, σε άμεσο δίκτυο ή DNS, ή να εφαρμόσουν αλλαγή του υπολογιστή.

Εγκατάσταση και σύζευξη εκτελεστή

Εγκαταστήστε το CLI για Mac με Homebrew, τις εφαρμογές για Mac με casks του Homebrew, το CLI για Linux μέσω APT ή DNF, ή τον εκτελεστή για Windows μέσω WinGet. Κάθε συζευγμένη ομάδα έχει ξεχωριστά δικαιώματα, αποθηκευμένα στον υπολογιστή. Το Nessie ελέγχει την πρόσβαση εντός της ομάδας, αλλά δεν μπορεί να αλλάξει τοπικούς πόρους.

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

Πόσο έχει αποδειχθεί κάθε πλατφόρμα

Η κατάσταση των τριών sandbox guest διαφέρει, και η διαφορά είναι ουσιαστική. Το macOS είναι το backend με λειτουργική, δοκιμασμένη διαδρομή guest. Τα backends Firecracker σε Linux και Hyper-V σε Windows είναι υλοποιημένα και καλύπτονται από δοκιμές στην πλευρά του υπολογιστή (η ακολουθία εκκίνησης, τα αρχεία δίσκου, τα κανάλια ελέγχου και εξόδου, το πρωτόκολλο προσχεδίων). Ωστόσο, κανένα guest δεν έχει ακόμη εκκινηθεί σε πραγματικό υλικό στη συνεχή ενοποίηση του έργου, επειδή αυτό απαιτεί μηχάνημα με KVM ή Hyper-V, και οι εργασίες που θα το αποδείκνυαν δεν είχαν ποτέ τέτοιο μηχάνημα. Το πακέτο χώρου εργασίας, που δεν χρειάζεται guest, δοκιμάζεται από άκρο σε άκρο στα Windows έναντι πραγματικού βρόχου ελέγχου. Να θεωρείτε τις λειτουργίες με guest σε Linux και Windows ως μη αποδεδειγμένες, έως ότου τις αποδείξετε στο δικό σας υλικό. Η οθόνη σύζευξης στο Nessie λέει το ίδιο με δικά της λόγια.

Ασφάλεια και περιορισμός

Ένας ριζικός φάκελος εργασίας, και η διαδρομή του μένει στον υπολογιστή

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

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

Οι εγγραφές γίνονται σε αντίγραφο, και μόνο ένα άτομο τις εφαρμόζει

Ένας πράκτορας δεν γράφει ποτέ στα αρχεία σας. Η file.write δημιουργεί ένα περιορισμένο δέντρο copy-on-write κάτω από τον φάκελο κατάστασης του ίδιου του daemon, συνδεδεμένο με την εκτέλεση. Οι μεταγενέστερες αναγνώσεις και καταγραφές εκείνης της εκτέλεσης βλέπουν το προσχέδιο. Η εργασία στο guest, συμπεριλαμβανομένων των συνεδριών κώδικα, χρησιμοποιεί τον ίδιο χώρο προσωρινής αποθήκευσης copy-on-write.

Η εφαρμογή ενός προσχεδίου στον πραγματικό χώρο εργασίας είναι μία ενέργεια, η workspace.promote, και είναι η μοναδική εγγραφή στον υπολογιστή μέσα στο σύστημα. Δεν έχει καθόλου σχήμα για μοντέλα: κανένας πράκτορας, κανένας βοηθός και καμία διαδρομή που δίνει ο καλών δεν μπορεί να μετατρέψει ένα προσχέδιο σε εγγραφή στον υπολογιστή. Αντίθετα, ένα άτομο ανοίγει τα Τα ελεγμένα προσχέδιά σας, πατά Έλεγχος εφαρμογής και επιβεβαιώνει με τον τρέχοντα κωδικό του. Ο διακομιστής τότε ελέγχει ξανά το επιβεβαιωμένο αποτύπωμα ελέγχου, το αποτύπωμα του manifest, την εκτέλεση προέλευσης, τον χρήστη και τον πράκτορα, την αναθεώρηση εξουσιοδότησης, τη χορήγηση της λειτουργίας και την ενεργή τοπική πολιτική, πριν δημιουργήσει την εντολή. Στο μηχάνημα, το daemon ξαναχτίζει μόνο του το manifest και αρνείται ένα αποτύπωμα που έχει αλλάξει, ώστε μια επεξεργασία μετά τον έλεγχο να μην περάσει με την έγκριση του ελέγχου.

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

Το guest δεν έχει δίκτυο, και η έξοδος επιβάλλεται

Όταν μια λειτουργία χρειάζεται guest, είναι ένα μικρό VM Linux ανά συνεδρία, χωρίς αρχικό φάκελο του χρήστη, χωρίς υποδοχή Docker, χωρίς SSH agent, χωρίς κληρονομημένο περιβάλλον και χωρίς άλλη τοποθέτηση του υπολογιστή εκτός από το κοινό μερίδιο του χώρου εργασίας. Η εκτελέσιμη τοποθέτηση του χρόνου εκτέλεσης είναι μόνο για ανάγνωση. Η εγγράψιμη τοποθέτηση του χώρου εργασίας απαγορεύει την εκτέλεση, ώστε ό,τι τρέχει να προέρχεται από το επαληθευμένο φορτίο του χρόνου εκτέλεσης και όχι από κάτι που έγραψε πράκτορας. Το guest υποβαθμίζει την ταυτότητά του σε μη προνομιούχο χρήστη πριν ανοίξει οποιαδήποτε υποδοχή, και ένα κοινόχρηστο μερίδιο που ανήκει στον root αποτυγχάνει την εκκίνηση, αντί να αφήσει ένα προνομιούχο φορτίο να τρέχει.

Το σημαντικότερο: το guest δεν έχει διεπαφή δικτύου. Σε Linux, η ακολουθία εκκίνησης σκόπιμα δεν ρυθμίζει καμία και δεν δημιουργείται συσκευή TAP. Σε Windows, η εικονική κάρτα δικτύου που προσθέτει το Hyper-V από προεπιλογή αφαιρείται κατά τη ρύθμιση. Η μόνη διαδρομή του guest προς τα έξω είναι ένας τοπικός διαμεσολαβητής loopback μέσα του, που διοχετεύεται μέσω εικονικής υποδοχής προς μια γέφυρα στον υπολογιστή. Η γέφυρα παραδίδει τα bytes στην πύλη του ίδιου του daemon, μια τοπική υποδοχή ακρόασης μόνο για τον ιδιοκτήτη, χωρίς ακροατή TCP και χωρίς γενική λειτουργία προώθησης. Εκεί επιβάλλεται η πολιτική HTTP, CONNECT, WebSocket, ανακατεύθυνσης, προέλευσης, λήψης και αποστολής, με τον υπάρχοντα μηχανισμό pinned-fetch του Nessie αντί για δεύτερη υλοποίηση των ίδιων κανόνων. Δεν υπάρχει γέφυρα NAT και δεν υπάρχει άμεσος επιλυτής DNS. Εναλλακτικό DNS, ακατέργαστο TCP, QUIC και παράκαμψη διαμεσολαβητή απορρίπτονται όλα.

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

Διαπιστευτήρια

Κανένα διαπιστευτήριο του υπολογιστή δεν τοποθετείται ποτέ σε guest. Ούτε το keychain, ούτε το ~/.codex ή το ~/.claude, ούτε ένα γενικό διακριτικό CLI, ούτε μια μεταβλητή περιβάλλοντος με κλειδί API. Η μόνη υποστηριζόμενη σύνδεση για μια διαχειριζόμενη συνεδρία κώδικα είναι ένα αρχείο ελέγχου ταυτότητας ιδιοκτήτη, του οποίου τα περιεχόμενα διαβάζει μόνο ο κατασκευαστής initrd που ελέγχει ο ιδιοκτήτης. Ποτέ δεν τα διαβάζει το Nessie, ούτε το descriptor, ούτε ένα αρχείο καταγραφής ή όρισμα εντολής. Το αρχείο μεταφέρεται μία φορά σε ιδιωτικό σπίτι μέσα στο guest, που καταστρέφεται μαζί με το VM. Αυτό το guest μπορεί να φτάσει ακριβώς σε μία προέλευση.

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

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

Τι χορηγεί ένας διαχειριστής και πώς την ανακαλεί

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

Η πρόσβαση των πρακτόρων και η κοινοποίηση τίθενται σε ισχύ αμέσως, στη σελίδα, χωρίς συνέχεια έγκρισης, μέτρηση κωδικού ή νέο βήμα ταυτοποίησης. Στην καρτέλα Πράκτορες του εκτελεστή, ένας διαχειριστής ενεργοποιεί ή απενεργοποιεί απευθείας την πρόσβαση ενός πράκτορα στο μηχάνημα. Στην Κοινοποίηση δίνει σε ένα άτομο δικαίωμα «Μπορεί να χρησιμοποιεί» ή «Διαχειριστής», ή επεκτείνει τη χρήση σε ένα έργο ή σε όλους στην τρέχουσα ομάδα, με τον ίδιο τρόπο. Μόνο στη δική σας συνομιλία με τον προσωπικό βοηθό (ποτέ σε κοινό κανάλι, προγραμματισμένη εργασία ή εκτέλεση άλλου πράκτορα) ο βοηθός μπορεί αντί αυτού να προετοιμάσει αλλαγή πρόσβασης πράκτορα ή ανάθεσης. Αυτή δημοσιεύει κάρτα επιβεβαίωσης στη συνομιλία, και τίποτα δεν αλλάζει έως ότου πατήσετε «Να επιτραπεί η πρόσβαση». Το κείμενο της συνομιλίας δεν αποτελεί ποτέ επιβεβαίωση.

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

Ένας εκτελεστής περνά από ένα μικρό, σαφές σύνολο καταστάσεων:

pending_pairing → online ↔ offline
        │             ↓
        └──────────→ draining → revoked
                         ↓
                       error

Το μενού Υπολογιστής στην κεφαλίδα είναι το σημείο όπου ένας διαχειριστής προετοιμάζει κάθε αλλαγή κύκλου ζωής: παύση, συνέχιση μετά την παύση, αποσύνδεση ή διαγραφή. Η παύση αφήνει τον εκτελεστή συνδεδεμένο, αλλά σταματά να δέχεται εντολές. Η αποσύνδεση ακυρώνει τα πιστοποιητικά πελάτη του και κάθε εκκρεμή υποψήφια διαθεσιμότητα, και δεν μπορεί να αναιρεθεί. Ένας αποσυνδεδεμένος εκτελεστής συζεύγνυται ξανά ως νέος. Η διαγραφή κάνει το ίδιο και αφαιρεί επιπλέον τον εκτελεστή από τη λίστα. Σε αντίθεση με την αποσύνδεση, προσφέρεται όποια και αν είναι η κατάσταση του εκτελεστή, και με εκκρεμή σύζευξη ή ήδη αποσυνδεδεμένο, επειδή είναι ο μόνος τρόπος να φύγει κάτι από τη λίστα. Η εκκένωση, δηλαδή η ολοκλήρωση της εργασίας που ήδη έχει πριν σταματήσει να δέχεται περισσότερη, είναι πραγματική τρίτη κατάσταση στο πρωτόκολλο. Η διεπαφή μπορεί να δείξει υπολογιστή σε αυτήν, όμως τίποτα εδώ δεν την ξεκινά: μόνο μια άμεση κλήση στο API. Κάθε επιβεβαιωμένη αλλαγή πρόσβασης, έλεγχος descriptor και μετάβαση κύκλου ζωής, συμπεριλαμβανομένης της εκκένωσης, προχωρά επίσης τον αριθμό σύνδεσης του daemon. Έτσι, η επόμενη έρευνα ελέγχου του, το πολύ ένα δευτερόλεπτο αργότερα, αποτυγχάνει με ασφάλεια και σταματά κάθε ενεργό guest πριν μπορέσει να επανασυνδεθεί. Η ανάκληση δεν είναι αίτημα που το μηχάνημα μπορεί να αγνοήσει.

Λειτουργία ενός εκτελεστή

Έλεγχος ότι λειτουργεί σωστά

Η δική της απάντηση του Nessie είναι η ένδειξη ζωής. Το daemon υπογράφει ένα heartbeat, και ένας εκτελεστής του οποίου η τελευταία αυθεντικοποιημένη δραστηριότητα είναι παλαιότερη των εξήντα δευτερολέπτων σημειώνεται μόνιμα ως εκτός σύνδεσης, πριν μπορέσει να εμφανιστεί, να επιλεγεί ή να του σταλεί εργασία. Ένας εκτελεστής που εμφανίζεται ως συνδεδεμένος έχει αποδείξει τον εαυτό του μέσα στο τελευταίο λεπτό.

Στο μηχάνημα δεν υπάρχει τελικό σημείο υγείας. Το daemon δεν ακούει σε καμία θύρα που προορίζεται για διαχειριστή, και αυτό είναι σκόπιμο. Σε macOS και Linux, ρωτήστε απευθείας το CLI:

nessie-executor status                # every paired executor, plus linger state
nessie-executor status <executorId>
systemctl --user status nessie-executor@<executorId>

Σε macOS, το status αναφέρει τον πράκτορα launchd κάθε ομάδας. Η εντολή systemctl ισχύει μόνο για Linux. Σε Windows, το εικονίδιο στο tray δίνει την πρώτη ματιά, το μενού του αναφέρει την αιτία και το αρχείο καταγραφής της υπηρεσίας περιέχει τις λεπτομέρειες. Και στις δύο πλατφόρμες, η καρτέλα Επισκόπηση του εκτελεστή στο Nessie δείχνει τα εγκεκριμένα προφίλ του, το όριο δεδομένων του, πότε εμφανίστηκε τελευταία φορά και τυχόν εκκρεμή πρόταση τοπικής πολιτικής που περιμένει έλεγχο.

Αρχεία καταγραφής

ΠλατφόρμαΠού
Linuxjournalctl --user -u nessie-executor@<executorId>. Το daemon δεν κρατά δικό του αρχείο καταγραφής.
Windows%ProgramData%\Nessie Executor\logs\service.log, το οποίο ανοίγει το Άνοιγμα φακέλου αρχείων καταγραφής του tray

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

Το CLI για Mac γράφει το αρχείο καταγραφής υπηρεσίας κάθε ομάδας στο ~/Library/Logs/NessieExecutor/<executorId>.log.

Ενημέρωση

Ενημερώστε το CLI μέσω Homebrew, APT ή DNF, και έπειτα επανεκκινήστε την υπηρεσία κάθε ομάδας με disable και μετά enable. Το WinGet ενημερώνει τον εκτελεστή για Windows. Οι άμεσοι εγκαταστάτες του Nessie Desktop προσφέρουν υπογεγραμμένες ενημερώσεις μέσα στην εφαρμογή· οι εγκαταστάσεις MSI και Debian χρησιμοποιούν τον διαχειριστή πακέτων τους. Οι συζεύξεις και τα τοπικά δικαιώματα επιβιώνουν των ενημερώσεων.

Διακοπή και αφαίρεση

Η διακοπή είναι ομαλή διαδρομή που διαχειρίζεται το ίδιο το daemon, όχι θανάτωση. Λαμβάνει σήμα τερματισμού, σταματά κάθε συνεδρία guest, απελευθερώνει τη μίσθωσή του και τερματίζεται. Σε Linux, η μονάδα περιμένει δεκαπέντε δευτερόλεπτα για προϋπολογισμό τερματισμού δέκα δευτερολέπτων, και σκόπιμα ποτέ δεν κλιμακώνει σε μη αναχαιτίσιμο kill. Ένα daemon που σκοτώνεται στη μέση του τερματισμού αφήνει πίσω του ένα μικρό VM και μια επικάλυψη χώρου εργασίας χωρίς διεργασία που να τα καθαρίσει. Μια διακοπή που κολλάει φαίνεται έτσι στο systemctl --user status, αντί να είναι σιωπηλή, και η κλιμάκωση είναι ρητή ανθρώπινη απόφαση.

Για να αφαιρέσετε το πακέτο Linux:

nessie-executor disable <executorId>   # stops and disables the service
sudo apt remove nessie-executor
loginctl disable-linger                # only if your user manager should stop running at boot too

Σε Windows, το msiexec /x σταματά και αφαιρεί την υπηρεσία, τις καταχωρίσεις μητρώου της και την καταχώριση εκκίνησης του tray. Και στις δύο πλατφόρμες, η συζευγμένη κατάσταση μένει σκόπιμα πίσω: το ~/.local/state/nessie-executor/ σε Linux και το %ProgramData%\Nessie Executor σε Windows. Μια σύζευξη είναι ένα κλειδί μηχανήματος και μια υπογεγραμμένη αναθεώρηση πολιτικής, και η απεγκατάσταση ενός προγράμματος δεν είναι αίτημα να τα καταστρέψει. Η επανεγκατάσταση τα βρίσκει εκεί που ήταν. Διαγράψτε τον φάκελο με το χέρι για να ξεχάσετε μια σύζευξη, και ανακαλέστε τον εκτελεστή στο Nessie για να τον τερματίσετε και από την άλλη πλευρά.

Το tray των Windows και η συντροφική εφαρμογή για επιφάνεια εργασίας προσφέρουν και τα δύο το Ξέχασε τη σύζευξη σε αυτόν τον υπολογιστή ως πρωταρχική ενέργεια. Σταματά το τοπικό daemon, αφαιρεί το κλειδί του μηχανήματος και την επιλογή φακέλου, και διαγράφει μόνιμα τα τοπικά αντίγραφα προσχεδίων μετά από μία εγγενή επιβεβαίωση. Αφήνει τον εκτελεστή και το ιστορικό ελέγχου του στον διακομιστή, για να τα κρατήσει ή να τα ανακαλέσει ένας ιδιοκτήτης.

Συνηθισμένες αστοχίες

ΣύμπτωμαΤι σημαίνει
Ο εκτελεστής συζεύγνυται, αλλά προσφέρει μόνο λειτουργίες αρχείωνΟ υπολογιστής ανέφερε ότι δεν υπάρχει χρησιμοποιήσιμο backend sandbox. Σε Linux, ελέγξτε αν μπορείτε να διαβάζετε και να γράφετε στο /dev/kvm και αν ανήκετε στην ομάδα kvm. Αποσυνδεθείτε και ξανασυνδεθείτε αφού προσθέσετε τον εαυτό σας. Σε Windows, η έκδοση δεν έχει Hyper-V. Είναι θέμα έκδοσης, όχι ρύθμισης.
Τα χειριστήρια του εκτελεστή λείπουν εντελώςΗ έκδοση δεν είναι επαληθευμένα από τον αναμενόμενο εκδότη. Σε Linux, ο χρόνος εκτέλεσης πρέπει να ανήκει στον root, χωρίς δικαίωμα εγγραφής για ομάδα ή για όλους. Σε Windows και macOS, η υπογραφή πρέπει να ταιριάζει με τον εκδότη ή την ομάδα που έχει καρφωθεί στην έκδοση. Καθένα από αυτά αρνείται με λόγια και ονομάζει τη λύση, αντί να κρύβει τα χειριστήρια.
Η υπηρεσία τρέχει, αλλά δεν ξεκινά daemon και αρνείται κάθε εντολήΚάτι στην εγκατάσταση αντικαταστάθηκε μετά τη συσκευασία. Αυτό είναι η προβλεπόμενη συμπεριφορά: μια παραποιημένη εγκατάσταση απαντά με την αιτία, αντί να εξαφανιστεί, επειδή μια σταματημένη υπηρεσία θα έκανε το tray να δείχνει λάθος λύση.
Μια εκτέλεση τελειώνει με άγνωστο αποτέλεσμαΧάθηκε μια τελική επιβεβαίωση. Το Nessie δεν αναφέρει αποτέλεσμα που δεν έλαβε: η εντολή σημειώνεται ως άγνωστη, η εκτέλεση ακολουθεί τη διαδρομή ανάκτησης και η παρενέργεια δεν επαναλαμβάνεται. Μια καθυστερημένη απόδειξη από το daemon μπορεί ακόμη να το λύσει.
Μια λειτουργία που δούλευε χθες αρνείται σήμεραΜια πύλη άλλαξε μεταξύ δέσμευσης και αποστολής, και οι έλεγχοι επαναλαμβάνονται σε κάθε βήμα: μια χορήγηση που αποσύρθηκε, μια αναθεώρηση descriptor που περιμένει έλεγχο, μια στενότερη τοπική πολιτική, ένα πεδίο που δεν ταιριάζει πια με την εκτέλεση, ή μια ανάκληση. Η άρνηση λέει ποια από αυτές.
Ένας πράκτορας ζητά πρόγραμμα περιήγησης και του λένε ότι δεν μπορείΗ εργασία με πρόγραμμα περιήγησης και κώδικα ξεκινά από άτομο, από κανάλι, ως ολόκληρο πακέτο σε νέα εκτέλεση. Η συνηθισμένη διαδρομή δέσμευσης τις αρνείται σκόπιμα, και καμία λειτουργία προγράμματος περιήγησης δεν μπορεί να προστεθεί σε εκτέλεση που ήδη κάνει κάτι άλλο.