เซสชันที่ปิดผนึกจากต้นทางถึงปลายทาง (เซสชันที่ปิดผนึก)
Android Console เปิดการเข้ารหัสจากต้นทางถึงปลายทางจากการตั้งค่า พร้อมด้วยการเลือกอุปกรณ์ภายในหน้า การตั้งค่าบัญชี Android และ Web Console รองรับการตั้งค่าหรือการเปลี่ยนรหัสผ่าน และการผูกหรือเปลี่ยนอีเมล อีเมลที่มีอยู่ยังคงใช้งานได้จนกว่าที่อยู่ใหม่จะได้รับการยืนยัน Console สำรองข้อมูลคีย์ส่วนตัว root ไปที่ Exchange ด้วยข้อความรหัสผ่านว่างตามค่าเริ่มต้น โดยคงการสำรองข้อมูลข้อความรหัสผ่านที่มีอยู่ การลบข้อมูลสำรองจะปิดใช้การบันทึกอัตโนมัติบนไคลเอนต์นั้น ข้อความรหัสผ่านที่ว่างเปล่าช่วยให้ Exchange หรือผู้ถือฐานข้อมูลสามารถถอดรหัสรูทได้ การกู้คืนด้วยตนเองจะตรวจสอบรากของพื้นที่ทำงานก่อนที่จะคงอยู่และซิงโครไนซ์เงินช่วยเหลือ
เป้าหมาย: แม้ว่าโฮสต์ Exchange จะถูกบุกรุกหรือผู้ปฏิบัติงานสงสัย แต่ ** ไม่สามารถอ่านคำสั่ง , เอาต์พุต, ไบต์ PTY, เนื้อหาไฟล์, ภาพหน้าจอ หรือข้อมูล ubus และ ** ไม่สามารถตัดสินใจหรือปลอมแปลง ว่าใครอาจดูหรือจัดการอุปกรณ์ได้ Exchange ทำหน้าที่เป็นรีเลย์สำหรับไซเฟอร์เท็กซ์และข้อมูลเมตาการกำหนดเส้นทางเท่านั้น
คำจำกัดความ: crates/proto/src/seal.rs (ประเภทสาย, กฎการอนุญาตในพื้นที่), crates/proto/src/seal/crypto.rs (การเข้ารหัสเซสชัน, แหวนเท่านั้น), crates/proto/src/seal/backup.rs (สำรองรหัสผ่าน: Argon2id + ChaCha20-Poly1305, ไม่ได้เชื่อมโยงกับ agent), crates/agent/src/seal.rs (ฝั่งอุปกรณ์), crates/cli/src/seal.rs (CLI ด้านข้าง), shared/seal-session.js (การใช้งานเซสชันที่แชร์โดย Web Console และ Android Console, @noble/curves · @noble/hashes · @noble/ciphers), shared/seal-backup.js (บนชุดเดียวกันของไลบรารีการสำรองข้อมูลรหัสผ่าน Argon2id) เวกเตอร์ทดสอบข้ามภาษา: shared/seal-vectors.json (สร้าง JS, Rust javascript_vectors_interoperate ตรวจสอบลายเซ็น/HKDF/ไซเฟอร์เท็กซ์ไบต์ที่สอดคล้องกันทีละไบต์), shared/seal-rust-vectors.json (การตอบสนองของอุปกรณ์ Rust, JS shared/seal-session.test.js จับมือและถอดรหัสเสร็จสมบูรณ์)
seal approve ยังคงเผยแพร่สิทธิ์โดยอัตโนมัติ การเรียก seal grant --publish ภายหลัง (หรือการเผยแพร่ตามค่าเริ่มต้นเมื่อเข้าสู่ระบบแล้ว) จะข้ามสิทธิ์ที่เผยแพร่แล้วและยังไม่หมดอายุ หากคีย์ผู้ออก คีย์ผู้รับ อุปกรณ์ และระดับสิทธิ์ตรงกัน โดยแจ้งว่าเผยแพร่แล้วและไม่สร้างโทเค็นใหม่ ใช้ --renew-before DAYS เพื่อต่ออายุสิทธิ์ที่ใกล้หมดอายุ ส่วน --no-publish ยังคงลงนามโทเค็นออฟไลน์ การตรวจสอบนี้ป้องกันรายการซ้ำจากการเรียกซ้ำตามลำดับ แต่ไม่ใช่ธุรกรรมระหว่างไคลเอนต์ที่ทำงานพร้อมกันและไม่ลบรายการซ้ำเดิม seal show จะสร้างตัวตนในเครื่องและลงทะเบียนคีย์เมื่อเข้าสู่ระบบแล้ว ควรใช้โปรไฟล์แยกสำหรับตัวตนทดลอง
โมเดลภัยคุกคาม
| รายการ | การป้องกันเซสชันที่ปิดผนึกและขอบเขต |
|---|---|
| บรรทัดคำสั่ง stdout/stderr รหัสทางออก | ไม่สามารถมองเห็นได้; การตรวจสอบบันทึกเฉพาะ sealed:true, รหัสสาธารณะของผู้ปฏิบัติงาน, ระดับการให้สิทธิ์และการหมดอายุ และผลลัพธ์สุดท้าย |
| อินพุต PTY และเอาต์พุตหน้าจอ | Invisible เฟรมข้อความเข้ารหัสไม่ได้รับการตรวจสอบ |
| เนื้อหาไฟล์ ภาพหน้าจอ โครงสร้างอินเทอร์เฟซ พารามิเตอร์ ubus และผลลัพธ์ | มองไม่เห็น |
| ใครสามารถทำอะไรได้บ้าง (ผู้ดูแลระบบระดับสูง/ผู้ดูแลระบบ/การดำเนินงานและการบำรุงรักษา/อ่านอย่างเดียว ดูอย่างเดียว/จัดการได้) | Device Judgement: เฉพาะการอนุญาตที่ออกโดยคีย์สาธารณะ root ของเวิร์กสเปซคงที่ในเครื่องเท่านั้นที่ได้รับการยอมรับ Exchange ไม่สามารถออก ขยาย หรือปลอมแปลงได้ |
| อุปกรณ์แอบอ้าง | เป็นไปไม่ได้: ลายเซ็นคีย์ข้อมูลประจำตัวของอุปกรณ์ดั้งเดิม + รหัสสาธารณะของอุปกรณ์ที่ปักหมุด CLI การตรวจสอบส่วนขยายเบราว์เซอร์ พื้นที่ทำงานการพิสูจน์ห่วงโซ่รูทและลายเซ็นการตอบสนอง |
| แทรกการกดแป้นพิมพ์/คำสั่งลงในเซสชัน | เป็นไปไม่ได้: การรับรองความถูกต้อง AEAD + ตัวนับที่เพิ่มขึ้นอย่างเคร่งครัด agent ละทิ้งข้อความที่ชัดเจนที่ส่งไปยังหมายเลขเซสชันที่ปิดผนึก |
| เล่นซ้ำ เรียงลำดับใหม่ สูญเสียแพ็กเก็ต การตัดทอน | ตรวจพบและปิดเซสชัน (ปิดไม่สำเร็จ) |
| ข้อมูลเมตาที่ยังคงมองเห็นได้ | รหัสอุปกรณ์ บัญชีผู้ให้บริการ หมายเลขเซสชัน การประทับเวลา ขนาดแพ็คเก็ต และจำนวน ไม่ว่าข้อมูลจะเป็น stdout หรือ stderr หรือไม่ก็ตาม: ประเภทนั้นถูกเข้ารหัส |
| การดำเนินการยังคงเป็นไปได้ | การปฏิเสธการให้บริการ: การระงับการส่งต่อ การยกเลิกการเชื่อมต่อ หรือการปิดเซสชัน (sealed_close) สิ่งนี้ส่งผลต่อความพร้อมใช้งาน ไม่ใช่การอนุญาต |
อยู่นอกขอบเขตการป้องกัน: อุปกรณ์ที่ถูกบุกรุกหรือคอมพิวเตอร์ของผู้ปฏิบัติงาน หรือ Exchange ปลอมตัวเป็นอุปกรณ์ในการเชื่อมต่อครั้งแรก (TOFU) แล้ว เปรียบเทียบลายนิ้วมือนอกแบนด์เพื่อหลีกเลี่ยงกรณีสุดท้าย การทำงานของอุปกรณ์ทั้งหมดต้องมีเซสชันที่ปิดสนิท ไดเร็กทอรีคำสั่งที่ตั้งไว้ล่วงหน้าและขอบเขตการอนุญาตรูทเชนของเบราว์เซอร์มีอธิบายไว้ด้านล่างนี้
ความครอบคลุมและการออกแบบเส้นทาง
| เส้นทาง | ลักษณะการทำงานของเซสชันที่ปิดผนึก | การอนุญาตและขอบเขตด้านอุปกรณ์ |
|---|---|---|
HTTP POST /api/devices/{id}/exec |
Explicit Reject, HTTP 409, พร้อมท์ให้ใช้เซสชัน open_sealed WebSocket |
อุปกรณ์ยังคงปฏิเสธข้อความที่ชัดเจน exec_req แม้ว่า Exchange จะเพิกเฉยต่อนโยบาย |
คำสั่ง HTTP ที่ตั้งไว้ล่วงหน้า /commands/{cmd}/run |
** ปฏิเสธอย่างชัดเจน ** พร้อมแจ้งให้ประทับตรา WS | คำสั่งในฐานข้อมูลเซิร์ฟเวอร์ไม่ใช่การอนุญาตฝั่งอุปกรณ์ |
| คำสั่งที่ตั้งไว้ล่วงหน้าของเว็บ Console/CLI | รับเทมเพลตจากไดเร็กทอรี ส่ง exec_req โดยผู้ดำเนินการภายใน WS ที่ปิดผนึก เอาต์พุตจะถูกปิดผนึกด้วย |
อุปกรณ์ตรวจสอบสวัสดี การอนุญาตลายเซ็นรูท การเพิกถอน ระยะเวลาที่มีผล และระดับ manage view ไม่สามารถเรียกใช้งานเทมเพลตได้ |
แลน /ws/operator |
เซสชันที่ปิดผนึกเท่านั้น สวัสดี รวมกลุ่มการให้สิทธิ์และใบรับรองโดยไม่มีโทเค็นผู้ถือ | การตรวจสอบห่วงโซ่รากและดู/จัดการกฎเดียวกันกับ Exchange เลเยอร์ชั้นนอกจะตรวจสอบเฉพาะที่อยู่เครือข่ายส่วนตัวและแหล่งกำเนิด /api/devices ส่งคืนเฉพาะ ID อุปกรณ์และประทับตราคีย์สาธารณะ/โหมด |
| เบราว์เซอร์ Agent / เส้นทางที่ปิดผนึกดั้งเดิม | ใช้ open_sealed / sealed_input / sealed_event ปฏิเสธช่องเบราว์เซอร์เก่า |
ขยายการอนุญาตลายเซ็นรูทของผู้ดำเนินการตรวจสอบเพิ่มเติม / สายโซ่ใบรับรอง; CLI / Console ตรวจสอบส่วนขยายรูทเชน SealAccept.peer และต้องการให้พับลิกคีย์เท่ากับพับลิกคีย์ลายเซ็นการตอบสนอง |
คลี exec-attach / exec-hold-tail / exec-hold-cat |
คำขอที่ปิดผนึกดั้งเดิม เฟรมเอาท์พุต และเหตุการณ์การเสร็จสิ้น | ต้องใช้ manage; งานที่ปิดผนึกไม่สามารถอ่านหรือแนบเป็นข้อความธรรมดาได้ |
CLI sensors --live |
ใช้เซสชันที่ปิดผนึกแยกกัน (การดำเนินการเดียว/เซสชัน) สำหรับการสุ่มตัวอย่างแต่ละรายการ Ctrl-C เพื่อสิ้นสุดการรีเฟรช | view; อย่าบรรจุตัวอย่างหลายตัวอย่างลงในอุโมงค์การทำงานเดียว |
CLI net |
ซีล net_req และ net_resp รวมถึง URL ส่วนหัว เนื้อหา ผลลัพธ์ |
ต้องใช้ manage |
CLI device update |
update_req ปิดผนึกความคืบหน้าและสถานะสุดท้ายทั้งหมดแล้ว |
ต้องใช้ manage; update ระดับบนสุดของ CLI อัปเดตไคลเอ็นต์ในเครื่อง ไม่ใช่เซสชันระยะไกล |
| exec / PTY / ไฟล์ / ubus / Android / เซ็นเซอร์เดี่ยว / พักรายการ, ฆ่า | มีการดำเนินการซีลแบบเนทีฟและยังคงไม่เปลี่ยนแปลง | ใช้ required_level และโปรแกรมเลือกจ่ายงานฝั่งอุปกรณ์เดียวกัน |
| รายการอุปกรณ์ เมตริก การแสดงตน รายการเซสชัน Exchange | ข้อมูลเมตาการกำหนดเส้นทาง/การตรวจสอบ ไม่ใช่การทำงานของอุปกรณ์ที่ปิดผนึก | Exchange มองเห็นได้; ไม่ได้รับอนุญาตให้เป็นการทำงานของอุปกรณ์ |
HTTP และคำสั่งที่ตั้งไว้ล่วงหน้า
ขณะนี้การดำเนินการที่ปิดผนึกแบบเนทีฟรองรับผู้เรียก HTTP เท่านั้น ใช้ remote-cli --transport http หรือ REMOTE_TRANSPORT=http POST /api/sealed/connections สร้างกล่องจดหมาย POST /input ส่งการจับมือหรือไซเฟอร์เท็กซ์ที่ลงนามแล้ว ผลการสำรวจความคิดเห็น GET /events และ DELETE ปิดการเชื่อมต่อ ลูกค้ายังคงรักษาการเข้ารหัสแบบ end-to-end และการอนุญาตอุปกรณ์ที่มีอยู่ จุดสิ้นสุดการดำเนินการของอุปกรณ์เดิมยังคงส่งคืน 409 การเชื่อมต่ออุปกรณ์ยังคงไม่เปลี่ยนแปลง
https://remote.ivjn.us/sealed-http.md
การสร้าง การแก้ไข และการแสดงรายการคำสั่งที่ตั้งไว้ล่วงหน้ายังคงเป็นพื้นที่การจัดการฐานข้อมูล Exchange และข้อความเทมเพลต ชื่อ และคำอธิบายในไดเร็กทอรีจะไม่ถูกปิดผนึกข้อมูล และคำสั่งที่ลงนามโดยรายการอนุญาตรูท คอนโซลและ CLI เรียกใช้งานเทมเพลตที่ดึงข้อมูลมาในฐานะผู้บริหารที่ปิดผนึกตามปกติ (ไม่ระงับ) ในขณะที่กดปุ่มค้างไว้ อุปกรณ์เชื่อถือเฉพาะนโยบายดั้งเดิมและการอนุญาตของผู้ปฏิบัติงาน ไม่ใช่รหัสไดเรกทอรี บทบาทของเซิร์ฟเวอร์ หรืออาร์กิวเมนต์ "นี่คือคำสั่งที่กำหนดไว้ล่วงหน้า" สมาชิกที่ถือเฉพาะการให้สิทธิ์ view ไม่สามารถรันคำสั่งที่กำหนดไว้ล่วงหน้าได้ จำเป็นต้องมีการให้สิทธิ์ root manage Grant ไม่สามารถขยายได้หากไดเร็กทอรีถูกดัดแปลง แต่ manage อนุญาตให้ดำเนินการได้ตามต้องการ ดังนั้นโปรดตรวจสอบเทมเพลตและอย่าเขียนรหัสผ่าน/โทเค็นลงในไดเร็กทอรีเซิร์ฟเวอร์ เอาต์พุตจะถูกถอดรหัสและแสดงเฉพาะบนเครื่องเท่านั้น การตรวจสอบรันพาธจะบันทึกเฉพาะเมตาดาต้าที่ปิดผนึกเท่านั้น และไม่บันทึกคำสั่งและเอาต์พุต
การเลือก LAN และไคลเอนต์
เซสชันอุปกรณ์ CLI ใช้เฉพาะการปิดผนึกแบบ end-to-end เท่านั้น โดยไม่ขึ้นกับ seal_key ความสามารถ หรือคำแนะนำนโยบายที่รายงานโดย Exchange ข้อมูลความสามารถที่ขาดหายไปหรือถูกลบจะไม่ทำให้มีการปรับลดรุ่นข้อความธรรมดา ความล้มเหลวในการอ่านฐานข้อมูลพินในเครื่องถือเป็นข้อผิดพลาด บันทึกความน่าเชื่อถือที่เสียหายจะไม่ถูกละเลย
งาน exec และไฟล์ที่ปิดผนึกไว้ / ไม่ถือไว้จะถูกทำเครื่องหมายว่าปิดผนึกก่อนที่จะเผยแพร่ไปยังไดเร็กทอรีงานส่วนกลาง และไม่สามารถพึ่งพาสภาวะการแข่งขันของ "การปิดเซสชันก่อนที่จะประมวลผลเหตุการณ์ขาออกครั้งแรก" เพื่ออ่านตัวอย่างข้อความที่ชัดเจน บันทึกของอุปกรณ์จะไม่บันทึกเป้าหมายหรือเมธอดโพรบ HTTP อ็อบเจ็กต์ ubus หรือเมธอด
LAN นำซองจดหมายดั้งเดิม การถอดเสียงลายเซ็น ตัวนับ AEAD การแก้ไขอุปกรณ์ และกฎการเพิกถอนมาใช้ซ้ำ โดยไม่ต้องสร้างอัลกอริธึมการเข้ารหัสใหม่ LAN ขาออกต้องผ่าน Tunnels::seal_outbound และแปลเป็น OperatorDown; การแทรกข้อความธรรมดาของหมายเลขเซสชันที่ปิดผนึกจะถูกยกเลิกโดยผู้จ่ายงานอุปกรณ์ การเชื่อมต่อถูกปิดในขณะที่ยังคงปลดผู้บริหารที่ถือไว้ ยกเลิกการดำเนินการอื่นๆ และเอาต์พุตล่าช้าจะถูกละทิ้งโดย ID ที่ไม่พอใจ ไม่มีโทเค็น LAN: ไคลเอ็นต์ใส่การอนุญาตแคชแบบออฟไลน์และห่วงโซ่ใบรับรองลงในสวัสดี และอุปกรณ์จะกำหนดมุมมอง/จัดการตาม authorize เดียวกันกับ Exchange เลเยอร์ชั้นนอกจะตรวจสอบเฉพาะที่อยู่เครือข่ายส่วนตัวและแหล่งกำเนิดเท่านั้น เซสชันข้อความที่ชัดเจนจะถูกปฏิเสธบน LAN เสมอ โดยไม่คำนึงถึงค่านโยบายในอดีต เว็บคอนโซลที่โฮสต์ยังคงเชื่อมต่อกับ Exchange
ข้อมูลอุปกรณ์เสริม info.seal_mode (allow / require), seal_key และความสามารถของ sealed ยังคงเข้ากันได้ ไม่ใช่ทั้งการอนุญาตหรือกุญแจสาธารณะของอุปกรณ์ที่เชื่อถือได้ ในที่สุดอุปกรณ์ก็บังคับใช้นโยบาย คำสั่ง เทอร์มินัล ไฟล์ ubus เซ็นเซอร์ งาน โพรบเครือข่าย การทำงานของเดสก์ท็อป การอัปเดตอุปกรณ์ คำสั่งที่กำหนดไว้ล่วงหน้า และการทำงานของเบราว์เซอร์ใน CLI, เว็บ Console และ Android Console ล้วนใช้เซสชันที่ปิดผนึกแบบเนทีฟ ไม่มีเส้นทางข้อความธรรมดา ค่านโยบาย allow ยังปฏิเสธการดำเนินการกับข้อความธรรมดาอีกด้วย ความล้มเหลวของการจับมือ การปักหมุดอุปกรณ์ การให้สิทธิ์ หรือการถอดรหัสจะหยุดการดำเนินการโดยไม่ต้องลองข้อความธรรมดาอีกครั้ง การเปลี่ยนแปลงนโยบายออนไลน์รีเฟรชข้อมูล LAN ทันที ข้อมูลคลาวด์จะรีเฟรชเมื่อเชื่อมต่อใหม่และลงทะเบียน
การตรวจสอบสิทธิ์รูทเชนพื้นที่ทำงานของเบราว์เซอร์ Agent
ส่วนขยายโฆษณา sealed, Ed25519 seal_key และ seal_mode: require หลังจากจับคู่หรือกำหนดค่าอุปกรณ์แล้ว ระบบจะเรียก POST /api/seal/device พร้อมข้อมูลรับรองอุปกรณ์และหลักฐานการครอบครองที่ลงนาม Exchange รับพื้นที่ทำงานจากอุปกรณ์และผูกพับลิกคีย์ของอุปกรณ์ ไคลเอนต์ที่ถือคีย์ส่วนตัวรูทของพื้นที่ทำงานที่เชื่อถือได้ลงนามในสิทธิ์การดูสำหรับอุปกรณ์เบราว์เซอร์นั้น ๆ การลงทะเบียนและผู้ถืออุปกรณ์ให้การเข้าถึงรีเลย์และการดึงข้อมูลรับรอง เซสชันเบราว์เซอร์ต้องมีการรับรองความถูกต้องของใบรับรอง
ส่วนขยายจะตรวจสอบลายเซ็นขาเข้า ห่วงโซ่รูท ขอบเขตอุปกรณ์ ระดับ การหมดอายุ และการเพิกถอนในเครื่อง จากนั้นลงนาม SealAccept ด้วย SealHello ที่ลงนามของตนเองใน peer CLI finish_workspace_operator และ finishBrowser ที่แชร์จะตรวจสอบการพิสูจน์นั้น ต้องใช้ peer.operator_key == accept.device_key และตรวจสอบลายเซ็นที่ยอมรับ การพิสูจน์ที่ขาดหายไปหรือไม่ถูกต้องจะปิดเซสชัน เซสชันที่ถูกต้องจะเริ่มต้นโดยอัตโนมัติ Raw CDP ยังต้องการความยินยอมในท้องถิ่นตามคำขอหรือการอนุมัติแบบอัตโนมัติซึ่งกำหนดขอบเขตไว้ที่คีย์ผู้ปฏิบัติงาน เซิร์ฟเวอร์ และอุปกรณ์ สิทธิ์การดูไม่สามารถใช้ CDP ได้
บันทึกการอนุญาตขอบเขตส่วนขยายตามแหล่งกำเนิดเซิร์ฟเวอร์ พื้นที่ทำงาน และอุปกรณ์ ข้อมูลประจำตัวเฉพาะท้องถิ่นสามารถเข้าถึงได้เฉพาะกับบริบทส่วนขยายที่เชื่อถือได้เท่านั้น โดยปักหมุดรูทเวิร์กสเปซแรกในเครื่องและปฏิเสธการเปลี่ยนแปลง CLI และ Console ใช้เอกลักษณ์การปิดผนึกปกติและห่วงโซ่รูทของพื้นที่ทำงานโดยไม่มีตัวแก้ไขพินของเบราว์เซอร์แยกต่างหาก การลงนามรูทคีย์ ผู้ออกใบรับรอง และข้อมูลรับรองการลงทะเบียนอุปกรณ์เป็นการตรวจสอบที่แตกต่างกัน รหัสอุปกรณ์ดั้งเดิม TOFU ยังคงแยกจากกัน
ขอบเขตความปลอดภัย: TOFU รูทแรกไม่สามารถแยกแยะรูทปลอมที่มาจากรีเลย์ที่เป็นอันตราย ตรวจสอบมันออกจากวง PoP พิสูจน์การครอบครองคีย์ ไม่ใช่การอนุมัติจากสมาชิก การอนุมัติอัตโนมัติของไคลเอนต์รูทขึ้นอยู่กับบัญชีรายชื่อ การใช้งานที่มีความละเอียดอ่อนควรตรวจสอบคีย์ใหม่ ปกป้องโปรไฟล์ส่วนขยาย เมล็ดพันธุ์ และห่วงโซ่การเผยแพร่คอนโซลเว็บ จุดสิ้นสุดที่ถูกบุกรุกหรือการเข้าถึง CDP เต็มรูปแบบที่มอบให้แก่ผู้ปฏิบัติงานที่เป็นอันตรายนั้นอยู่นอกเหนือการป้องกันของการปิดผนึก การลบบันทึกไดเรกทอรีไม่เพิกถอนข้อมูลรับรองที่ลงนามในแคช กฎการเพิกถอนภายในอุปกรณ์และการหมดอายุยังคงมีความสำคัญ Exchange ยังสามารถสังเกตข้อมูลเมตาการกำหนดเส้นทาง ระงับข้อมูลรับรอง และปฏิเสธบริการ
เมื่อข้อมูลประจำตัวไม่พร้อมใช้งาน: หากไม่สามารถโหลดหรือเขียนข้อมูลประจำตัวของอุปกรณ์ได้ เซสชันที่ปิดผนึกจะไม่พร้อมใช้งาน และการดำเนินการข้อความธรรมดาทั้งหมดยังคงถูกปฏิเสธ (ปิดล้มเหลว) ไฟล์นโยบายที่สูญหายหรือเสียหายและค่านโยบายในอดีตจะไม่เปิดใช้งานข้อความธรรมดา ซ่อมแซมที่เก็บข้อมูลคีย์ภายในอุปกรณ์
กล่องจดหมาย HTTP จำเป็นต้องมีความสัมพันธ์กับการสร้างอินสแตนซ์ Exchange และหมดอายุหลังจาก 90 วินาทีโดยไม่มีกิจกรรม ทำให้อินพุตเป็นอนุกรม ลองเฉพาะลำดับและข้อความไซเฟอร์เดียวกันอีกครั้ง และรับทราบเหตุการณ์ที่ประมวลผลด้วย after เว็บ Console, อุปกรณ์เคลื่อนที่ และ LAN ยังคงรักษาการขนส่งที่มีอยู่ การดำเนินการที่กำหนดไว้ล่วงหน้ายังคงต้องใช้ manage
การตรวจสอบการถดถอย
การทดสอบ Rust ครอบคลุมการจับมือที่อนุญาตโดยอุปกรณ์จริง, ผลลัพธ์ของ exec/attach/tail/cat/sensors/net/update ที่ปิดผนึก, การปฏิเสธข้อความธรรมดาภายใต้ทุกค่านโยบาย, LAN WebSocket การจับมือ/เฟรม/การอัปเดตนโยบายที่ปิดผนึก, คำแนะนำ HTTP 409, การปิดเส้นทางโหมดต้องใช้เบราว์เซอร์ และค่าคงที่การปิดผนึกที่บังคับสำหรับไคลเอนต์และข้อมูลอุปกรณ์ การทดสอบ JavaScript ครอบคลุมเวกเตอร์ Rust/JS แบบสองทิศทางที่มีอยู่ ซองจดหมายการดำเนินการ เอาต์พุตคำสั่งที่กำหนดไว้ล่วงหน้าแบบปิดผนึกโดยไม่มีทางเลือกอื่นหลังจากการปฏิเสธ การกำหนดค่าเบราว์เซอร์/การลงทะเบียน/การปฏิเสธอุปกรณ์/การเปลี่ยนแปลงนโยบายท้องถิ่น และข้อผิดพลาดในการปักหมุดไคลเอ็นต์ ซิงเกิลตันการปิดผนึกทั้งกระบวนการจะเริ่มต้นในกระบวนการย่อยที่แยกได้ในระหว่างการทดสอบ ดังนั้นการทดสอบที่เกิดขึ้นพร้อมกันจึงไม่สามารถแก้ไขนโยบายด้านอุปกรณ์ของกันและกันได้
CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 cargo test --workspace
cargo fmt --all --check
CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 cargo clippy --workspace --all-targets -- -D warnings
npm test --prefix shared
npm test --prefix website/console
npm test --prefix browser-agent
node --test scripts/test-pages-worker.mjs
จาวาสคริปต์ใช้โหนด 24+ เพิ่มการถดถอย LAN แบบปิดผนึกสำหรับการอัปเกรด HTTP จริง / WebSocket ผ่านการสตรีมดูเพล็กซ์ในหน่วยความจำ พร้อมความสามารถในการตรวจสอบการจับมือกัน เฟรม และการปิดผนึกบังคับภายใต้ทุกค่านโยบายในแซนด์บ็อกซ์ที่ปิดใช้งานซ็อกเก็ตเครือข่าย การทดสอบ WS/TLS/HTTP แบบวนกลับที่มีอยู่ยังคงต้องอยู่ในสภาพแวดล้อมที่อนุญาตให้รวมพอร์ตได้ มิฉะนั้นจะล้มเหลวด้วย Operation not permitted และไม่สามารถใช้เป็นหลักฐานว่าชุดการทดสอบทั้งหมดผ่านการทดสอบ การตรวจสอบเครือข่ายและการทดสอบเส้นทางการอัปเดตจะตรวจสอบผลลัพธ์ความสำเร็จ/ข้อผิดพลาดของการปิดผนึก การอัปเดตจะไม่ถูกดาวน์โหลดหรือติดตั้ง
** ความเสี่ยงพิเศษของเว็บ Console:** รหัสของหน้าเว็บนั้นถูกส่งโดยไซต์ Pages ไซต์/CDN ที่ถูกบุกรุกสามารถออกสคริปต์ที่เป็นอันตรายเพื่ออ่านข้อความธรรมดาของหน้านี้หรือเซ็นชื่อด้วยคีย์ของเบราว์เซอร์ (แต่ไม่สามารถนำคีย์ส่วนตัวที่ไม่สามารถส่งออกออกไปได้) ข้อกำหนดเบื้องต้นสำหรับการรักษาความลับจากตัวดำเนินการ Exchange คือคุณเชื่อถือห่วงโซ่การเผยแพร่ของไซต์แบบคงที่ หากคุณไม่แน่ใจเกี่ยวกับเรื่องนี้ โปรดใช้ CLI หรือ Android Console
ตัวตนและกุญแจ
| คีย์ | ประเภท | ที่เก็บของ | ใครสามารถดูกุญแจสาธารณะได้ |
|---|---|---|---|
| ข้อมูลระบุตัวตนของอุปกรณ์ | เอ็ด25519 | agent: agent.seal.key (0600) เมื่อไฟล์สถานะอยู่บน tmpfs (/var/run, /run, /tmp) พื้นที่เก็บข้อมูลจะย้ายไปที่ /etc/remote-agent/ แทนที่ด้วย REMOTE_SEAL_DIR OpenWrt รวมไว้ใน Conffiles |
รายงานเป็น info.seal_key ระหว่างการลงทะเบียน (แสดงเท่านั้น CLI ไม่เชื่อสำเนานี้) |
| ตัวตนของผู้ปฏิบัติงาน | เอ็ด25519 | CLI: seal-identity.pk8 (0600) ข้าง config.toml; เว็บ Console: ** ไม่สามารถส่งออกได้** WebCrypto Ed25519 CryptoKeyPair ใน IndexedDB remote-seal (ถอยกลับไปเป็นเมล็ดสุ่มใน IndexedDB หากเบราว์เซอร์ขาดการสนับสนุน WebCrypto Ed25519); Android Console: เมล็ดใน expo-secure-store (เข้ารหัสโดยที่เก็บคีย์ Android) |
ส่งไประหว่างการจับมือกัน |
| รากของพื้นที่ทำงาน | เอ็ด25519 | คือคีย์ตัวดำเนินการบนไคลเอ็นต์ผู้ดูแลระบบขั้นสูง เมล็ดต้องสามารถส่งออกได้บนเว็บ Console (ผู้ดูแลระบบระดับสูงจะแทนที่คีย์ WebCrypto ที่ไม่สามารถส่งออกได้ด้วยเมล็ดในเครื่องเมื่อสร้างรูท) มันสามารถส่งออกเป็นข้อความ rsk1. สำรองข้อมูลไปที่ Exchange โดย Console ด้วยข้อความรหัสผ่านว่างเปล่าตามค่าเริ่มต้น |
บันทึกรากของ rsr1. (เผยแพร่ Exchange, แก้ไขอุปกรณ์แล้ว) |
| คีย์เซสชัน | คีย์ X25519 ชั่วคราว → HKDF-SHA256 → คีย์ ChaCha20-Poly1305 หนึ่งคีย์ต่อทิศทาง | หน่วยความจำเท่านั้น ละทิ้งเมื่อเซสชันสิ้นสุดลง (ส่งต่อความลับ) | ไม่มีใคร |
คีย์ส่วนตัวของตัวดำเนินการจะถูกจัดเก็บไว้ในเครื่อง Console อัปโหลดการสำรองข้อมูลรูทด้วยข้อความรหัสผ่านว่างเปล่าตามค่าเริ่มต้น Exchange หรือผู้ถือฐานข้อมูลสามารถถอดรหัสได้ ตั้งค่าข้อความรหัสผ่านสำรองด้วยตนเอง หรือลบข้อมูลสำรองเพื่อปิดใช้งานการบันทึกอัตโนมัติบนไคลเอนต์นี้
การอนุญาต (Exchange ไม่ใช่การอนุญาต)
อุปกรณ์จะเชื่อถือคีย์สาธารณะรูทของพื้นที่ทำงานเพียงคีย์เดียวเท่านั้น นโยบายท้องถิ่น agent.seal.json:
{"mode":"require","root_key":"<base64 Ed25519>","revoked_keys":[]}
agent กำหนดระดับสำหรับ sealed_open แต่ละตัวด้วยตัวมันเอง:
- ไม่มีการปักหมุดรูทพื้นที่ทำงานบนอุปกรณ์ → ปฏิเสธ (
no workspace root pinned on this device) - รหัสสาธารณะของผู้ดำเนินการที่
revoked_keys→ ถูกปฏิเสธ - รหัสสาธารณะของผู้ดำเนินการคือ
root_key→owner(จัดการได้ + แก้ไขนโยบายท้องถิ่น) - มีการจัดหา
grantมาให้: ลายเซ็นถูกต้อง,operator_keyตรงกับการจับมือ,device_idระบุอุปกรณ์นี้หรือ*และสิทธิ์นั้นอยู่ภายในระยะเวลาที่มีผลใช้ได้ (±5 นาทีของการเอียงของนาฬิกา) ผู้ลงนามจะต้องเป็นรูทที่ปักหมุดไว้ หรือสวัสดีต้องมีห่วงโซ่ใบรับรองrsc1.(hello.chainซึ่งไม่ครอบคลุมอยู่ในลายเซ็นแฮนด์เชค) โดยเรียงลำดับจากใบรับรองที่ออกโดยรูทไปยังผู้ลงนามการให้สิทธิ์ ใบรับรองแต่ละใบจะต้องอนุญาตให้ออกเพิ่มเติมได้ และความยาวเส้นทาง ระดับ ขอบเขตอุปกรณ์ และการหมดอายุจะต้องอยู่ภายในใบรับรองก่อนหน้า ระดับสิทธิ์คือviewหรือmanageไม่ใช่owner - อื่นๆ → ปฏิเสธ
ข้อจำกัดของห่วงโซ่ใบรับรอง
อุปกรณ์ยอมรับสายโซ่ rsc1. ที่ยืนยันกลับไปยังรูทพื้นที่ทำงานที่ปักหมุดไว้ ไม่ใช่ใบรับรองระดับกลางที่แยกออกมา (hello.chain สั่งจากใบรับรองที่ออกรูทไปยังผู้ลงนามการให้สิทธิ์) มี ไม่มีการจำกัดความลึกขององค์กร: องค์กรอาจมีมากกว่า 10 ระดับ ราวกั้น DoS ขนาดใหญ่จะจำกัดเชนไว้ที่ใบรับรอง MAX_CERT_CHAIN = 64 และขนาดที่เข้ารหัส (ผลรวมของความยาวโทเค็น Canonical rsc1.) ถึง MAX_CERT_CHAIN_BYTES ≤ 64 KiB (check_chain_limits / checkChainLimits ใน crates/proto/src/seal.rs / shared/seal-cert.js; กฎที่เหมือนกันบนอุปกรณ์, Exchange, CLI, เว็บ และ Android) เกินขีดจำกัดอย่างใดอย่างหนึ่งทำให้เกิดการปฏิเสธทันที
ใบรับรองแต่ละใบยังมี max_path_len (0–255) ซึ่งเป็นข้อจำกัดของผู้ออก เป็นทางเลือก เกี่ยวกับจำนวนใบรับรองที่อาจตามมา หากไม่มี --max-path, seal cert issue จะใช้ค่าเริ่มต้นเป็นความลึกของผู้ออกที่เหลือทั้งหมด (255 ไม่จำกัดอย่างมีประสิทธิภาพ) การยืนยันกำหนดให้จำนวนใบรับรองที่ตามมาต้องไม่มากกว่า max_path_len ใบรับรองระดับกลางที่ออกโดยรูทให้กับผู้ดูแลระบบมี max_path_len 0: ผู้ดูแลระบบอาจลงนามในการอนุญาต แต่ไม่สามารถออกใบรับรองอื่นได้ can_issue ที่เป็นเท็จยังป้องกันการออกใบรับรองเพิ่มเติมอีกด้วย
ใบรับรองย่อยจะต้องอยู่ในใบรับรองหลัก (cert_within_parent / verify_chain บนอุปกรณ์):
- level ไม่เกินระดับพาเรนต์ รูตคือ
owner; ระดับที่ได้รับต้องเป็นviewหรือmanageเท่านั้น และต้องไม่สูงกว่าใบรับรองหลักownerไม่สามารถปรากฏในใบรับรองหรือสิทธิ์ได้ - Device scope เป็นเซ็ตย่อยของพาเรนต์ ลูกสามารถครอบคลุมอุปกรณ์ทั้งหมดได้ก็ต่อเมื่อพาเรนต์มี
*; ไม่เช่นนั้นอุปกรณ์แต่ละชิ้นของเด็กจะต้องอยู่ในรายการของผู้ปกครอง รายการย่อยจะถูกเขียนว่า*เฉพาะในกรณีที่รายการหลักเป็น*ด้วย - Eexpiration time ไม่สามารถอยู่หลังใบรับรองหลักได้ รากไม่มีขีดจำกัดการหมดอายุ นอกจากนี้ Grant ยังต้องไม่ช้ากว่าใบรับรองที่ออก และอุปกรณ์ก็ไม่สามารถเกินขอบเขตของใบรับรองนั้นได้
**การเพิกถอนใบรับรองระดับกลางจะเรียงซ้อนกับทุกสิ่งที่อยู่ด้านล่าง ** อุปกรณ์จะตรวจสอบทุก subject_key และ serial บนเชนกับ revoked_keys ในนโยบาย หลังจากที่อันกลางถูกเพิกถอน เชนอีกต่อไปที่ยังคงแบกมันไว้จะล้มเหลว ดังนั้นใบรับรองรองที่ออกให้ เช่นเดียวกับหน่วยงานที่ออกโดยใบรับรองเหล่านั้น จะกลายเป็นโมฆะ การลบใบรับรองจาก Exchange จะหยุดการแจกจ่ายเพิ่มเติมเท่านั้น และสำเนาที่เก็บไว้ในอุปกรณ์นั้นยังคงใช้ได้ก่อนหมดอายุ หากต้องการทำให้เชนด้านล่างทั้งหมดไม่ถูกต้องทันที ให้เขียนคีย์สาธารณะของหัวเรื่อง (หรือหมายเลขซีเรียล) ของใบรับรองลงในนโยบายด้านอุปกรณ์ revoked_keys
การแมประดับกับการดำเนินการ (proto::seal::required_level): view (ดูอย่างเดียว) อนุญาตให้เซ็นเซอร์ เก็บรายการงานไว้ การดำเนินการอ่านอย่างเดียว Android (สถานะ/ต้นไม้/ภาพหน้าจอ/find_text); สิ่งอื่นๆ ทั้งหมด (exec, PTY, ไฟล์, ubus, การตรวจจับเครือข่าย, การอัปเดตตัวเอง, อินพุต Android) ต้องใช้ manage
การให้สิทธิ์เป็น JSON ที่ลงนามโดยรูท การดัดแปลงฟิลด์ใดๆ โดย Exchange (เช่น ดู → จัดการ การเปลี่ยนอุปกรณ์ การขยายระยะเวลาที่มีผล การเปลี่ยนบุคคลที่ได้รับอนุญาต) จะทำให้ลายเซ็นเป็นโมฆะ ลายเซ็นการจับมือยังผูกการอนุญาตในเซสชันนี้ด้วย บทบาทของบัญชีในฝั่ง Exchange จะกำหนดว่า "สามารถกำหนดเส้นทางข้อความไปยังอุปกรณ์นี้ได้หรือไม่" (การเปิดเผยผู้เช่า) และจะไม่ขยายหรือลดสิทธิ์ของเซสชันที่ปิดผนึก ไม่มีการอ้างสิทธิ์ในระดับอุปกรณ์ เจ้าของ หรือเจ้าของร่วม: owner เดียวเท่านั้นที่เป็นรูท
อุปกรณ์ต่างๆ ปักหมุดรูทอย่างไร:
- TOFU: เมื่ออุปกรณ์ที่สามารถปิดผนึกเชื่อมต่อกับ Exchange, Exchange จะส่ง
seal_root {token, rotation?}(บันทึก root ของrsr1.ที่ลงนามด้วยตนเอง) อุปกรณ์จะตรวจสอบลายเซ็นตนเอง ถ้าไม่มีการปักหมุดรูทในเครื่อง มันจะปักหมุดรูทนี้และเขียนไปที่agent.seal.json - Rotation: หลังจาก root ได้รับการแก้ไขแล้ว root ที่ประกาศโดย Exchange จะเปลี่ยนไป อุปกรณ์จะเปลี่ยนเป็นรูทใหม่เมื่อได้รับบันทึกการหมุน
rsx1.พร้อมกันซึ่งลงนามโดยรูทคงที่ (old_root= รูทคงที่,new_root= รูทใหม่ พื้นที่ทำงานเดียวกัน); มิฉะนั้นจะถูกละเว้นและบันทึกไว้ รากยังสามารถเปลี่ยนแปลงได้ในเซสชันที่ปิดผนึกด้วยseal_policy_set {root_key}(เฉพาะรากปัจจุบันเท่านั้นที่มีระดับowner) - การตั้งค่าท้องถิ่น:
remote-agent seal root <key>ถูกเขียนโดยตรงไปยังรูท;remote-agent seal forget-rootถูกล้าง และ TOFU จะถูกทำซ้ำในครั้งถัดไปที่เชื่อมต่อ Exchange (การรีสตาร์ท agent จะมีผล)
Risk: หาก Exchange ถูกโจมตีในการเชื่อมต่อครั้งแรกของอุปกรณ์ TOFU จะปล่อยให้อุปกรณ์ทำการรูทปลอม หากเป็นข้อกังวล ให้ปักหมุดคีย์สาธารณะรูทด้วย remote-agent seal root <key> ก่อนที่จะนำอุปกรณ์ออนไลน์ (ดู remote-cli seal root สำหรับลายนิ้วมือของอุปกรณ์) เมื่อปักหมุดแล้ว Exchange จะไม่สามารถแทนที่รูทนั้นได้
Revocation: Root remote-cli seal policy <设备> --revoke <key> หรือบนอุปกรณ์ remote-agent seal revoke <key> ไม่สามารถเพิกถอนรากได้ การอนุญาตมีระยะเวลาที่ถูกต้อง (90 วันตามค่าเริ่มต้น) การลบทุนที่เผยแพร่ออกจาก Exchange จะไม่เป็นการแจกจ่ายอีกต่อไป สำเนาที่นำเข้าในเครื่องยังคงใช้ได้จนกว่าจะหมดอายุและต้องถูกเพิกถอนตามนโยบายด้านอุปกรณ์
Exchange เป็นรีเลย์การให้สิทธิ์ที่ไม่น่าเชื่อถือ
เพื่อนร่วมงานไม่จำเป็นต้องคัดลอกโทเค็น rsg1. หรือคีย์สาธารณะลงในหน้าต่างแชทอีกต่อไป: Exchange มี Operator Public Key Directory และ grant Relay ระดับพื้นที่ทำงาน สิ่งนี้ไม่เปลี่ยนรูปแบบภัยคุกคาม - Exchange ยังคงไม่สามารถมองเห็นข้อความที่ชัดเจน และไม่สามารถออก ขยาย หรือปลอมแปลงการอนุญาตได้ มันจะช่วยประหยัด:
- ผู้ดำเนินการใช้รหัสส่วนตัวในเครื่องเพื่อพิสูจน์รหัสสาธารณะ Ed25519 (
POST /api/seal/keys) ที่เขาถืออยู่ - ข้อความต้นฉบับของโทเค็น
rsg1.ที่ลงนามแล้ว (POST /api/seal/grants) - ข้อความต้นฉบับของใบรับรองระดับกลาง
rsc1.ที่ลงนามแล้ว (POST /api/seal/certs) Exchange ตรวจสอบลายเซ็น Ed25519 ของผู้ออก แต่ไม่สามารถปลอมแปลงใบรับรองได้GET /api/seal/certs/chain?subject_key=ดึงโทเค็นตามความสัมพันธ์การออก (จำกัดด้วยโทเค็น 64 เดียวกัน / รั้ว 64 KiB) ออกรูตก่อน
การให้สิทธิ์อุปกรณ์ยังคงรับรู้เฉพาะรูทแบบคงที่ หรือสายใบรับรอง rsc1. ที่สามารถตรวจสอบรูทได้ Exchange แยกวิเคราะห์โทเค็นเพื่อสร้างดัชนีตามเวลา owner_key / operator_key / เวลาหมดอายุเท่านั้น และไม่ถือว่าการอัปโหลดเป็นการอนุญาต กรณีที่แย่ที่สุดคือผู้ดำเนินการระงับโทเค็น (อีกฝ่ายไม่สามารถรับสิทธิ์ได้ ซึ่งปรากฏเป็น no grant) และไม่สามารถเปลี่ยน view เป็น manage ได้ และไม่สามารถหลอกว่าเป็น root ได้
สมาชิกพื้นที่ทำงานทุกคนสามารถอัปโหลดทุนได้: โทเค็นมาพร้อมกับลายเซ็นของตัวเอง และการอัปโหลดไม่ใช่การดำเนินการอนุญาต เฉพาะสิทธิ์ที่ลงนามโดยรูทเท่านั้นที่ถูกต้องสำหรับอุปกรณ์ CLI มีค่าเริ่มต้นเป็น --publish เมื่อเข้าสู่ระบบ คอนโซล Web/Android ใช้อินเทอร์เฟซเดียวกันเมื่อ "ลงนามและเผยแพร่"
การผูกมัดหลักฐานการครอบครองสำหรับการลงทะเบียนกุญแจ:
remote-seal-key-register:v1:<workspace_id>:<operator_id>:<public_key>:<issued_at_ms>
หลักฐานเป็นลายเซ็น Ed25519 ที่สร้างด้วยคีย์ส่วนตัวที่สอดคล้องกับคีย์สาธารณะนี้ issued_at_ms ต้องอยู่ภายใน ±10 นาทีของเวลาเซิร์ฟเวอร์ CLI พยายามลงทะเบียนบน login และ seal show คอนโซลลงทะเบียนหลังจากเข้าสู่ระบบ
หากไม่มีเงินอุดหนุนที่ตรงกันในพื้นที่ก่อนการดำเนินการปิดผนึก ผู้ปฏิบัติงานจะพยายามอย่างดีที่สุดกับ seal sync เมื่อการจับมือถูกปฏิเสธเนื่องจาก no grant มันจะซิงโครไนซ์อีกครั้งและลองอีกครั้ง
เมื่อลูกค้าของผู้ออกออนไลน์ ลูกค้าจะต่ออายุการอนุญาตที่ออกให้โดยอัตโนมัติและกำลังจะหมดอายุ ลายเซ็นยังคงเสร็จสิ้นภายในเครื่อง Exchange บันทึกเฉพาะโทเค็น rsg1. ใหม่และลบบันทึกเก่า และไม่สามารถเปลี่ยนระดับหรือเปลี่ยนบุคคลที่ได้รับอนุญาต
- ** เมื่อรัน: ** CLI หลังจากการเข้าสู่ระบบสำเร็จ และเมื่อคำสั่งการเข้าสู่ระบบใด ๆ เริ่มทำงาน (
seal renewใช้เส้นทางแบบแมนนวลและไม่ใช้เลเยอร์ของการต่ออายุอัตโนมัติ) เว็บ Console จะเข้าสู่พื้นที่ทำงานเมื่อเข้าสู่ระบบและเข้าสู่พื้นที่ทำงาน (หากมีเซสชันอยู่แล้วหลังจากโหลดเพจแล้ว) Android Console หลังจากเข้าสู่ระบบ และเมื่อแอปกลับมาทำงานเบื้องหน้า หากคุณไม่ได้เข้าสู่ระบบ หรือหากคีย์สาธารณะนี้ไม่มีการอนุญาตที่เผยแพร่ ก็จะไม่มีการต่ออายุ - กฎการต่ออายุ:
GET /api/seal/grants?owner_key=<本机公钥>เงินช่วยเหลือที่หมดอายุภายใน 30 วันจะถูกออกใหม่ด้วยdevice_id,operator_keyและlevelดั้งเดิมเป็นเวลา 90 วัน หลังจากรีลีสสำเร็จ สิทธิ์เก่าจะเป็นDELETEหากGET /api/seal/keysสำเร็จoperator_keyที่ไม่ได้อยู่ในไดเร็กทอรีคีย์สาธารณะอีกต่อไปจะถูกข้ามไป หากการร้องขอไดเร็กทอรีล้มเหลว มันจะไม่ถูกกรองตามไดเร็กทอรี - Throttling: Web/Android: รหัสสาธารณะที่ออกเดียวกันนี้จะถูกลองใช้มากที่สุดทุกๆ 12 ชั่วโมง CLI ถูกบันทึกในไดเร็กทอรีการกำหนดค่าเป็น
seal-renew-state.json, Web Console ใช้localStorageและ Android Console ใช้ SecureStore ความล้มเหลวไม่ส่งผลต่อการดำเนินการปัจจุบัน: CLI พิมพ์เฉพาะบรรทัดคำเตือนบน stderr และคอนโซลใช้console.warnเมื่อการต่ออายุสำเร็จ CLI จะพิมพ์คำอธิบายสั้น ๆ เกี่ยวกับ stderr เว็บ Console ที่เก็บรูทจะออกหนึ่งรอบก่อนเมื่อเข้าสู่พื้นที่ทำงาน และ Android จะออกหนึ่งรอบก่อนเมื่อเปิดใช้งาน "การเข้ารหัสจากต้นทางถึงปลายทาง" สองครั้งนี้ไม่อยู่ภายใต้การควบคุมปริมาณ 12 ชั่วโมง การรีเฟรชหลังจากการเข้าพักครั้งเดียวกันเท่านั้นที่จะถูกควบคุมปริมาณ - การต่ออายุ CLI: บันทึกความสำเร็จแยกตามเซิร์ฟเวอร์และกุญแจผู้ออก หลังสำเร็จจะข้ามคำขอต่ออายุเป็นเวลา 12 ชั่วโมง หากล้มเหลวหรือถูกขัดจังหวะจะรอเพียง 5 นาทีก่อนลองใหม่ กระบวนการทั้งหมดมีเวลาสูงสุด 30 วินาที ข้อผิดพลาดระบุขั้นตอนและเวลาที่ใช้ หากคำสั่งหลักล้มเหลวจะยกเลิกการต่ออายุทันที การเพิกถอนอุปกรณ์ที่ยังค้างอยู่ไม่ถูกจำกัดด้วยช่วงเวลาหลังสำเร็จ และมีเวลาของตัวเอง 4 วินาที ใช้
remote-cli seal renewเพื่อต่ออายุโดยตรง หลังเข้าสู่ระบบสำเร็จจะบังคับรีเฟรชหนึ่งครั้ง - Root client: ไคลเอ็นต์ผู้ดูแลระบบขั้นสูงที่เก็บเวิร์กสเปซรูทใช้การออกตามบทบาทในส่วนถัดไปเพื่อแทนที่การต่ออายุทั่วไปนี้เพื่อหลีกเลี่ยงการลงนามกลับการอนุญาตที่ถูกลบใหม่
- Manual: ยังคงใช้งานได้
remote-cli seal renew(ค่าเริ่มต้น--before 30 --days 90) กฎเดียวกันกับการต่ออายุอัตโนมัติ
# 按工作区用户名授权对方每一把已登记的钥匙,并发布到 Exchange(默认 90 天)
remote-cli seal grant --device lab-router --to alice --level view
# 只打印 token,不上传
remote-cli seal grant --device lab-router --operator-key <KEY> --no-publish
remote-cli seal keys # 工作区公钥目录
remote-cli seal sync # 拉取签给自己钥匙的 grant 并导入本地
remote-cli seal renew # 手动续签,默认 --before 30 --days 90
ผู้ดูแลระบบขั้นสูงของพื้นที่ทำงานคือรากฐานของความไว้วางใจ
รากของพื้นที่ทำงานคือคีย์ Ed25519 บนไคลเอ็นต์ผู้ดูแลระบบระดับพิเศษ อุปกรณ์จะเชื่อถือเฉพาะคีย์สาธารณะรูทนี้เท่านั้น และสามารถตรวจสอบการอนุญาต rsg1. ของรูทได้ตลอดสายใบรับรอง rsc1. ไคลเอนต์รูทจะออกและต่ออายุการอนุญาตสมาชิกโดยอัตโนมัติตามบทบาทของบัญชี Exchange ยังคงไม่น่าเชื่อถือ: จะบันทึกเฉพาะบันทึก root ของ rsr1. ที่ลงนามด้วยตนเอง, บันทึกการหมุนเวียน rsx1. และคำเชิญ rsi1. และตรวจสอบรูปแบบกับลายเซ็น Ed25519 โดยไม่ต้องตัดสินใจว่าใครเป็นผู้อนุมัติ Exchange ที่เป็นอันตรายสามารถระงับบันทึกหรือกรอกบัญชีรายชื่อด้วยสมาชิกปลอม มันไม่สามารถปลอมแปลงลายเซ็นรูตได้ การอนุมัติอัตโนมัติจะถูกเปิดใช้งานตามค่าเริ่มต้นใน CLI, Web และ Android และคีย์สาธารณะใหม่ในบัญชีรายชื่อจะถูกลงนามโดยตรงจากไคลเอ็นต์รูทเหล่านี้ เฉพาะเมื่อมีการปิดการอนุมัติอัตโนมัติอย่างชัดเจนเท่านั้น กุญแจสาธารณะใหม่ที่ไม่เคยได้รับการอนุมัติและไม่ได้รับการเผยแพร่โดยรูทนี้จะยังคงอยู่ในรายการที่รอดำเนินการ
รูปแบบความน่าเชื่อถือและการแลกเปลี่ยน
- กุญแจสาธารณะรูทได้รับการแก้ไขในการใช้งานครั้งแรก (TOFU) ** เมื่อไคลเอนต์เห็นบันทึกรูทที่ตรวจสอบแล้วเป็นครั้งแรก จะทำการแก้ไขกุญแจสาธารณะในเครื่อง CLI เขียน
seal-root.json(0600) ถัดจากconfig.tomlและคีย์คือ服务器|工作区 idเว็บ Console ใช้localStorage(remote.seal.root.<工作区 id>) Android Console ใช้ SecureStore (remote.seal.rootstateวางใน JSON เดียวกันโดยเซิร์ฟเวอร์และพื้นที่ทำงาน) จากนั้นตรวจสอบลายเซ็นตนเองและลายนิ้วมือทุกครั้ง หากคีย์สาธารณะรูทคงที่มีการเปลี่ยนแปลง จะมีการออกคำเตือนเสียงดัง ** ไคลเอนต์จะไม่เปลี่ยนรหัสผ่านโดยอัตโนมัติ (อุปกรณ์จะเปลี่ยนรหัสผ่านโดยอัตโนมัติตามบันทึกการหมุนrsx1.ดูด้านบน) หลังจากตรวจสอบลายนิ้วมือแล้ว ให้ดำเนินการremote-cli seal root --trust <key>อย่างชัดเจน หรือคลิก "เชื่อถือคีย์สาธารณะรูทใหม่" ในคอนโซล - **Invitation เปิดให้ลงทะเบียนเท่านั้น ** Root public key ออก
rsi1.(รหัสพื้นที่ทำงาน, root public key, nonce 16 ไบต์, เวลาหมดอายุ) ผู้ดูแลระบบ ผู้ปฏิบัติงาน และไคลเอนต์ที่มีบัญชีแบบอ่านอย่างเดียวจะดึงคำเชิญเมื่อเข้าสู่ระบบ ปฏิบัติตามคำสั่ง โหลดเพจ หรือเมื่อแอปพลิเคชันกลับสู่เบื้องหน้า ตรวจสอบลายเซ็นด้วยรหัสสาธารณะรูทคงที่ จากนั้นใช้POST /api/seal/keysดั้งเดิมเพื่อลงทะเบียนรหัสสาธารณะของผู้ปฏิบัติงาน คำเชิญไม่ใช่การอนุญาต - **ออกตามบทบาท อนุมัติคีย์ใหม่ภายในเครื่อง ** ไคลเอ็นต์ผู้ดูแลระบบระดับสูงซึ่งมีคีย์สาธารณะรูทอยู่ อ่าน
GET /api/seal/roster(ผู้ดูแลระบบระดับสูงเท่านั้น รวมถึงสมาชิกที่ปิดใช้งาน บทบาทoperator_device_grantsคีย์สาธารณะที่ลงทะเบียน) และสิทธิ์ที่เผยแพร่ของตนเอง และคำนวณการอนุญาตที่คาดหวัง กุญแจสาธารณะที่ลงทะเบียนเดียวกันจะใช้ช่วงชุดนี้ร่วมกัน:- ผู้ดูแลระบบขั้นสูงและผู้ดูแลระบบที่ไม่จำกัด:
manage* - ผู้ดูแลระบบที่ถูกจำกัด: ได้รับอนุญาตจากอุปกรณ์
can_manageคือmanageมิฉะนั้นview - ตัวดำเนินการที่ไม่จำกัด:
view*รวมถึงmanageสำหรับอุปกรณ์can_manageแต่ละตัว - ผู้ดำเนินการที่ถูกจำกัด: ต่อการตรวจสอบอุปกรณ์
manageหรือview - อ่านอย่างเดียวไม่จำกัด:
view* - จำกัดการอ่านอย่างเดียว:
viewต่ออุปกรณ์ที่ได้รับอนุญาต บัญชีแบบอ่านอย่างเดียวไม่สามารถใช้งานอุปกรณ์ได้ ดังนั้นแม้แต่can_manageก็จะไม่ถูกส่งmanage - สมาชิกผู้พิการ: ห้ามโพสต์
- ค่าเริ่มต้น 90 วัน ต่ออายุโดยเหลือเวลาน้อยกว่า 30 วัน
- ผู้ดูแลระบบขั้นสูงและผู้ดูแลระบบที่ไม่จำกัด:
- **Aใบรับรองระดับกลางของผู้ดูแลระบบ ** Root ไคลเอ็นต์ออก
rsc1.ให้กับผู้ดูแลระบบที่เปิดใช้งาน (manage,can_issue,max_path_lenคือ 0, 90 วัน) ขอบเขตอุปกรณ์ของผู้ดูแลระบบที่ไม่จำกัดคือ*ผู้ดูแลระบบแบบจำกัดคืออุปกรณ์ที่ได้รับการกำหนดให้can_manageต่ออายุเหลือเพียง 30 วันเท่านั้น จะไม่มีการออกใบรับรองสำหรับกุญแจสาธารณะใหม่ที่ยังไม่ได้รับการอนุมัติ เมื่อไคลเอ็นต์ของผู้ดูแลระบบถือใบรับรองระดับกลางที่ยังคงใช้ได้อยู่ ไคลเอ็นต์จะใช้คีย์ของตัวเองและสายโซ่นี้เพื่อออกการอนุญาตให้กับสมาชิกที่จัดการ และขอบเขตคือจุดตัดของใบรับรองและการมอบหมายอุปกรณ์ หากรูทยังมีสิทธิ์ใหม่ซึ่งครอบคลุมโอเปอเรเตอร์ อุปกรณ์ และระดับเดียวกันอยู่แล้ว (*ของรูทครอบคลุมอุปกรณ์เฉพาะmanageครอบคลุมview) ก็จะไม่เซ็นชื่ออีกต่อไป การเพิกถอนใบรับรองจาก Exchange จะหยุดการแจกจ่ายเพิ่มเติมเท่านั้น สำเนาที่มีอยู่แล้วในอุปกรณ์ยังคงใช้ได้จนกว่าจะหมดอายุ การเพิกถอนแบบถาวรอาศัยrevoked_keysในนโยบายด้านอุปกรณ์ - การอนุมัติอัตโนมัติเปิดอยู่ตามค่าเริ่มต้น ในเว็บ Console (
localStorage) และ Android Console (SecureStore) เมื่อบันทึกไม่มีฟิลด์นี้ จะถือว่าเปิดอยู่ (ขาด = เปิด) เฉพาะfalseที่ชัดเจนเท่านั้นที่ยังคงปิดอยู่ รายการที่ปิดไปแล้วจะไม่ถูกเปิดอีกครั้งตามตรรกะเริ่มต้น หลังจากเปิดแล้ว ไคลเอ็นต์รูทจะลงชื่อโดยตรงตามบัญชีรายชื่อ weaker: Exchange ที่ถูกบุกรุกสามารถแทรกสมาชิกปลอมและรับลายเซ็นได้ทันที สำเนาสวิตช์คือ "อนุมัติคีย์สาธารณะใหม่โดยอัตโนมัติ" CLI เปิดใช้งานตามค่าเริ่มต้นเช่นเดียวกับ Web/Android Console หากไม่มีไฟล์seal-approved.jsonหรือฟิลด์auto_approveจะถือว่าเปิดอยู่ ส่วน"auto_approve": falseที่ระบุไว้อย่างชัดเจนจะยังคงปิด ใช้remote-cli seal approve --no-auto-approveเพื่อปิด หรือremote-cli seal approve --auto-approveเพื่อเปิดอีกครั้ง โดยระบบจะบันทึกตัวเลือกนี้ หลังจากปิด คีย์ที่ไม่เคยได้รับการอนุมัติหรือเผยแพร่โดยคีย์สาธารณะรูทนี้จะเข้าสู่รายการที่รอดำเนินการในเครื่อง (CLIseal-approved.json, WeblocalStorage, Android SecureStore)remote-cli seal pendingแสดงชื่อผู้ใช้และลายนิ้วมือseal approve --allหรือseal approve <key>…จะออกทันทีเมื่อได้รับอนุมัติ สำหรับคีย์ที่ได้รับการอนุมัติ เช่นเดียวกับคีย์ที่ออกโดยคีย์สาธารณะรูทนี้ การต่ออายุและการเปลี่ยนแปลงบทบาทจะเสร็จสมบูรณ์โดยอัตโนมัติ การออกคีย์สาธารณะของลูกค้าไม่จำเป็นต้องได้รับการอนุมัติอีกครั้ง - **ลงชื่อเข้าใช้ทันทีที่คุณเปิดขึ้นมา ** ไคลเอ็นต์รูทจะถูกเซ็นชื่อทันทีเมื่อเว็บ Console เข้าสู่พื้นที่ทำงาน และ Android เปิด "End-to-End Encryption" รอบนี้ไม่ต้องควบคุมปริมาณ 12 ชั่วโมง การรีเฟรชอัตโนมัติหลังจากการเข้าพักเดิมยังคงถูกควบคุมปริมาณ การเปลี่ยนสวิตช์หรือการคลิก "อนุมัติ" จะบังคับให้คุณลงชื่อเข้าใช้อีกครั้ง
- **กล่องโต้ตอบบัญชี ป้ายสถานะ และบรรทัดความล้มเหลว ** สวิตช์เว็บ Console และรายการที่รอดำเนินการอยู่ในกล่องโต้ตอบ "บัญชี" บนหน้าอุปกรณ์ ("บัญชี" บนแถบเครื่องมือ) เมื่อมีคีย์ที่รอการอนุมัติ ป้าย "คีย์สาธารณะ N ที่รอการอนุมัติ" จะแสดงบนแถบเครื่องมือเดียวกัน คลิกป้ายเพื่อเปิดกล่องโต้ตอบนี้ เมื่อการเซ็นชื่อล้มเหลว จะมีบรรทัดสถานะในแถบเครื่องมือ: "การเซ็นชื่อรูทของพื้นที่ทำงานล้มเหลว:..." โทเค็นการปิดผนึกและวัสดุกุญแจแบบยาวจะถูกลบออกจากบรรทัดนี้ สวิตช์ Android ป้ายสถานะประโยคเดียวกัน และคำแนะนำความล้มเหลวในบรรทัดเดียวกันอยู่ที่หน้าการเข้ารหัสจากต้นทางถึงปลายทาง
- **Downgrade จะไม่เพิกถอนการอนุญาตเก่าบนอุปกรณ์ ** เมื่อสมาชิกถูกลบ ปิดใช้งาน หรือคีย์สาธารณะหายไปจากไดเร็กทอรี ให้ลบสิทธิ์ออกจาก Exchange หยุดการต่ออายุ และลองเขียน
revoked_keysบนอุปกรณ์ที่ออนไลน์และรองรับเซสชันที่ปิดผนึก เมื่อบทบาทถูกดาวน์เกรด จะมีการแลกเปลี่ยนเฉพาะสิทธิ์ใหม่เท่านั้น และคีย์จะไม่ถูกใส่ลงในrevoked_keysทุนเก่าที่นำเข้าบนอุปกรณ์ยังคงใช้ได้ก่อนหมดอายุ คีย์สาธารณะรูทจะไม่ถูกใส่ไว้ในรายการเพิกถอน การเพิกถอนที่ไม่เสร็จสิ้นภายในงบประมาณ 4 วินาทีจะถูกบันทึกไว้ในเครื่องและจะดำเนินการต่อด้วยคำสั่งถัดไป โดยไม่ต้องอยู่ภายใต้ขีดจำกัดการควบคุมปริมาณการออก 12 ชั่วโมง เมื่อคีย์กลายเป็นการอนุญาตที่ต้องการอีกครั้ง การเพิกถอนจะถูกเพิกถอนบนอุปกรณ์ที่ถูกเพิกถอนสำเร็จเท่านั้น - **Root บันทึกจะถูกสร้างขึ้นโดยอัตโนมัติ ** เมื่อบัญชีผู้ดูแลระบบขั้นสูงถูกสร้างขึ้น (
register/บัญชีแรกในพื้นที่ทำงาน) หรือการเข้าสู่ระบบผู้ดูแลระบบขั้นสูงในภายหลัง หากไม่มีบันทึกรากบน Exchange ไคลเอนต์ของผู้ดูแลระบบขั้นสูง (CLI / Web / Android) จะเผยแพร่คีย์ของตัวเองเป็นรูทในเครื่อง และส่งคำเชิญ 90 วันทันที หลังจากนั้น เมื่อคำเชิญหายไปหรือจะหมดอายุภายใน 30 วัน คำเชิญจะถูกรีเฟรชพร้อมกับการควบคุมการออกremote-cli seal root --publishยังคงสามารถดำเนินการได้ด้วยตนเอง
การตั้งค่าครั้งเดียว
- ผู้ดูแลระบบระดับสูงลงทะเบียนหรือล็อกอินเข้าสู่ไคลเอนต์ใดๆ: รูทจะถูกสร้างขึ้นและประกาศโดยอัตโนมัติ (CLI พิมพ์พรอมต์บน stderr; คอนโซลจะแสดงพรอมต์ขึ้นมา)
- เก็บคีย์ส่วนตัวของรูทไว้ (เลือกอย่างใดอย่างหนึ่งหรือทั้งสองอย่าง):
- เพียงเก็บไว้เองและไม่อัปโหลดอะไรเลย:
remote-cli seal root --export root.rsk(ไฟล์ 0600;-ส่งออกไปยัง stdout) หรือ "ส่งออกคีย์ส่วนตัวรูท" ในคอนโซล - การตั้งค่าการสำรองข้อมูลบนคลาวด์ด้วยตนเอง:
remote-cli seal backupหรือคอนโซล "Root Private Key Cloud Backup" รหัสผ่านสามารถเว้นว่างไว้ได้ แต่หากรหัสผ่านว่างเปล่าหรือคาดเดาง่ายเกินไป Exchange จะสามารถปลดล็อกคีย์ส่วนตัวรูทและควบคุมอุปกรณ์ทั้งหมดได้
- เพียงเก็บไว้เองและไม่อัปโหลดอะไรเลย:
- ตราบใดที่อุปกรณ์รองรับเซสชันที่ปิดผนึกและเชื่อมต่อกับ Exchange อุปกรณ์จะแก้ไขรูท (TOFU) โดยอัตโนมัติ แนวทางที่เชื่อถือได้มากขึ้นคือตั้งค่า
remote-agent seal root <根公钥>บนอุปกรณ์ก่อนออนไลน์ - สมาชิกใหม่จะลงทะเบียนคีย์สาธารณะของตนหลังจากเข้าสู่ระบบ การอนุมัติอัตโนมัติจะถูกเปิดใช้งานตามค่าเริ่มต้นใน CLI, Web และ Android และไคลเอนต์รูทจะลงนามโดยตรง หากการอนุมัติอัตโนมัติปิดอยู่: มุมมอง
remote-cli seal pending,remote-cli seal approve --all(หรือคอนโซล "อนุมัติ") จะออกทันทีหลังจากการอนุมัติ
remote-cli seal root # 显示已固定的根公钥和指纹
remote-cli seal root --export root.rsk # 导出根私钥(rsk1. 文本)
remote-cli seal root --import root.rsk # 在另一台机器装上根私钥(或 seal restore)
remote-cli seal root --rotate # 生成新根,旧根签 rsx1. 轮换,自动按新根重签成员授权
remote-cli seal invite # 单独刷新邀请(默认 90 天,--days N)
remote-cli seal pending
remote-cli seal approve --all # 或 seal approve <key>…;--no-auto-approve 关闭自动批准(保持开启较弱)
เปลี่ยนเป็นเครื่องอื่น/เปลี่ยนรูท
- ใช้รูทบนอุปกรณ์อื่น: หลังจากที่ผู้ดูแลระบบระดับสูงเข้าสู่ระบบแล้ว หากเครื่องไม่มีรูทที่เผยแพร่และมีการสำรองข้อมูลบนคลาวด์
rsb1.บน Exchange, CLI / Web / Android จะทำให้ ** พยายามกู้คืนโดยอัตโนมัติ** (ดู "การกู้คืนอัตโนมัติเมื่อเข้าสู่ระบบ") มิฉะนั้น ไคลเอนต์จะแจ้งให้นำเข้าด้วยตนเอง:seal root --import <文件|->วางrsk1.ในคอนโซล จากนั้น "นำเข้าคีย์ส่วนตัวรูท" หรือกู้คืนข้อมูลสำรองที่เข้ารหัสจาก Exchange (seal restore/ คอนโซล "กู้คืนจาก Exchange") สิ่งที่นำเข้าคือรูทปัจจุบัน และติดตั้งบนเครื่องท้องถิ่นเท่านั้นโดยไม่มีการเปลี่ยนแปลงบันทึกใดๆ - Rotation:
seal root --rotate(Console "สร้างรูทใหม่และหมุน") หรือนำเข้าคีย์rsk1.ที่เป็น ** แตกต่างจากรูทปัจจุบัน** เมื่อเครื่องโลคัลเก็บรูทปัจจุบันไว้ ไคลเอ็นต์จะใช้รูทเก่าเพื่อลงนามบันทึกการหมุนrsx1.ร่วมกับrsr1.PUT /api/seal/rootใหม่ Exchange จะพุชไปที่อุปกรณ์ออนไลน์ และอุปกรณ์จะตรวจสอบว่าการหมุนได้รับการลงนามโดยรูทคงที่ จากนั้นจึงเปลี่ยนเป็นรูทใหม่ และอุปกรณ์ออฟไลน์จะได้รับในครั้งถัดไปที่เชื่อมต่อ สมาชิกที่ได้รับอนุมัติโดยรูทเก่าจะถือว่าได้รับการอนุมัติบนเครื่องนี้ต่อไป จากนั้นการอนุญาตของสมาชิกทั้งหมดจะถูกลงนามอีกครั้งด้วยรูทใหม่ (90 วัน) โลคัลคีย์เก่ายังคงอยู่seal-identity.<毫秒>.previous.pk8โปรดส่งออกใหม่หรือสำรองข้อมูลรูทใหม่หลังจากการหมุนเวียน - ** รูทเก่าหายไป:** ไม่สามารถลงนามบันทึกการหมุนเวียนได้ ลูกค้าจะยังคงโฆษณารูทใหม่ แต่อุปกรณ์ที่มีการปักหมุดรูทเก่าจะไม่ยอมรับมัน ต้องดำเนินการ
remote-agent seal root <新根公钥>ในแต่ละอุปกรณ์ และ agent จะรีสตาร์ท - การส่งมอบผู้ดูแลระบบระดับสูง: โปรดดู "การส่งมอบผู้ดูแลระบบขั้นสูง = การส่งมอบใบรับรองหลัก" เพียงเปลี่ยนบทบาทของบัญชีไม่เพียงพอ อุปกรณ์จะเชื่อถือคีย์ส่วนตัวของรูท
กู้คืนคีย์ส่วนตัวรูทโดยอัตโนมัติเมื่อเข้าสู่ระบบ
หลังจากที่ผู้ดูแลระบบขั้นสูงเข้าสู่ระบบสำเร็จแล้ว ** ก่อนที่จะสร้างข้อมูลประจำตัวที่ปิดผนึกในเครื่อง**, CLI / Web Console / Android Console จะใช้ตารางการตัดสินใจเดียวกัน (Rust decide_auto_restore, JS decideAutoRestore) เพื่อพยายามกู้คืนรูทของเวิร์กสเปซที่เผยแพร่จากการสำรองข้อมูล Exchange rsb1.:
1.Skip: ไม่ใช่ผู้ดูแลระบบระดับสูง เครื่องมีคีย์เดียวกันกับรูทที่เผยแพร่อยู่แล้ว การสำรองข้อมูลบนคลาวด์ถูกปิด (CLI: REMOTE_SEAL_CLOUD_BACKUP=0; เว็บ: localStorage.seal.cloudBackup=off; Android: SecureStore remote.seal.cloudBackup=off); ไม่มีการเผยแพร่รูทบน Exchange
2.ดึงข้อมูลสำรอง: GET /api/seal/backup (จำกัดด้วยจำนวนครั้งต่อชั่วโมง) เมื่อไม่มีการสำรองข้อมูล ระบบจะแจ้งว่ารูทอยู่ที่อื่นและไม่บล็อกการเข้าสู่ระบบ
3.** พยายามเงียบด้วยรหัสผ่านว่างเปล่า:** ถอดรหัสด้วยสตริงว่างก่อน เมื่อดำเนินการสำเร็จและคีย์สาธารณะที่ถอดรหัสแล้วเท่ากับรูทที่เผยแพร่ และเครื่องไม่มีคีย์อื่น คีย์ดังกล่าวจะถูกโหลดลงในเครื่องและแก้ไขเป็นรูทของพื้นที่ทำงาน
4. Oมิฉะนั้นรหัสผ่านจะได้รับแจ้ง: CLI พยายามอีกครั้ง REMOTE_SEAL_BACKUP_PASSPHRASE อินพุตจะถูกซ่อนอยู่ใน TTY; Web/Android จะส่งเฉพาะคำแนะนำ non-blocking เท่านั้น โปรดป้อนรหัสผ่านบนหน้าซีลแล้วคลิก "กู้คืนจาก Exchange" กล่องโต้ตอบการบล็อกไม่ปรากฏขึ้นและการเข้าสู่ระบบจะเสร็จสมบูรณ์ตามปกติ
5.Security Boundary: ห้ามเขียนทับคีย์ที่ปิดผนึกอื่นที่มีอยู่แล้วในเครื่องนี้โดยไม่แจ้งให้ทราบ (การกู้คืนต้องใช้ seal restore --force หรือคอนโซลเพื่อยืนยัน) กุญแจสาธารณะที่ถอดรหัสจะต้องเท่ากับรูทที่เผยแพร่ จะมีการเตือนเฉพาะความล้มเหลวและการเข้าสู่ระบบจะไม่เกิดขึ้น รหัสผ่าน เมล็ดพืช หรือข้อความเข้ารหัส rsb1. จะไม่ถูกพิมพ์
6.คำเตือนความเสี่ยง (ไม่ปิดกั้น): หลังจากติดตั้งรูทแล้ว ระบบจะแจ้ง "เครื่องหลายเครื่องที่ยึดรูทไว้จะเพิ่มความเสี่ยงของการรั่วไหล"; หากปลดล็อครหัสผ่านที่ว่างเปล่าสำเร็จ ระบบจะแจ้งว่า Exchange สามารถปลดล็อคคีย์ส่วนตัวรูทได้
การส่งมอบผู้ดูแลระบบระดับสูง = การส่งมอบรูทคีย์
บทบาทของบัญชีผู้ดูแลระบบขั้นสูงและรูทพื้นที่ทำงานที่อุปกรณ์ไว้วางใจจะแยกจากกัน การโอนบทบาทเพียงอย่างเดียวไม่ได้ทำให้ผู้ดูแลระบบระดับสูงคนใหม่ได้รับคีย์ส่วนตัวรูทหรือความน่าเชื่อถือของอุปกรณ์ การโอนย้ายจะถ่ายโอนคีย์ส่วนตัว root ตามด้วยการหมุนเวียนทันทีเพื่อทำให้คีย์ที่ถ่ายโอนเป็นโมฆะ
- ผู้ดูแลระบบขั้นสูงปัจจุบันเริ่มต้นการถ่ายโอนในขณะที่ไคลเอ็นต์ภายในเครื่องเก็บ root ที่เผยแพร่:
POST /api/superadmin/transferโดยมีเนื้อความ{operator_id, root_handover?}root_handoverเป็นแพ็คเกจrsb1.ที่เข้ารหัสด้วยข้อความรหัสผ่าน โดยใช้อัลกอริธึมการสำรองข้อมูลบนคลาวด์ (Argon2id, 64 MiB, t=3, p=1 และ ChaCha20-Poly1305) ข้อความรหัสผ่านอาจว่างเปล่า CLI:remote-cli seal handover <账号>. เมื่อถ่ายโอนบทบาทผู้ดูแลระบบขั้นสูงใน Web/Android Console ไคลเอ็นต์ที่ถือคีย์ส่วนตัว root จะพร้อมท์ให้ใส่ข้อความรหัสผ่านเผื่อเลือกและรวมแพ็คเกจนี้ด้วย - Exchange ** บันทึกเท่านั้น ไม่ใช่ถอดรหัส** จะตรวจสอบว่าคำนำหน้าคือ
rsb1.หรือrsk1.ยาวไม่เกิน 16384 และประกอบด้วยอักขระที่ปลอดภัยต่อ URL แบบ ASCII เท่านั้น เมื่อไม่มีroot_handoverในคำขอ ให้ลบแพ็คเกจการส่งมอบที่เหลือของเวิร์กสเปซ - ผู้ดูแลระบบขั้นสูงคนใหม่
GET /api/superadmin/handoverดึงข้อมูล{blob, from_operator, created_at}(หากไม่ใช่ 404) ปลดล็อกด้วยรหัสผ่าน ติดตั้งลงในเครื่องภายในเครื่อง จากนั้นดำเนินการหมุนเวียนแบบเดียวกับ "สร้างรูทใหม่และหมุน": รูทเก่าออกปัญหาrsx1.และเผยแพร่รูทใหม่ ในที่สุดDELETE /api/superadmin/handoverCLI:remote-cli seal accept-handover. หน้าประทับตราของคอนโซลจะแสดง "รับการส่งมอบคีย์ส่วนตัวของรูท" เมื่อมีแพ็คเกจการส่งมอบ - **Rotation ทำให้สำเนาเก่าไม่ถูกต้อง ** สิ่งที่ส่งมอบคือรูทก่อนการหมุน อุปกรณ์ออนไลน์จะสลับไปใช้รูทใหม่ก็ต่อเมื่อมีการลงนามบันทึกการหมุนโดยรูทเก่าที่พวกเขาเชื่อถืออยู่แล้ว คีย์ส่วนตัวเก่าที่อยู่ในมือของรุ่นก่อนไม่สามารถลงนามในการอนุญาตรูทใหม่ได้ และไม่สามารถเปลี่ยนรูทของอุปกรณ์ที่ถูกแปลงได้ ก่อนที่การหมุนจะเสร็จสิ้น รหัสผ่านว่างหรือรหัสผ่านที่ไม่รัดกุม
rsb1.ยังสามารถปลดล็อคได้ กรุณาส่งรหัสผ่านแยกต่างหาก
นอกแบนด์: เมื่อคุณไม่ต้องการใส่ไซเฟอร์เท็กซ์ลงใน Exchange ให้ใช้ remote-cli seal handover <账号> --out-of-band สำหรับ CLI เอาต์พุตมาตรฐานมี rsb1. เพียงบรรทัดเดียว และคำขอถ่ายโอนไม่มี root_handover ให้บรรทัดและรหัสผ่านนี้แก่อีกฝ่ายผ่านช่องทางอื่น และอีกฝ่ายจะดำเนินการ remote-cli seal accept-handover <那一行> คลิกยกเลิกบนพร้อมท์รหัสผ่านในคอนโซล (Android จะโอนบัญชีเท่านั้น) นอกจากนี้ยังถ่ายโอนบทบาทเท่านั้นและไม่ได้อัปโหลดคีย์ส่วนตัวของรูท ยังคงต้องส่งมอบคีย์ส่วนตัวรูทแยกต่างหาก (ส่งออก rsk1. หรือ rsb1. นอกแบนด์)
การจับมือและรูปแบบเส้น
CLI Exchange agent
│ open_sealed{session_id, │ │
│ device_id, hello} │──sealed_open{session_id,hello}▶│ 验证 hello 签名、授权 → 级别
│ │◀─sealed_accept{session_id, │
│◀─sealed_accept (原样转发) ──│ accept} │
│ 验证设备签名 + pin │ │
│ sealed_input{packet} ─────▶│──sealed_input────────────────▶│ 解密、校验级别、执行
│ 二进制帧 kind=4 (PTY 键入)─▶│── 只改写帧头编号 ─────────────▶│
│◀── sealed_event{packet,last}│◀── sealed_event ──────────────│ 所有输出在出站队列加密
│◀── 二进制帧 kind=4 ─────────│◀── 二进制帧 kind=4 ───────────│
hello={v, operator_key, operator_ephemeral, nonce, grant?, sig}ลายเซ็นครอบคลุม["remote-seal-v1/hello", v, device_id, operator_key, operator_ephemeral, nonce, grant.sig|""](อาร์เรย์ JSON เช่น ไบต์แบบบัญญัติ)- ลายเซ็นรากบันทึก
rsr1.ครอบคลุม["remote-seal-v1/workspace-root", v, workspace_id, root_key, issued_at_ms]; การหมุนrsx1.={v, workspace_id, old_root, new_root, issued_at_ms, sig}ลงนามโดยold_rootบน["remote-seal-v1/root-rotation", v, workspace_id, old_root, new_root, issued_at_ms]Exchange → agent:{"type":"seal_root","token":"rsr1.…","rotation":"rsx1.…"?}(ยอมรับเฉพาะข้อความควบคุมข้อความที่ชัดเจนจาก Exchange ซึ่งไม่ถูกต้องในช่องสัญญาณ) accept={v, device_key, device_ephemeral, nonce, level, sig}ลายเซ็นครอบคลุม["remote-seal-v1/accept", v, device_id, operator_key, operator_ephemeral, hello.nonce, hello.sig, device_key, device_ephemeral, nonce, level]Exchange ที่เปลี่ยนเป็นlevelจะทำให้ลายเซ็นใช้ไม่ได้- คีย์เซสชัน:
salt = SHA256(accept 签名字节),PRK = HKDF-Extract(salt, X25519(o, b)),K_od = Expand("remote-seal-v1/operator_to_device"),K_do = Expand("remote-seal-v1/device_to_operator") - AEAD: ChaCha20-Poly1305, AAD =
remote-seal-v1, nonce = ไบต์ของช่องสัญญาณ (0 ข้อความ / 1 ไบนารี่) ‖ สามศูนย์ไบต์ ‖ ตัวนับu64(ปลายใหญ่) ตัวนับในแต่ละทิศทางและแต่ละช่องจะเพิ่มขึ้นอย่างเข้มงวดหนึ่งจาก 0; ความคลาดเคลื่อนใดๆ จะปิดเซสชันโดยตรง - ข้อความ:
{"counter":n,"ciphertext":"<base64>"}. ข้อความที่ชัดเจนคือ JSON: โอเปอเรเตอร์ → อุปกรณ์คือSealedRequest(ข้อความDeviceDownที่มีอยู่ หรือข้อความการจัดการรูทseal_policy_get/seal_policy_set {mode?, root_key?, revoke?, unrevoke?}) อุปกรณ์ → โอเปอเรเตอร์คือSealedResponse(ข้อความDeviceUpที่มีอยู่หรือseal_policy) เลเยอร์ด้านในsession_idถูกเขียนใหม่เป็นหมายเลขช่องสัญญาณโดย agent - เฟรมไบนารี่:
StreamKind::Sealed = 4, เพย์โหลด =counter(u64 BE) ‖ AEAD(inner_kind ‖ bytes),inner_kindคือ 1/2/3 (stdout/stderr/PTY) - แต่ละเซสชันที่ปิดผนึกมีการดำเนินการ one (หนึ่ง exec, หนึ่ง PTY, หนึ่งการถ่ายโอนไฟล์...) ตามโมเดลเซสชัน 1:1 ข้อความการยุติถูกเข้ารหัสโดย agent และทำเครื่องหมาย
last:trueในเลเยอร์ด้านนอก Exchange เผยแพร่การตรวจสอบการกำหนดเส้นทางและทดแทนข้อมูลตามลำดับ โดยไม่จำเป็นต้องเข้าใจเนื้อหา close_session→sealed_close{detach:false}(สิ้นสุด); การตัดการเชื่อมต่อการทำงานและการบำรุงรักษา →sealed_close{detach:true}(ตัดสินโดย agent: ให้กด exec ค้างไว้เท่านั้น ถอดออก, ยุติอื่นๆ)- ขนาดสูงสุด: ประมาณ 2.8 MiB สำหรับ ciphertext base64 (รองรับภาพหน้าจอ 2 MiB Android) บรรจุภัณฑ์ด้านนอก
MAX_SEALED_WIRE
บรรทัดการป้องกันฝั่ง Agent: ข้อความธรรมดาที่เป็นของหมายเลขเซสชันที่ปิดผนึกในคิวขาออกจะถูกเข้ารหัสหรือละทิ้งเท่านั้น และหมายเลขจะถูกแยกออกอย่างถาวรหลังจากเซสชันสิ้นสุด (เอาต์พุตล่าช้าของกระบวนการระงับจะถูกยกเลิก แทนที่จะถูกส่งในรูปแบบข้อความธรรมดา) งานการระงับที่เริ่มต้น/แนบผ่านเซสชันที่ปิดผนึกจะไม่ปรากฏในรายการของเส้นทางเก่า และไม่สามารถแนบ/หาง/แมว/ฆ่าโดยเส้นทางเก่าได้
ส่งออกและสำรองข้อมูลคีย์ส่วนตัวรูท
คีย์ส่วนตัวรูทสามารถควบคุมอุปกรณ์ทั้งหมดในพื้นที่ทำงาน วิธีการจัดเก็บข้อมูลถูกกำหนดโดยผู้ดูแลระบบขั้นสูง Console จะอัปโหลดการสำรองข้อมูลข้อความรหัสผ่านว่างตามค่าเริ่มต้น ลบออกเพื่อปิดการใช้งานการบันทึกอัตโนมัติ:
- **Export (ไม่มีการอัปโหลด): **
rsk1.+ base64url (ไม่มีช่องว่างภายใน) เมล็ด 32 ไบต์ CLIseal root --export FILE|-(ไฟล์ 0600), คอนโซล "ส่งออกคีย์ส่วนตัวของรูท" (เว็บจะแสดงในกล่องอินพุต Android จะถูกคัดลอกไปยังคลิปบอร์ด) ใครก็ตามที่ได้รับมันสามารถควบคุมอุปกรณ์ทั้งหมดได้ - **Eเข้ารหัสการสำรองข้อมูลไปยัง Exchange (อัตโนมัติใน Console, คู่มือใน CLI): ** เฉพาะผู้ดูแลระบบระดับสูงเท่านั้นที่สามารถอัปโหลดได้หากโลคัลคีย์เป็นรูทที่เผยแพร่ ไซเฟอร์เท็กซ์เป็นโทเค็น
rsb1.เวอร์ชัน (JSON ที่เข้ารหัส base64url สูงสุด 4,096 อักขระ) คีย์ได้มาจากรหัสผ่านโดย Argon2id และพารามิเตอร์การผลิตได้รับการแก้ไขที่หน่วยความจำ 64 MiB การวนซ้ำ 3 และความขนาน 1 ซึ่งเขียนในโทเค็น Salt คือ 16 ไบต์ nonce ของ ChaCha20-Poly1305 คือ 12 ไบต์ และสร้างขึ้นแบบสุ่มสำหรับการสำรองข้อมูลแต่ละครั้ง ข้อมูลการรับรองความถูกต้องเพิ่มเติมคือremote-seal-v1/key-backup:{version}:{public_key}หากเวอร์ชัน คีย์สาธารณะ หรือข้อความเข้ารหัสมีการเปลี่ยนแปลง การตรวจสอบจะล้มเหลว หลังจากปลดล็อคแล้ว จะต้องตรวจสอบว่ากุญแจสาธารณะที่ได้มาจาก Seed นั้นเท่ากับกุญแจสาธารณะในโทเค็น ตัวถอดรหัสจะปฏิเสธพารามิเตอร์ที่อ่อนแอเกินไปหรือใหญ่เกินไปก่อนที่จะรัน Argon2 (หน่วยความจำ 8 KiB–256 MiB, การถอดรหัสการผลิตอย่างน้อย 64 MiB; การวนซ้ำ 1–8, การผลิตอย่างน้อย 3; ความขนานสามารถมีได้เพียง 1 เท่านั้น) - **รหัสผ่านเป็นทางเลือก ไม่บังคับความเข้มงวด ** รหัสผ่านที่ว่างเปล่ายังใช้ Argon2id (รหัสผ่านเป็นสตริงว่าง) และรูปแบบก็เหมือนกัน ลูกค้าแจ้งเท่านั้น: เมื่อรหัสผ่านว่างเปล่าหรืออ่อนแอ (น้อยกว่า 12 ตัวอักษร, หมวดหมู่อักขระน้อยเกินไป, ซ้ำ, รหัสผ่านทั่วไป), CLI / เว็บ / Android จะเตือนอย่างชัดเจน: **Exchange (หรือบุคคลที่สามารถอ่านฐานข้อมูลได้) สามารถปลดล็อคคีย์ส่วนตัวรูทและควบคุมอุปกรณ์ทั้งหมด ** Rust และ JavaScript ใช้ ชุดกฎพร้อมท์เดียวกันและเวกเตอร์ทดสอบชุดเดียวกัน (รวมถึงเวกเตอร์รหัสผ่านว่างเปล่า)
PUT / GET / DELETE /api/seal/backup ให้บริการเฉพาะบัญชีเข้าสู่ระบบปัจจุบันเท่านั้น PUT และ GET อนุญาตเฉพาะผู้ดูแลระบบระดับสูงเท่านั้น เนื้อหาคำขอคือ {blob} Exchange ตรวจสอบคำนำหน้าและความยาว rsb1. และไม่เคยถอดรหัส GET แต่ละบัญชี แต่ละกระบวนการ สูงสุด 5 ครั้งต่อชั่วโมง หากเกิน จะส่งกลับ 429; สิ่งนี้จะทำให้การคาดเดาออนไลน์ช้าลงเท่านั้น และรหัสผ่านที่ไม่รัดกุมสามารถหมดลงแบบออฟไลน์ได้หลังจากที่คัดลอกไลบรารีแล้ว การอ่าน การเขียน และการลบจะถูกตรวจสอบ และรายละเอียดเป็นเพียงจำนวนไบต์เท่านั้น
- CLI:
remote-cli seal backup(ซ่อนการป้อนรหัสผ่านสองครั้ง คุณสามารถป้อนและปล่อยว่างไว้ได้โดยตรง หรือ--passphrase-stdin)remote-cli seal restore(เพิ่ม--forceเมื่อมีคีย์อื่น และเก็บคีย์เก่าไว้เป็นseal-identity.<毫秒>.previous.pk8) หลังจากการกู้คืน ให้แก้ไขเป็นรูทเวิร์กสเปซของเครื่อง นอกจากนี้ จะมีการพยายามกู้คืนโดยอัตโนมัติเมื่อเข้าสู่ระบบ (ดูหัวข้อก่อนหน้า) อย่าพิมพ์คีย์ส่วนตัว รหัสผ่าน หรือข้อความเข้ารหัส - เว็บ Console: คีย์ส่วนตัวรูทจะต้องสามารถส่งออกได้ เมื่อผู้ดูแลระบบระดับสูงสร้างรูท เบราว์เซอร์ที่เก็บคีย์ WebCrypto ที่ไม่สามารถส่งออกได้จะใช้เมล็ดพันธุ์ในเครื่องใน IndexedDB เป็นรูทแทน บูตสแตรปเข้าสู่ระบบจะดำเนินการต่อโดยอัตโนมัติก่อนที่จะสร้างข้อมูลประจำตัว
localStorage.seal.cloudBackup=offสามารถปิดได้ - Android Console: เมล็ดอยู่ในร้านค้าที่ปลอดภัยสำหรับงานแสดงสินค้า
bootstrapSealจะกู้คืนโดยอัตโนมัติก่อนเช่นกันremote.seal.cloudBackup=offสามารถปิดได้
ใช้
remote-cli seal show # 生成/显示本机操作员公钥与指纹
remote-cli exec lab-router -- uname -a
remote-cli shell lab-router
remote-cli seal policy lab-router # 根:查看设备授权与吊销策略
# 根给同事手动授权(通常不需要:根客户端按角色自动签发)(默认 90 天;对方已登录的客户端会自动登记公钥)
remote-cli seal grant --device lab-router --to alice --level view
# 或仍用公钥;--no-publish 只打印 token
remote-cli seal grant --device lab-router --operator-key <KEY> --level view --no-publish
# 手动续签即将到期的已发布授权(默认 --before 30 --days 90;上线时也会自动续签)
remote-cli seal renew
# 同事:拉取 Exchange 上签给自己的授权(登录后也会自动 sync)
remote-cli seal sync
# 仍可手动导入
remote-cli seal import-grant rsg1.xxxxx
# 根私钥:导出(不上传)或可选的加密云端备份
remote-cli seal root --export root.rsk
remote-cli seal backup
remote-cli seal restore # 已有不同钥匙时加 --force
# 带外固定设备指纹(在设备上 `remote-agent seal show`)
remote-cli seal trust-device lab-router <DEVICE_KEY>
Web Console / Android Console: การทำงานของอุปกรณ์ทั้งหมดใช้เซสชันที่ปิดผนึกดั้งเดิม: คำสั่ง, Hold List/kill/tail/cat, เทอร์มินัล, ไฟล์, ภาพหน้าจอและอินพุต (Android/เดสก์ท็อป), โครงสร้างอินเทอร์เฟซ, เซ็นเซอร์, ubus, บันทึกระบบ และ การอัปเดตตัวเองทั้งหมดต้องผ่านอุโมงค์ที่ปิดสนิท "🔒 การเข้ารหัสจากต้นทางถึงปลายทาง" ปรากฏบนหน้า รายละเอียดอุปกรณ์เว็บหรือการตั้งค่า Android → แผง "การเข้ารหัสจากต้นทางถึงปลายทาง" เทียบเท่ากับ CLI: แสดงคีย์สาธารณะ/ลายนิ้วมือในเครื่อง, รูทพื้นที่ทำงาน (ผู้ดูแลระบบขั้นสูง: ส่งออก/นำเข้า/หมุนคีย์ส่วนตัวรูท, รับการส่งมอบคีย์ส่วนตัวรูท, อนุมัติคีย์สาธารณะใหม่), ดู/แก้ไขคีย์อุปกรณ์และนโยบายการเพิกถอน (ต้องใช้รูท), การอนุญาตปัญหา (โทเค็นเอาท์พุต rsg1., CLI สามารถทำได้โดยตรง seal import-grant) การอนุญาตการนำเข้า รหัสสาธารณะของอุปกรณ์ที่เชื่อถือได้ และการสำรองข้อมูลบนคลาวด์อัตโนมัติของคีย์ส่วนตัวรูท (รหัสผ่านสามารถเว้นว่างได้ และ Exchange จะได้รับคำเตือนอย่างชัดเจนหากรหัสผ่านไม่รัดกุมและสามารถปลดล็อคได้) เมื่อเชื่อมต่อกับลายนิ้วมือของอุปกรณ์แบบคงที่ (TOFU) เป็นครั้งแรก การเปลี่ยนแปลงลายนิ้วมือในภายหลังจะถูกปฏิเสธโดยตรงและขอให้ตรวจสอบ สมาชิกสามัญจะมีปุ่มที่แตกต่างกันสามปุ่มบน CLI เบราว์เซอร์ และโทรศัพท์มือถือ หลังจากการลงทะเบียนแต่ละครั้ง ไคลเอนต์รูทจะออกให้ตามบทบาทของพวกเขา หากผู้ดูแลระบบขั้นสูงต้องการรูทบนอุปกรณ์หลายเครื่อง เขาหรือเธอสามารถอัปโหลดการสำรองรหัสผ่านและกู้คืนข้อมูลโดยอัตโนมัติเมื่อเข้าสู่ระบบในอุปกรณ์ใหม่ หรือนำเข้าคีย์ส่วนตัวรูทลงในแต่ละอุปกรณ์
บนอุปกรณ์: remote-agent seal show | root <key> | forget-root | revoke <key> (รีสตาร์ท agent หลังจากการเปลี่ยนแปลงในเครื่อง การเปลี่ยนแปลงผ่านเซสชัน seal policy ที่ปิดผนึกจะมีผลทันที)
พฤติกรรมเริ่มต้น
| ขอบเขต | พฤติกรรมปัจจุบัน |
|---|---|
| CLI, เว็บ Console, Android Console | การทำงานของอุปกรณ์ทั้งหมดใช้เซสชันที่ปิดสนิท โดยไม่มีสวิตช์ปิดใช้หรือการใช้ข้อความธรรมดาสำรอง |
| นโยบายท้องถิ่นของอุปกรณ์ | ทุกค่านโยบาย รวมถึง allow จะปฏิเสธการดำเนินการกับข้อความธรรมดา |
- อุปกรณ์ใหม่ปักหมุดรูทพื้นที่ทำงานในการเชื่อมต่อกับ Exchange (TOFU) รูทและสิทธิ์ที่ลงนามแล้วอนุญาตการดำเนินการ หาก Exchange อาจไม่น่าเชื่อถือในการเชื่อมต่อครั้งแรก ให้เรียกใช้
remote-agent seal root <key>ในเครื่องก่อนที่จะนำอุปกรณ์ออนไลน์ - คีย์ข้อมูลประจำตัวที่ไม่พร้อมใช้งานหรือนโยบายที่เสียหายล้มเหลวในการปิด ซ่อมแซมคีย์และนโยบายในเครื่องก่อนเชื่อมต่อใหม่