Como usar módulos PAM para autenticação local no Linux usando chaves GOST-2012 no Rutoken



Senhas simples não protegem, e senhas complexas não podem ser lembradas. Portanto, eles costumam ser encontrados em um adesivo sob o teclado ou no monitor. Para que as senhas permaneçam na cabeça dos usuários "esquecidos" e a confiabilidade da proteção não seja perdida, existe a autenticação de dois fatores (2FA).

Devido à combinação de fatores de propriedade do dispositivo e conhecimento do seu código PIN, o próprio código PIN pode ser mais simples e fácil de lembrar. As deficiências no comprimento ou na aleatoriedade do código PIN são compensadas pelo requisito de propriedade física e restrições na pesquisa do código PIN.

Além disso, nas instituições estatais, eles querem que tudo funcione de acordo com o GOST. Sobre esta opção 2FA para entrar no Linux e será discutido. Vou começar de longe.

Módulos PAM


Módulos de autenticação conectáveis ​​(PAMs) são módulos com uma API padrão e implementações de vários mecanismos de autenticação em aplicativos.
Todos os utilitários e aplicativos que podem trabalhar com o PAM os coletam e podem usá-los para autenticar o usuário.
Na prática, isso funciona da seguinte maneira: o comando login se volta para o PAM, que executa todas as verificações necessárias usando os módulos especificados no arquivo de configuração e retorna o resultado ao comando login.

librtpam


O módulo desenvolvido pela empresa Active adiciona autenticação de dois fatores aos usuários usando cartões inteligentes ou tokens USB usando chaves assimétricas, de acordo com os mais recentes padrões de criptografia doméstica.

Considere o princípio de seu trabalho:
  • o token armazena o certificado do usuário e sua chave privada;
  • O certificado é salvo no diretório inicial do usuário como confiável.


O processo de autenticação é o seguinte:
  1. Rutoken procura o certificado pessoal do usuário.
  2. Um PIN de token é solicitado.
  3. Os dados aleatórios são assinados em uma chave privada diretamente no chip Rutoken.
  4. A assinatura recebida é verificada usando a chave pública do certificado do usuário.
  5. O módulo retorna o resultado da verificação de assinatura para o aplicativo de chamada.


Você pode autenticar usando as teclas GOST R 34.10-2012 (comprimento 256 ou 512 bits) ou GOST R 34.10-2001 desatualizado.

Não há necessidade de se preocupar com a segurança das chaves - elas são geradas diretamente no Rutoken e nunca deixam sua memória durante operações criptográficas.



O Rutoken EDS 2.0 é certificado pelo FSB e FSTEC de acordo com o NDV 4, portanto, pode ser usado em sistemas de informação que processam informações confidenciais.

Uso prático


Quase todo Linux moderno é adequado, por exemplo, usaremos o xUbuntu 18.10.

1) Instale os pacotes necessários


sudo apt-get install libccid pcscd opensc
Se você deseja adicionar um bloqueio de área de trabalho com um protetor de tela, instale adicionalmente o pacote libpam-pkcs11 .

2) Adicione um módulo PAM com suporte para GOST


Faça o download da biblioteca em https://download.rutoken.ru/Rutoken/PAM/
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


Faça o download e instale o pacote DEB ou RPM no link: https://www.rutoken.ru/support/download/pkcs/

4) Verificamos que o Rutoken EDS 2.0 funciona no sistema


No terminal, execute
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T
Se você Rutoken ECP <no label> a linha Rutoken ECP <no label> - tudo está 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)
  • Se informações sobre chaves e certificados forem exibidas , você precisará ler o certificado e salvá-lo no disco. Para fazer isso, execute o seguinte comando, onde, em vez de {id}, você precisa substituir o certificado de ID que 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 for criado, vá para a etapa 6).
  • não há nada , então o dispositivo está vazio. Entre em contato com seu administrador ou crie as chaves e certificado você mesmo seguindo a próxima etapa.


5.1) Crie um certificado de teste


Atenção! Os métodos descritos para criar chaves e certificados são adequados para teste e não se destinam ao uso no modo de combate. Para fazer isso, você precisa usar chaves e certificados emitidos por uma autoridade de certificação confiável da sua organização ou por uma autoridade de certificação credenciada.
O módulo PAM foi projetado para proteger computadores locais e envolve trabalho em pequenas organizações. Como existem poucos usuários, o próprio administrador pode monitorar a revogação de certificados e bloquear manualmente as contas, bem como o período de validade dos certificados. O módulo PAM ainda não é capaz de verificar certificados pela CRL e criar cadeias de confiança.


Maneira fácil (via navegador)


Para obter um certificado de teste, use o serviço da web Rootoken Registration Center . O processo não levará mais que 5 minutos.

Caminho Geek (via console e possivelmente compilador)


Verifique a versão do OpenSC
$ opensc-tool --version
Se a versão for menor que 0,20, atualize ou colete a ramificação pkcs11-tool com suporte do GOST 2012 no nosso GitHub (no momento deste artigo, a liberação 0.20 ainda não foi lançada) ou na ramificação principal do projeto principal do OpenSC, o mais tardar no commit 8cf1e6f

Geramos um par de chaves com parâmetros:
--key-type: GOSTR3410-2012-512: (-2012 512 c ), GOSTR3410-2012-256:A (-2012 256 A)

