\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{mar. juin 10 12:37:10 CEST 2014}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={draft-chu-ldap-kdc-schema-00},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={LDAP KDC Schema},
CreationDate={D:20140610123710},
ModDate={D:20140610123710},
Keywords={LDAP;Lightweight Directory Access Protocol;Kerberos}
}}
\begin{document}
 
\begin{center}
{\Huge draft-chu-ldap-kdc-schema-00 }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large LDAP KDC Schema}
 
\vspace{10mm}
 
\vspace{1cm}{\huge Introduction }
 
\
 
 
 
\vspace{1cm}{\huge Motivations }
 
\
 
\hspace{1mm}  Kerberos et LDAP sont fréquemment utilisés séparément pour une authentification distribuée. Ils peuvent également être utilisé conjointement, mais leur base de données restent généralement séparées. Ces bases séparées implique une duplication de données et sont source de charge d'administation supplémentaire. Il est donc préférable de partager la même base de données. Un certain nombre d'implémentations Kerberos supportent déjà l'utilisation de LDAP comme stockage du KDC. Cependant, chaque implémentation utilise son propre schéma.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Terminologie }
 
\
 
\hspace{1mm} Les OID définis ci-dessous sont dérivés de TBD.OID:
 
{\ttfamily
KRBSYN = TBD.OID.0\\ KRBATTR = TBD.OID.1\\ KRBOC = TBD.OID.2\\
}
\vspace{8mm}
 
\vspace{1cm}{\huge Attributs }
 
\
 
