Serveur d'impression

Gestion des utilisateurs AWS ParallelCluster SSH avec OpenLDAP: idk.dev – Serveur d’impression

Par Titanfall , le 29 août 2020 - 14 minutes de lecture

[bzkshopping keyword= »Minecraft » count= »8″ template= »grid »]

Une demande courante des utilisateurs d'AWS ParallelCluster est d'avoir la possibilité de déployer plusieurs comptes utilisateur POSIX. Le wiki sur la page GitHub du projet décrit un mécanisme simple pour y parvenir, et un article de blog précédent, «AWS ParallelCluster avec AWS Directory Services Authentication», explique comment intégrer AWS ParallelCluster à AWS Directory Service. Cependant, certains clients peuvent préférer un service d'annuaire traditionnel hébergé localement sur le cluster pour permettre une administration plus pratique. Cela élimine la nécessité d'arrêter et de redémarrer le nœud principal ou de connaître les détails de la gestion d'Active Directory.

Un environnement AWS ParallelCluster multi-utilisateurs est idéal pour les cas dans lesquels une équipe de scientifiques ou d'ingénieurs collabore étroitement et a besoin de partager des ressources, telles que des données ou un budget de compte. L'utilisation d'un seul ensemble de systèmes de fichiers facilite la gestion des clusters pour l'administrateur, en particulier s'ils sont nouveaux sur AWS. Lorsque le temps de mise en solution et les dépenses totales doivent être soigneusement équilibrés, il est également utile de faire exécuter les tâches de plusieurs utilisateurs dans un seul planificateur.

Dans cet article, nous décrivons comment activer le service d'annuaire OpenLDAP sur le nœud principal du cluster. Cette activation peut créer et synchroniser une collection locale d'utilisateurs.

Le processus documenté ici s'applique aux clusters déployés à l'aide du système d'exploitation CentOS 7, pour AWS ParallelCluster version 2.8.1. D'autres systèmes d'exploitation peuvent suivre un processus similaire, mais nécessiteront des modifications mineures des commandes utilisées pour installer les packages pertinents (par exemple, en utilisant apt-get au lieu de Miam).

Après avoir installé et configuré l'outil de ligne de commande AWS ParallelCluster, définissez les paramètres de configuration post_installer et s3_read_resource (ou s3_read_write_resource) pour permettre à un script d'être exécuté sur la tête du cluster et de calculer les nœuds au moment du démarrage. Voici un exemple de fichier de configuration minimale pour déployer un cluster basé sur Slurm à l'aide d'instances C5n.18xlarge, parfaitement adaptées à la mise à l'échelle des charges de travail HPC:

[aws]



aws_region_name = eu-west-1
[global]
update_check = vrai
sanity_check = vrai
cluster_template = par défaut

[cluster default]
nom_clé = 
master_instance_type = c5.xlarge
compute_instance_type = c5n.18xlarge
enable_efa = calculer
placement_group = DYNAMIQUE
placement = calculer
disable_hyperthreading = true
post_install = s3: ///post-install.sh
s3_read_resource = arn: aws: s3 :::/ *
initial_queue_size = 0
max_queue_size = 20
keep_initial_size = false
planificateur = slurm
cluster_type = ondemand
master_root_volume_size = 340
compute_root_volume_size = 340
base_os = centos7
vpc_settings = std-vpc

[vpc std-vpc]
vpc_id = 
master_subnet_id = 
compute_subnet_id = 

Le script de post-installation unique contient toutes les étapes d'installation et de déploiement associées au serveur OpenLDAP:

#! / bin / bash
exec>> (tee /var/log/post-install.log|logger -t données-utilisateur -s 2> / dev / console) 2> & 1

### Fonctions utilitaires

install_server_packages () 
    yum -y installer openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel


prepare_ldap_server ()  awk 'print $ 1'> /root/.ldappasswd
    chmod 400 /root/.ldappasswd
    # Utilisez le mot de passe pour générer un hachage de mot de passe LDAP
    LDAP_HASH = $ (slappasswd -T /root/.ldappasswd)
    # Spécification de la configuration LDAP initiale
    chat <<-EOF > /root/ldapdb.ldif
dn: olcDatabase = 2 hdb, cn = config
type de changement: modifier
remplacer: olcSuffix
olcSuffix: dc = $ stack_name, dc = internal

dn: olcDatabase = 2 hdb, cn = config
type de changement: modifier
remplacer: olcRootDN
olcRootDN: cn = ldapadmin, dc = $ stack_name, dc = internal

