Pass - Trình quản lý mật khẩu Unix
(passwordstore.org)- Pass là công cụ quản lý mật khẩu đơn giản tuân theo triết lý Unix, lưu từng mật khẩu vào tệp sau khi mã hóa bằng GPG
- Mật khẩu có thể được quản lý có hệ thống bằng cấu trúc thư mục, và các thao tác như thêm, chỉnh sửa, tạo, xem, xóa có thể xử lý dễ dàng bằng công cụ dòng lệnh
- Thông qua tích hợp Git, có thể theo dõi lịch sử thay đổi mật khẩu và đồng bộ hóa, nên rất hữu ích trong nhiều máy tính và môi trường nhóm
- Có mức tự do cho người dùng cao, cho phép tự do tổ chức cấu trúc tệp hoặc định dạng dữ liệu lưu trữ theo tình huống sử dụng
- Nhờ khả năng mở rộng và độ tương thích cao, nhiều tính năng mở rộng cùng client/GUI theo từng nền tảng đang được phát triển và phân phối tích cực
Giới thiệu về Pass
- Việc quản lý mật khẩu nên đơn giản và cần tuân theo triết lý Unix
- Pass lưu từng mật khẩu dưới dạng tệp được mã hóa bằng GPG, và tên tệp sử dụng tên website hoặc tài nguyên cần mật khẩu đó
- Các tệp mã hóa này có thể được sắp xếp theo cấu trúc thư mục mong muốn. Có thể dễ dàng sao chép, di chuyển, xóa giữa các máy tính bằng các lệnh quản lý tệp thông thường
- Pass cung cấp các lệnh chuyên biệt để thêm, chỉnh sửa, tạo, xem từng tệp mật khẩu, và theo mặc định mật khẩu được lưu dưới
~/.password-store - Được triển khai chỉ bằng shell script đơn giản
- Sử dụng Git để sao chép mật khẩu (sao chép vào clipboard) và ghi lại lịch sử thay đổi mật khẩu
- Cũng có thể chỉnh sửa bằng các lệnh shell cơ bản, đồng thời hỗ trợ tự động hoàn thành trên nhiều shell như Zsh, Fish, Bash
- Nhiều tính năng mở rộng và client/GUI cho các nền tảng khác đang được cộng đồng phát triển rất tích cực
Cách sử dụng kho mật khẩu
- Có thể xem toàn bộ danh sách mật khẩu đã lưu
- Hỗ trợ xem một mật khẩu cụ thể và sao chép vào clipboard (tự động xóa)
- Xử lý nhập mật khẩu và xác thực thuận tiện thông qua
gpg-agent - Có thể thêm mật khẩu mới, lưu nhiều dòng trong tệp hiện có (tùy chọn
-m), và chỉnh sửa trực tiếp tệp bằng trình soạn thảo văn bản mặc định - Cung cấp tính năng tạo mật khẩu ngẫu nhiên bằng
/dev/urandom(tùy chọn bao gồm/loại trừ ký hiệu, hỗ trợ sao chép ngay vào clipboard) - Khi xóa mật khẩu, tệp mã hóa cũng bị xóa khỏi hệ thống tệp
- Sau khi khởi tạo thành kho Git, mỗi lần thay đổi mật khẩu sẽ tạo commit và có thể đồng bộ bằng
pass git push/pull - Tham khảo man page để biết thêm tính năng và cách dùng chi tiết
Cách thiết lập cơ bản
- Khi khởi tạo kho mật khẩu, có thể bắt đầu dễ dàng chỉ bằng cách nhập khóa GPG (nếu chỉ định nhiều khóa GPG thì phù hợp cho môi trường nhóm)
- Có thể gán khóa GPG riêng cho từng thư mục cụ thể (tùy chọn
-p) - Cũng có thể khởi tạo như một kho Git (có thể chỉ định remote riêng)
- Mọi thao tác thêm, xóa, chỉnh sửa mật khẩu đều được quản lý bằng commit Git
- Có thể xem thêm các ví dụ khởi tạo mở rộng hơn trong man page
Cách cài đặt
- Debian/Ubuntu: apt-get install pass
- Fedora/RHEL: yum install pass
- Hỗ trợ nhiều nền tảng như openSUSE/Gentoo/Arch/Macintosh/FreeBSD
- Có thể dùng tarball hoặc clone trực tiếp kho Git (mọi bản phát hành đều cung cấp tag đã ký)
Tổ chức dữ liệu và tính linh hoạt
- Pass cho phép tự do tổ chức dữ liệu theo ý người dùng (không ép buộc schema hay định dạng)
- Có thể chọn nhiều cách khác nhau như lưu nhiều dòng, phân biệt dữ liệu bằng tên tệp, dùng cấu trúc thư mục
- Ví dụ: với Amazon/bookreader, có thể lưu dòng đầu là mật khẩu, sau đó là URL, tên người dùng, câu hỏi bí mật và các thông tin bổ sung khác
- Khi cần, cũng có thể chọn cách quản lý từng thông tin trong các tệp riêng biệt (ví dụ: password, secretquestion1)
- Tùy chọn sao chép vào clipboard chỉ sao chép dòng đầu tiên, nên có thể kết hợp hiệu quả giữa sử dụng thực tế và lưu thông tin bổ sung
Tính năng mở rộng
- Tính năng mở rộng (extensions) được hỗ trợ để đáp ứng nhiều nhu cầu người dùng khác nhau
- Có thể cài vào thư mục hệ thống hoặc thư mục người dùng, và chỉ định việc kích hoạt bằng biến môi trường
- Cộng đồng đang phát triển và cung cấp nhiều tính năng mở rộng rất tích cực
Client tương thích
- Client/GUI cho nhiều nền tảng đang được cộng đồng phát triển và phân phối
- Người dùng có thể chọn client phù hợp với hệ điều hành hoặc môi trường sử dụng của mình
Di chuyển từ trình quản lý mật khẩu khác
- Khi chuyển dữ liệu từ trình quản lý mật khẩu khác, có nhiều script chuyển đổi và phương pháp được hỗ trợ
- Người dùng có thể chọn cách tổ chức dữ liệu tối ưu phù hợp nhất với mình
Tác giả và giấy phép
- Được phát triển bởi Jason A. Donenfeld (zx2c4.com)
- Có thể tự do sử dụng và chỉnh sửa theo giấy phép GPLv2+
2 bình luận
Thực ra có nhiều công cụ chỉ đơn thuần để lưu trữ, nhưng điều quan trọng là khả năng tích hợp như tự động điền.
Ý kiến trên Hacker News
Ở đây có nhiều ý kiến tích cực về pass, nhưng cũng có một số nhược điểm lớn khá rõ ràng
Vì là dữ liệu không có cấu trúc nên nhìn chung khá bất tiện để xử lý
Ví dụ, khi cần dùng username và password trong script thì mỗi lần đều phải tự viết code để parse nên rất phiền
Khi tạo mật khẩu mới bằng
pass generate, nó sẽ ghi đè toàn bộ các giá trị hiện cóTức là nếu có cả password và câu trả lời cho câu hỏi bí mật, thì khi chỉ tạo lại password, phần câu trả lời sẽ biến mất
Việc xem lịch sử rất khó
Vì mọi nội dung đều được mã hóa nên ngay cả
git diffcũng không cho ra thông tin hữu ích, còn việc khôi phục lịch sử hay sửa sai bằng công cụ dòng lệnh cũng bất tiệnTên gọi quá chung chung nên khó tìm kiếm
Gần đây còn đang phát triển một công cụ tương tự tên là passworth (cũng cân nhắc dùng container/sandbox) https://github.com/andrewbaxter/passworth
Về chuyện khó xem lịch sử, thực ra pass có hỗ trợ cấu hình file .gitattributes để git chuyển file gpg thành văn bản rồi hiển thị diff
*.gpg diff=gpgvào~/.password-store/.gitattributes[diff "gpg"]để đặttextconv = gpg2 -d ...Chia sẻ thêm các vấn đề đã gặp khi dùng pass
Vấn đề cấu trúc dữ liệu được giải quyết bằng cấu trúc thư mục
Bản thân tôi lại thấy chính sự không có cấu trúc của dữ liệu là một ưu điểm lớn
Chia sẻ ý kiến theo từng tính năng về vấn đề dữ liệu có cấu trúc và lịch sử
pass generateghi đè toàn bộ giá trị, vẫn có thể quản lý riêng bằng các file nhưsite/pass,site/secret-question$ passtrong terminal thì hiện ra các package liên quan, nên vấn đề tìm kiếm cũng không quá nghiêm trọngTrình quản lý mật khẩu trên trình duyệt + passkey tiện hơn nhiều, nhưng kho pass vẫn khá hữu ích để lưu recovery code và API key
Điểm mơ hồ nhất khi dùng pass là mô hình đe dọa không thật sự rõ ràng
Nếu GPG agent bị cache, thì bất kỳ script nào (
npm postinstallchẳng hạn) cũng có thể quét toàn bộ credential bằngpass lsNhư vậy thì gần giống với việc chỉ lưu tất cả vào một file
~/passwords.txtNhưng nếu không dùng cache thì lại phải nhập passphrase GPG dài mỗi lần, rất khổ
Cũng từng thử dùng YubiKey để mở khóa theo yêu cầu, nhưng tích hợp kém và rất bất tiện khi phải nhập mật khẩu thường xuyên
Vì vậy đã chuyển sang Bitwarden
Trường hợp của tôi thì cứ cắm yubi suốt
Mọi trình quản lý mật khẩu về cơ bản đều có vấn đề là khi kho đang mở, master password có thể nằm trong RAM hoặc cache khiến toàn bộ mật khẩu bị lộ
Nếu còn cổng USB trống thì cứ cắm Nano key vào là được
Tôi lưu mật khẩu trong một DB sqlite nằm trên phân vùng file đã mã hóa
Có thể cấu hình yubikey để yêu cầu PIN hoặc chạm trước khi cho dùng khóa GPG
Tôi thật sự rất thích cái này và dùng hằng ngày
Với người thích CLI thì pass khá thú vị, nhưng với người dùng phổ thông hơn, cách dùng KeepassXC trên desktop, KeepassDX trên Android, và truy cập từ xa bằng Wireguard có vẻ phù hợp hơn
Một tính năng hữu ích nhưng ít được nhắc tới của keepass là có thể mở nhiều vault cùng lúc và tìm kiếm trên tất cả
Tôi nghĩ tiêu chuẩn “người dùng phổ thông” là rất tương đối
Đừng quên
keepassxc.cliMột ví dụ sử dụng của tôi mà keepass không giải quyết được là tạo mật khẩu trên hai máy tách biệt rồi hợp nhất lại sau này
Tôi cũng muốn dùng KeepassXC, nhưng việc chia sẻ credential với vợ/chồng không dễ
pass là giải pháp thú vị khi dùng một mình, nhưng cần cẩn trọng nếu chia sẻ với nhiều người
Nếu dùng để quản lý mật khẩu công ty, sẽ không có cách nào biết ai đã xem bí mật nào vào lúc nào, nên mỗi lần nhân sự thay đổi lại phải đổi toàn bộ mật khẩu
Nếu ai đó mới cần quyền truy cập, cũng không có cách tiêu chuẩn để tái mã hóa có chọn lọc các file, phải tự làm
Có dùng git để lưu, nhưng commit message được tạo tự động nên trên thực tế chỉ hơn Dropbox một chút
Nếu lỡ push nhầm nội dung rồi muốn hoàn tác, phải viết lại git history, và điều đó có thể làm hỏng phía người dùng khác
Sự đơn giản và khả năng tự thao tác là ưu điểm, nhưng chính sự đơn giản đó cũng là cái bẫy
Nó giống kiểu hash(site_name+main_password): đẹp về ý tưởng nhưng thực tế phát sinh đủ loại vấn đề
Trong môi trường doanh nghiệp cũng cần các tính năng như mã hóa end-to-end, xác minh fingerprint giữa người dùng, v.v.; Bitwarden có vẻ phù hợp nhất, nhưng nếu ai có ví dụ tốt hơn thì rất muốn được gợi ý
Với pass cũng có thể áp dụng khóa khác nhau (hoặc nhiều khóa) theo từng thư mục để phân quyền chi tiết theo nhóm hay theo người
Công ty tôi dùng 1Password
op runqua file .env, tích hợp CI, v.v.Tôi mới chỉ đánh giá chứ chưa dùng thực tế, nhưng passbolt cũng là một lựa chọn tốt cho công cụ chia sẻ mật khẩu theo nhóm https://www.passbolt.com
Ở công ty tôi, một công cụ khá lạ tên là "pa" đang được dùng rất tốt https://git.j3s.sh/pa
Có vẻ cũng có thể xây dựng một giải pháp tốt dựa trên FOKS https://foks.pub
Gần đây tôi chuyển từ pass sang Bitwarden và Vaultwarden
Trong môi trường cài app GUI bằng flatpak, việc tích hợp giữa extension Firefox và pass không hoạt động nên rất bất tiện
Tạm thời phải dùng
pass -c <path>trong hộp Run để copy mật khẩu rồi dán vào trình duyệt, nhưng trải nghiệm đó không lý tưởngViệc app Android chính thức bị archive cũng là một lý do, dù có fork nhưng không rõ sẽ được duy trì tới đâu https://github.com/android-password-store/Android-Password-Store/discussions/3260
Hiện tại tôi đang self-host vaultwarden và dùng nó qua nhiều client bitwarden khác nhau
Chia sẻ trải nghiệm chuyển từ pass sang KeePassXC
Cũng có công cụ passmenu
Tôi không biết app Android của pass đã bị ngừng phát triển
pass -ctừ prompt hơn là dùng pluginTôi tò mò về trải nghiệm dùng vaultwarden khi offline
Cũng có extension pass-otp https://github.com/tadfisher/pass-otp
App Android cho pass cũng khá ổn https://play.google.com/store/apps/details?id=dev.msfjarvis.aps
Chạy được cả trên termux
App Android Password Store đã bị archive từ năm ngoái, và agrahn đã fork rồi cải thiện khá nhiều
Giải pháp thay thế của tôi là đặt một script nhỏ trong ~/bin và dùng pass cùng oathtool để tạo OTP
Một số app Android cũ cho pass giờ thậm chí không còn cài được trên thiết bị của tôi
Nếu dùng age thay cho GPG thì có công cụ passage sẽ hữu ích https://github.com/FiloSottile/passage
Gần 10 năm nay tôi dùng một cách tiếp cận khác
Toàn bộ metadata của mật khẩu được lưu dưới dạng JSON plaintext, mỗi mục ghi user, phiên bản, quy tắc mật khẩu (độ dài, loại ký tự, v.v.)
Mật khẩu thực tế không được lưu, mà được tạo ra một cách "deterministic" từ hash của passphrase + metadata
Chỉ cần đổi version number là sẽ tạo ra mật khẩu hoàn toàn mới, và chỉ cần nhìn vào "version" là cũng dễ xem lịch sử
Nhược điểm là gần như không thể chia sẻ (người khác phải biết passphrase tôi dùng)
Khi cần chia sẻ thì tôi từng nghĩ tới chế độ tạo ciphertext bằng trình sinh mật khẩu rồi lưu riêng dưới dạng metadata, nhưng thực tế chưa thấy quá cần
Cách dùng password generator khá hay vì giảm lo lắng chuyện làm mất vault
Gần đây tôi biết tới cách này qua SECUSO password generator https://secuso.aifb.kit.edu/english/105.php
Nếu chia sẻ passphrase thì bề mặt rủi ro sẽ rộng hơn, nên chỉ cần lộ một lần là nhiều thông tin xác thực cùng lúc có thể gặp nguy hiểm
Tôi đã dùng pass hơn 8 năm và lưu khoảng 1300 mật khẩu
Đồng bộ giữa các thiết bị bằng git và thật sự rất hài lòng
"1300 mật khẩu thì làm sao mà nhiều thế?"