เก็บคีย์เทรดและ secret ของแอปไว้นอกดิสก์ของเซิร์ฟเวอร์
erpc worker เก็บคีย์เทรดและ secret ของแอปไว้ใน 1Password, พวงกุญแจของคุณ หรือ keystore ที่เข้ารหัส และส่งให้แอปในหน่วยความจำ โดยไม่ส่งลงดิสก์ของเซิร์ฟเวอร์เลยหน้านี้อธิบาย ERPC CLI
v0.1.0-rc.4 ซึ่งเป็นเวอร์ชัน pre-releaseคีย์เทรดไปถึงแอปอย่างไร
แอปที่มี wallet จะได้รับคีย์ทาง pipe เมื่อแอปเริ่มทำงาน บนเซิร์ฟเวอร์ไม่มี
wallet.json ไม่มี .env และไม่มีสำเนาใด ๆ erpc ไม่เขียนคีย์ลงดิสก์ใดโดยไม่เข้ารหัส: ไฟล์เดียวที่ erpc เก็บคีย์ไว้คือไฟล์ของ keystore บนเครื่องของคุณ ซึ่งเข้ารหัสด้วยวลีรหัสผ่านของคุณ- ที่เก็บ:
erpc worker key newสร้างคีย์ใน 1Password เมื่อerpc loginเก็บเซสชันไว้ที่นั่น มิฉะนั้นจะสร้างในพวงกุญแจ หรือไม่เช่นนั้นก็สร้างใน keystore ส่วนerpc.tomlจะบันทึกการอ้างอิงของคีย์และคีย์สาธารณะของคีย์นั้น - บนเซิร์ฟเวอร์: เอเจนต์ของ erpc worker เก็บคีย์ไว้ในหน่วยความจำเท่านั้น เอเจนต์ทำให้ตัวเอง dump ไม่ได้และล็อกหน่วยความจำของตัวเอง แล้วส่งคีย์ให้แอปทาง file descriptor จากนั้นแอปจะล้างคีย์ทิ้งหลังอ่าน
- หลังรีบูต worker จะกลับมาในสถานะถูกล็อก: แอปจะไม่รันจนกว่า
erpc worker startจะส่งคีย์อีกครั้ง เอเจนต์ที่ล้มเหลวหรือถูก kill จะถูก systemd เริ่มใหม่ และกลับมาในสถานะถูกล็อกในแบบเดียวกัน - การอัปเดต package ไม่รีสตาร์ท worker
deployสั่งให้needrestartไม่แตะ unit ของ worker: ในโหมดอัตโนมัติ เครื่องมือนี้จะเลื่อน unit เหล่านี้ออกไป และเมื่อถามในเทอร์มินัล คำตอบเริ่มต้นสำหรับ unit เหล่านี้คือ no ดังนั้นการอัปเดตด้านความปลอดภัยที่ทำโดยไม่มีคนดูแลจะไม่รีสตาร์ทแอป เมื่อเขียนกฎนั้นไม่ได้ การ deploy จะแจ้งให้ทราบแล้วทำงานต่อ และ worker จะรันโดยไม่มีการป้องกันนี้
คีย์เทรดถูกระบุโดย
[wallet] และไม่มีสิ่งอื่นระบุ และ erpc จะอ่านคีย์นี้เฉพาะเมื่อมีคนอยู่ที่เทอร์มินัลเท่านั้น: ไม่อ่านให้เครื่องมือ AI และไม่อ่านด้วย service account ของ 1Password บรรทัดใน [secrets] ที่ระบุการอ้างอิงของ [wallet] หรือบัญชี keychain: หรือ keystore: ที่ลงท้ายด้วย .wallet จะถูกปฏิเสธ ใน keystore รายการที่เก็บไว้เป็นคีย์จะไม่เปิดออกมาเป็น secret ส่วนใน 1Password และภายใต้บัญชีของพวงกุญแจที่ใช้ชื่ออื่น ไม่มีสิ่งใดระบุว่าเป็นคีย์: erpc.toml ที่ไม่มี [wallet] แต่ระบุรายการดังกล่าวไว้ใต้ [secrets] จะทำให้รายการนั้นถูกอ่านเป็น secretเลือกที่เก็บค่า
การใช้ 1Password ไม่ใช่ข้อบังคับ
erpc worker key new และ erpc worker secret put จะเก็บสิ่งที่ได้รับไว้ในที่เก็บแรกที่ใช้ได้จากรายการต่อไปนี้ เว้นแต่ --store จะระบุไว้ (--store 1password --vault <id>, --store keychain, --store keystore):- 1Password เมื่อ
erpc loginเก็บเซสชันไว้ที่นั่น หรือเมื่อระบุ--vault - พวงกุญแจของ OS ในระบบที่พวงกุญแจเก็บค่าไว้ได้หลังรีบูต: macOS, Windows และ Linux ที่มี keyring ของเดสก์ท็อปในเซสชันที่เข้าสู่ระบบอยู่
- keystore ของ erpc บนเครื่อง Linux ที่ไม่มี keyring แบบนั้น ได้แก่ เซิร์ฟเวอร์แบบ headless, WSL หรือการเข้าสู่ระบบผ่าน SSH ส่วน
--store keychainบนเครื่องแบบนี้จะถูกปฏิเสธ
ในพวงกุญแจหรือ keystore คีย์จะมีอยู่บนเครื่องนั้นเครื่องเดียวเท่านั้น โดยไม่มีสำเนาและไม่มีการซิงก์ และเครื่องอื่นจะอ่านการอ้างอิง
keychain: หรือ keystore: ไม่ได้หากเครื่องสูญหายหรือถูกล้างข้อมูล wallet ก็จะหายไปด้วย: เก็บไว้ใน wallet เพียงเล็กน้อย หรือใช้ 1Password ซึ่งทุกเครื่องที่ลงชื่อเข้าใช้ vault อ่านได้ ลงชื่อเข้าใช้ 1Password ด้วย
erpc login --store 1password-desktop หรือผ่าน op signin ในที่ที่ไม่มีแอปเดสก์ท็อปservice account ของ 1Password เก็บ secret ของแอปได้ แต่ erpc จะไม่อ่านคีย์เทรดด้วย service account เมื่อใช้ 1Password การอ่านแต่ละครั้งอาจแสดงหน้าต่างขอการอนุมัติในแอป และ erpc จะแสดง spinner ระหว่างรอ
เก็บ secret
secret เช่น API token และ RPC key จะถูกเก็บด้วยวิธีเดียวกัน แต่ไปถึงแอปในรูปของตัวแปรสภาพแวดล้อม ไม่ใช่ทาง pipe
erpc worker secret put <NAME> จะเก็บค่า และ [secrets] ใน erpc.toml จะเก็บเฉพาะการอ้างอิงของค่านั้นbash
--generateสร้างค่าให้: ไบต์สุ่ม 32 ไบต์ ในรูปอักขระเลขฐานสิบหก 64 ตัว--from-accountเก็บ RPC key ตัวแรกในบัญชีของคุณที่ shared RPC ยอมรับ โดยจะลองคีย์ตามลำดับ เริ่มจากคีย์หลัก ด้วยgetHealthคีย์ละหนึ่งครั้ง และให้เวลาตอบ 8 วินาที คีย์ที่ได้รับคำตอบ 401 หรือ 403 จะถูกปฏิเสธแล้วลองคีย์ถัดไป และจะเก็บเฉพาะคีย์ที่ RPC ยอมรับเท่านั้น คำสั่งจะแจ้งว่าเป็นคีย์หลักของบัญชีหรือคีย์อื่น (account_keyเมื่อใช้--json)- ค่าทั้งสองแบบจะไม่ถูกแสดงออกมา แม้ใช้
--jsonก็ตาม การใช้ keystore ครั้งแรก หรือ keystore ที่ถูกล็อก ต้องมีคนอยู่ที่เทอร์มินัล - การลองคีย์ทำจากเครื่องนี้ ดังนั้นคีย์ที่จำกัดไว้เฉพาะที่อยู่ของเซิร์ฟเวอร์จะถูกปฏิเสธที่นี่ แม้จะใช้ได้บนเซิร์ฟเวอร์ก็ตาม เมื่อทุกคีย์ถูกปฏิเสธ
--from-accountจะไม่เก็บอะไรเลย และให้คุณเก็บคีย์ที่ต้องการเอง โดยพิมพ์แบบไม่แสดงบนจอ หรือส่งเข้ามาทาง pipe เมื่อถาม RPC ไม่ได้ คำสั่งจะไม่เก็บอะไรเลย และerpc.tomlจะยังเหมือนเดิม ให้รันคำสั่งเดิมอีกครั้ง
วิธีเก็บคีย์ด้วยตนเอง:
bash
--replaceเก็บค่าใหม่สำหรับชื่อที่ตั้งไว้แล้ว ส่วนerpc worker secret listแสดงรายการการตั้งค่าที่เป็น secret ตามชื่อ และที่เก็บของแต่ละรายการ- การตั้งค่าที่สายข้อมูลให้มา (
GRPC_ENDPOINT,SHREDS_ENDPOINT,SOLANA_SEND_RPC_ENDPOINT) ไม่ถือเป็น secret ในทุกกรณี:--grpc,--shredsและ--unlimitedจะตั้งค่าเหล่านี้
การอ้างอิงใน
[secrets] หรือ [wallet] เป็นแบบใดแบบหนึ่งต่อไปนี้:keystore
keystore คือไดเรกทอรี
~/.erpc/keystore (keystore ภายใต้ ERPC_HOME เมื่อตั้งค่าไว้) บน Linux และ macOS ไดเรกทอรีของ keystore มีสิทธิ์ 0700 และไฟล์มีสิทธิ์ 0600 ส่วนบน Windows erpc ไม่ได้ตั้งสิทธิ์ใด ๆ เองmaster.jsonเก็บ master key แบบสุ่มขนาด 32 ไบต์ ซึ่งถูกปิดผนึกด้วยคีย์ที่ PBKDF2-HMAC-SHA256 (600,000 รอบ) สร้างจากวลีรหัสผ่านของคุณ แต่ละรายการเก็บค่าหนึ่งค่า ซึ่งถูกปิดผนึกด้วย ChaCha20-Poly1305 ภายใต้คีย์ของรายการนั้นเอง- วลีรหัสผ่าน:
key newหรือsecret putครั้งแรกที่ใช้ keystore จะให้คุณตั้งวลีรหัสผ่าน โดยพิมพ์สองครั้งในเทอร์มินัล ยาว 12 อักขระขึ้นไป erpc รับวลีรหัสผ่านจาก prompt แบบซ่อนนั้นเท่านั้น ไม่รับจาก argument, ตัวแปรสภาพแวดล้อม หรือ pipe - การปลดล็อกบน Linux: เมื่อวลีรหัสผ่านเปิด keystore แล้ว การปลดล็อกจะถูกเก็บไว้ใน persistent keyring ของ kernel ในหน่วยความจำ จนกว่าเครื่องจะรีสตาร์ท จนกว่า keyring จะไม่มีการใช้งานจนครบระยะหมดอายุ (สามวัน เว้นแต่ระบบจะกำหนดเป็นอย่างอื่น) หรือจนกว่าจะใช้
erpc worker secret lockส่วนerpc worker secret unlockจะถามวลีรหัสผ่านไว้ล่วงหน้าและแจ้งว่าการปลดล็อกมีผลถึงเมื่อใด ใน shell ที่เริ่มโดยไม่มีการเข้าสู่ระบบของตัวเอง (suที่ไม่มี-,sudo -E) การปลดล็อกจะไม่ถูกเก็บไว้ และแต่ละคำสั่งจะถามวลีรหัสผ่าน - เมื่อไม่มีใครอยู่ที่เทอร์มินัล คำสั่งที่ต้องใช้ keystore จะใช้การปลดล็อกที่มีอยู่ หากไม่มีจะล้มเหลว โดยระบุ
erpc worker secret unlockไว้ keystore ที่ปลดล็อกแล้วจะส่งมอบ secret แต่ไม่ส่งมอบคีย์เทรด - บน macOS และ Windows (
--store keystore) การปลดล็อกจะไม่ถูกเก็บไว้: แต่ละคำสั่งที่ต้องใช้ keystore จะถามวลีรหัสผ่านหนึ่งครั้ง จึงต้องมีเทอร์มินัล
สิ่งที่ keystore ป้องกัน และสิ่งที่ไม่ได้ป้องกัน
- สำรองข้อมูลไดเรกทอรี
keystoreและจำวลีรหัสผ่านไว้ erpc กู้คืนให้ไม่ได้ทั้งสองอย่าง และหากขาดอย่างใดอย่างหนึ่ง สิ่งที่ keystore เก็บไว้จะหายไป - ใครก็ตามที่มีไฟล์ของ keystore และวลีรหัสผ่านจะได้คีย์ไป PBKDF2 ทำให้การเดาแต่ละครั้งช้าลง แต่ไม่ได้ทำให้วลีรหัสผ่านที่เดาได้กลายเป็นปลอดภัย
- ขณะที่ keystore ถูกปลดล็อก โปรแกรมใดก็ตามที่รันในฐานะคุณสามารถอ่าน master key จาก keyring ของ kernel (โปรแกรมที่เซสชันไม่มี keyring ของคุณก็เชื่อม keyring นั้นเข้ามาได้) และเปิดทุกรายการได้ รวมถึงรายการของคีย์ด้วย กฎของ erpc เอง (คีย์ที่
[wallet]ระบุจะถูกอ่านเฉพาะเมื่อมีคนอยู่ที่เทอร์มินัลเท่านั้น ไม่ถูกอ่านให้เครื่องมือ AI เด็ดขาด และคีย์ที่เก็บไว้ใน keystore จะไม่ถูกเปิดเป็น secret เด็ดขาด) คือสิ่งที่ erpc ทำ กฎเหล่านี้ไม่มีผลบังคับต่อโปรแกรมอื่นที่รันในฐานะคุณ โปรดรันerpc worker secret lockเมื่อใช้งานเสร็จ - ชื่อรายการไม่ได้ถูกซ่อน และขนาดของรายการจะบอกความยาวของค่า
- ไฟล์ที่ถูกแก้ไขจะเปิดไม่ได้ แต่สำเนาเก่าของรายการเดียวกันที่ถูกนำกลับมาวางไว้ที่เดิมจะเปิดได้
erpc worker secret rmลบรายการใน keystore ของ secret พร้อมบรรทัดของ secret นั้นในerpc.toml(เว้นแต่การตั้งค่าอื่นของแอปจะระบุรายการเดียวกัน) และปล่อยค่าที่อยู่ใน 1Password หรือพวงกุญแจไว้ตามเดิม คำสั่งนี้ไม่ได้ล้างข้อมูลบนดิสก์ และสำเนาในข้อมูลสำรองของคุณจะยังคงอยู่- erpc ไม่เคยลบหรือเขียนทับรายการของคีย์เทรด หากต้องการเปลี่ยนคีย์ ให้ย้ายเงินออกก่อน แล้วลบไฟล์ของคีย์และ
[wallet]ด้วยตนเอง - การตั้งค่าไม่สามารถใช้ชื่อ
WALLETได้ ไม่ว่าจะเป็นตัวพิมพ์ใหญ่หรือเล็ก ทั้งใน keystore และพวงกุญแจ ส่วน--store 1passwordรับชื่อนี้ได้
ทำงานกับคีย์เทรด
เมื่อ erpc จบการทำงานโดยไม่รู้ว่าการโอนสำเร็จแล้วหรือไม่ ให้ตรวจสอบ signature ของการโอนนั้นก่อนส่งอีกครั้ง: การส่งครั้งที่สองคือการโอนครั้งที่สอง






