RHEL6/OL6 et Oracle Unified Directory (2/2) : Sudoers LDAP

@xkcd by Randall Munroe

Dans l’article précédent « RHEL6/OL6 et Oracle Unified Directory (1/2) : Authentification LDAP« , vous avez pu configurer l’authentification et la gestion des comptes et groupes Linux dans Oracle Unified Directory. Cela permet de centraliser la gestion des droits de vos administrateurs ainsi que leur mot de passe.

Seulement voilà, un administrateur n’est pas grand chose s’il ne peut pas se connecter oracle ou, mieux, root ! Voici donc une solution pour stocker l’ensemble de la configuration de la commande sudo dans votre annuaire LDAP. Vous constaterez, une fois encore, que Oracle Unified Directory est d’une simplicité d’utilisation déconcertante. Et vous aurez les cartes en main pour améliorer la gestion de votre sécurité.

Note 1:Les versions 6.1 de Redhat EL et Oracle Linux souffrent d’un problème avec le package sudo et la configuration LDAP comme décrit dans le bug 760843. Le problème n’est pas présent en 6.3.

Note 2 :
Pour tous les détails de la configuration sudo avec un annuaire LDAP et notamment la signification de tous les attributs et classes associées reportez-vous au « Sudoers LDAP Manual« 

Schéma LDAP et SUDO

Le schéma utilisé pour stocker la configuration SUDO dans Oracle Unified Directory n’est pas chargé par défaut. Heureusement avec OUD, cette opération est extrêmement simple, connectez-vous avec l’outil de votre choix et chargez un fichier LDIF dont le contenu est celui ci-dessous :

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.1
NAME 'sudoUser'
DESC 'User(s) who may run sudo'
EQUALITY caseExactIA5Match
SUBSTR caseExactIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
X-ORIGIN 'LDAP Sudoers' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.2
NAME 'sudoHost'
DESC 'Host(s) who may run sudo'
EQUALITY caseExactIA5Match
SUBSTR caseExactIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
X-ORIGIN 'LDAP Sudoers' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.3
NAME 'sudoCommand'
DESC 'Command(s) to be executed by sudo'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
X-ORIGIN 'LDAP Sudoers' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.4
NAME 'sudoRunAs'
DESC 'User(s) impersonated by sudo'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
X-ORIGIN 'LDAP Sudoers' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.5
NAME 'sudoOption'
DESC 'Options(s) followed by sudo'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
X-ORIGIN 'LDAP Sudoers' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.6
NAME 'sudoRunAsUser'
DESC 'User(s) impersonated by sudo'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
X-ORIGIN 'LDAP Sudoers' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.7
NAME 'sudoRunAsGroup'
DESC 'Group(s) impersonated by sudo'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
X-ORIGIN 'LDAP Sudoers' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.8
NAME 'sudoNotBefore'
DESC 'Start of time interval for which the entry is valid'
EQUALITY generalizedTimeMatch
ORDERING generalizedTimeOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
X-ORIGIN 'LDAP Sudoers' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.9
NAME 'sudoNotAfter'
DESC 'End of time interval for which the entry is valid'
EQUALITY generalizedTimeMatch
ORDERING generalizedTimeOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
X-ORIGIN 'LDAP Sudoers' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.10
NAME 'sudoOrder'
DESC 'an integer to order the sudoRole entries'
EQUALITY integerMatch
ORDERING integerOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
X-ORIGIN 'LDAP Sudoers' )

dn: cn=schema
changetype: modify
add: objectClasses
objectClasses: ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL
DESC 'Sudoer Entries'
MUST ( cn )
MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $
sudoRunAsGroup $ sudoOption $ sudoNotBefore $ sudoNotAfter $
sudoOrder $ description )
X-ORIGIN 'LDAP Sudoers' )

Note :
Si vous voulez en savoir plus, vous pouvez vous reportez à la description des différents éléments qui constituent un schéma dans la documentation de Unified Directory ainsi qu’à la description de comment étendre le schéma de Unified Directory. Par ailleurs, concernant le schéma lui-même, « SUDOer LDAP Manual » contient une section dédiée.

Ajouter les règles SUDO dans votre annuaire

L’étape suivante consiste à créer le référentiel du sudo dans votre annuaire. Pour cela, créez un container et une règle ObjectClass: sudoRole nommée defaults à l’aide du fichier LDIF ci-dessous ; évidemment vous pouvez changer le DN et l’emplacement de ce container :

dn: ou=SUDOers,dc=arkzoyd,dc=com
objectClass: organizationalUnit
objectClass: top
ou: SUDOers

dn: cn=defaults,ou=SUDOers,dc=arkzoyd,dc=com
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: env_keep+=SSH_AUTH_SOCK

Définissez ensuite les règles sudo qui vous conviennent en ajoutant à votre container des ObjectClass: sudoRole pour chacune d’entre-elle. Reportez-vous à « SUDOer LDAP Manual » pour le détail de la signification de chacun des attributs. Voici un exemple de règle dans le fichier /etc/sudoers :

Gregory ALL=(ALL) ALL

Son équivalent dans l’annuaire LDAP est représenté par
le fichier LDIF ci-dessous ; son nom n’a pas réellement d’importance :

dn: cn=role1,ou=SUDOers,dc=arkzoyd,dc=com
objectClass: top
objectClass: sudoRole
cn: role1
sudoUser: Gregory
sudoHost: ALL
sudoCommand: ALL

Configurer SUDO sur le serveur

La dernière étape, comme vous pouvez vous en douter, consiste à configurer SUDO sur le serveur pour qu’il utilise l’annuaire. Pour cela, vous procèderez en 2 étapes :

  • D’abord ajoutez ou modifiez la ligne sudoers dans /etc/nsswitch.conf en indiquant que le référentiel est stocké dans le LDAP :
sed "/sudoers/d" /etc/nsswitch.conf
echo "sudoers: ldap" >> /etc/nsswitch.conf
  • Ensuite, enregistrez les paramètres du LDAP dans /etc/sudo-ldap.conf ; en particulier :
    • uri définit la connexion au LDAP
    • sudoers_base définit le DN du groupe qui contient les règles sudo
    • en production, ssl, tls_checkpeer et tls_cacertfile permettent d’assurer l’identité de l’annuaire
sudo grep -v "^#" /etc/sudo-ldap.conf |grep -v "^[ t]*$"
uri ldap://blue:1389
sudoers_base ou=SUDOers,dc=arkzoyd,dc=com

Tester

Vous pouvez désormais tester le fonctionnement combiné de l’authentification et du SUDO à travers Oracle Unified Directory :

ssh Gregory@blue
Gregory@blue's password:

id
uid=3001(Gregory) gid=3000(SA) groups=3000(SA),3001(MailUsers)

sudo su -
[sudo] password for Gregory:

id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon)