
Senhas simples não protegem, enquanto senhas complexas são difíceis de lembrar. Por isso, muitas vezes, elas acabam em um adesivo embaixo do teclado ou na tela. Para que as senhas permaneçam na memória de usuários “esquecidos” e a segurança não seja comprometida, existe a autenticação de dois fatores (2FA).
Graças à combinação de possuir um dispositivo e conhecer seu PIN, o próprio PIN pode ser mais simples e fácil de lembrar. As deficiências em comprimento ou aleatoriedade do PIN são compensadas pela exigência de posse física e restrições na tentativa de adivinhação do PIN.
Além disso, em organismos governamentais, pode haver a necessidade de que tudo funcione de acordo com as normas. Sobre essa opção de 2FA para acesso ao Linux é que vamos falar. Começarei do início.
Módulos PAM
Módulos de Autenticação Plugáveis (Pluggable Authentication Modules, PAM) são módulos com uma API padrão e implementações de vários mecanismos de autenticação em aplicativos.
Todas as utilidades e aplicativos que conseguem trabalhar com PAM os capturam e podem usar para autenticação de usuários.
Na prática, funciona mais ou menos assim: o comando login solicita ao PAM, que realiza todas as verificações necessárias através dos módulos especificados no arquivo de configuração e retorna o resultado ao comando login.
librtpam
O módulo desenvolvido pela empresa "Ativo" adiciona a autenticação de dois fatores para usuários através de cartões inteligentes ou tokens USB usando chaves assimétricas de acordo com os mais recentes padrões de criptografia nacional.
Vamos considerar o princípio de seu funcionamento:
- o token armazena o certificado do usuário e sua chave privada;
- o certificado é armazenado no diretório pessoal do usuário como confiável.
O processo de autenticação ocorre da seguinte forma:
- No Rutoken, é feita a busca pelo certificado pessoal do usuário.
- O PIN do token é solicitado.
- É realizada a assinatura de dados aleatórios na chave privada diretamente no chip do Rutoken.
- A assinatura obtida é verificada com a chave pública do certificado do usuário.
- O módulo retorna ao aplicativo chamador o resultado da verificação da assinatura.
É possível se autenticar utilizando as chaves da norma ГОСТ Р 34.10-2012 (com comprimentos de 256 ou 512 bits) ou da antiga ГОСТ Р 34.10-2001.
A segurança das chaves pode ficar garantida – elas são geradas diretamente no Rutoken e nunca deixam sua memória durante operações criptográficas.

