Différences entre versions de « Authentification à deux facteurs (A2F) sous Linux »

(création de la page en mode brouillon)
 
(structure de base)
Ligne 1 : Ligne 1 :
brouillon
+
ceci est un brouillon
 +
 
 +
intro
 +
 
 +
lien Authentification_à_deux_facteurs_(A2F)
 +
 
 +
== KeePassXC ==
 +
 
 +
lien doc TI pour "Mac"
 +
 
 +
== Authenticator ==
 +
 
 +
lien flatpak
 +
 
 +
== Obtenir un code via un script Python ==
 +
 
 +
si pour une raison quelconque vous ne pouvez utiliser les outils choisis par les TI, il est possible d'obtenir un code A2F via le script Python (version 3) suivant:
 +
 
 +
<pre>
 +
#!/usr/bin/env python3
 +
 
 +
"""
 +
Générer un code pour le 2FA UdeM
 +
Ce code a été testé avec python v3
 +
python3 ./gettingOTP.py --help
 +
 
 +
La première fois que vous roulerez ce code il vous demandera d'entrer le clé OTP
 +
Pour plus d'information voir
 +
https://dms.umontreal.ca/wiki/index.php?title=Authentification_%C3%A0_deux_facteurs_(A2F)
 +
 
 +
Le code sera sauvegardé dans votre home .saved_otp
 +
 
 +
Vous avez besoin des librairies pyotp et cryptography
 +
pip3 install --user pyotp cryptography
 +
 
 +
 
 +
@Author: Equipe DMS
 +
@Date: Dec 7, 2021
 +
@version: 0.2
 +
 
 +
"""
 +
 
 +
import pyotp
 +
 
 +
import datetime,time
 +
import argparse, os, sys, base64
 +
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
 +
from cryptography.hazmat.primitives import hashes
 +
from getpass import getpass
 +
from cryptography.fernet import Fernet
 +
 
 +
_file=os.path.expanduser('~/.saved_totp')
 +
 
 +
def range_limit_loop(arg):
 +
try:
 +
_value=int(arg)
 +
except ValueError:
 +
raise argparse.ArgumentTypeError("Valeur doit être un nombre entier")
 +
if _value < 2 or _value > 30:
 +
raise argparse.ArgumentTypeError("Valeur doit être entre 2 et 30")
 +
return _value
 +
 
 +
parser = argparse.ArgumentParser()
 +
parser.add_argument('-e', '--encrypt', action="store_true")
 +
parser.add_argument('-l', '--loop', default=-1, help="Valeur entre 2 et 30 secondes", type=range_limit_loop )
 +
parser.add_argument('-o', '--only_code', action="store_true", help="Affiche seulement le code" )
 +
 
 +
args = parser.parse_args()
 +
 
 +
if args.encrypt:
 +
_pass=getpass()
 +
salt=b'\xa1\xb3\xd9l\xa4\xa0\xa7\x0c\xf5\xf4\x84)3P\x98\xf5'
 +
kdf = PBKDF2HMAC(
 +
algorithm=hashes.SHA256(),
 +
length=32,
 +
salt=salt,
 +
iterations=390000,
 +
)
 +
key = base64.urlsafe_b64encode(kdf.derive( str.encode(_pass) ))
 +
 
 +
fernet = Fernet(key)
 +
 +
if not os.path.isfile(_file):
 +
_key=input('Entrez la clé TOTP =>')
 +
_key=str.encode(_key)
 +
if args.encrypt: 
 +
_key=fernet.encrypt(_key)
 +
f=open(_file,'wb')
 +
f.write( _key )
 +
os.chmod(_file, 0o400 )
 +
 
 +
f=open(_file,'rb')
 +
_key= f.read()
 +
 
 +
if args.encrypt: 
 +
_key=fernet.decrypt(_key)
 +
else:
 +
_key=_key.decode("utf-8")
 +
 
 +
totp = pyotp.TOTP(_key)
 +
 
 +
while True:
 +
_time_remaining = totp.interval - datetime.datetime.now().timestamp() % totp.interval
 +
 
 +
# S'il reste moins de 2 secondes, lire le prochain code
 +
if _time_remaining<2:
 +
_code=totp.at(datetime.datetime.now().timestamp()+2)
 +
_time_remaining=30
 +
else:
 +
_code=totp.now()
 +
 
 +
if args.only_code:
 +
print(_code, end="")
 +
break;
 +
else:
 +
print("Clé OTP courante: %s Temps restant %d " % (_code, _time_remaining), end='\r')
 +
if args.loop<1:
 +
print("\n");
 +
break;
 +
else:
 +
time.sleep(args.loop)
 +
 
 +
</pre>
 +
 
 +
Copiez le code dans un fichier nommé getTotp.py et rendez-le exécutable (varie selon votre plateforme).  Ensuite utilisez-le comme ceci:
 +
 
 +
<pre>
 +
./getTotp.py -e -l 5
 +
</pre>
 +
 
 +
