Qual é o escape correto para arquivos de credenciais de montagem autofs?

4

Eu configurei o autofs no CentOS usando /etc/auto.mymount . Algo assim:

mymount -fstype=cifs,rw,noperm,credentials=/etc/auto.creds.svc_account ://winserver.domain.local/SharedFolder

Isso tem funcionado e ainda funciona para algumas montagens. No entanto, uma senha foi alterada para uma conta que é usada para conectar a um servidor Windows e agora contém todos os tipos de caracteres especiais. Meu arquivo de credenciais /etc/auto.creds.svc_account parece um pouco com isto:

username=svc_account
password=AbCd@a;abc{'B"[C\~/fg9w(G':4##abC}d3.H}v,2]f+c

Obviamente, alterei a senha acima, mas ela contém vários caracteres não alfanuméricos que estão na senha real.

Olhando em / var / log / messages, vejo o seguinte:

Status code returned 0xc000006d NT_STATUS_LOGON_FAILURE
CIFS VFS: Send error in SessSetup = -13
CIFS VFS: cifs_mount failed w/return code = -13

Dado que a única coisa que mudou é a senha, estou supondo que há caracteres especiais que precisam ser escapados de alguma forma.

Agora eu sei que se eu colocar essa senha na linha de comando, os comandos cairão devido aos vários caracteres especiais, que podem ser tratados precedendo cada um deles com uma barra invertida. Por exemplo:

password=AbCd@a\;abc{\'B\"[C\\~/fg9w\(G\':4##abC}d3.H}v,2]f+c

Mas isso não funcionou, então claramente estou perdendo alguma coisa. Alguém é capaz de explicar quais caracteres precisam ser escapados em um arquivo de credenciais e a maneira correta de escapar deles?

    
por Steve 13.05.2014 / 12:47

4 respostas

5

Suponho que o arquivo de credenciais será lido por mount.cifs , como para outras montagens CIFS. Então eu dei uma olhada em o arquivo de código mount.cifs.c no código atual do cifs-utils , que deve ser para a versão 6.3. O código para ler a senha não faz escape, exceto que cada vírgula é dobrada no campo password do parsed_mount_info struct, como aparentemente é necessário ao montar os parâmetros para a chamada mount(2) :

/*
 * CIFS has to "escape" commas in the password field so that they don't
 * end up getting confused for option delimiters. Copy password into pw
 * field, turning any commas into double commas.
 */
static int set_password(struct parsed_mount_info *parsed_info, const char *src)
{
    char *dst = parsed_info->password;
    unsigned int i = 0, j = 0;

    while (src[i]) {
        if (src[i] == ',')
            dst[j++] = ',';
        dst[j++] = src[i++];
        if (j > sizeof(parsed_info->password)) {
            fprintf(stderr, "Converted password too long!\n");
            return EX_USAGE;
        }
    }
    dst[j] = '
/*
 * CIFS has to "escape" commas in the password field so that they don't
 * end up getting confused for option delimiters. Copy password into pw
 * field, turning any commas into double commas.
 */
static int set_password(struct parsed_mount_info *parsed_info, const char *src)
{
    char *dst = parsed_info->password;
    unsigned int i = 0, j = 0;

    while (src[i]) {
        if (src[i] == ',')
            dst[j++] = ',';
        dst[j++] = src[i++];
        if (j > sizeof(parsed_info->password)) {
            fprintf(stderr, "Converted password too long!\n");
            return EX_USAGE;
        }
    }
    dst[j] = '%pre%';
    parsed_info->got_password = 1;
    return 0;
}
'; parsed_info->got_password = 1; return 0; }

No caso de um arquivo de credenciais, src aponta para a posição na linha de senha logo atrás do sinal = . Tudo entre o sinal = e o final da linha, conforme lido por fgets() , é copiado no campo de senha. (A nova linha é substituída por um byte nulo antes da cópia.) Mas para qualquer outra maneira de definir uma senha, como variáveis de ambiente, opções ou stdin, a mesma rotina é chamada, portanto, se montar o volume funcionar na linha de comando, que a duplicação de vírgulas não é o culpado.

No entanto, você pode ter problemas se alguma linha contiver espaço em branco ou se o seu arquivo de credenciais tiver terminações de linha não-UNIX. Um CR final seria lido como parte da senha, assim como outros espaços em branco à direita. Da mesma forma, a leitura da senha pode falhar se sua senha contiver caracteres não-ASCII, nos quais a codificação do arquivo seria importante.

TL, DR:

  • Nada precisa ser ignorado na senha
  • Verifique se a montagem do volume CIFS funciona na linha de comando
  • Verifique o espaço em branco à direita na linha de senha
  • Verifique se o seu arquivo de credenciais tem formato UNIX e nenhuma linha DOS terminações
  • Verifique se há caracteres não ASCII (como umlauts) na senha
  • Verifique se funciona com uma senha sem vírgulas (realmente não deve fazer diferença, mas quem sabe)
por 20.05.2014 / 19:20
1

Você tem algum espaço no arquivo, talvez entre os sinais = ? um erro -13 pode ser causado por espaços no arquivo creds, conforme o link a seguir. link

Meu próprio pensamento também se pergunta se isso pode ser devido a um problema de codificação com o arquivo em si. O que file -bi /etc/auto.creds.svc_account retorna? Talvez haja um personagem de controle perdido? O que abre o arquivo com o vim e executa :set list show? Talvez não tenha sido um problema antes, porque a codificação usada apenas "explode" em certos caracteres que não estavam presentes na senha até agora. A maneira mais fácil de solucionar isso seria recriar o arquivo e tentar novamente, ou comparar a senha de trabalho antiga com a nova e determinar quais novos caracteres especiais podem ter sido introduzidos.

    
por 20.05.2014 / 19:53
1

Eu não sei se é tarde demais para responder isso, mas para qualquer outra pessoa que tenha esse problema, eu passei algumas horas batendo a cabeça contra uma parede com uma VM do CentOS6 tentando acessar os compartilhamentos cifs no Windows 7 host.

No final, o que funcionou para mim foi alterar a linha de senha no arquivo de credenciais para usar "pass" como o nome do parâmetro. por exemplo,

user=myUserName
domain=MYDOMAIN
pass=myStrongPasswordWithSpecialCharacters

Eu não sei se algo sobre os caracteres especiais na senha estragou algo quando o arquivo foi analisado, mas notei que o nome de usuário e a senha estavam sendo analisados pelo usuário e aprovados, então decidi cortar essa etapa colocando esses valores diretamente no arquivo.

Espero que isso ajude alguém.

    
por 06.10.2015 / 20:51
0

Você deve poder usar códigos ASCII para caracteres especiais, por exemplo:

SPACE = 0
AMPERSAND = 6

Consulte a tabela ASCII aqui: link

Solução encontrada em: link

    
por 20.05.2014 / 20:18