10.5. Senhas de uso único

S/Key é um esquema de senha de uso único baseado em uma função hash de one-way. O FreeBSD usa o hash MD4 para compatibilidade mas outros sistemas tem usado MD5 e DES-MAC. O S/Key foi parte da base do sistema FreeBSD desde a versão 1.1.5 e é também usado em um número crescende de outros sistemas operacionais. S/Key é marca registrada da Bell Communications Research, Inc.

Da versão 5.0 do FreeBSD, o S/Key foi substituído com o funcionalmente equivalente OPIE (One-time Passwords In Everything). OPIE usa o hash MD5 por padrão.

Há três diferentes tipos de senhas que nós discutiremos abaixo. O primeito é seu estilo UNIX® usual ou senha Kerberos; nós chamaremos isto de uma ``senha UNIX''. O segundo tipo é a senha de uso único que é gerada pelo programa key S/Key ou pelo programa OPIE opiekey(1) e acertada pelos programas keyinit ou opiepasswd(1) e o prompt de login; nós chamaremos isto uma ``senha de uso único''. O tipo final de senha é a senha secreta que você dá aos programas key/opiekey (e às veses aos programas keyinit/ opiepasswd) que se usa para gerar senhas de uso único; nós chamaremos ela de uma ``senha secreta'' ou inadequadamente apenas ``senha''.

A senha secreta não tem qualquer coisa com sua senha UNIX; podem ser as mesmas mas isto não é recomendado. Senhas secretas S/Key e OPIE não são limitadas a 8 carácteres como senhas antigas UNIX [1], podem ser tão longas o quanto você gostar. Senhas de seis ou sete frases longas são razoavelmente comuns. Para a maior parte, os sistema S/Key ou OPIE operam completamente independentes do sistema de senhas UNIX.

Além da senha, há outras duas partes de dados que são importantes para o S/Key e OPIE. Um que é conhecido como ``semente'' ou ``key'', consistindo em duas letras e cinco dígitos. O outro que é chamado ``contagem de iteração'', um número entre 1 e 100. O S/Key cria a senha de uso único concatenando a semente e a senha secreta, então aplicando o hash MD4/MD5 tantas vezes como especificadas pela contagem de interação e voltando o resultado em seis palavras curtas em inglês. Estas seis palavras em inglês é sua senha de uso único. O sistema de autenticação (primeiramente PAM) manten-se a par de última senha de uso único usada, e o usuário é autenticado se o hash da senha fornecida pelo usuário for a igual a senha anterior. Porque um hash de uso único é usado é impossível gerar senhas de uso único futuras se uma usada com sucesso for capturada; a contagem de interação é decrementada após cada login bem sucedido para manter o usuário e o programa de login em sincronismo. Quando a contagem de iteração passar de 1, o S/Key e OPIE devem ser reinicializados.

Há três programas envolvidos em cada sistema que nós discutiremos abaixo. Os programas key e opiekey aceitam uma contagem de iteração, uma semente, e uma senha secreta, e geram uma senha de uso único ou uma lista consecutiva de senhas de uso único. Os programas keyinit e opiepasswd são usados para inicializar o S/Key e OPIE respectivamente, e trocar senhas, contagem de iteração, ou sementes; aceitam um passphrase secreto, ou uma contagem de iteração, semente, e senha de uso único. Os programas keyinfo e opieinfo examinam os arquivos relevantes as credenciais (/etc/skeykeys ou /etc/opiekeys) e imprimem invocando a contagem de iteração atual do usuário e a semente.

Há quatro tipos diferentes de operações que nós cobriremos. O primeiro é usando keyinit ou opiepasswd sobre uma conexão segura para criar senhas de uso único pela primeira vez, ou para trocar sua senha ou semente. A segunda operação é usando keyinit ou opiepasswd sobre uma conexão insegura, em conjunto com key ou opiekey sbore uma conexão segura, para fazer o mesmo. O terceiro é usando key/opiekey para fazer login sobre uma conexão insegura. O quarto é usando key ou opiekey para gerar um número de chaves que podem ser escritas ou impressas para carregar com você quanto ir a algum local sem conexão segura para qualquer lugar.

10.5.1. Inicialização de Conexão Segura

Para inicializar o S/Key pela primeira vez, troque sua senha, ou troque sua semente enquanto logado sobre uma conexão segura (e.g., no console de uma máquina ou via ssh), use o comando keyinit sem nenhum parâmetro enquanto logado:

% keyinit
Adding unfurl:
Reminder - Only use this method if you are directly connected.
If you are using telnet or rlogin exit with no password and use keyinit -s.
Enter secret password: 
Again secret password: 

