pam_rssh
                                
                                
                                
                                    pam_rssh copied to clipboard
                            
                            
                            
                        Remote sudo authenticated via ssh-agent
PAM-RSSH
This PAM module provides ssh-agent based authentication. The primary design goal is to avoid typing password when you sudo on remote servers. Instead, you can simply touch your hardware security key (e.g. Yubikey/Canokey) to fulfill user verification. The process is done by forwarding the remote authentication request to client-side ssh-agent as a signature request.
This project is developed in Rust language to minimize security flaws.
Development Status
It's ready for production use, and has been tested on production servers for over a year. More tests and feedback are welcome.
Currently supported SSH public key types:
- RSA (with SHA256 digest)
 - DSA
 - ECDSA 256/384/521
 - ECDSA-SK (FIDO2/U2F)
 - ED25519
 - ED25519-SK (FIDO2)
 
Build and Install
Prerequisites:
- OpenSSL (>=1.1.1)
 - libpam
 - Rust (with Cargo)
 
Clone this repo with a submodule.
git clone --recurse-submodule https://github.com/z4yx/pam_rssh.git
cd pam_rssh
Then build it using Cargo.
cargo build --release
cp target/release/libpam_rssh.so <pam module path>
pam module path
- the module path is specific to certain distributions
 
| OS | Destination | 
|---|---|
| Arch Linux | /usr/lib/security/ | 
| Debian | /lib/x86_64-linux-gnu/security/ | 
| openSUSE | /lib/security/ | 
Config
Add the following line to /etc/pam.d/sudo (place it before existing rules):
auth sufficient libpam_rssh.so
Then edit sudoers with visudo command. Add the following line: (It makes sudo keep the environment variable, so this module can communicate with ssh-agent)
Defaults        env_keep += "SSH_AUTH_SOCK"
Start a ssh-agent on your client, then add your keys with ssh-add.
Try to ssh to your server with forwarded agent (-A option), and make a sudo there.
Optional Arguments
The following arguments are supported:
loglevel=<off|error|warn|info|debug|trace>Select the level of messages logged to syslog. Defaults towarn.debugEquivalent tologlevel=debug.ssh_agent_addr=<IP:port or UNIX domain address>The address of ssh-agent. Defaults to the value ofSSH_AUTH_SOCKenvironment variable, which is set by ssh automatically.auth_key_file=<Path to authorized_keys>Public keys allowed for user authentication. Defaults to$HOME/.ssh/authorized_keys. Usually$HOMEexpands to/home/<username>.authorized_keys_command=<Path to command>A command to generate the authorized_keys. It takes a single argument, the username of the user being authenticated. The standard output of this command will be parsed as authorized_keys. Theauth_key_filewill be ignored if you specify this argument.authorized_keys_command_user=<Username>Theauthorized_keys_commandwill be run as the user specified here. If this argument is omitted, theauthorized_keys_commandwill be run as the user being authenticated.
Arguments should be appended to the PAM rule. For example:
auth sufficient libpam_rssh.so debug authorized_keys_command=/usr/bin/sss_ssh_authorizedkeys authorized_keys_command_user=nobody