Why I prefer !requiretty over "ssh -t"
Dall-E https://admin.brennt.net/bl-content/uploads/pages/dad5b98ab9f04a2cdca5de3afe2f6b0e/dall-e_sudo.jpg
Claudio Künzler, whom I know briefly from working with him on enhancing is check_equallogic back in 2010, wrote an article over at Geeker's Digest on How to use sudo inside SSH command. Of course he mentions the ssh -t
parameter, as without it, we would get the following error message when calling sudo: (Example shamelessly stolen from his article. 😇)
ck@linux:~$ ssh targetserver "sudo whoami"
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: a password is required
And ssh -t
is the right call here. Well, to be fair: It's not the only solution and in my eyes even not the best solution.
No, I am not talking about piping the password into the command prompt which is so often recommend as a solution (it's not!) that it makes me sad.
I am talking about the usage of negating requiretty
in the /etc/sudoers
file or a file under /etc/sudoers.d/
respectively.
Lets take the /etc/sudoers.d/icinga2
file I use in my article How to monitor your APT-repositories with Icinga:
Here I must use NOPASSWD
for all executed commands and monitoring plugins as well as the line Defaults:icinga2 !requiretty
. This negates the need for a tty for the icinga2
user completely. Omitting either the NOPASSWD
or the !requiretty
will give us the error message we see above.
root@admin:~ # cat /etc/sudoers.d/icinga2
# This line disables the need for a tty for sudo
# else we will get all kind of "sudo: a password is required" errors
Defaults:icinga2 !requiretty
# sudo rights for Icinga2
icinga2 ALL=(ALL) NOPASSWD: /usr/bin/unattended-upgrades
icinga2 ALL=(ALL) NOPASSWD: /usr/bin/unattended-upgrade
icinga2 ALL=(ALL) NOPASSWD: /usr/bin/apt-get
icinga2 ALL=(ALL) NOPASSWD: /usr/lib/nagios/plugins/check_apt
It's also possible to just negate requiretty based on the path to the binary. As mentioned in this StackExchange question: How to disable requiretty for a single command in sudoers?
However keep in mind that the ordering of lines in a sudoers file is important! Quoting man sudoers
from the SUDOERS FILE FORMAT section:
When multiple entries match for a user, they are applied in order. Where there are multiple matches, the last match is used (which is not necessarily the most specific match).
Why not just use ssh -t?
Personally I prefer the configuration/setting of sudo-related parameters in an /etc/sudoers.d/
file. My reasons are:
When properly configured via a sudoers file it doesn't matter if a command is called via ssh
, ssh -t
or any other way. Hence enhancing operational stability and making it easier for users as they don't have to remember adding the -t
parameter.
And it, at least, servers as some form of documentation that this user/binary is called from another script/host/etc. giving you a clue that these sudo rights are needed/used for.