dn: olcDatabase = 2 hdb, cn = config
type de changement: modifier
remplacer: olcRootPW
olcRootPW: $ LDAP_HASH
EOF
    # Appliquer les paramètres LDAP
    ldapmodify -Y EXTERNAL -H ldapi: /// -f /root/ldapdb.ldif
    # Appliquer les paramètres de base de données LDAP
    cp /usr/share/openldap-servers/DB_CONFIG.example / var / lib / ldap / DB_CONFIG
    chown ldap: ldap / var / lib / ldap / *
    # Appliquer un ensemble minimal de schémas LDAP
    ldapadd -Y EXTERNAL -H ldapi: /// -f /etc/openldap/schema/cosine.ldif
    ldapadd -Y EXTERNAL -H ldapi: /// -f /etc/openldap/schema/nis.ldif
    # Spécifiez une structure de répertoire minimale
    chat <<-EOF > /root/struct.ldif
dn: dc = $ stack_name, dc = internal
dc: $ stack_name
objectClass: haut
objectClass: domaine

dn: cn = ldapadmin, dc = $ stack_name, dc = internal
objectClass: OrganizationRole
cn: ldapadmin
description: Admin LDAP

dn: ou = Users, dc = $ stack_name, dc = internal
objectClass: organizationUnit
ou: Utilisateurs
EOF
    # Appliquer la structure des répertoires
    ldapadd -x -W -D "cn = ldapadmin, dc = $ stack_name, dc = internal" -f /root/struct.ldif -y /root/.ldappasswd
    # Enregistrez le nom d'hôte du contrôleur dans un emplacement partagé pour une utilisation ultérieure
    echo "ldap_server = $ (nom d'hôte)"> /home/.ldap


install_client_packages () 
    miam -y installer openldap-clients nss-pam-ldapd


prepare_ldap_client () 
    source / etc / parallelcluster / cfnconfig
    source /home/.ldap
    authconfig --enableldap
               --enableldapauth
               --ldapserver = $ ldap_server
               --ldapbasedn = "dc = $ stack_name, dc = internal"
               --enablemkhomedir
               --mettre à jour
    systemctl redémarrage nslcd


### Corps principal

# Charger les variables d'environnement depuis ParallelCluster
source / etc / parallelcluster / cfnconfig
# Si le script est en cours d'exécution sur le contrôleur, configurez le serveur LDAP
si [ $cfn_node_type  == 'MasterServer' ]; puis
    install_server_packages
    prepare_ldap_server

Fi

# Pour les nœuds de contrôleur et de calcul, activez l'authentification LDAP
install_client_packages
prepare_ldap_client

Lorsque le script est exécuté sur l'instance de contrôleur, le install_server_packages et prepare_ldap_server les fonctions s'exécutent en premier, suivies de install_client_packages et prepare_ldap_client les fonctions. Toutes ces étapes se produisent pendant le processus de création de cluster initial. Lors des lancements d'instance suivants (c'est-à-dire lorsque le cluster évolue pour répondre aux demandes des travaux soumis), le processus de post-installation sur les nœuds de calcul exécutera uniquement le install_client_packages et prepare_ldap_client pas.

C'est tout! Une fois le lancement du cluster terminé, il sera prêt à accueillir de nouveaux utilisateurs.

Processus de post-installation

Avant d'ajouter des utilisateurs, parcourons le processus de post-installation étape par étape. passez à la section suivante si vous souhaitez simplement continuer à utiliser votre cluster.

Dans le prepare_ldap_server fonction, nous commençons par démarrer la giflé démon – c'est le service OpenLDAP – qui maintiendra une base de données d'utilisateurs et permettra aux clients de s'authentifier.

Ensuite, nous générons une chaîne aléatoire à utiliser comme mot de passe de configuration LDAP et la plaçons dans le répertoire de base racine pour réutiliser plus tard. Nous générons également un hachage approprié à partir du mot de passe à insérer dans LDAP. La configuration LDAP initiale définit le olcSuffix, olcRootDN, et olcRootPW paramètres aux valeurs que nous choisissons. Dans ce cas, les affectations de variables importantes sont cn = ldapadmin, dc = $ stack_name, dc = internal et $ LDAP_HASH.

Nous sommes libres de modifier le nom commun du compte administrateur LDAP à partir de ldapadmin à tout ce que nous choisissons, et ajustez également les composants du domaine de $ stack_name et interne selon nos propres préférences. Le point clé est de s'assurer que nos valeurs choisies sont cohérentes tout au long du script. le ldapmodify La commande applique ces paramètres au service LDAP en cours d'exécution.