\hspace{1mm}  Les attributs et classes définies dans ce document sont (additionnellement, certains attributs définis dans LDAP Password Policy sont requis):
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} krbPrincipalName]{Nom canonique du principal}
\item[\hspace{1mm} krbPrincipalAliases]{Alias du nom du principal. Vu que cet attribut est un sous-type de krbPrincipalName, une recherche sur krbPrincipalName va également rechercher les alias.}
\item[\hspace{1mm} krbTicketMaxLife]{Maintient le maximum ticket lifetime, en secondes pour un principal.}
\item[\hspace{1mm} krbTicketMaxRenewal]{Maintient la durée maximal de renouvellement d'un ticket}
\item[\hspace{1mm} krbEncSaltTypes]{Maintient les combinaisons chiffrement/salt permis pour ce principal}
\item[\hspace{1mm} krbRealmName]{Nom du domaine Kerberos}
\item[\hspace{1mm} krbPrincipalRealm]{DN de l'entrée krbRealm}
\item[\hspace{1mm} krbKeySet]{Maintient les clés du principal, optionnellement chiffrés avec la clé maître. l'attribut est encodé en utilisant ASN.1}
\end{description}
 
\hspace{6mm} Le format de la valeur pour cet attribut est:
 
{\ttfamily
KrbKeySet ::= SEQUENCE \{\\ \hspace{2mm}kvno \texttt{[}0\texttt{]} UInt32,\\ \hspace{2mm}mkvno \texttt{[}1\texttt{]} UInt32 OPTIONAL,\\ \hspace{2mm}keys \texttt{[}2\texttt{]} SEQUENCE OF KrbKey,\\ \hspace{2mm}...\\ \}\\ \hspace{2mm}\\ KrbKey ::= SEQUENCE \{\\ \hspace{2mm}salt \texttt{[}0\texttt{]} KrbSalt OPTIONAL,\\ \hspace{2mm}key \texttt{[}1\texttt{]} EncryptionKey,\\ \hspace{2mm}s2kparams \texttt{[}2\texttt{]} OCTET STRING OPTIONAL,\\ \hspace{2mm}...\\ \}\\ \hspace{2mm}\\ KrbSalt ::= SEQUENCE \{\\ \hspace{2mm}type \texttt{[}0\texttt{]} Int32,\\ \hspace{2mm}salt \texttt{[}1\texttt{]} OCTET STRING OPTIONAL\\ \}\\ \hspace{2mm}\\ EncryptionKey ::= SEQUENCE \{\\ \hspace{2mm}keytype \texttt{[}0\texttt{]} Int32,\\ \hspace{2mm}keyvalue \texttt{[}1\texttt{]} OCTET STRING\\ \}\\
}
\vspace{8mm}
 
\begin{description} \normalsize
\item[\hspace{1mm} krbKeyVersion]{Stocke le numéro de version de la clé courante}
\item[\hspace{1mm} krbTicketPolicy]{Définis les flags qu'un utilisateur peut utiliser ou demander à utiliser dans une demande de ticket}
\end{description}
 
{\ttfamily
krb5KDCFlagsSyntax SYNTAX ::= \{\\ \hspace{2mm}WITH SYNTAX INTEGER\\ \hspace{2mm}\hspace{2mm}initial(0), -- require as-req\\ \hspace{2mm}\hspace{2mm}forwardable(1),-- may issue forwardable\\ \hspace{2mm}\hspace{2mm}proxiable(2), -- may issue proxiable\\ \hspace{2mm}\hspace{2mm}renewable(3), -- may issue renewable\\ \hspace{2mm}\hspace{2mm}postdate(4), -- may issue postdatable\\ \hspace{2mm}\hspace{2mm}server(5), -- may be server\\ \hspace{2mm}\hspace{2mm}client(6), -- may be client\\ \hspace{2mm}\hspace{2mm}invalid(7), -- entry is invalid\\ \hspace{2mm}\hspace{2mm}require-preauth(8), -- must use preauth\\ \hspace{2mm}\hspace{2mm}change-pw(9), -- change password service\\ \hspace{2mm}\hspace{2mm}require-hwauth(10), -- must use hwauth\\ \hspace{2mm}\hspace{2mm}ok-as-delegate(11), -- as in TicketFlags\\ \hspace{2mm}\hspace{2mm}user-to-user(12), -- may use user-to-user auth\\ \hspace{2mm}\hspace{2mm}immutable(13) -- may not be deleted\\ \hspace{2mm}ID \{ 1.3.6.1.4.1.5322.10.0.1 \}\\ \}\\
}
\vspace{8mm}
 
\begin{description} \normalsize
\item[\hspace{1mm} krbExtraData]{Maintient des données arbitraires qui peuvent être utilisés par certaines implémentations. la valeur est encodée en DER ASN.1}
\end{description}
 
{\ttfamily
ExtraData ::= SEQUENCE \{\\ \hspace{2mm}tag \texttt{[}0\texttt{]} OCTET STRING,\\ \hspace{2mm}data \texttt{[}1\texttt{]} OCTET STRING\\ \}\\
}
\vspace{8mm}
 
\begin{description} \normalsize
\item[\hspace{1mm} krbPrincNamingAttr]{Enregistre que attributs sont utilisés pour nommer les nouvelles créations de principal}
\item[\hspace{1mm} krbPrincContainer]{Pointe vers un conteneur sous lequel les nouvelles entrées de principaux sont créés.}
\item[\hspace{1mm} krbPwdPolicy]{Point vers une subentry de stratégie de mot de passe contenant la stratégie qui sera appliquée aux principaux Kerberos. Noter que pour les serveur avec le support complet des subentry, cet subentry définissent à quelles entrée elles s'applique. Donc cet attribut n'est pas nécessaire.}
\item[\hspace{1mm} krbLDAPURI]{URI ldap que le KDC utilise pour localiser les principaux.}
\end{description}
 
\vspace{1cm}{\huge Classes d'objets }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} krbKDCInfo]{}
\item[\hspace{1mm} krbPrincipal]{}
\item[\hspace{1mm} krbRealm]{}
\end{description}
 
\vspace{1cm}{\huge Définition des attributs }
 
\
 
{\ttfamily
( KRBATTR.1 NAME 'krbPrincipalName' DESC 'Canonical principal name' EQUALITY caseExactIA5Match SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )\\ ( KRBATTR.2 NAME 'krbPrincipalAliases' SUP krbPrincipalName )\\ ( KRBATTR.3 NAME 'krbTicketMaxLife' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )\\ ( KRBATTR.4 NAME 'krbTicketMaxRenewal' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )\\ ( KRBATTR.5 NAME 'krbEncSaltTypes' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )\\ ( KRBATTR.6 NAME 'krbRealmName' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )\\ ( KRBATTR.7 NAME 'krbPrincipalRealm' DESC 'DN of krbRealm entry' SUP distinguishedName )\\ ( KRBATTR.8 NAME 'krbKeyVersion' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )\\ ( KRBATTR.9 NAME 'krbKeySet' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )\\ ( KRBATTR.10 NAME 'krbTicketPolicy' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )\\ ( KRBATTR.11 NAME 'krbExtraData' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )\\ ( KRBATTR.12 NAME 'krbPrincNamingAttr' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE )\\ ( KRBATTR.13 NAME 'krbPrincContainer' DESC 'DN of container entry for principals' SUP distinguishedName SINGLE-VALUE )\\ ( KRBATTR.14 NAME 'krbPwdPolicy' DESC 'DN of password policy subentry' SUP distinguishedName SINGLE-VALUE )\\ ( KRBATTR.15 NAME 'krbLDAPURI' DESC 'LDAP search parameters for locating principals' SUP labeledURI )\\
}
\vspace{8mm}
 
\vspace{1cm}{\huge Définitions des classes d'objet }
 
\
 
\hspace{1mm} ( KRBOC.1 NAME 'krbKDCInfo' SUP top AUXILIARY MAY ( krbTicketMaxLife \$ krbTicketMaxRenewal \$ krbEncSaltTypes \$ krbTicketPolicy \$ krbKeySet \$ krbKeyVersion ) )
 
{\ttfamily
( KRBOC.2 NAME 'krbPrincipal' SUP krbKDCInfo AUXILIARY MUST ( krbPrincipalName ) MAY ( krbPrincipalAliases \$ krbPrincipalRealm \$ krbExtraData ) )\\ ( KRBOC.3 NAME 'krbRealm' SUP krbKDCInfo AUXILIARY MUST ( krbRealmName ) MAY ( krbPrincNamingAttr \$ krbPrincContainer \$ krbPwdPolicy \$ krbLDAPURI ) )\\
}
\vspace{8mm}
 
\vspace{1cm}{\huge Détails de l'implémentation }
 
\
 
\hspace{1mm}  Vu que le LDAP Password Policy est intimement lié à la sécurité de ce draft, l'annuaire devrait être traité en conséquence Cela signifie que pour toute authentification Kerberos déservis, une opération LDAP correspondante est également effectuée, pour permettre au mécanisme de stratégie de mot de passe d'opérer.
\vspace{5mm} \\
 
 
\hspace{1mm}  Le mécanisme dessiné ici assume que les accréditifs LDAP et les accréditifs Kerberos sont unifiés (ou au moins synchronisés). Dans ce cas, pour toute requête d'authentification Kerberos entrante, le KDC peut fournir une requête ldap compare en utilisant les accréditifs connus de l'utilisateur et le contrôle ldap Password Policy. Le résultat de la requête va s'occuper de tout code d'erreur si le compte est désactivé, le mot de passe a expiré, ou divers autres échecs. Si la pré-authentification est utilisée et que la requête est invalide, un compare avec des accréditifs invalides connus peuvent être utilisés pour mettre à jours l'état de la stratégie de mot de passe.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Détails du modèle }
 
\
 
\hspace{1mm}  Un nombre d'éléments de données décris dans le modèle d'information sont délégués pour LDAP DSA pour la gestion. Les détails de leurs utilisation sont décrites ici.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge principalNotUsedBefore }
 
\
 
\hspace{1mm}  Correspond à l'attribut \textbf{pwdStartTime}. Si le KDC utilise les requêtes LDAP pour opérer le mécanisme de stratégie de mot de passe, il n'a pas besoin de référencer ou manipuler cet attribut directement.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge principalNotUsedAfter }
 
\
 
\hspace{1mm}  Correspond à l'attribut \textbf{pwdEndTime}. Si le KDC utilise les requêtes LDAP pour opérer le mécanisme de stratégie de mot de passe, il n'a pas besoin de référencer ou manipuler cet attribut directement.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge principalIsDisabled }
 
\
 
\hspace{1mm}  Si le KDC utilise les requêtes LDAP pour opérer le mécanisme de stratégie de mot de passe, il n'a pas besoin de référencer ou manipuler cet attribut directement. Sinon cet effet est contrôlé par le paramètrage de \textbf{pwdStartTime} à une valeur supérieur ou égale à \textbf{pwdEndTime}
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge principalNumberOfFailedAuthenticationAttempts }
 
\
 
\hspace{1mm}  Si le KDC utilise les requêtes LDAP pour opérer le mécanisme de stratégie de mot de passe, il n'a pas besoin de référencer ou manipuler cet attribut directement. Sinon, cette valeur est obtenue en comptant le nombre de valeurs stockées dans \textbf{pwdFailureTime}
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge principalLastFailedAuthentication }
 
\
 
\hspace{1mm}  Si le KDC utilise les requêtes LDAP pour opérer le mécanisme de stratégie de mot de passe, il n'a pas besoin de référencer ou manipuler cet attribut directement. Sinon, cette valeur est obtenue en récupérant les valeur stockées dans \textbf{pwdFailureTime} et en sélectionnant la valeur la plus récente.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge principalLastSuccessfulAuthentication }
 
\
 
\hspace{1mm}  Correspond à l'attribut \textbf{pwdLastSuccess}. Si le KDC utilise les requêtes LDAP pour opérer le mécanisme de stratégie de mot de passe, il n'a pas besoin de référencer ou manipuler cet attribut directement.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge principalLastCredentialChangeTime }
 
\
 
\hspace{1mm}  Correspond à l'attribut \textbf{pwdChangedTime} Si le KDC utilise les requêtes LDAP pour opérer le mécanisme de stratégie de mot de passe, il n'a pas besoin de référencer ou manipuler cet attribut directement.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge principalCreateTime }
 
