Verified for lunar and jammy: # lxc launch ubuntu:jammy test-openssh-lunar # lxc exec test-openssh-lunar bash
# cat <<EOF >/etc/apt/sources.list.d/ubuntu-$(lsb_release -cs)-proposed.list # Enable Ubuntu proposed archive deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-proposed restricted main multiverse universe EOF # apt update && apt dist-upgrade -y # mkdir reproducer # cd reproducer # mkdir certuser keyonlyuser # cd keyonlyuser # ssh-keygen -t ed25519 -f key Generating public/private ed25519 key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in key Your public key has been saved in key.pub ... # cd ../certuser/ # ssh-keygen -t rsa -f ca Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ca Your public key has been saved in ca.pub # ssh-keygen -t ed25519 -f key Generating public/private ed25519 key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in key Your public key has been saved in key.pub # ssh-keygen -s ca -I key_id -n certuser key.pub Signed user key key-cert.pub: id "key_id" serial 0 for certuser valid forever # cd .. # cat <<EOF >authorized_principals #!/bin/sh if [ "$1" = "otheruser" ]; then echo certuser fi EOF # chmod 755 authorized_principals # adduser --disabled-password otheruser Adding user `otheruser' ... Adding new group `otheruser' (1001) ... Adding new user `otheruser' (1001) with group `otheruser' ... Creating home directory `/home/otheruser' ... Copying files from `/etc/skel' ... Changing the user information for otheruser Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y # adduser --disabled-password keyonlyuser Adding user `keyonlyuser' ... Adding new group `keyonlyuser' (1002) ... Adding new user `keyonlyuser' (1002) with group `keyonlyuser' ... Creating home directory `/home/keyonlyuser' ... Copying files from `/etc/skel' ... Changing the user information for keyonlyuser Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y # cat <<EOF >authorized_keys #!/bin/sh if [ "$1" = "keyonlyuser" ]; then echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBbBpE1TDzG48CLKI6bWQbIE87ke4ZJmgFQ0LFnYyikT root@test-openssh-lunar" fi EOF # chmod 755 authorized_keys # vi /etc/ssh/sshd_config i AuthorizedKeysCommand /root/reproducer/authorized_keys %u AuthorizedKeysCommandUser root AuthorizedPrincipalsCommand /root/reproducer/authorized_principals %u AuthorizedPrincipalsCommandUser root TrustedUserCAKeys /root/reproducer/certuser/ca.pub [esc] :wq # systemctl restart ssh # ssh keyonlyuser@localhost -i /root/reproducer/keyonlyuser/key The authenticity of host 'localhost (127.0.0.1)' can't be established. ED25519 key fingerprint is SHA256:hCVcIK0Q/jBlQqqyEAcGnxgXnd46/kaT7j+78BobN2E. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'localhost' (ED25519) to the list of known hosts. Welcome to Ubuntu 23.04 (GNU/Linux 5.15.0-83-generic x86_64) ... $ exit # ssh otheruser@localhost -i /root/reproducer/certuser/key -o CertificateFile=/root/reproducer/certuser/key-cert.pub Welcome to Ubuntu 23.04 (GNU/Linux 5.15.0-83-generic x86_64) # lxc launch ubuntu:jammy test-openssh-jammy # lxc exec test-openssh-jammy bash # cat <<EOF >/etc/apt/sources.list.d/ubuntu-$(lsb_release -cs)-proposed.list # Enable Ubuntu proposed archive deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-proposed restricted main multiverse universe EOF # apt update && apt dist-upgrade -y # mkdir reproducer # cd reproducer # mkdir certuser keyonlyuser # cd keyonlyuser # ssh-keygen -t ed25519 -f key Generating public/private ed25519 key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in key Your public key has been saved in key.pub ... # cd ../certuser/ # ssh-keygen -t rsa -f ca Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ca Your public key has been saved in ca.pub # ssh-keygen -t ed25519 -f key Generating public/private ed25519 key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in key Your public key has been saved in key.pub # ssh-keygen -s ca -I key_id -n certuser key.pub Signed user key key-cert.pub: id "key_id" serial 0 for certuser valid forever # cd .. # cat <<EOF >authorized_principals #!/bin/sh if [ "$1" = "otheruser" ]; then echo certuser fi EOF # chmod 755 authorized_principals # adduser --disabled-password otheruser Adding user `otheruser' ... Adding new group `otheruser' (1001) ... Adding new user `otheruser' (1001) with group `otheruser' ... Creating home directory `/home/otheruser' ... Copying files from `/etc/skel' ... Changing the user information for otheruser Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y # adduser --disabled-password keyonlyuser Adding user `keyonlyuser' ... Adding new group `keyonlyuser' (1002) ... Adding new user `keyonlyuser' (1002) with group `keyonlyuser' ... Creating home directory `/home/keyonlyuser' ... Copying files from `/etc/skel' ... Changing the user information for keyonlyuser Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y # cat <<EOF >authorized_keys #!/bin/sh if [ "$1" = "keyonlyuser" ]; then echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIVm2xIPfP0Nm2blQVErar4K9iOFUVFSpVxyZhQIkTl4 root@test-openssh-jammy" fi EOF # chmod 755 authorized_keys # vi /etc/ssh/sshd_config i AuthorizedKeysCommand /root/reproducer/authorized_keys %u AuthorizedKeysCommandUser root AuthorizedPrincipalsCommand /root/reproducer/authorized_principals %u AuthorizedPrincipalsCommandUser root TrustedUserCAKeys /root/reproducer/certuser/ca.pub [esc] :wq # systemctl restart ssh # ssh keyonlyuser@localhost -i /root/reproducer/keyonlyuser/key The authenticity of host 'localhost (127.0.0.1)' can't be established. ED25519 key fingerprint is SHA256:4NFSX3Jx8X4+jOzo2xDnMcJy5lGJvTVnOupp9UAQ3J4. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'localhost' (ED25519) to the list of known hosts. Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-83-generic x86_64) ... $ exit # ssh otheruser@localhost -i /root/reproducer/certuser/key -o CertificateFile=/root/reproducer/certuser/key-cert.pub Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-83-generic x86_64) ** Tags removed: verification-needed verification-needed-jammy verification-needed-lunar ** Tags added: verification-done verification-done-jammy verification-done-lunar -- You received this bug notification because you are a member of Ubuntu Touch seeded packages, which is subscribed to openssh in Ubuntu. https://bugs.launchpad.net/bugs/2031942 Title: AuthorizedPrincipalsCommand is ignored if AuthorizedKeysCommand is set Status in openssh package in Ubuntu: Fix Released Status in openssh source package in Jammy: Fix Committed Status in openssh source package in Lunar: Fix Committed Status in openssh source package in Mantic: Fix Released Bug description: [Impact] User of openssh reported an issue that affects Lunar and Jammy. If AuthorizedKeysCommand is set, an AuthorizedPrincipalsCommand configuration in sshd_config that comes after it is ignored. In this scenario, where AuthorizedPrincipalsCommand is needed and set, users relying on ssh certificates for authentication will be denied access. [Test Plan] Launch container: $ lxc launch ubuntu:jammy <container-name> Shell into that container: $ lxc shell <container-name> Create the main directory for our task (e.g. “reproducer”) # mkdir reproducer Go to that directory: # cd reproducer Create 2 more dirs that reflect users: # mkdir certuser keyonlyuser Go to the keyonlyuser: # cd keyonlyuser Do: # ssh-keygen -t ed25519 -f key Go to the certuser: # cd /root/reproducer/certuser/ Do: # ssh-keygen -t rsa -f ca # ssh-keygen -t ed25519 -f key # ssh-keygen -s ca -I key_id -n certuser key.pub Create a script '/root/reproducer/authorized_principals' with permissions 755 as follows: #!/bin/sh if [ "$1" = "otheruser" ]; then echo certuser fi Exit the file. Ensure you are in the /root/reproducer/ directory: # adduser --disabled-password otheruser (Enter multiple times, leave all fields blank) Then do the same for another user: # adduser --disabled-password keyonlyuser Create a script '/root/reproducer/authorized_keys' with permissions 755 as follows: #!/bin/sh if [ "$1" = "keyonlyuser" ]; then echo <key.pub from keyonlyuser e.g. ssh-ed25519 AAAdjakdjaskdajd> fi Go to the /etc/ssh/sshd_config file. Add at the top: AuthorizedKeysCommand /root/reproducer/authorized_keys %u AuthorizedKeysCommandUser root AuthorizedPrincipalsCommand /root/reproducer/authorized_principals %u AuthorizedPrincipalsCommandUser root TrustedUserCAKeys /root/reproducer/certuser/ca.pub Exit from the file and restart the ssh service: # systemctl restart ssh Use these commands to manifest the bug: # ssh keyonlyuser@localhost -i /root/reproducer/keyonlyuser/key # ssh otheruser@localhost -i /root/reproducer/certuser/key -o CertificateFile=/root/reproducer/certuser/key-cert.pub Expected results: both ssh commands should succeed. Actual results: the second ssh fails because the AuthorizedPrincipalsCommand is ignored if AuthorizedKeysCommand is set. [Where problems could occur] * The patch itself modifies only the servconf.c, so regressions should be limited to the server configuration. * Since the fix touches pointers, there might be regression related to memory handling and fetching data. ---------------------------------original report-------------------------- Versions of OpenSSH from 8.7p1 to 9.3p1 contain the following code: if (*activep && options->authorized_keys_command == NULL) *charptr = xstrdup(str + len); However, this is executed for both authorized_keys_command and authorized_principals_command. As a result, if authorized_keys_command is set (for instance, if using ec2-instance-connect), any AuthorizedPrincipalsCommand configuration in sshd_config is ignored. This is fixed in 9.4p1 with the attached patch. To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/2031942/+subscriptions -- Mailing list: https://launchpad.net/~touch-packages Post to : touch-packages@lists.launchpad.net Unsubscribe : https://launchpad.net/~touch-packages More help : https://help.launchpad.net/ListHelp