ID unfurl s/key is 99 to17757
DEFY CLUB PRO NASH LACE SOFT

Para OPIE, opiepasswd é usado:

% opiepasswd -c
[grimreaper] ~ $ opiepasswd -f -c
Adding unfurl:
Only use this method from the console; NEVER from remote. If you are using
telnet, xterm, or a dial-in, type ^C now or exit with no password.
Then run opiepasswd without the -c parameter.
Using MD5 to compute responses.
Enter new secret pass phrase:
Again new secret pass phrase:
ID unfurl OTP key is 499 to4268
MOS MALL GOAT ARM AVID COED

Nos prompts Enter new secret pass phrase: ou Enter secret password:, você deve entrar uma senha ou frase. Lembre-se, isto não é a senha que você usará para fazer login, é usada para gerar suas chaves login de uso único. A linha ``ID'' dá os parâmetros da sua instância particular: seu nome de login, a contagem de iteração, e semente. Ao logar o sistema recordará estes parâmetros e apresenta-os para você assim você não tem que lembra-los. A última linha dá a senha de uso único particular que corresponde a estes parâmetros e sua senha secreta; se você fosse re-logar imediatamente, esta senha de uso único é a que você usaria.

10.5.2. Inicialização da Conexão Insegura

Para inicializar ou trocar sua senha secreta sob uma conexão insegura, você precisará já tem uma conexão segura para algum lugar onde você pode executar o key ou opiekey; isto pode ser na forma de um acessório de desktop em um Macintosh®, ou um prompt shell em uma máquina que você confia. Você precisará também fazer uma contagem de iteração (100 é provavelmente um bom valor), e você pode fazer sua própria semente ou usar uma gerada randomicamente. Sob a conexão insegura (para a máquina que você esta inicializando), use o comando keyinit -s:

% keyinit -s
Updating unfurl:
Old key: to17758
Reminder you need the 6 English words from the key command.
Enter sequence count from 1 to 9999: 100
Enter new key [default to17759]: 
s/key 100 to 17759
s/key access password:
s/key access password:CURE MIKE BANE HIM RACY GORE

Para o OPIE, você precisa usar opiepasswd:

% opiepasswd

Updating unfurl:
You need the response from an OTP generator.
Old secret pass phrase:
        otp-md5 498 to4268 ext
        Response: GAME GAG WELT OUT DOWN CHAT
New secret pass phrase:
        otp-md5 499 to4269
        Response: LINE PAP MILK NELL BUOY TROY

ID mark OTP key is 499 gr4269
LINE PAP MILK NELL BUOY TROY

Para aceitar a semente padrão (que o programa keyinit confusingly chama de key), pressione Return. Então antes de entrar uma senha de acesso, vá para sua conexão segura ou acessório de desk S/Key, e aplique os mesmos parâmetros:

% key 100 to17759
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: <secret password>
CURE MIKE BANE HIM RACY GORE

Ou para o OPIE:

% opiekey 498 to4268
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT

Agora troque de volta para sua conexão insegura, e copie a senha de uso único gerada over to the relevant program.

10.5.3. Gerando uma Senha de Uso Único

Uma vez que você tenha inicializado o S/Key ou OPIE, quando você fizer login será apresentado com um prompt como este:

% telnet example.com
Trying 10.0.0.1...
Connected to example.com
Escape character is '^]'.

FreeBSD/i386 (example.com) (ttypa)

login: <username>
s/key 97 fw13894
Password:

Ou para o OPIE:

% telnet example.com
Trying 10.0.0.1...
Connected to example.com
Escape character is '^]'.

FreeBSD/i386 (example.com) (ttypa)

login: <username>
otp-md5 498 gr4269 ext
Password:

As a side note, os prompts do S/Key e OPIE tem uma característica útil (não mostrada aqui): se você pressionar Return no prompt de senha, o prompter irá ligar o echo, assim você pode ver o que você está digitando. Isto pode ser extremamente útil se você estiver tentando digitar uma senha manualmente, como de um impresso.

Neste momento você precisa gerar sua senha de uso único para responder este prompt de login. Isto deve ser feito em um sistema confiável em que você pode executar key ou opiekey. (Há versões destes para DOS, Windows® e Mac OS® também.) Necessitam ambos a contagem de iteração e a semente como opções de linha de comando. Você pode copiar-e-colar estes do prompt de login na máquina a que você está logando.

No sistema confiável:

% key 97 fw13894
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: 
WELD LIP ACTS ENDS ME HAAG

