Bitwarden-backed SSH agent for Linux
Project description
bwssh
Bitwarden-backed SSH agent for Linux. Store your SSH keys in Bitwarden and use them seamlessly with any SSH client.
Features
- Bitwarden integration: SSH keys stored securely in your Bitwarden vault
- Standard SSH agent: Works with
ssh,git, and any SSH client - Systemd integration: Runs as a user service, starts on login
- Forwarding protection: Blocks remote servers from using your keys
- Optional polkit prompts: Desktop authorization popups (disabled by default)
Requirements
- Linux with systemd user services
- Python 3.12+
- Bitwarden CLI (
bw) installed and logged in
Installation
uv sync
Bitwarden CLI
Install the Bitwarden CLI (bw) and log in before using bwssh. See
https://bitwarden.com/help/cli/ for installation instructions.
bw --version
bw login
Quick start
uv run bwssh install --user-systemd
uv run bwssh start
uv run bwssh unlock
export SSH_AUTH_SOCK=${XDG_RUNTIME_DIR}/bwssh/agent.sock
ssh -T git@github.com
Configuration
Config file: ~/.config/bwssh/config.toml
Quick Setup (Recommended)
The easiest way to configure bwssh is to use the init command:
# First, unlock Bitwarden
export BW_SESSION=$(bw unlock --raw)
# Then run init to auto-discover SSH keys
bwssh config init
This will find all SSH keys in your Bitwarden vault and create a config file.
Manual Setup
If you prefer to configure manually, first find your SSH key IDs:
bw list items | jq -r '.[] | select(.sshKey != null) | "\(.id) \(.name)"'
Then create ~/.config/bwssh/config.toml:
[bitwarden]
bw_path = "/full/path/to/bw" # Use 'which bw' to find this
item_ids = [
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", # your-key-name
]
Full Config Example
[daemon]
log_level = "INFO"
[bitwarden]
bw_path = "/usr/bin/bw"
item_ids = [
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
]
[auth]
# Polkit authorization prompts (default: disabled)
require_polkit = false
# Block forwarded agent requests (recommended)
deny_forwarded_by_default = true
[ssh]
allow_ed25519 = true
allow_ecdsa = true
allow_rsa = true
Environment Variables
BWSSH_RUNTIME_DIR: Override socket directoryBWSSH_LOG_LEVEL: Override log levelBW_SESSION: Bitwarden session key (auto-detected bybwssh unlock)
Security
Default Mode
By default, bwssh allows all local signing requests without prompts. Security comes from:
- Auto-lock on sleep: Keys are cleared when your laptop sleeps (enabled by default)
- Forwarded agent blocking: Remote servers can't use your keys
- Manual lock: Run
bwssh lockwhen stepping away
Polkit Prompts (Optional)
For extra security, enable polkit to show desktop prompts for each signing request:
[auth]
require_polkit = true
This requires installing the polkit policy:
bwssh install --polkit | sudo tee /usr/share/polkit-1/actions/io.github.reidond.bwssh.policy > /dev/null
See docs/ for detailed polkit setup instructions.
CLI Commands
# Daemon control
bwssh start # Start the agent daemon
bwssh stop # Stop the agent daemon
bwssh status # Show daemon status
# Key management
bwssh unlock # Unlock vault and load keys
bwssh lock # Lock agent and clear keys
bwssh sync # Reload keys from Bitwarden
bwssh keys # List loaded SSH keys
# Configuration
bwssh config init # Auto-discover SSH keys and create config
bwssh config show # Show current configuration
# Installation
bwssh install --user-systemd # Install systemd user service
bwssh install --polkit # Print polkit policy file
System Tray
bwssh includes an optional system tray icon (bwssh tray) that shows agent
status and provides quick lock/unlock controls. Install with the gui extra:
uv tool install bwssh[gui]
Build dependencies
PyGObject must be compiled from source, which requires system development packages.
Fedora / RHEL / CentOS:
sudo dnf install gobject-introspection-devel cairo-gobject-devel python3-devel \
gtk3-devel libayatana-appindicator-gtk3
Arch / Manjaro:
sudo pacman -S gobject-introspection cairo python gtk3 libayatana-appindicator
openSUSE:
sudo zypper install gobject-introspection-devel cairo-devel python3-devel \
gtk3-devel typelib-1_0-AyatanaAppIndicator3-0_1
Debian / Ubuntu:
sudo apt install libgirepository1.0-dev libcairo2-dev python3-dev \
libgtk-3-dev libayatana-appindicator3-1 gir1.2-ayatanaappindicator3-0.1
Alternatively, skip building from source by using system-installed PyGObject:
sudo dnf install python3-gobject gtk3 libayatana-appindicator-gtk3 # Fedora
uv tool install --system-site-packages bwssh[gui]
Documentation
Full documentation lives in docs/ and can be served locally:
cd docs
bun install
bun run dev
Development
uv run ruff check .
uv run ruff format .
uv run mypy src tests
uv run pytest
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bwssh-0.1.3.tar.gz.
File metadata
- Download URL: bwssh-0.1.3.tar.gz
- Upload date:
- Size: 39.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac3f8337dbc48862d351f3bf2f631d6d54268d87d0462bbdae8e1016d0f11991
|
|
| MD5 |
c0a25c265730375a9720a90da19d4fec
|
|
| BLAKE2b-256 |
335ddec7c77fbc36a0771d6b2688f749bfdfe485ffd568a59bb2d83bcea74ab2
|
File details
Details for the file bwssh-0.1.3-py3-none-any.whl.
File metadata
- Download URL: bwssh-0.1.3-py3-none-any.whl
- Upload date:
- Size: 52.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
72190178fa2dfedaa40a0eaea2bd6fc5c2db26304e434de1505f4a02d099f2cd
|
|
| MD5 |
61621ad14ae6a2090ef3f7523444bc1f
|
|
| BLAKE2b-256 |
0a670b3acdf8e813e08ce1842c0b13fbe67388a8bfb4e65e171e342dadf74f62
|