O Rutoken ECP 2.0 é certificado pela FSB e FSTEK de acordo com NDV 4, portanto, pode ser usado em sistemas de informação que processam dados confidenciais.
Utilização prática
Praticamente qualquer Linux moderno servirá, por exemplo, estaremos usando xUbuntu 18.10.
1) Instale os pacotes necessários
sudo apt-get install libccid pcscd opensc
Se você quiser adicionar um bloqueio da área de trabalho com protetor de tela – instale adicionalmente o pacote libpam-pkcs11.
2) Adicione um módulo PAM com suporte a GOSTs
Carregue a biblioteca com
Copie o conteúdo da pasta PAM librtpam.so.1.0.0 para a pasta do sistema
/usr/lib/ ou /usr/lib/x86_64-linux-gnu/ou /usr/lib64
3) Instale o pacote com librtpkcs11ecp.so
Baixe e instale o pacote DEB ou RPM pelo link:
4) Verifique se o Rutoken ECP 2.0 está funcionando no sistema
No terminal, execute
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T
Se você vir a linha Rutoken ECP – significa que está tudo bem.
5) Leia o certificado
Verifique se o dispositivo possui um certificado
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O
Se após a linha:
Using slot 0 with a present token (0x0)
- sair informações sobre chaves e certificados, você precisa ler o certificado e salvá-lo no disco. Para isso, execute o seguinte comando, onde em vez de {id} deve-se substituir pelo ID do certificado que você viu na saída do comando anterior:
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -r -y cert --id {id} --output-file cert.crt
Se o arquivo cert.crt foi criado, vamos para o ponto 6). - se não há nada, significa que o dispositivo está vazio. Entre em contato com o administrador ou crie chaves e certificado por conta própria, seguindo o próximo ponto.
5.1) Crie um certificado de teste
Atenção! Os métodos descritos para criar chaves e certificados são adequados para testes e não devem ser utilizados em ambientes de produção. Para isso, é necessário usar chaves e certificados emitidos por um centro de certificação confiável da sua organização ou por um centro de autorizador credenciado.
O módulo PAM foi criado para proteger computadores locais e é destinado a pequenas organizações. Como há poucos usuários, o Administrador pode gerenciar a revogação de certificados e bloquear contas manualmente, assim como a validade dos certificados. O módulo PAM ainda não possui a capacidade de verificar certificados via CRL e construir cadeias de confiança.
Caminho simples (via navegador)
Para obter um certificado de teste, utilize . O processo levará no máximo 5 minutos.
Caminho geek (via console e, possivelmente, compilador)
Verifique a versão do OpenSC
$ opensc-tool --version
Se a versão for inferior a 0.20, atualize ou compile do nosso GitHub (no momento da publicação deste artigo, a versão 0.20 ainda não havia sido lançada) ou da ramificação master do projeto OpenSC, não mais tarde que
Gerando um par de chaves com os parâmetros:
--key-type: GOSTR3410-2012-512:A (GOST-2012 512 bits com conjunto de parâmetros A), GOSTR3410-2012-256:A (GOST-2012 256 bits com conjunto de parâmetros A)
--id: identificador do objeto (CKA_ID) na forma de códigos hexadecimais de dois dígitos da tabela ASCII. Utilize apenas códigos ASCII de caracteres imprimíveis, pois o id precisará ser passado ao OpenSSL como uma string. Por exemplo, o código ASCII "3132" corresponde à string "12". Para conveniência, você pode usar .
$ ./pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-512:A -l --id 3132
Em seguida, vamos criar o certificado. Abaixo, descreveremos dois caminhos: o primeiro através de uma CA (usaremos CAs de teste), o segundo – autoassinado. Para isso, primeiro, é necessário instalar e configurar o OpenSSL versão 1.1 ou superior para trabalhar com o Rútoken através do módulo especial rtengine usando o guia .
Por exemplo: para '--id 3132' no OpenSSL, deve-se especificar "pkcs11:id=12«.
Você pode usar os serviços de uma CA de teste, que são muitas, por exemplo, , e , para isso, criaremos um pedido de certificado
Outra opção – você pode ser preguiçoso e criar um autoassinado
$ openssl req -utf8 -new -keyform engine -key "pkcs11:id=12" -engine rtengine -out req.csr
Carregando o certificado no dispositivo
$ openssl req -utf8 -x509 -motor de keyform -chave "pkcs11:id=12" -motor rtengine -out cert.cer
6) Registrando o certificado no sistema
Certifique-se de que seu certificado esteja no formato de arquivo base64:

Se seu certificado estiver assim:

