Razões para o arquivo .ssh / rc não ser executado

2

Eu tenho uma máquina remota com o Ubuntu 16.04.3 em execução. Eu quero que meu arquivo ~/.ssh/rc seja executado toda vez que eu fizer login via ssh. No entanto, é silenciosamente ignorado. Não há mensagens de erro (ou até mesmo mensagens relacionadas a rc) nem em ssh -vvvv do lado do cliente nem em /var/log/auth.log do lado do servidor.

A opção sshd PermitUserRC para sshd é definida como Yes (não é explicitamente mencionada no arquivo de configuração, mas seu valor padrão é Yes ).

As permissões são 700 para ~/.ssh e ~/.ssh/rc .

A mesma configuração do lado do cliente funciona em outras versões do Ubuntu (12.04 e 14.04).

Eu tenho acesso sudo à máquina, mas não consigo reiniciar ou reiniciar o sshd. (Embora os administradores possam fazê-lo se eu encontrar uma causa).

Quaisquer razões pelas quais isso possa acontecer?

    
por Ivan Smirnov 04.05.2018 / 18:18

1 resposta

1

Este é o código OpenSSH 7.3p1 para invocar .ssh/rc . É de "session.c". O arquivo rc é chamado por uma função chamada do_rc_files() . Todo esse código é executado no servidor. Todas as opções referenciadas são obtidas de sshd_config , juntamente com a entrada authorized_keys do arquivo para a chave que autenticou a sessão (se a autenticação por chave foi usada).

/*
 * Run $HOME/.ssh/rc, /etc/ssh/sshrc, or xauth (whichever is found
 * first in this order).
 */
static void
do_rc_files(Session *s, const char *shell)
{

    [...]

        /* ignore _PATH_SSH_USER_RC for subsystems and admin forced commands */
        if (!s->is_subsystem && options.adm_forced_command == NULL &&
            !no_user_rc && options.permit_user_rc &&
            stat(_PATH_SSH_USER_RC, &st) >= 0) {
                snprintf(cmd, sizeof cmd, "%s -c '%s %s'",
                    shell, _PATH_BSHELL, _PATH_SSH_USER_RC);
                if (debug_flag)
                        fprintf(stderr, "Running %s\n", cmd);
                f = popen(cmd, "w");
                if (f) {
                        if (do_xauth)
                                fprintf(f, "%s %s\n", s->auth_proto,
                                    s->auth_data);
                        pclose(f);
                } else
                        fprintf(stderr, "Could not run %s\n",
                            _PATH_SSH_USER_RC);
        } else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) {
            ...

do_rc_files() em si é chamado assim:

    if (!options.use_login)
            do_rc_files(s, shell);

Então, isso nos diz:

  1. Nenhum arquivo rc é invocado se a opção sshd "UseLogin" estiver configurada.
  2. .ssh / rc não será chamado se a sessão estiver chamando um subsistema. Isso afeta as sessões de SFTP, por exemplo.
  3. .ssh / rc não será chamado se a sessão estiver sujeita a uma configuração de ForceCommand em sshd_config (mas não para comandos forçados de authorized_keys ).
  4. .ssh / rc não é invocado se a opção authorized_keys "no-user-rc" tiver sido definida (ou "restrita", o que implica no-user-rc).
  5. .ssh / rc não será chamado se a opção sshd_config "PermitUserRC" estiver configurada como "no".
  6. .ssh / rc não é chamado se não estiver presente, relativo ao diretório inicial do usuário.

Se o OpenSSH decidir invocar o .ssh / rc, ele acabará invocando este comando:

$SHELL -c '/bin/sh .ssh/rc'

onde "$ SHELL" é o shell de login do usuário. Isso falhará se o shell do usuário não aceitar a opção "-c" para executar um comando. Ele também pode falhar se /bin/sh estiver ausente ou não estiver funcionando corretamente.

    
por 06.05.2018 / 14:07