Ensuite, nous importons une configuration de base de données par défaut à partir des fichiers fournis avec le package de serveur LDAP, et nous assurons le LDAP l'utilisateur du service possède tous les fichiers pertinents. La dernière étape de configuration du serveur consiste à définir et à appliquer une structure de répertoire utilisateur simple. Cela définit les fichiers liés les uns aux autres et leur permet d'être regroupés en unités organisationnelles. Pour cet exemple minimal, nous n'avons besoin que des définitions de schéma COSINE et NIS, qui sont fournies dans le cadre de l'installation LDAP. Ceux-ci décrivent la configuration minimale requise pour ajouter un utilisateur à LDAP. Notre structure de répertoires (spécifiée dans le struct.ldif fichier créé en ligne) contient une seule unité organisationnelle pour nos utilisateurs AWS ParallelCluster.

Avant de passer à la configuration du client, nous enregistrons le nom d'hôte du serveur LDAP dans un emplacement partagé qui sera accessible aux clients sur les instances de calcul. Dans ce cas, nous pouvons placer un fichier dans le /Accueil répertoire, car il sera partagé avec le reste du cluster via NFS.

le prepare_ldap_client La fonction établit la connexion entre les clients, exécutés sur l'instance de contrôleur ainsi que sur toutes les futures instances de calcul, et le serveur LDAP – dans ce cas, à l'aide de variables définies à la fois dans un emplacement AWS ParallelCluster standard (/ etc / parallelcluster / cfnconfig) et le /home/.ldap fichier que nous avons créé lors de la préparation du serveur.

Ajout d'utilisateurs de cluster

Une fois que l'instance de contrôleur de cluster démarre et que la configuration LDAP est terminée, nous devons ajouter des utilisateurs au service d'annuaire. Connectez-vous au cluster en tant qu'utilisateur par défaut (centos dans ce cas) avec la commande:

pcluster ssh 

Sinon, utilisez état du cluster pour obtenir l'adresse IP publique et connectez-vous à cette instance via SSH à l'aide de la commande:

ssh -i  centos @

Si vous avez utilisé une paire de clés publique / privée générée localement et stockée à l'emplacement par défaut (~ / .ssh), vous pouvez omettre -je section de la commande.

Une fois connecté, créez un script bash avec le contenu suivant (nous appellerons ce script add-user.sh):

#! / bin / bash