é necessário converter o certificado do formato DER para o formato PEM (base64)
$ openssl x509 -in cert.crt -out cert.pem -inform DER -outform PEM
Verifique novamente se agora está tudo em ordem.
Adicionando o certificado à lista de certificados confiáveis
$ mkdir ~/.eid
$ chmod 0755 ~/.eid
$ cat cert.pem >> ~/.eid/authorized_certificates
$ chmod 0644 ~/.eid/authorized_certificates
A última linha protege a lista de certificados confiáveis de modificações acidentais ou intencionais por outros usuários. Isso exclui a situação em que alguém adiciona seu próprio certificado e consegue acessar o sistema em seu nome.
7) Configurando a autenticação
A configuração do nosso módulo PAM é absolutamente padrão e é feita da mesma forma que as configurações de outros módulos. Criamos no arquivo /usr/share/pam-configs/rutoken-gost-pam contendo o nome completo do módulo, se ele está habilitado por padrão, a prioridade do módulo e os parâmetros de autenticação.
Nos parâmetros de autenticação, há requisitos para o sucesso da operação:
- required (obrigatório): módulos desse tipo devem retornar uma resposta positiva. Se o resultado da chamada do módulo contiver uma resposta negativa, isso resultará em erro de autenticação. A solicitação será descartada, mas os demais módulos serão acionados.
- requisite (necessário): semelhante ao required, mas resulta imediatamente em falha de autenticação e ignora os demais módulos.
- sufficient (suficiente): se nenhum dos módulos required ou sufficient anterior retornar um resultado negativo, o módulo retornará uma resposta positiva. Os módulos restantes serão ignorados.
- optional (opcional): se não houver módulos required na pilha e nenhum dos módulos sufficient retornar uma resposta positiva, pelo menos um dos módulos optional deve retornar uma resposta positiva.
Conteúdo completo do arquivo /usr/share/pam-configs/rutoken-gost-pam:
Nome: Rutoken PAM GOST
Padrão: sim
Prioridade: 800
Tipo de Autenticação: Primário
Autenticação: suficiente /usr/lib/librtpam.so.1.0.0 /usr/lib/librtpkcs11ecp.so

salvamos o arquivo, em seguida, executamos
$ sudo pam-auth-update
na janela que aparece, colocamos um asterisco ao lado de Rutoken PAM GOST e clicamos em OK

8) Verificação da configuração
Para entender se tudo está configurado, mas sem perder a capacidade de acessar o sistema, digite o comando
$ sudo login
Digite o nome de usuário. Está tudo configurado corretamente se o sistema solicitar o PIN do dispositivo.

9) Configurando a bloqueio do computador ao remover o token
O pacote inclui a ferramenta libpam-pkcs11 pkcs11_eventmgr, que permite executar várias ações ao ocorrer eventos PKCS#11. Para a configuração,
pkcs11_eventmgr serve o arquivo de configuração: Para diferentes distribuições Linux, o comando que aciona o bloqueio da conta ao remover cartões inteligentes ou tokens será diferente. Veja: /etc/pam_pkcs11/pkcs11_eventmgr.conf
event card_remove Um exemplo do arquivo de configuração é apresentado abaixo:.
Um exemplo de arquivo de configuração é apresentado abaixo:
pkcs11_eventmgr
{
# Execução em segundo plano
daemon = true;
# Configuração de mensagens de depuração
debug = false;
# Tempo de interação em segundos
polling_time = 1;
# Configuração do tempo limite para remover o cartão
# Por padrão, 0
expire_time = 0;
# Seleção da biblioteca pkcs11 para operar com Rutoken
pkcs11_module = usr/lib/librtpkcs11ecp.so;
# Ações com o cartão
# Cartão inserido:
event card_insert {
# Mantém os valores padrão (nada acontece)
on_error = ignore ;
action = "/bin/false";
}
# Cartão removido
event card_remove {
on_error = ignore;
# Chama a função de bloquear a tela
# Para GNOME
action = "dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock";
# Para XFCE
# action = "xflock4";
# Para Astra Linux (FLY)
# action = "fly-wmfunc FLYWM_LOCK";
}
# Cartão removido por um longo tempo
event expire_time {
# Mantém os valores padrão (nada acontece)
on_error = ignore;
action = "/bin/false";
}
}Após isso, adicione o aplicativo serve o arquivo de configuração: ao início automático. Para isso, edite o arquivo .bash_profile:
$ nano /home//.bash_profile
Adicione a linha pkcs11_eventmgr ao final do arquivo e reinicie.
Os passos descritos para configurar o sistema operacional podem ser usados como um guia em qualquer distribuição moderna do Linux, incluindo as nacionais.

Conclusão
Computadores com Linux nas estruturas governamentais russas estão se tornando cada vez mais populares, e configurar uma autenticação de dois fatores confiável neste sistema operacional nem sempre é fácil. Esperamos que este guia ajude a resolver o 'problema das senhas' e a proteger o acesso ao PC de forma confiável, sem gastar muito tempo.
Fonte: habr.com
