Общий смысл замечания @rui-f-ribeiro верен, но детали - нет. Детали имеют значение. Ubuntu использует эти пакеты:
Утилита ping сбрасывает разрешения в функции с именем limit_capabilities
, общей для ping и ping6. Соответствующий кусок кода выглядит так:
if (prctl(PR_SET_KEEPCAPS, 1) < 0) {
perror("ping: prctl");
exit(-1);
}
if (setuid(getuid()) < 0) {
perror("setuid");
exit(-1);
}
if (prctl(PR_SET_KEEPCAPS, 0) < 0) {
perror("ping: prctl");
exit(-1);
}
cap_free(cap_p);
cap_free(cap_cur_p);
#endif
uid = getuid();
euid = geteuid();
#ifndef CAPABILITIES
if (seteuid(uid)) {
perror("ping: setuid");
exit(-1);
}
#endif
То есть (читайте исходный код), ping
выполняет несколько привилегированных операций и сбрасывает привилегии - но он может быть построен так, чтобы вести себя по-разному, в зависимости от ваших предпочтений.
Интересно, что в журнале изменений отмечается:
iputils (3:20121221-2) unstable; urgency=low
* Enable the CAP_NET_RAW capability and strip the setuid bit on ping and
ping6 binaries if possible.
История с passwd
похожа, с разными деталями. Он является частью набора утилит shadow, который может сбросить привилегии в change_root
:
/* Drop privileges */
if ( (setregid (getgid (), getgid ()) != 0)
|| (setreuid (getuid (), getuid ()) != 0)) {
fprintf (stderr, _("%s: failed to drop privileges (%s)\n"),
Prog, strerror (errno));
exit (EXIT_FAILURE);
}
Но он делает это только в особом случае:
/*
* process_root_flag - chroot if given the --root option
*
* This shall be called before accessing the passwd, group, shadow,
* gshadow, useradd's default, login.defs files (non exhaustive list)
* or authenticating the caller.
*
* The audit, syslog, or locale files shall be open before
*/
В обычном случае он обеспечивает наличие привилегий и не сбрасывает их (потому что больше нечего делать, не требующего привилегий):
if (setuid (0) != 0) {
(void) fputs (_("Cannot change ID to root.\n"), stderr);
SYSLOG ((LOG_ERR, "can't setuid(0)"));
closelog ();
exit (E_NOPERM);
}
Большинство утилит не сбрасывают поведение setuid/setgid, предполагая, что они не установлены с этими правами.
Проблему можно решить, выполнив следующие действия:
Отредактируйте файл ~/.ssh/config
вашего клиента таким образом, чтобы запись хоста имела следующее:
Host fooName
Hostname foo.name.tld
User usrname
IdentityFile ~/.ssh/fooName.pub
IdentitiesOnly yes
Обратите внимание, что директива IdentityFile
относится к открытому ключу, а не к файлу закрытого ключа.
Добавьте соответствующий закрытый ключ в агент ssh -с помощью ssh-add
. В это время у вас должен быть запрошен пароль.