ahuffman.sudoers
ahuffman.sudoers
Contrôle la configuration du fichier par défaut /etc/sudoers
ainsi que des fichiers/dossiers inclus.
Veuillez noter que la version 2.0.0+ est une réécriture majeure du rôle. Veuillez lire la documentation pour comprendre les changements avant l'installation et l'utilisation si vous venez des versions antérieures.
Table des matières
- Table des matières
- Astuces
- Variables du rôle
- Champs du dictionnaire sudoers_files
- Génération automatique des données des fichiers sudoers à partir d'une configuration existante
- Exemples de playbooks
- Licence
- Informations sur l'auteur
Astuces
Astuce : Voici quelques excellentes ressources sur la configuration des sudoers : |
---|
Commencez ici - Fournit un bon aperçu des configurations de fichiers sudoers de base et de la terminologie |
Manuel de sudoers - Si vous voulez connaître tous les détails, c'est pour vous. |
Variables du rôle
Les valeurs par défaut définies pour ce rôle sont basées sur une configuration par défaut de /etc/sudoers
pour RHEL7.6. Veuillez vérifier les valeurs par défaut dans defaults/main.yml
avant de l'exécuter pour la compatibilité avec votre OS.
Nom de la variable | Description | Valeur par défaut | Type de variable |
---|---|---|---|
sudoers_rewrite_default_sudoers_file | Utilise les valeurs par défaut du rôle ou les définitions sudoers_files définies par l'utilisateur, remplaçant votre fichier /etc/sudoers fourni par la distribution. Utile lors du déploiement de nouveaux fichiers de configuration dans les include_directories sans modifier le fichier /etc/sudoers . |
True | boolean |
sudoers_remove_unauthorized_included_files | Très dangereux! Chaque fichier sudoer existant trouvé dans le dictionnaire include_directories qui n'a pas été défini dans sudoers_files sera supprimé. Cela permet de forcer un état souhaité. |
False | boolean |
sudoers_backup | Indique s'il faut ou non créer une sauvegarde de l'état actuel du fichier /etc/sudoers existant ainsi que de tous les fichiers définis dans sudoers_files . Les fichiers sont sauvegardés sur le nœud de contrôle Ansible (Serveur depuis lequel vous exécutez Ansible) pour éviter de laisser accidentellement des fichiers dans vos include_directories susceptibles d'être évalués par la configuration sudoers. |
True | boolean |
sudoers_backup_path | Chemin relatif à l'endroit où vous exécutez votre playbook pour sauvegarder les copies distantes des sudoers_files définis. |
"sudoers_backups" | string |
sudoers_backup_become | Indique s'il faut utiliser sudo lors de la création du répertoire de sauvegarde local de sudoers et des sauvegardes de fichiers sudoers | True | boolean |
sudoers_visudo_path | Chemin entièrement qualifié vers le binaire visudo requis pour valider les changements de configuration des sudoers. Ajouté pour la compatibilité avec le système d'exploitation. |
"/usr/sbin/visudo" | string |
sudoers_files | Définition de toutes vos configurations sudoers | voir defaults/main.yml | liste de dictionnaires |
Champs du dictionnaire sudoers_files
Nom de la variable | Description | Type de variable |
---|---|---|
path | Où déployer le fichier de configuration sur le système de fichiers. | string |
aliases | Définition optionnelle des éléments cmnd_alias , host_alias , runas_alias , ou user_alias . |
dictionnaire |
defaults | Permet de définir les valeurs par défaut de votre configuration sudoers. Des remplacements par défaut peuvent être effectués via la clé user_specifications . |
liste |
include_files | Fichiers spécifiques optionnels que vous souhaitez inclure dans votre configuration. C'est une liste de chemins entièrement qualifiés à inclure via l'option #include d'une configuration sudoers. |
liste |
include_directories | Répertoires spécifiques optionnels que vous souhaitez inclure dans vos configurations. C'est une liste de chemins entièrement qualifiés vers les répertoires à inclure via l'option #includedir d'une configuration sudoers. |
liste |
user_specifications | Liste des spécifications utilisateur et des remplacements par défaut à appliquer à une configuration de fichier sudoers. | liste |
Champs du dictionnaire sudoers_files.aliases
Nom de la variable | Description | Type de variable |
---|---|---|
cmnd_alias | Liste des définitions d'alias de commande. | liste de dictionnaires |
host_alias | Liste des définitions d'alias d'hôte | liste de dictionnaires |
runas_alias | Liste des définitions d'alias runas | liste de dictionnaires |
user_alias | Liste des définitions d'alias utilisateur | liste de dictionnaires |
Champs du dictionnaire cmnd_alias
Nom de la variable | Description | Type de variable |
---|---|---|
name | Nom de l'alias de commande. | string |
commands | Liste des commandes à appliquer à l'alias | liste |
Champs du dictionnaire host_alias
Nom de la variable | Description | Type de variable |
---|---|---|
name | Nom de l'alias d'hôte. | string |
hosts | Liste des hôtes à appliquer à l'alias | liste |
Champs du dictionnaire runas_alias
Nom de la variable | Description | Type de variable |
---|---|---|
name | Nom de l'alias runas | string |
users | Liste des utilisateurs à appliquer à l'alias | liste |
Champs du dictionnaire user_alias
Nom de la variable | Description | Type de variable |
---|---|---|
name | Nom de l'alias utilisateur | string |
users | Liste des utilisateurs à appliquer à l'alias | liste |
Champs du dictionnaire user_specifications
Ce dictionnaire peut être utilisé pour attribuer soit des spécifications utilisateur, soit des remplacements par défaut.
Spécifications standard user_specifications
Nom de la variable | Description | Type de variable |
---|---|---|
users | Liste des utilisateurs à appliquer à la spécification. Vous pouvez utiliser un nom d'alias utilisateur ainsi que des noms d'utilisateur. | liste |
hosts | Liste des hôtes à appliquer à la spécification. Vous pouvez utiliser un nom d'alias d'hôte défini ainsi que des noms d'hôte. | liste |
operators | Liste des opérateurs à appliquer à la spécification. Vous pouvez utiliser un nom d'alias runas défini ainsi que des noms d'utilisateur. | liste |
selinux_role | Rôle selinux optionnel à appliquer à la spécification | liste |
selinux_type | Type selinux optionnel à appliquer à la spécification | liste |
solaris_privs | Privileges Solaris optionnels à appliquer à la spécification | liste |
solaris_limitprivs | Privileges Solaris optionnels à appliquer à la spécification | liste |
tags | Liste optionnelle de tags à appliquer à la spécification. | liste |
commands | Liste des commandes à appliquer à la spécification. Vous pouvez utiliser un nom d'alias cmnd défini ainsi que des commandes. | liste |
Remplacements par défaut user_specifications
Nom de la variable | Description | Type de variable |
---|---|---|
defaults | Liste des valeurs par défaut à remplacer à partir de la configuration principale | liste |
type | Type de remplacement par défaut, cela affecte l'opérateur dans la configuration ( hôte -> @ , utilisateur -> : , commande -> ! , et runas -> > ). Le champ type peut être l'une des valeurs suivantes : command , host , runas , ou user . |
string |
commands | À utiliser lorsque type: "command" . Liste de noms d'alias cmnd ainsi que des commandes pour remplacer des valeurs par défaut spécifiques. |
liste |
hosts | À utiliser lorsque type: "host" . Liste de noms d'alias host ainsi que des noms d'hôtes individuels pour remplacer des valeurs par défaut spécifiques. |
liste |
operators | À utiliser lorsque type: "runas" . Liste de noms d'alias runas ainsi que des noms d'utilisateur individuels pour remplacer des valeurs par défaut spécifiques. |
liste |
users | À utiliser lorsque type: "user" . Liste de noms d'alias user ainsi que des noms d'utilisateur individuels pour remplacer des valeurs par défaut spécifiques. |
liste |
Génération automatique des données des fichiers sudoers à partir d'une configuration existante
Cela semble-t-il trop compliqué à configurer selon la documentation ? Veuillez vérifier et essayer ahuffman.scan_sudoers pour trouver un rôle qui peut générer automatiquement la structure de données appropriée pour vous. Avec le rôle ahuffman.scan_sudoers, vous pouvez prendre une configuration active dans un play et l'appliquer sur un autre avec le rôle ahuffman.sudoers (version 2.0.0+). Vous pourriez aussi choisir de prendre les données collectées et de les pousser dans une source de vérité telle qu'un CMDB ou un dépôt via l'automatisation. Les données collectées générées par ahuffman.scan_sudoers et pouvant être utilisées par ahuffman.sudoers seraient {{ ansible_facts['sudoers'].sudoers_files }}
.
Cela devrait vous aider à réduire la complexité de la définition manuelle des configurations sudoers en tant que code, et vous faire gagner beaucoup de temps.
Voir l'Exemple de Playbook ci-dessous.
Exemples de playbooks
Configuration sudoers par défaut RHEL7.6
- name: "Appliquer une configuration sudoers par défaut RHEL7.6 /etc/sudoers"
hosts: "all"
roles:
- role: "ahuffman.sudoers"
...ou avec une syntaxe moderne :
- name: "Appliquer une configuration sudoers par défaut RHEL7.6 /etc/sudoers"
hosts: "all"
tasks:
- name: "Configurer /etc/sudoers"
include_role:
name: "ahuffman.sudoers"
Résultats : /etc/sudoers
Les deux exemples ci-dessus utilisant les valeurs par défaut du rôle produiront un fichier de configuration /etc/sudoers
comme ceci :
# Géré par Ansible
# Spécifications par défaut
Defaults !visiblepw
Defaults always_set_home
Defaults match_group_by_gid
Defaults always_query_group_plugin
Defaults env_reset
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR"
Defaults env_keep += "LS_COLORS MAIL PS1 PS2 QTDIR"
Defaults env_keep += "USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE"
Defaults env_keep += "LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME"
Defaults env_keep += "LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL"
Defaults env_keep += "LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
# Spécifications utilisateur
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
# Inclus
## Répertoires inclus
#includedir /etc/sudoers.d
Configuration sudoers (fichiers multiples)
- name: "Appliquer une configuration sudoers multi-fichiers"
hosts: "all"
tasks:
- name: "Configurer /etc/sudoers et les fichiers inclus"
include_role:
name: "ahuffman.sudoers"
vars:
sudoers_rewrite_default_sudoers_file: True
sudoers_remove_unauthorized_included_files: True
sudoers_backup: True
sudoers_backup_path: "sudoers-backups"
sudoers_files:
- path: "/etc/sudoers"
defaults:
- "!visiblepw"
- "always_set_home"
- "match_group_by_gid"
- "always_query_group_plugin" # maintient le comportement de groupe sudo pré-1.8.15
- "env_reset"
- secure_path:
- "/sbin"
- "/bin"
- "/usr/sbin"
- "/usr/bin"
- env_keep:
- "COLORS"
- "DISPLAY"
- "HOSTNAME"
- "HISTSIZE"
- "KDEDIR"
- "LS_COLORS"
- "MAIL"
- "PS1"
- "PS2"
- "QTDIR"
- "USERNAME"
- "LANG"
- "LC_ADDRESS"
- "LC_CTYPE"
- "LC_COLLATE"
- "LC_IDENTIFICATION"
- "LC_MEASUREMENT"
- "LC_MESSAGES"
- "LC_MONETARY"
- "LC_NAME"
- "LC_NUMERIC"
- "LC_PAPER"
- "LC_TELEPHONE"
- "LC_TIME"
- "LC_ALL"
- "LANGUAGE"
- "LINGUAS"
- "_XKB_CHARSET"
- "XAUTHORITY"
user_specifications:
- users:
- "root"
hosts:
- "ALL"
operators:
- "ALL"
commands:
- "ALL"
- users:
- "%wheel"
hosts:
- "ALL"
operators:
- "ALL"
commands:
- "ALL"
include_directories:
- "/etc/sudoers.d"
aliases:
cmnd_alias:
- name: "PING"
commands:
- "/bin/ping"
user_alias:
- name: "PINGERS"
users:
- "ahuffman"
- path: "/etc/sudoers.d/pingers"
user_specifications:
- type: "user"
defaults:
- "!requiretty"
users:
- "PINGERS"
- path: "/etc/sudoers.d/root"
defaults:
- "syslog=auth"
user_specifications:
- type: "runas"
defaults:
- "!set_logname"
operators:
- "root"
L'exemple ci-dessus produira les fichiers de configuration suivants :
Résultats : /etc/sudoers
# Géré par Ansible
# Spécifications par défaut
Defaults !visiblepw
Defaults always_set_home
Defaults match_group_by_gid
Defaults always_query_group_plugin
Defaults env_reset
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR"
Defaults env_keep += "LS_COLORS MAIL PS1 PS2 QTDIR"
Defaults env_keep += "USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE"
Defaults env_keep += "LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME"
Defaults env_keep += "LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL"
Defaults env_keep += "LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
# Spécifications d'alias
## Alias de commande
Cmnd_Alias PING = /bin/ping
## Alias d'utilisateur
User_Alias PINGERS = ahuffman
# Spécifications utilisateur
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
# Inclus
## Répertoires inclus
#includedir /etc/sudoers.d
Résultats : /etc/sudoers.d/pingers
# Géré par Ansible
# Spécifications de remplacement par défaut
Defaults:PINGERS !requiretty
Résultats : /etc/sudoers.d/root
# Géré par Ansible
# Spécifications par défaut
Defaults syslog=auth
# Spécifications de remplacement par défaut
Defaults>root !set_logname
Migration d'une configuration sudoers active vers un autre hôte
---
- name: "Collecter les faits sudoers existants"
hosts: "source-host"
tasks:
- name: "Collecter la configuration sudoers active"
include_role:
name: "ahuffman.scan_sudoers"
- name: "Définir les faits sudoers collectés"
set_fact:
sudoers_files: "{{ ansible_facts['sudoers'].sudoers_files }}"
- name: "Afficher les faits de configuration sudoers collectés"
debug:
var: "sudoers_files"
verbosity: "1"
- name: "Déployer la configuration active sur la cible"
hosts: "destination-host"
tasks:
- include_role:
name: "ahuffman.sudoers"
vars:
sudoers_remove_unauthorized_included_files: True
L'exemple ci-dessus fournit une méthode d'utilisation de l'Infrastructure-as-Code à l'envers pour prendre une configuration connue convertie en données structurées pour alimenter l'automatisation future. Au lieu de provisionner directement la configuration collectée sur un nouvel hôte, vous pourriez pousser les données dans un CMDB ou un dépôt pour un usage futur comme source de vérité.
Licence
Informations sur l'auteur
Controls the configuration of the default /etc/sudoers file and included files/directories
ansible-galaxy install ahuffman.sudoers