\
 
\hspace{1mm}  Correspond à l'attribut \textbf{createTimestamp}. Le KDC n'a pas besoin de référencer ou manipuler cet attribut directement.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge principalModifyTime }
 
\
 
\hspace{1mm}  Correspond à l'attribut \textbf{modifyTimestamp}. Le KDC n'a pas besoin de référencer ou manipuler cet attribut directement.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Détail de KeySet }
 
\
 
\hspace{1mm}  L'attribut \textbf{krbKeySet} est multi-valué mais il est attendu qu'il ait une seule valeur. Durant une opération de changement de mot de passe le KDC peut choisir de conserver une valeur précédente pour permettre aux clients actifs de continuer à opérer en utilisant la clé précédente. La durée de rétention de cet ancien mot de passe n'est pas spécifié ici. Noter également que le mécanisme ldap Password Policy a déja une gestion d'historique de mot de passe, donc krbKeySet ne devrait pas être utilisé pour l'historique des mots de passe.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Considérations de sécurité }
 
\
 
\hspace{1mm}  Tout ce document est conserné par l'implémentation d'un mécanisme d'authentification distribué sécurisé. Il faut bien comprendre que les divers clé utilisée ici sont des données sensible et doivent être protégés en conséquence en utilisant les ACL et autres mécanismes. Également, toutes les communications entre le KDC et le DSA doivent être protégés quand des données sensible sont référencées.
\vspace{5mm} \\
 
 
\hspace{1mm}  En pratique, le KDC et le DSA sont hébergés sur un serveur hôte et communiquent via ldapi. Celà implique que l'hôte soit également sécurisé, et un canal sécurisé doit être utilisé pour la session LDAP.
\vspace{5mm} \\
 
\end{flushleft}
\end{document}