Para OPIE:

% opiekey 498 to4268
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT

Agora que você tem sua senha de uso único você pode continuar logando:

login: <username>
s/key 97 fw13894
Password: <return to enable echo>
s/key 97 fw13894
Password [echo on]: WELD LIP ACTS ENDS ME HAAG
Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ...

10.5.4. Gerando Múltiplas Senhas de Uso Único

As vezes você tem que ir a logares onde você não tem acesso a uma máquina confiável ou uma conexão segura. Neste caso, é possível usar os comandos key e opiekey para gerar de antemão um número de senhas de uso único para serem impressas e levadas com você. Por exemplo:

% key -n 5 30 zz99999
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: <secret password>
26: SODA RUDE LEA LIND BUDD SILT 
27: JILT SPY DUTY GLOW COWL ROT  
28: THEM OW COLA RUNT BONG SCOT  
29: COT MASH BARR BRIM NAN FLAG  
30: CAN KNEE CAST NAME FOLK BILK

Ou para o OPIE:

% opiekey -n 5 30 zz99999
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <secret password>
26: JOAN BORE FOSS DES NAY QUIT
27: LATE BIAS SLAY FOLK MUCH TRIG
28: SALT TIN ANTI LOON NEAL USE
29: RIO ODIN GO BYE FURY TIC
30: GREW JIVE SAN GIRD BOIL PHI

O -n 5 pede cinco chaves em sequência, o 30 especifica o que o último número de iteração deve ser. Note que estes são impressos em ordem reversa do uso eventual. Se você for realmente paranóico, você pode querer escrever os resultados manualmente; caso contrário você pode copiar-e-colar no lpr. Note que cada linha mostra ambos a contagem de iteração e a senha de uso único; you may still find it handy to scratch off passwords as you use them.

10.5.5. Restringindo o Uso de Senhas UNIX®

S/Key pode colocar restrições no uso de senhas UNIX baseadas no nome de host, nome de usuário, porta de terminal, ou endereço IP de uma seção de login. Estas restrições podem ser encontradas no arquivo de configuração /etc/skey.access. A página de manual skey.access(5) tem mais informação no formato completo do arquivo e também detalha alguns cuidados com segurança para se estar ciente antes dependendo deste arquivo para a segurança.

Se não existir o arquivo /etc/skey.access (iste é o padrão em sistemas FreeBSD 4.X), então todos os usuários estarão permitidos a usar senhas UNIX. Se o arquivo existir, entretanto, então todos os usuários estarão requeridos a usar S/Key a menos que permitidos explicitamente para fazer de outra maneira por declarações de configuração no arquivo skey.access. Em todos os casos, senhas UNIX são permitidas no console.

Aqui esta uma amostra do arquivo de configuração skey.access que ilustra os três tipos mais comuns de declarações de configuração:

permit internet 192.168.0.0 255.255.0.0
permit user fnord
permit port ttyd0

A primeira linha (permit internet) permite os usuários cujo endereço IP de origem (que é vulnerável a spoofing) combina com o valor e máscara especificados, para usar senhas UNIX. Isto não deve ser considerado um mecanismo de segurança, mas preferivelmente, um meio de lemrar usuários autorizados que eles estão usando uma rede insegura e necessitam usar S/Key para autenticação.

A segunda linha (permit user) permite o nome de usuário especificado, neste caso fnord, usar senhas UNIX a qualquer hora. Geralmente falando, isto deve somente ser usado para pessoas que são incapazes de usar o programa key, como aquelas com terminais burros, ou aquelas que são mal-educadas.

A terceira linha (permit port) permite todos os usuários que fizerem login no terminal especificado usar senhas UNIX; isto seria usado para conexões discadas.

O OPIE pode restringir o uso das senhas UNIX baseado no endereço IP de uma seção de login como o S/Key faz. O arquivo relevante é o /etc/opieaccess, que é atualmente padrão no FreeBSD 5.0 e em novos sistemas. Por favor verifique opieaccess(5) para mais informação deste arquivo e de considerações de segurança que você deve estar ciente ao usar.

Aqui esta uma amostra do arquivo opieaccess:

permit 192.168.0.0 255.255.0.0

Esta linha permite os usuários cujo endereço IP de origem (que é vulnerável a spoofing) combina com o valor e a máscara especificados, a usar senhas UNIX em qualquer hora.

Se nenhuma regra no opieaccess combinar, o padrão é negar logins não OPIE.

Notas

[1]

Sob FreeBSD as senhas de login padrão podem ter até 128 carácteres de comprimento.

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.