Pass - เครื่องมือจัดการรหัสผ่านแบบยูนิกซ์
(passwordstore.org)- Pass คือ เครื่องมือจัดการรหัสผ่านแบบเรียบง่าย ที่ยึดตาม ปรัชญาแบบยูนิกซ์ โดยจะเข้ารหัสรหัสผ่านแต่ละรายการด้วย GPG แล้วจัดเก็บเป็นไฟล์
- สามารถจัดการรหัสผ่านอย่างเป็นระบบด้วย โครงสร้างโฟลเดอร์ และจัดการการเพิ่ม แก้ไข สร้าง ดู และลบได้อย่างง่ายดายผ่าน เครื่องมือบรรทัดคำสั่ง
- รองรับ การทำงานร่วมกับ Git เพื่อให้ติดตามประวัติการเปลี่ยนแปลงรหัสผ่านและซิงก์ข้อมูลได้ จึงเหมาะกับการใช้งานบน คอมพิวเตอร์หลายเครื่องและในสภาพแวดล้อมแบบทีม
- มี อิสระในการใช้งาน สูง ผู้ใช้สามารถกำหนด โครงสร้างไฟล์และรูปแบบข้อมูลที่จัดเก็บ ให้เหมาะกับสถานการณ์ของตนได้อย่างอิสระ
- ด้วย ความสามารถในการขยาย และ ความเข้ากันได้สูง จึงมีการพัฒนาและเผยแพร่ ส่วนขยาย และ ไคลเอนต์/GUI สำหรับแต่ละแพลตฟอร์ม อย่างต่อเนื่อง
แนะนำ Pass
- การจัดการรหัสผ่านควรเรียบง่าย และควรยึดตาม ปรัชญา Unix
- Pass จัดเก็บรหัสผ่านแต่ละรายการในรูปแบบไฟล์ที่เข้ารหัสด้วย GPG โดยใช้ชื่อไฟล์เป็นชื่อเว็บไซต์หรือทรัพยากรที่ต้องใช้รหัสผ่านนั้น
- ไฟล์ที่เข้ารหัสเหล่านี้สามารถจัดเรียงตาม โครงสร้างโฟลเดอร์ ที่ต้องการได้ และยังสามารถคัดลอก ย้าย หรือลบระหว่างคอมพิวเตอร์ได้อย่างสะดวกด้วยคำสั่งจัดการไฟล์ทั่วไป
- Pass มีคำสั่งที่ออกแบบมาสำหรับ การเพิ่ม แก้ไข สร้าง และดู ไฟล์รหัสผ่านแต่ละรายการโดยเฉพาะ และโดยปกติรหัสผ่านจะถูกเก็บไว้ใต้
~/.password-store - ถูกพัฒนาด้วย เชลล์สคริปต์แบบเรียบง่าย เท่านั้น
- ใช้ Git สำหรับการคัดลอกรหัสผ่านไปยังคลิปบอร์ดและการบันทึกประวัติการเปลี่ยนแปลงรหัสผ่าน
- สามารถแก้ไขได้ด้วยคำสั่งเชลล์พื้นฐาน และรองรับการเติมคำสั่งอัตโนมัติในเชลล์ต่าง ๆ เช่น Zsh, Fish และ Bash
- มีการพัฒนา ส่วนขยาย และ ไคลเอนต์/GUI สำหรับแพลตฟอร์มอื่น อย่างต่อเนื่องโดยชุมชนที่ขับเคลื่อนโครงการ
วิธีใช้ password store
- สามารถดูรายการรหัสผ่านทั้งหมดที่จัดเก็บไว้ได้
- รองรับการดูรหัสผ่านเฉพาะรายการและคัดลอกไปยังคลิปบอร์ดได้ (พร้อมล้างอัตโนมัติ)
- ใช้
gpg-agentเพื่อช่วยให้การป้อนรหัสผ่านและการยืนยันตัวตนสะดวกยิ่งขึ้น - สามารถเพิ่มรหัสผ่านใหม่ บันทึกข้อมูลหลายบรรทัดในไฟล์เดิมได้ (-m option) และแก้ไขไฟล์โดยตรงผ่าน text editor เริ่มต้นได้
- มีฟังก์ชัน สร้างรหัสผ่านแบบสุ่ม โดยใช้
/dev/urandom(เลือกได้ว่าจะรวม/ไม่รวมสัญลักษณ์ตาม option และรองรับการคัดลอกไปคลิปบอร์ดได้ทันที) - เมื่อลบรหัสผ่าน ไฟล์ที่เข้ารหัสจะถูกลบออกจากระบบไฟล์ด้วย
- หลังจาก เริ่มต้นเป็น Git repository แล้ว ทุกการเปลี่ยนแปลงรหัสผ่านจะถูก commit และสามารถซิงก์ผ่าน
pass git push/pullได้ - สำหรับฟังก์ชันเพิ่มเติมและวิธีใช้งานโดยละเอียด ให้ดู man page
วิธีตั้งค่าพื้นฐาน
- ตอนเริ่มต้น password store สามารถเริ่มใช้งานได้ง่ายเพียงระบุ GPG key (หากกำหนดหลาย GPG key จะเหมาะกับการใช้งานแบบทีม)
- สามารถกำหนด GPG key แยกตามโฟลเดอร์ได้ (-p option)
- สามารถ เริ่มต้นเป็น Git repository ได้ด้วย (และกำหนด remote แยกต่างหากได้)
- ทุกการเพิ่ม ลบ และแก้ไขรหัสผ่านจะถูกจัดการเป็น Git commit
- ดูตัวอย่างการเริ่มต้นเพิ่มเติมได้ใน man page
วิธีติดตั้ง
- Debian/Ubuntu: apt-get install pass
- Fedora/RHEL: yum install pass
- รองรับหลายแพลตฟอร์ม เช่น openSUSE/Gentoo/Arch/Macintosh/FreeBSD
- สามารถดาวน์โหลดแบบ tarball หรือ clone จาก Git repository ได้โดยตรง (ทุกรีลีสมาพร้อม signed tag)
การจัดระเบียบข้อมูลและความยืดหยุ่น
- Pass เปิดให้ผู้ใช้จัดระเบียบข้อมูลได้อย่างอิสระตามต้องการ (ไม่มีการบังคับ schema หรือ format)
- เลือกได้หลากหลายรูปแบบ เช่น การจัดเก็บหลายบรรทัด การแยกข้อมูลด้วยชื่อไฟล์ หรือการจัดตามโครงสร้างโฟลเดอร์
- ตัวอย่างเช่น ในกรณีของ Amazon/bookreader อาจเก็บรหัสผ่านไว้บรรทัดแรก แล้วตามด้วย URL ชื่อผู้ใช้ คำถามลับ และข้อมูลเพิ่มเติมอื่น ๆ
- หากต้องการ ก็สามารถแยกข้อมูลแต่ละส่วนเป็นไฟล์ต่างหากได้ (เช่น password, secretquestion1 เป็นต้น)
- เนื่องจากตัวเลือกคัดลอกคลิปบอร์ดจะคัดลอกเฉพาะบรรทัดแรก จึงสามารถใช้งานจริงควบคู่กับการเก็บข้อมูลเสริมได้อย่างมีประสิทธิภาพ
ส่วนขยาย
- รองรับ ส่วนขยาย (extensions) เพื่อตอบโจทย์ความต้องการของผู้ใช้ที่หลากหลาย
- สามารถติดตั้งไว้ในโฟลเดอร์ของระบบหรือโฟลเดอร์ผู้ใช้ และกำหนดการเปิดใช้งานผ่าน environment variable
- ชุมชนยังคงพัฒนาและเผยแพร่ส่วนขยายหลากหลายรูปแบบอย่างต่อเนื่อง
ไคลเอนต์ที่เข้ากันได้
- มีการพัฒนาและเผยแพร่ ไคลเอนต์/GUI สำหรับหลายแพลตฟอร์ม โดยชุมชน
- ผู้ใช้สามารถเลือกไคลเอนต์ให้เหมาะกับระบบปฏิบัติการหรือสภาพแวดล้อมการใช้งานของตนได้
การย้ายข้อมูลจากตัวจัดการรหัสผ่านอื่น
- รองรับสคริปต์แปลงข้อมูลและวิธีการหลากหลายสำหรับการย้ายข้อมูลจากตัวจัดการรหัสผ่านอื่น
- ผู้ใช้สามารถเลือก รูปแบบการจัดระเบียบข้อมูลที่เหมาะสมที่สุด สำหรับตนเองได้
ผู้สร้างและไลเซนส์
- พัฒนาโดย Jason A. Donenfeld (zx2c4.com)
- ใช้งานและแก้ไขได้อย่างอิสระภายใต้ ไลเซนส์ GPLv2+
2 ความคิดเห็น
จริง ๆ แล้วก็มีเครื่องมือที่ทำได้แค่เก็บข้อมูลอยู่มากมาย แต่สิ่งสำคัญคือการทำงานร่วมกันอย่างการกรอกอัตโนมัติ
ความคิดเห็นจาก Hacker News
ที่นี่มีความเห็นเชิงบวกเกี่ยวกับ pass อยู่มาก แต่ก็มีข้อเสียหลัก ๆ อยู่ชัดเจนเหมือนกัน
ด้วยความที่เป็นข้อมูลแบบไม่มีโครงสร้าง จึงใช้งานทั่วไปได้ไม่ค่อยสะดวก
ตัวอย่างเช่น เวลาจะใช้ username และ password ในสคริปต์ ก็ต้องเขียนโค้ด parse เองทุกครั้ง จึงไม่สะดวก
ถ้าสร้างรหัสผ่านใหม่ด้วย
pass generateค่าที่มีอยู่เดิมทั้งหมดจะถูกเขียนทับหมายความว่า ถ้ามีทั้ง password และคำตอบของ secret question อยู่ด้วยกัน แล้วสร้างใหม่เฉพาะรหัสผ่าน คำตอบก็จะหายไป
การตรวจสอบประวัติทำได้ยากมาก
เนื่องจากทุกอย่างถูกเข้ารหัส จึงไม่ได้ข้อมูลที่มีประโยชน์จาก
git diffและการดูประวัติหรือกู้คืนความผิดพลาดด้วยเครื่องมือ command line ก็ไม่สะดวกชื่อทั่วไปเกินไปจนค้นหายาก
ช่วงนี้กำลังพัฒนาเครื่องมือคล้ายกันชื่อ passworth อยู่ด้วย (พิจารณาการใช้ container/sandbox ด้วย) https://github.com/andrewbaxter/passworth
สำหรับประเด็นที่ว่าตรวจสอบประวัติได้ยาก จริง ๆ แล้ว pass รองรับการตั้งค่าไฟล์ .gitattributes เพื่อให้ git แปลงไฟล์ gpg เป็นข้อความก่อนดู diff ได้
*.gpg diff=gpgใน~/.password-store/.gitattributes[diff "gpg"]ใน .git/config ให้textconv = gpg2 -d ...แชร์ปัญหาเพิ่มเติมที่เจอระหว่างใช้ pass
ปัญหาเรื่องโครงสร้างข้อมูลแก้ด้วยโครงสร้างโฟลเดอร์
ส่วนตัวกลับรู้สึกว่าความไม่มีโครงสร้างของข้อมูลเป็นข้อดีอย่างมาก
แชร์ความเห็นแยกตามฟีเจอร์เกี่ยวกับประเด็นโครงสร้างข้อมูลและประวัติ
pass generateจะเขียนทับทุกค่า ก็สามารถแยกจัดการเป็นไฟล์อย่างsite/pass,site/secret-questionได้$ passในเทอร์มินัล มันจะขึ้นแพ็กเกจที่เกี่ยวข้องให้ จึงไม่ได้มีปัญหาเรื่องค้นหาร้ายแรงขนาดนั้นตัวจัดการรหัสผ่านในเบราว์เซอร์ + passkey สะดวกกว่ามาก แต่คลังของ pass ก็ยังพอใช้เก็บ recovery code และ API key ได้
จุดที่คลุมเครือที่สุดของการใช้ pass คือ threat model ไม่ชัดเจน
ถ้าปล่อยให้ GPG agent cache ไว้ สคริปต์อะไรก็ได้ (เช่น npm postinstall) ก็สามารถไล่ดู credential ทั้งหมดด้วย
pass lsได้แบบนั้นก็แทบไม่ต่างจากเก็บทุกอย่างไว้ในไฟล์เดียวอย่าง ~/passwords.txt
แต่ถ้าไม่ใช้ cache ก็ต้องทนกรอกรหัสผ่าน GPG ยาว ๆ ทุกครั้ง
เคยลองใช้ YubiKey เพื่อปลดล็อกแบบ on-demand แล้ว แต่การเชื่อมต่อทำได้ไม่ค่อยดี และถ้าต้องกรอกรหัสผ่านบ่อย ๆ ก็ไม่สะดวกมาก
สุดท้ายเลยย้ายไป Bitwarden
สำหรับฉัน แค่เสียบ yubi ทิ้งไว้ตลอด
ตัวจัดการรหัสผ่านทุกตัวโดยพื้นฐานแล้ว ถ้าปลดล็อกคลังอยู่ master password ก็อาจค้างอยู่ใน RAM หรือ cache ทำให้รหัสผ่านทั้งหมดถูกเปิดเผยได้
ถ้ามีพอร์ต USB ว่าง ก็เสียบ Nano key ทิ้งไว้ได้เลย
ฉันเก็บรหัสผ่านไว้ใน sqlite DB บนพาร์ทิชันไฟล์ที่เข้ารหัส
บน yubikey สามารถตั้งให้ต้องมี PIN หรือการแตะเพื่ออนุมัติการใช้ GPG key ได้
ฉันชอบสิ่งนี้มากและใช้ทุกวัน
สำหรับคนที่ชอบ CLI นั้น pass น่าสนใจ แต่สำหรับผู้ใช้ทั่วไป (ในความหมายของ ‘normie’) ดูเหมือนว่า KeepassXC บน Desktop, KeepassDX บน Android และการเข้าถึงระยะไกลผ่าน Wireguard จะเหมาะกว่า
หนึ่งในฟีเจอร์มีประโยชน์ของ keepass ที่ไม่ค่อยมีใครพูดถึง คือสามารถเปิดหลาย vault พร้อมกันและค้นหาข้ามกันได้
คิดว่าเกณฑ์คำว่า ‘normie’ เป็นเรื่องสัมพัทธ์
อย่าลืม
keepassxc.cliด้วยตัวอย่างการใช้งานอย่างหนึ่งของฉันที่ keepass แก้ไม่ได้ คือการสร้างรหัสผ่านบนคอมพิวเตอร์แยกขาดจากกันสองเครื่อง แล้วค่อยนำมารวมภายหลัง
อยากใช้ KeepassXC เหมือนกัน แต่การแชร์ credential กับคู่สมรสไม่ง่าย
pass เป็นโซลูชันที่สนุกเวลาจะใช้คนเดียว แต่ถ้าจะแชร์กับหลายคนต้องระวัง
ถ้าใช้เป็นตัวจัดการรหัสผ่านของบริษัท จะไม่มีทางรู้ว่าใครดูความลับไหนไปเมื่อไร ดังนั้นทุกครั้งที่มีการเปลี่ยนพนักงานก็ต้องเปลี่ยนรหัสผ่านทั้งหมด
ถ้ามีคนต้องการสิทธิ์เข้าถึงใหม่ ก็ไม่มีวิธีมาตรฐานในการเข้ารหัสไฟล์ใหม่แบบเลือกเฉพาะ ต้องทำเอง
แม้จะเก็บด้วย git แต่ commit message ถูกสร้างอัตโนมัติ จึงแทบได้ประโยชน์เพิ่มจาก Dropbox ไม่มากนัก
ถ้าพลาด push เนื้อหาผิดแล้วอยากย้อนกลับ ก็ต้อง rewrite git history และอาจทำให้เครื่องของผู้ใช้อื่นพังได้
ความเรียบง่ายและการแก้ไขตรง ๆ เป็นข้อดี แต่ความเรียบง่ายนี้เองก็เป็นกับดัก
มันสวยงามในแนวคิดแบบ hash(site_name+main_password) แต่ในความเป็นจริงจะมีปัญหาหลากหลายตามมา
ในสภาพแวดล้อมธุรกิจก็ยังต้องมีฟีเจอร์อย่าง end-to-end encryption, การตรวจสอบ fingerprint ระหว่างผู้ใช้ ฯลฯ ซึ่ง Bitwarden ดูจะเหมาะที่สุดเท่าที่เห็น แต่ถ้ามีตัวอย่างที่ดีกว่าก็อยากได้คำแนะนำ
ใน pass ก็สามารถใช้คีย์คนละชุด (หรือหลายคีย์) แยกตามไดเรกทอรี เพื่อแบ่งสิทธิ์เข้าถึงตามกลุ่มหรือตามบุคคลได้
บริษัทของฉันใช้ 1Password
op runผ่านไฟล์ .env และการเชื่อมต่อกับ CIแม้จะยังไม่ได้ใช้จริง มีแค่ประเมินไว้ แต่ passbolt ก็เป็นตัวเลือกที่ดีสำหรับเครื่องมือแชร์รหัสผ่านสำหรับทีม https://www.passbolt.com
ที่บริษัทของเราใช้เครื่องมือชื่อไม่คุ้นหูอย่าง "pa" ได้ดีทีเดียว https://git.j3s.sh/pa
ดูเหมือนว่าจะสร้างโซลูชันที่ดีบนพื้นฐานของ FOKS ได้เช่นกัน https://foks.pub
เมื่อไม่นานมานี้เปลี่ยนจาก pass ไปเป็น Bitwarden และ Vaultwarden
ในสภาพแวดล้อมที่ติดตั้งแอป GUI ผ่าน flatpak การเชื่อมต่อระหว่าง Firefox extension กับ pass ใช้งานไม่ได้ จึงไม่สะดวก
มี workaround คือใช้
pass -c <path>ในหน้าต่าง run เพื่อคัดลอกรหัสผ่านแล้วนำไปวางในเบราว์เซอร์ แต่ไม่ใช่ประสบการณ์ที่ดีนักอีกเหตุผลคือแอป Android ทางการถูก archive ไปแล้ว แม้จะมี fork แต่ก็ไม่รู้ว่าจะได้รับการดูแลต่อแค่ไหน https://github.com/android-password-store/Android-Password-Store/discussions/3260
ตอนนี้จึงโฮสต์ vaultwarden เองและใช้งานผ่านไคลเอนต์ bitwarden หลายตัว
แชร์ประสบการณ์ย้ายจาก pass ไป KeePassXC
ยังมีเครื่องมือชื่อ passmenu ด้วย
ไม่รู้มาก่อนว่าแอป Android ของ pass ถูกยุติแล้ว
pass -cคัดลอกจากพรอมป์ต์โดยตรงมากกว่าพลักอินอยากรู้ประสบการณ์ใช้งานแบบออฟไลน์ของ vaultwarden
มีส่วนขยาย pass-otp ด้วย https://github.com/tadfisher/pass-otp
แอป Android สำหรับ pass ก็ถือว่าค่อนข้างดี https://play.google.com/store/apps/details?id=dev.msfjarvis.aps
และยังทำงานบน termux ได้ด้วย
แอป Android Password Store ถูก archive ไปเมื่อปีที่แล้ว และ agrahn ได้ fork ไปพร้อมปรับปรุงหลายอย่าง
ทางเลือกของฉันคือวางสคริปต์เล็ก ๆ ไว้ใน ~/bin แล้วใช้ pass ร่วมกับ oathtool เพื่อสร้าง otp
แอป Android เก่า ๆ บางตัวสำหรับ pass ตอนนี้ติดตั้งบนอุปกรณ์ของฉันไม่ได้แล้ว
ถ้าใช้ age แทน GPG มีเครื่องมือ passage ที่ช่วยได้ https://github.com/FiloSottile/passage
ช่วงนี้ฉันใช้แนวทางอื่นมานานเกือบ 10 ปีแล้ว
meta data รหัสผ่านทั้งหมดเก็บเป็น JSON แบบ plain text โดยแต่ละรายการบันทึก user, เวอร์ชัน, กฎของรหัสผ่าน (ความยาว, ชนิดตัวอักษร ฯลฯ)
ไม่ได้เก็บรหัสผ่านจริง แต่ใช้ passphrase + hash ของ meta data เพื่อสร้างรหัสผ่านแบบกำหนดแน่นอน (deterministic)
แค่เปลี่ยนเลขเวอร์ชันก็จะได้รหัสผ่านใหม่ทั้งหมด และเพียงเปลี่ยน 'version' ก็ตรวจสอบประวัติได้ง่าย
ข้อเสียคือแทบจะแชร์ไม่ได้เลย (อีกฝ่ายต้องรู้ passphrase ที่ฉันใช้ด้วย)
ถ้าจำเป็นต้องแชร์ ก็เคยคิดถึงโหมดที่ใช้ตัวสร้างรหัสผ่านมาสร้าง ciphertext แล้วบันทึกเป็น meta data แยกต่างหาก แต่ในทางปฏิบัติก็ยังไม่ค่อยจำเป็น
เหตุผลที่แนวทาง password generator ดูดี คือช่วยลดความกังวลเรื่องทำ vault หาย
เพิ่งรู้จักแนวทางนี้ไม่นานผ่าน SECUSO password generator https://secuso.aifb.kit.edu/english/105.php
ถ้าแชร์ passphrase พื้นที่เสี่ยงก็จะกว้างขึ้น เพราะถ้ารั่วครั้งเดียว credential หลายรายการก็จะตกอยู่ในความเสี่ยงพร้อมกัน
ฉันใช้ pass มามากกว่า 8 ปีแล้ว และเก็บรหัสผ่านไว้ 1300 รายการ
ซิงก์ข้ามอุปกรณ์ด้วย git และพอใจมากกับการใช้งาน
"มีรหัสผ่าน 1300 รายการได้ยังไงเยอะขนาดนั้น?"