--id: identificador de objeto (CKA_ID) como números de caracteres de dois dígitos em hexadecimal da tabela ASCII. Use apenas códigos ASCII para caracteres impressos, como id precisará passar o OpenSSL como uma string. Por exemplo, os códigos ASCII "3132" correspondem à sequência "12". Por conveniência, você pode usar o serviço online para converter seqüências de caracteres em códigos ASCII .

$ ./pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-512:A -l --id 3132

Em seguida, criaremos um certificado. Duas maneiras serão descritas abaixo: a primeira através da CA (usaremos CAs de teste), a segunda - autoassinada. Para fazer isso, você deve primeiro instalar e configurar o OpenSSL versão 1.1 ou posterior para trabalhar com o Rutoken por meio de um módulo rtengine especial usando o manual Instalar e configurar o OpenSSL .
Por exemplo: para '- -id 3132 ' no OpenSSL, você precisa especificar " pkcs11:id=12 ".

Você pode usar os serviços de uma CA de teste, dos quais existem muitos, por exemplo, aqui , aqui e aqui . Para isso, criaremos uma solicitação de certificado

Outra opção é sucumbir à preguiça e criar um auto-assinado
$ openssl req -utf8 -new -keyform engine -key "pkcs11:id=12" -engine rtengine -out req.csr

Faça o download do certificado para o dispositivo
$ openssl req -utf8 -x509 -keyform engine -key "pkcs11:id=12" -engine rtengine -out cert.cer

6) Registre o certificado no sistema


Verifique se o seu certificado se parece com um arquivo base64:



Se o 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
Mais uma vez, verificamos que agora tudo está em ordem.

Adicione um 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 ​​contra alterações acidentais ou intencionais de outros usuários. Isso elimina a situação em que alguém adiciona seu certificado aqui e pode efetuar login em seu nome.

7) Configurar autenticação


A configuração do nosso módulo PAM é completamente padrão e é feita exatamente como as configurações de outros módulos. Criamos no arquivo /usr/share/pam-configs/rutoken-gost-pam contém o nome completo do módulo, se ele está ativado por padrão, prioridade do módulo e parâmetros de autenticação.
Nos parâmetros de autenticação, existem requisitos para o sucesso da operação:
  • necessário: esses módulos devem retornar uma resposta positiva. Se o resultado da chamada do módulo contiver uma resposta negativa, isso causará um erro de autenticação. A solicitação será redefinida, mas o restante dos módulos será chamado.
  • requisito (obrigatório): semelhante ao obrigatório, mas imediatamente leva à falha de autenticação e ignora o restante dos módulos.
  • suficiente: se na frente desse módulo nenhum dos módulos necessários ou suficientes retornou um resultado negativo, o módulo retornará uma resposta positiva. Os módulos restantes serão ignorados.
  • opcional (opcional): se não houver módulos necessários na pilha e nenhum dos módulos suficientes retornar um resultado positivo, pelo menos um dos módulos opcionais deverá retornar uma resposta positiva.

O conteúdo completo do arquivo /usr/share/pam-configs/rutoken-gost-pam :
Name: Rutoken PAM GOST
Default: yes
Priority: 800
Auth-Type: Primary
Auth: sufficient /usr/lib/librtpam.so.1.0.0 /usr/lib/librtpkcs11ecp.so




salve o arquivo e execute
$ sudo pam-auth-update
na janela que aparece, coloque um asterisco perto de Rutoken PAM GOST e clique em OK



8) Verifique a configuração


Para entender que tudo está configurado, mas para não perder a capacidade de efetuar login, digite o comando
$ sudo login
Digite seu nome de usuário. Tudo está configurado corretamente se o sistema exigir um PIN do dispositivo.



9) Configure a trava do computador ao extrair o token


O pacote libpam-pkcs11 inclui o utilitário pkcs11_eventmgr, que permite executar várias ações quando ocorrerem eventos do PKCS # 11.
Para configurar o pkcs11_eventmgr use o arquivo de configuração: /etc/pam_pkcs11/pkcs11_eventmgr.conf
Para várias distribuições Linux, o comando que causa o bloqueio da conta ao remover cartões inteligentes ou tokens será diferente. Veja o event card_remove .
Um arquivo de configuração de exemplo é apresentado abaixo:

 pkcs11_eventmgr { #    daemon = true; #    debug = false; #     polling_time = 1; #  -    # - 0 expire_time = 0; #  pkcs11      pkcs11_module = usr/lib/librtpkcs11ecp.so; #    #  : event card_insert { #     (  ) on_error = ignore ; action = "/bin/false"; } #   event card_remove { on_error = ignore; #     #  GNOME action = "dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock"; #  XFCE # action = "xflock4"; #  Astra Linux (FLY) # action = "fly-wmfunc FLYWM_LOCK"; } #     event expire_time { #     (  ) on_error = ignore; action = "/bin/false"; } } 


Depois disso, adicione o aplicativo pkcs11_eventmgr ao carregamento automático. Para fazer isso, edite o arquivo .bash_profile:
$ nano /home/<_>/.bash_profile
Adicione a linha pkcs11_eventmgr ao final do arquivo e reinicie.

As etapas descritas para configurar o sistema operacional podem ser usadas como instruções em qualquer distribuição moderna do Linux, incluindo as domésticas.



Conclusão


Os PCs Linux estão se tornando cada vez mais populares nas agências governamentais russas, e nem sempre é fácil configurar uma autenticação de dois fatores confiável neste sistema operacional. Ficaremos felizes com este guia para ajudar a resolver o "problema da senha" e proteger com segurança o acesso ao seu PC sem gastar muito tempo nele.

Source: https://habr.com/ru/post/pt461199/


All Articles