# N'agissez que si deux arguments sont fournis et que l'UID est suffisamment élevé
si [ $# -eq 2 ] && [ "$2" -eq "$2" ] 2> / dev / null && [ "$2" -gt 1000 ]; puis
  NOM D'UTILISATEUR = 1 $
  USERID = 2 $
autre
  echo "Utilisation:` basename $ 0`  "
  écho " doit être une chaîne "
  écho " doit être un entier supérieur à 1 000 "
  sortie 1
Fi

# Charger les variables d'environnement qui identifient le type d'instance
source / etc / parallelcluster / cfnconfig

# Ecrire une configuration d'objet LDAP minimale pour un utilisateur
chat <<-EOF > /tmp/$USERNAME.ldif
dn: uid = $ USERNAME, ou = Users, dc = $ stack_name, dc = internal
objectClass: haut
objectClass: compte
objectClass: posixAccount
objectClass: shadowAccount
cn: $ USERNAME
uid: $ USERNAME
uidNumber: $ USERID
gidNumber: 100
homeDirectory: / home / $ USERNAME
loginShell: / bin / bash
EOF

# Ajouter l'utilisateur à LDAP
ldapadd -x -D "cn = ldapadmin, dc = $ stack_name, dc = internal" -f /tmp/$USERNAME.ldif -y /root/.ldappasswd

# Ranger et vérifier que l'entrée a réussi
rm /tmp/$USERNAME.ldif
getent passwd $ 1

Rendre le script exécutable (chmod + x add-user.sh). L'ajout d'un utilisateur à LDAP ne nécessite pas de privilèges root en général, mais dans ce cas, notre seul enregistrement du ldapadmin le mot de passe est dans le fichier /root/.ldappasswd. Nous devrons utiliser sudo lors de l'exécution du script. Transmettez votre nom d'utilisateur et votre UID comme arguments, par exemple:

sudo ./add-user.sh alice 3000

Tous les utilisateurs créés de cette manière appartiendront au utilisateurs groupe (GID 100). Si nécessaire, vous pouvez modifier ce paramètre pour affecter les utilisateurs à différents groupes. Notez que la création de groupe n'est pas automatique; tous les groupes personnalisés doivent être créés avant d'ajouter les utilisateurs.

Au lieu d'utiliser le processus scripté décrit précédemment, vous pouvez récupérer le mot de passe LDAP du fichier et le stocker en dehors du cluster en utilisant vos mécanismes de protection par mot de passe habituels. Ensuite, vous exécuterez ldapadd sur une invite de commande en tant qu'utilisateur régulier (non root). Dans ce cas, vous devrez vous assurer qu'une configuration d'objet LDAP valide est disponible, ainsi qu'un fichier contenant le mot de passe, puis exécuter:

source / etc / parallelcluster / cfnconfig
ldapadd -x -D "cn = ldapadmin, dc = $ stack_name, dc = internal" -f  -y 

Une fois qu'un utilisateur est ajouté, son compte sera présent dans le système (confirmé par getent passwd ou sudo getent shadow), mais leur répertoire personnel n'existera pas encore; le répertoire personnel est généralement créé lors de la première connexion. À ce stade, vos utilisateurs ne pourront toujours pas se connecter au cluster via SSH, car il n'y a aucune entrée dans leur ~ / .ssh / clés_autorisées fichier. La connexion à l'aide d'un mot de passe n'est pas non plus possible, à la fois parce que nous n'avons pas configuré de mot de passe pour l'utilisateur et parce que l'authentification par mot de passe est désactivée par défaut dans la configuration du démon AWS ParallelCluster SSH.

Notez que nous pouvons incorporer des clés SSH dans la configuration LDAP en utilisant un schéma plus complexe. Ce serait le choix le plus approprié si vous implémentez un serveur LDAP distinct fournissant des informations d'identification pour plusieurs clusters ou pour d'autres instances qui n'ont pas de répertoires personnels partagés. Pour éviter une complexité supplémentaire dans cet exemple simple, nous allons plutôt copier une clé publique SSH, fournie par l'utilisateur potentiel, à l'emplacement approprié.

En supposant que nous soyons toujours connectés en tant que centos et ont enregistré la clé publique pour le nouveau Alice utilisateur à ~ / alice.pub, enregistrez le script suivant sous add-key.sh et exécutez via sudo ./add-key.sh alice alice.pub:

#! / bin / bash

# N'agissez que si deux arguments sont fournis et le second est un fichier local
si [ $# -eq 2 ] && [ -f "$2" ] ; puis
  NOM D'UTILISATEUR = 1 $
  KEYFILE = 2 $
autre
  echo "Utilisation:` basename $ 0`  "
  écho " doit être un compte utilisateur "
  écho " doit être un fichier de clé publique SSH "
  sortie 1
Fi

# Créez le répertoire home et .ssh de l'utilisateur, configurez le fichier authorized_keys
# Notez que cela écrasera toutes les clés existantes si elles sont utilisées plusieurs fois
mkhomedir_helper $ USERNAME
mkdir -p /home/$USERNAME/.ssh
cat $ KEYFILE> /home/$USERNAME/.ssh/authorized_keys
chmod 600 /home/$USERNAME/.ssh/authorized_keys
chown -R $ USERNAME: utilisateurs / domicile / $ USERNAME

Le propriétaire de la clé privée correspondante alice.pub peut maintenant SSH dans le cluster en utilisant le nom d'utilisateur Alice. Grâce à l'utilisation répétée de add-user.sh et add-key.sh, l'administrateur du cluster peut ajouter autant de comptes supplémentaires que nécessaire en ajustant simplement les arguments de chaque script et en s'assurant que chaque ensemble de nom d'utilisateur, d'ID utilisateur et de fichier de clé publique est unique.

Les utilisateurs créés de cette manière ne pourront pas utiliser sudo pour assumer les privilèges root; vous devez réserver les actions administratives par défaut centos utilisateur. Pour une utilisation régulière des clusters HPC (soumission de travaux au planificateur, connexion aux nœuds de calcul via SSH à partir du contrôleur, utilisation du contenu des systèmes de fichiers locaux et réseau), ces comptes ont un comportement essentiellement identique à celui des comptes créés à l'aide du adduser commander.

Conclusion

Dans cet article, nous avons décrit un mécanisme simple pour provisionner plusieurs utilisateurs dans AWS ParallelCluster à l'aide d'un serveur OpenLDAP installé localement sur le contrôleur. Avec une complexité minimale, nous avons configuré la structure de répertoires pour fournir un accès SSH aux utilisateurs HPC.

Image de vedette via Pixabay.

Click to rate this post!
[Total: 0 Average: 0]

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.