Lors de la première exécution il vous demandera un mot de passe qui servira à encrypter clé TOTP (vous pouvez enlever l'option -e si vous ne désirez pas avoir cette fonction).  Ensuite il vous demandera votre clé TOTP (que vous pouvez obtenir sur le site web des TI, voir la section ci-dessous pour un résumé).  Une fois configuré il affichera votre code OTP à chaque 5 secondes.  Vous n'avez qu'à relancer la commande plus tard pour avoir votre code, il vous demandera alors seulement votre mot de passe puis affichera votre code TOTP à chaque 5 secondes.
 +
 
 +
Vous pouvez aussi l'éxécuter avec l'option '''-o''' au lieu de '''-l 5''', ceci affichera le code seulement une fois au lieu de le faire en loop.
 +
 
 +
== Obtenir votre clé TOTP ==
 +
 
 +
Voici un survol rapide de comment obtenir votre clé, voir la documentation des TI ((lien)) pour plus de détails:
 +
 
 +
[[Image:a2f.gif]]

Version du 17 décembre 2021 à 12:56

ceci est un brouillon

intro

lien Authentification_à_deux_facteurs_(A2F)

KeePassXC

lien doc TI pour "Mac"

Authenticator

lien flatpak

Obtenir un code via un script Python

si pour une raison quelconque vous ne pouvez utiliser les outils choisis par les TI, il est possible d'obtenir un code A2F via le script Python (version 3) suivant:

#!/usr/bin/env python3

""" 
Générer un code pour le 2FA UdeM
Ce code a été testé avec python v3
	python3 ./gettingOTP.py --help

La première fois que vous roulerez ce code il vous demandera d'entrer le clé OTP
Pour plus d'information voir
https://dms.umontreal.ca/wiki/index.php?title=Authentification_%C3%A0_deux_facteurs_(A2F)

Le code sera sauvegardé dans votre home .saved_otp

Vous avez besoin des librairies pyotp et cryptography
	pip3 install --user pyotp cryptography


@Author: Equipe DMS
@Date: Dec 7, 2021
@version: 0.2

"""

import pyotp

import datetime,time
import argparse, os, sys, base64
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from getpass import getpass
from cryptography.fernet import Fernet

_file=os.path.expanduser('~/.saved_totp')

def range_limit_loop(arg):
	try:
		_value=int(arg)
	except ValueError:
		raise argparse.ArgumentTypeError("Valeur doit être un nombre entier")
	if _value < 2 or _value > 30:
		raise argparse.ArgumentTypeError("Valeur doit être entre 2 et 30")
	return _value

parser = argparse.ArgumentParser()
parser.add_argument('-e', '--encrypt', action="store_true")
parser.add_argument('-l', '--loop', default=-1, help="Valeur entre 2 et 30 secondes", type=range_limit_loop )
parser.add_argument('-o', '--only_code', action="store_true", help="Affiche seulement le code" )

args = parser.parse_args()

if args.encrypt:	
	_pass=getpass()
	salt=b'\xa1\xb3\xd9l\xa4\xa0\xa7\x0c\xf5\xf4\x84)3P\x98\xf5'
	kdf = PBKDF2HMAC(
		algorithm=hashes.SHA256(),
		length=32,
		salt=salt,
		iterations=390000,
	)
	key = base64.urlsafe_b64encode(kdf.derive( str.encode(_pass) ))

	fernet = Fernet(key)
	
if not os.path.isfile(_file):
	_key=input('Entrez la clé TOTP =>')
	_key=str.encode(_key)
	if args.encrypt:  
		_key=fernet.encrypt(_key)
	f=open(_file,'wb')
	f.write( _key )
	os.chmod(_file, 0o400 )

f=open(_file,'rb')
_key= f.read()

if args.encrypt:  
	_key=fernet.decrypt(_key)
else:
	_key=_key.decode("utf-8")

totp = pyotp.TOTP(_key)

while True:
	_time_remaining = totp.interval - datetime.datetime.now().timestamp() % totp.interval

	# S'il reste moins de 2 secondes, lire le prochain code
	if _time_remaining<2:
		_code=totp.at(datetime.datetime.now().timestamp()+2)
		_time_remaining=30
	else:
		_code=totp.now()

	if args.only_code:
		print(_code, end="")
		break;
	else:
		print("Clé OTP courante: %s Temps restant %d " % (_code, _time_remaining), end='\r')
		if args.loop<1:
			print("\n");
			break;
		else:
			time.sleep(args.loop)

Copiez le code dans un fichier nommé getTotp.py et rendez-le exécutable (varie selon votre plateforme). Ensuite utilisez-le comme ceci:

./getTotp.py -e -l 5

Lors de la première exécution il vous demandera un mot de passe qui servira à encrypter clé TOTP (vous pouvez enlever l'option -e si vous ne désirez pas avoir cette fonction). Ensuite il vous demandera votre clé TOTP (que vous pouvez obtenir sur le site web des TI, voir la section ci-dessous pour un résumé). Une fois configuré il affichera votre code OTP à chaque 5 secondes. Vous n'avez qu'à relancer la commande plus tard pour avoir votre code, il vous demandera alors seulement votre mot de passe puis affichera votre code TOTP à chaque 5 secondes.

Vous pouvez aussi l'éxécuter avec l'option -o au lieu de -l 5, ceci affichera le code seulement une fois au lieu de le faire en loop.

Obtenir votre clé TOTP

Voici un survol rapide de comment obtenir votre clé, voir la documentation des TI ((lien)) pour plus de détails:

A2f.gif


La dernière modification de cette page a été faite le 17 décembre 2021 à 12:56.