feat: Implement public key authentication for server#147
Merged
Conversation
Add authentication provider infrastructure for bssh-server:
- Create AuthProvider trait for extensible auth backends
- Implement PublicKeyVerifier with OpenSSH authorized_keys parsing
- Support both directory and pattern-based authorized_keys locations
- Integrate auth provider with SSH handler for auth_publickey
- Add rate limiting for authentication attempts
- Include comprehensive security features:
- Username validation to prevent path traversal
- File permission checks on Unix systems
- Logging for auth attempts (success/failure)
Configuration supports two modes:
- Directory mode: {dir}/{username}/authorized_keys
- Pattern mode: /home/{user}/.ssh/authorized_keys
Closes #126
… authentication CRITICAL Issue Fixed: - Fix TOCTOU race condition in load_authorized_keys by removing path.exists() check and handling NotFound from read operation. Use symlink_metadata to detect symlinks before reading. HIGH Severity Issues Fixed: - Add group-writable permission check (0o020) in check_file_permissions - Fix user enumeration timing attack in user_exists by using constant-time behavior - always perform same operations regardless of username validity - Add directory ownership and permission validation in load_authorized_keys - Fix symlink check in get_user_info to use symlink_metadata MEDIUM Issue Fixed: - Share rate limiter across handlers via Arc to provide server-wide rate limiting instead of per-instance limiting Security Improvements: - Use symlink_metadata consistently to avoid following symlinks - Validate parent directory permissions (not world-writable, warn on group-writable) - Check ownership consistency between file and parent directory - Reject both world-writable and group-writable authorized_keys files - Prevent user enumeration through timing attacks All tests pass with cargo test and cargo clippy.
- Update ARCHITECTURE.md with comprehensive auth module documentation - Add authentication module reference to docs/architecture/README.md - Apply cargo fmt formatting to publickey.rs
Member
Author
PR Finalization ReportProject Structure Discovered
ChecklistTests
Documentation
Code Quality
Changes Made
Test Coverage SummaryThe new authentication code has comprehensive test coverage: publickey.rs (14 tests):
provider.rs (2 tests):
handler.rs (8 tests):
config.rs (12 tests):
All verification passed. Ready for merge. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Changes
New Files
src/server/auth/mod.rs- Auth module exportssrc/server/auth/provider.rs- AuthProvider trait definitionsrc/server/auth/publickey.rs- PublicKeyVerifier implementationModified Files
src/server/mod.rs- Export auth modulesrc/server/config.rs- Add auth configuration optionssrc/server/handler.rs- Integrate auth provider with auth_publickeyImplementation Details
AuthProvider Trait
verify_publickey()- Verify public key authenticationverify_password()- Verify password authentication (placeholder)get_user_info()- Get user information after authuser_exists()- Check if user existsPublicKeyVerifier Features
Configuration Options
Two modes for authorized_keys location:
{dir}/{username}/authorized_keys/home/{user}/.ssh/authorized_keysSecurity Features
Test plan
Closes #126