เก็บคีย์เทรดและ 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):
  1. 1Password เมื่อ erpc login เก็บเซสชันไว้ที่นั่น หรือเมื่อระบุ --vault
  2. พวงกุญแจของ OS ในระบบที่พวงกุญแจเก็บค่าไว้ได้หลังรีบูต: macOS, Windows และ Linux ที่มี keyring ของเดสก์ท็อปในเซสชันที่เข้าสู่ระบบอยู่
  3. 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
erpc worker secret put API_TOKEN --generate          # the bot's own API token, made for you and shown to nobody
erpc worker secret put ERPC_API_KEY --from-account   # the account's RPC key, read from your account (or SOLANA_RPC_ENDPOINT in [vars])
  • --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
erpc worker secret put ERPC_API_KEY        # asks for the value, unseen
  • --replace เก็บค่าใหม่สำหรับชื่อที่ตั้งไว้แล้ว ส่วน erpc worker secret list แสดงรายการการตั้งค่าที่เป็น secret ตามชื่อ และที่เก็บของแต่ละรายการ
  • การตั้งค่าที่สายข้อมูลให้มา (GRPC_ENDPOINT, SHREDS_ENDPOINT, SOLANA_SEND_RPC_ENDPOINT) ไม่ถือเป็น secret ในทุกกรณี: --grpc, --shreds และ --unlimited จะตั้งค่าเหล่านี้
การอ้างอิงใน [secrets] หรือ [wallet] เป็นแบบใดแบบหนึ่งต่อไปนี้:
การอ้างอิงตำแหน่งของค่า
op://<vault-id>/<item-id>/<field>1Password ตาม id ของ vault และ item
keychain:<service>/<account>พวงกุญแจของ OS บนเครื่องที่เก็บค่านั้นไว้
keystore:<service>/<account>keystore ของ erpc บนเครื่องที่เก็บค่านั้นไว้

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 worker key newสร้างคีย์เทรดและแสดงคีย์สาธารณะที่ต้องโอนเงินเข้า
erpc worker key import <FILE>ย้ายไฟล์คีย์ไปไว้ใน 1Password, พวงกุญแจ หรือ keystore แล้วเสนอให้ล้างไฟล์นั้นทิ้ง
erpc worker key showแสดงคีย์สาธารณะของคีย์และที่เก็บคีย์
erpc worker key balanceแสดงยอดคงเหลือของคีย์ ผ่านการตั้งค่า RPC ของแอปเอง
erpc worker key send --to <ADDRESS> --sol <N>ลงนามการโอนหนึ่งรายการในหน่วยความจำ หลังจากคุณตอบ yes ในเทอร์มินัล ส่วน --all จะส่งทั้งหมดยกเว้นค่าธรรมเนียม
เมื่อ erpc จบการทำงานโดยไม่รู้ว่าการโอนสำเร็จแล้วหรือไม่ ให้ตรวจสอบ signature ของการโอนนั้นก่อนส่งอีกครั้ง: การส่งครั้งที่สองคือการโอนครั้งที่สอง