Как использовать ssh-agent для предоставления ключей для конкретного хоста из файла ~ / .ssh / config и управлять паролями?

Общий смысл замечания @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, предполагая, что они не установлены с этими правами.

4
23.01.2017, 04:57
1 ответ

Проблему можно решить, выполнив следующие действия:

  1. Отредактируйте файл ~/.ssh/configвашего клиента таким образом, чтобы запись хоста имела следующее:

    Host fooName
        Hostname foo.name.tld
        User usrname
        IdentityFile ~/.ssh/fooName.pub
        IdentitiesOnly yes
    

    Обратите внимание, что директива IdentityFileотносится к открытому ключу, а не к файлу закрытого ключа.

  2. Добавьте соответствующий закрытый ключ в агент ssh -с помощью ssh-add. В это время у вас должен быть запрошен пароль.

7
27.01.2020, 21:01

Теги

Похожие вопросы