Sudo, in its most common configuration, requires the user to type his password. Typically, the user already used his password to authenticate into the account, and typing the password again is a way to confirm that the legitimate user hasn't abandoned his console and been hijacked.
In your setup, the user's password would be used only for authentication to sudo. In particular, if a user's SSH key is compromised, the attacker would not be able to elevate to root privileges on the server. The attacker could plant a key logger into the account, but this key logger would be detectable by other users, and could even be watched for automatically.
A user normally needs to know his current password to change it to a different password. The
passwd program verifies this (it can be configured not to, but this is not useful or at all desirable in your scenario). However, root can change any user's password without knowing the old one; hence a user with sudo powers can change his own password without entering it at the
passwd prompt by running
sudo passwd $USER. If
sudo is configured to require the user's password, then the user must have typed the password to
You can disable password authentication selectively. In your situation, you would disable password authentication in ssh, and possibly in other services. Most services on most modern unices (including Ubuntu) use PAM to configure authentication methods. On Ubuntu, the PAM configuration files live in
/etc/pam.d. To disable password authentication, comment out the
auth … pam_unix.so line in
/etc/pam.d/common-auth. Furthermore, make sure you have
PasswordAuthentication no in
/etc/ssh/sshd_config to disable sshd's built-in password authentication.
You may want to allow some administrative users to log in with a password, or to allow password authentication on the console. This is possible with PAM (it's pretty flexible), but I couldn't tell you how off the top of my head; ask a separate question if you need help.