diff --git a/Makefile b/Makefile index 03df032b8ae489a992bfa09aa516c1a57ccfb87a..da9a566a2979c8d3964f6fbaad5075049ffdfef4 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,12 @@ after=cmd_name = '${cmd_name}' before2=cmd_name=${cmd_original_name} after2=cmd_name=${cmd_name} +# Path du sudoer-file utilisé pour autoriser l'accès au script serveur +sudoer_file_path=/etc/sudoers.d/${cmd_name} +# Groupe qui aura le droit de lire les fichiers de mot de passe +# (indépendamment de pouvoir les déchiffrer) +sudoer_group=respbats + build: @echo "Pour installer ${cmd_name} :" @echo "Exécutez make install pour installer le client pour vous." @@ -35,3 +41,9 @@ install: @if [ "${cmd_name}" != "${cmd_original_name}" ]; then make --quiet rerename; fi install-server: + @echo "Création du sudoer-file." + @echo "# Autorisation locale d'éxécution de ${cmd_name}" > ${sudoer_file_path} + @echo " %${sudoer_group} ALL=(root) NOPASSWD: /usr/local/bin/${cmd_name}-server" >> ${sudoer_file_path} + install server.py /usr/local/bin/${cmd_name}-server + install -d /etc/${cmd_name} + install serverconfig.example.py /etc/${cmd_name}/serverconfig.py diff --git a/README b/README index 7097b9e8c80ab60a618ce3c490b1ceca5ef9f6ba..881ceda47f6db3a28ca4aa9d0d387cb654317ce7 100644 --- a/README +++ b/README @@ -5,17 +5,29 @@ ordinateur) et le serveur. == Nom de la commande == Si vous voulez appeler votre commande autrement que "cranspasswords", c'est possible. Il faut pour cela changer la variable cmd_name dans le Makefile -avant de lancer make install. +avant de lancer make install ou make install-server. == Installation et configuration du client == - * Copier le dépôt git sur votre machine : + * Copiez le dépôt git sur votre machine : $ git clone git://git.crans.org/git/cranspasswords.git - * Installer le package python-gnupg + * Installez le package python-gnupg * Si ce n'est déjà fait, indiquer votre clé publique sur gest_crans * Lancez make install * Assurez-vous d'avoir ~/bin dans votre $PATH * Exécutez cranspasswords test pour voir si vous arrivez à récupérer le mot de passe de test +== Installation et configuration du serveur == + * Copiez le dépôt git sur le serveur : + $ git clone git://git.crans.org/git/cranspasswords.git + * Lancez sudo make install-server + * Il va installer un suoder-file, si vous voulez paramétrer + le groupe qui aura les accès en lecture aux fichiers de mot de passe, + changez la variable sudoer_group au début de Makefile. + La possibilité de lire les fichiers est indépendante de la capacité + à les déchiffrer. + * Éditez /etc/cranspasswords/serverconfig.py pour qu'il soit conforme + à vos désirs. + == Complétion == * Pour avoir la bash-complétion, dans votre .bashrc : * Sourcez le fichier bash_completion présent dans le dépôt diff --git a/server b/server index a438404ba0f55f16137773f4534839928e59816f..973125b32dee36ac48328854ba44ffdbb9cbc686 100755 --- a/server +++ b/server @@ -2,4 +2,4 @@ # sudo-wrapper pour exécuter cranspasswords côté serveur cmd_name=cranspasswords -sudo /root/${cmd_name}/server.py $* +sudo /usr/local/bin/${cmd_name}/server.py $* diff --git a/server.py b/server.py index aed4786c97236844f3391805c963cd05774ba3bc..427fd0f0a6b40a263f9bf770fa86990612a7feb1 100755 --- a/server.py +++ b/server.py @@ -13,7 +13,11 @@ import datetime from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart -from serverconfig import READONLY, CRANSP_MAIL, DEST_MAIL, KEYS, ROLES, STORE, cmd_name +# Même problème que pour le client, il faut bootstraper le nom de la commande +# Pour accéder à la config +cmd_name = os.path.split(sys.argv[0])[1].replace("-server", "") +sys.path.append("/etc/%s/" % (cmd_name,)) +import serverconfig MYUID = pwd.getpwuid(os.getuid())[0] if MYUID == 'root': @@ -26,13 +30,13 @@ def validate(roles, mode='r'): for role in roles: if mode == 'w': role += '-w' - if ROLES.has_key(role) and MYUID in ROLES[role]: + if serverconfig.ROLES.has_key(role) and MYUID in serverconfig.ROLES[role]: return True return False def getpath(filename, backup=False): """Récupère le chemin du fichier ``filename``""" - return os.path.join(STORE, '%s.%s' % (filename, 'bak' if backup else 'json')) + return os.path.join(serverconfig.STORE, '%s.%s' % (filename, 'bak' if backup else 'json')) def writefile(filename, contents): """Écrit le fichier avec les bons droits UNIX""" @@ -43,15 +47,15 @@ def writefile(filename, contents): def listroles(): """Liste des roles existant et de leurs membres""" - return ROLES + return serverconfig.ROLES def listkeys(): """Liste les usernames et les (mail, fingerprint) correspondants""" - return KEYS + return serverconfig.KEYS def listfiles(): """Liste les fichiers dans l'espace de stockage, et les roles qui peuvent y accéder""" - os.chdir(STORE) + os.chdir(serverconfig.STORE) filenames = glob.glob('*.json') files = {} @@ -128,14 +132,14 @@ def backup(corps, fname, old): def notification(subject, corps, fname, old): """Envoie par mail une notification de changement de fichier""" conn = smtplib.SMTP('localhost') - frommail = CRANSP_MAIL - tomail = DEST_MAIL + frommail = serverconfig.CRANSP_MAIL + tomail = serverconfig.DEST_MAIL msg = MIMEMultipart(_charset="utf-8") msg['Subject'] = subject - msg['X-Mailer'] = cmd_name.decode() - msg['From'] = CRANSP_MAIL - msg['To'] = DEST_MAIL - msg.preamble = u"%s report" % (cmd_name.decode(),) + msg['X-Mailer'] = serverconfig.cmd_name.decode() + msg['From'] = serverconfig.CRANSP_MAIL + msg['To'] = serverconfig.DEST_MAIL + msg.preamble = u"%s report" % (serverconfig.cmd_name.decode(),) info = MIMEText(corps + u"\nLa version précédente a été sauvegardée." + u"\n\n-- \nCranspasswords.py", _charset="utf-8") @@ -150,7 +154,7 @@ if __name__ == "__main__": if len(argv) not in [1, 2]: sys.exit(1) command = argv[0] - if READONLY and command in WRITE_COMMANDS: + if serverconfig.READONLY and command in WRITE_COMMANDS: raise IOError("Ce serveur est read-only.") filename = None try: