Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
centos:ldap:data [28.10.2011 05:39. ]
django [erster Test]
centos:ldap:data [20.04.2018 10:49. ] (aktuell)
Zeile 1: Zeile 1:
 +====== Datenerstbefüllung des OpenLDAP Servers ======
 +{{:​centos:​ldap-logo.png?​nolink&​167 |OpenLDAP Logo}}
 +
 +Nachdem wir die [[centos:​ldap:​install|Grundinstallation des OpenLDAP Servers]] erfolgreich abgeschlossen haben, werden wir im nächsten Schritt unsere Berkely-Datenbank mit Inhalt befüllen. ​
 +
 +Diese Daten, die aus Distinguished Names (DN) und einem eindeutigen Objektnamen bestehen, müssen hierzu in den **Directory Information Tree** (**DIT**), einer hierarchischen Baumstruktur eingefügt werden.
 +===== Directory Information Tree =====
 +Zur Übernahme bereits bestehender Nutzer aus dem LINUX-Grundsystem (**/​etc/​passwd**,​ **/​etc/​group**) werden wir uns zunächst einen passenden //DIT// anlegen. Diese Informationen werden wir auch wieder in .ldif-Dateien in einem zugehörigen Verzeichnis abgespeichert.
 +==== vorbereitende Konfiguration ====
 +Bevor wir nun im Detail beginnen werden unsere DIT zu erstellen, beenden wir erst einmal unseren eventuell noch laufenden slapd-Dämon.
 +   # service slapd status
 +
 +   slapd (pid  2024) is running...
 +
 +   # service slapd stop
 +
 +   ​Stopping slapd: ​                                           [  OK  ]
 +
 +Im ersten Schritt werden wir nun unser Unterverzeichnis für die .ldif Dateistrukturen unseres DIT anlegen.
 +   # mkdir /​etc/​openldap/​ldif
 +Anschließend legen wir noch die Benutzer- und Gruppenrechte,​ sowie die Dateirechte entsprechend an.
 +   # chown ldap.ldap /​etc/​openldap/​ldif/​ -R
 +
 +   # chmod 700 /​etc/​openldap/​ldif/​ -R
 +Im letzten Schritt vor dem eigentlichem Erstellen der DIT erstellen wir uns noch eine Konfigurationsdatei für unsere verwendete Domäne //​**nausch.org.ldif**//​ und legen diese im Verzeichnis //​**/​etc/​openldap/​ldif/​**//​ ab.
 +   # vim /​etc/​openldap/​ldif/​nausch.org.ldif
 +<file | /​etc/​openldap/​ldif/​nausch.org.ldif>​
 +## Build the root node.
 +dn: dc=nausch,​dc=org
 +dc: Nausch
 +objectClass:​ dcObject
 +objectClass:​ organizationalUnit
 +ou: nausch Dot org
 +
 +## Build the Manager cn.
 +dn: cn=Manager,​dc=nausch,​dc=org
 +cn: Manager
 +objectClass:​ organizationalRole
 +
 +## Build the People ou.
 +dn: ou=People,​dc=nausch,​dc=org
 +ou: People
 +objectClass:​ organizationalUnit
 +
 +## Build the Group ou.
 +dn: ou=Group,​dc=nausch,​dc=org
 +ou: Group
 +objectClass:​ organizationalUnit
 +</​file>​
 +==== Datenübernahme aus .ldif in die DIT  ====
 +Nachdem wir nun die vorbereitenden Aufgaben erledigt haben werden wir im nächsten Schritt die Daten aus der *.LDIF-Datei in den Directory Information Tree überführen. Hierzu benutzen wir nachfolgenden Befahlsaufruf:​
 +   # slapadd -v -l /​etc/​openldap/​ldif/​nausch.org.ldif ​
 +<​code>​added:​ "​dc=nausch,​dc=org"​ (00000001)
 +added: "​cn=Manager,​dc=nausch,​dc=org"​ (00000002)
 +_############### ​      ​77.52% eta   none elapsed ​           none spd 535.4  /s added: "​ou=People,​dc=nausch,​dc=org"​ (00000003)
 +added: "​ou=Group,​dc=nausch,​dc=org"​ (00000004)
 +.####################​ 100.00% eta   none elapsed ​           none fast!         
 +Closing DB...
 +</​code>​
 +Bevor wir nun unseren OpenLDAP-Server wieder starten korrigieren wir noch die Nutzerrechte der neu angelegten Dateien im Verzeichnis //​**/​var/​lib/​ldap**//​.
 +   # chown ldap:ldap /​var/​lib/​ldap/​cn.bdb /​var/​lib/​ldap/​objectClass.bdb /​var/​lib/​ldap/​ou.bdb
 +==== erster Test  ====
 +Damit wir den gerade durchgeführten Import in den DIT auch überprüfen können, müssen wir unseren OpenLDAP-Server wieder starten.
 +   # service slapd start
 +
 +   ​Starting slapd: ​                                           [  OK  ]
 +Der erfolgreiche Start wurde im ldap-Logfile //​**/​var/​log/​ldap.log**//​ auch entsprechend quittiert.
 +<​code>​Oct 27 11:58:43 vml000030 slapd[8070]:​ @(#) $OpenLDAP: slapd 2.4.19 (Jun 25 2011 11:27:10) $#​012#​011mockbuild@c6b6.bsys.dev.centos.org:/​builddir/​build/​BUILD/​openldap-2.4.19/​openldap-2.4.19/​build-servers/​servers/​slapd
 +Oct 27 11:58:43 vml000030 slapd[8071]:​ slapd starting
 +</​code>​
 +Ob nun das Anlegen der DIT erfolgreich war oder nicht, fragen wir nun mit folgender Suchanfrage ab.
 +   # ldapsearch -x -b "​dc=nausch,​dc=org"​ "​(objectclass=*)"​
 +<​code>#​ extended LDIF
 +#
 +# LDAPv3
 +# base <​dc=nausch,​dc=org>​ with scope subtree
 +# filter: (objectclass=*)
 +# requesting: ALL
 +#
 +
 +# nausch.org
 +dn: dc=nausch,​dc=org
 +dc: Nausch
 +objectClass:​ dcObject
 +objectClass:​ organizationalUnit
 +ou: nausch Dot org
 +
 +# Manager, nausch.org
 +dn: cn=Manager,​dc=nausch,​dc=org
 +cn: Manager
 +objectClass:​ organizationalRole
 +
 +# People, nausch.org
 +dn: ou=People,​dc=nausch,​dc=org
 +ou: People
 +objectClass:​ organizationalUnit
 +
 +# Group, nausch.org
 +dn: ou=Group,​dc=nausch,​dc=org
 +ou: Group
 +objectClass:​ organizationalUnit
 +
 +# search result
 +search: 2
 +result: 0 Success
 +
 +# numResponses:​ 5
 +# numEntries: 4
 +</​code>​
 +Im Logfile des slapd-Daemon wird unsere erfolgreiche Abfrage entsprechend protokolliert.
 +<​code>​Oct 27 12:04:26 vml000030 slapd[8071]:​ conn=4 fd=12 ACCEPT from IP=[::​1]:​56589 (IP=[::​]:​389)
 +Oct 27 12:04:26 vml000030 slapd[8071]:​ conn=4 op=0 BIND dn=""​ method=128
 +Oct 27 12:04:26 vml000030 slapd[8071]:​ conn=4 op=0 RESULT tag=97 err=0 text=
 +Oct 27 12:04:26 vml000030 slapd[8071]:​ conn=4 op=1 SRCH base="​dc=nausch,​dc=org"​ scope=2 deref=0 filter="​(objectClass=*)"​
 +Oct 27 12:04:26 vml000030 slapd[8071]:​ conn=4 op=1 SEARCH RESULT tag=101 err=0 nentries=4 text=
 +Oct 27 12:04:26 vml000030 slapd[8071]:​ conn=4 op=2 UNBIND
 +Oct 27 12:04:26 vml000030 slapd[8071]:​ conn=4 fd=12 closed
 +</​code>​
 +===== Benutzermigration mit Hilfe der migrationstools =====
 +In den seltensten Fällen haben wir eine Installation ohne jegliche Benutzer; in der Regel befinden sich auf unserem LINUX-System bereits angelegte Nutzer mit Ihren Konten. Diesen Nutzer wird immer eine UserID (**uid**) ab 500 zugewiesen. Somit ist eine Unterscheidung zwischen realen Nutzern und technischen Nutzeraccounts relativ leicht möglich.
 +Die hierzu erforderlichen Daten bekommen wir aus den beiden Dateien //​**/​etc/​group**//​ und //​**/​etc/​passwd**//​.
 +==== Installation ====
 +Zur leichteren Übernahme der Nutzerdaten bedienen wir uns der Hilfsprogramme aus dem RPM-Paket **migrationtools** aus dem Base-Repository,​ welches wir nun zuerst installieren wollen.
 +   # yum install migrationtools -y
 +Was uns dieses RPM-Paket alles an Hilfsmittel mitbringt zeigt uns ein Blick in das Paket selbst.
 +   # rpm -qil migrationtools
 +<​code>​Name ​       : migrationtools ​              ​Relocations:​ (not relocatable)
 +Version ​    : 47                                Vendor: CentOS
 +Release ​    : 7.el6                         Build Date: Tue 24 Aug 2010 06:09:18 PM CEST
 +Install Date: Thu 27 Oct 2011 12:23:20 PM CEST      Build Host: c6b2.bsys.dev.centos.org
 +Group       : System Environment/​Daemons ​   Source RPM: migrationtools-47-7.el6.src.rpm
 +Size        : 106663 ​                          ​License:​ BSD
 +Signature ​  : RSA/8, Sun 03 Jul 2011 06:30:14 AM CEST, Key ID 0946fca2c105b9de
 +Packager ​   : CentOS BuildSystem <​http://​bugs.centos.org>​
 +URL         : http://​www.padl.com/​OSS/​MigrationTools.html
 +Summary ​    : Migration scripts for LDAP
 +Description :
 +The MigrationTools are a set of Perl scripts for migrating users, groups,
 +aliases, hosts, netgroups, networks, protocols, RPCs, and services from
 +existing nameservices (flat files, NIS, and NetInfo) to LDAP.
 +/​usr/​share/​doc/​migrationtools-47
 +/​usr/​share/​doc/​migrationtools-47/​README
 +/​usr/​share/​doc/​migrationtools-47/​migration-tools.txt
 +/​usr/​share/​migrationtools
 +/​usr/​share/​migrationtools/​migrate_aliases.pl
 +/​usr/​share/​migrationtools/​migrate_all_netinfo_offline.sh
 +/​usr/​share/​migrationtools/​migrate_all_netinfo_online.sh
 +/​usr/​share/​migrationtools/​migrate_all_nis_offline.sh
 +/​usr/​share/​migrationtools/​migrate_all_nis_online.sh
 +/​usr/​share/​migrationtools/​migrate_all_nisplus_offline.sh
 +/​usr/​share/​migrationtools/​migrate_all_nisplus_online.sh
 +/​usr/​share/​migrationtools/​migrate_all_offline.sh
 +/​usr/​share/​migrationtools/​migrate_all_online.sh
 +/​usr/​share/​migrationtools/​migrate_automount.pl
 +/​usr/​share/​migrationtools/​migrate_base.pl
 +/​usr/​share/​migrationtools/​migrate_common.ph
 +/​usr/​share/​migrationtools/​migrate_fstab.pl
 +/​usr/​share/​migrationtools/​migrate_group.pl
 +/​usr/​share/​migrationtools/​migrate_hosts.pl
 +/​usr/​share/​migrationtools/​migrate_netgroup.pl
 +/​usr/​share/​migrationtools/​migrate_netgroup_byhost.pl
 +/​usr/​share/​migrationtools/​migrate_netgroup_byuser.pl
 +/​usr/​share/​migrationtools/​migrate_networks.pl
 +/​usr/​share/​migrationtools/​migrate_passwd.pl
 +/​usr/​share/​migrationtools/​migrate_profile.pl
 +/​usr/​share/​migrationtools/​migrate_protocols.pl
 +/​usr/​share/​migrationtools/​migrate_rpc.pl
 +/​usr/​share/​migrationtools/​migrate_services.pl
 +/​usr/​share/​migrationtools/​migrate_slapd_conf.pl
 +</​code>​
 +==== Konfiguration ====
 +Vor der Migration unserer Daten ist es noch notwendig, das mitgelieferte Hilfsprogramm **migrate_common.ph** unserer Produktivumgebung anzupassen.
 +   # vim /​usr/​share/​migrationtools/​migrate_common.ph
 +<file bash | /​usr/​share/​migrationtools/​migrate_common.ph>​
 +#
 +# $Id: migrate_common.ph,​v 1.22 2003/04/15 03:09:33 lukeh Exp $
 +#
 +# Copyright (c) 1997-2003 Luke Howard.
 +# All rights reserved.
 +#
 +# Redistribution and use in source and binary forms, with or without
 +# modification,​ are permitted provided that the following conditions
 +# are met:
 +# 1. Redistributions of source code must retain the above copyright
 +#    notice, this list of conditions and the following disclaimer.
 +# 2. Redistributions in binary form must reproduce the above copyright
 +#    notice, this list of conditions and the following disclaimer in the
 +#    documentation and/or other materials provided with the distribution.
 +# 3. All advertising materials mentioning features or use of this software
 +#    must display the following acknowledgement:​
 +#        This product includes software developed by Luke Howard.
 +# 4. The name of the other may not be used to endorse or promote products
 +#    derived from this software without specific prior written permission.
 +#
 +# THIS SOFTWARE IS PROVIDED BY THE LUKE HOWARD ``AS IS''​ AND
 +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 +# ARE DISCLAIMED. ​ IN NO EVENT SHALL LUKE HOWARD BE LIABLE
 +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 +# SUCH DAMAGE.
 +#
 +
 +#
 +# Common defines for MigrationTools
 +#
 +
 +# Naming contexts. Key is $PROGRAM with migrate_ and .pl 
 +# stripped off. 
 +$NETINFOBRIDGE = (-x "/​usr/​sbin/​mkslapdconf"​);​
 +
 +if ($NETINFOBRIDGE) {
 + $NAMINGCONTEXT{'​aliases'​} ​          = "​cn=aliases";​
 + $NAMINGCONTEXT{'​fstab'​} ​            = "​cn=mounts";​
 + $NAMINGCONTEXT{'​passwd'​} ​           = "​cn=users";​
 + $NAMINGCONTEXT{'​netgroup_byuser'​} ​  = "​cn=netgroup.byuser";​
 + $NAMINGCONTEXT{'​netgroup_byhost'​} ​  = "​cn=netgroup.byhost";​
 + $NAMINGCONTEXT{'​group'​} ​            = "​cn=groups";​
 + $NAMINGCONTEXT{'​netgroup'​} ​         = "​cn=netgroup";​
 + $NAMINGCONTEXT{'​hosts'​} ​            = "​cn=machines";​
 + $NAMINGCONTEXT{'​networks'​} ​         = "​cn=networks";​
 + $NAMINGCONTEXT{'​protocols'​} ​        = "​cn=protocols";​
 + $NAMINGCONTEXT{'​rpc'​} ​              = "​cn=rpcs";​
 + $NAMINGCONTEXT{'​services'​} ​         = "​cn=services";​
 +} else {
 + $NAMINGCONTEXT{'​aliases'​} ​          = "​ou=Aliases";​
 + $NAMINGCONTEXT{'​fstab'​} ​            = "​ou=Mounts";​
 + $NAMINGCONTEXT{'​passwd'​} ​           = "​ou=People";​
 + $NAMINGCONTEXT{'​netgroup_byuser'​} ​  = "​nisMapName=netgroup.byuser";​
 + $NAMINGCONTEXT{'​netgroup_byhost'​} ​  = "​nisMapName=netgroup.byhost";​
 + $NAMINGCONTEXT{'​group'​} ​            = "​ou=Group";​
 + $NAMINGCONTEXT{'​netgroup'​} ​         = "​ou=Netgroup";​
 + $NAMINGCONTEXT{'​hosts'​} ​            = "​ou=Hosts";​
 + $NAMINGCONTEXT{'​networks'​} ​         = "​ou=Networks";​
 + $NAMINGCONTEXT{'​protocols'​} ​        = "​ou=Protocols";​
 + $NAMINGCONTEXT{'​rpc'​} ​              = "​ou=Rpc";​
 + $NAMINGCONTEXT{'​services'​} ​         = "​ou=Services";​
 +}
 +
 +# Default DNS domain
 +# Django : 2011-10-27 Domäne nausch.org angepasst
 +# default : $DEFAULT_MAIL_DOMAIN = "​padl.com";​
 +$DEFAULT_MAIL_DOMAIN = "​nausch.org";​
 +
 +# Default base 
 +# Django : 2011-10-27 Domäne nausch.org angepasst
 +# default : $DEFAULT_BASE = "​dc=padl,​dc=com";​
 +$DEFAULT_BASE = "​dc=nausch,​dc=org";​
 +
 +# Turn this on for inetLocalMailReceipient
 +# sendmail support; add the following to 
 +# sendmail.mc (thanks to Petr@Kristof.CZ):​
 +##### CUT HERE #####
 +#​define(`confLDAP_DEFAULT_SPEC',​`-h "​ldap.padl.com"'​)dnl
 +#​LDAPROUTE_DOMAIN_FILE(`/​etc/​mail/​ldapdomains'​)dnl
 +#​FEATURE(ldap_routing)dnl
 +##### CUT HERE #####
 +# where /​etc/​mail/​ldapdomains contains names of ldap_routed
 +# domains (similiar to MASQUERADE_DOMAIN_FILE).
 +# $DEFAULT_MAIL_HOST = "​mail.padl.com";​
 +
 +# turn this on to support more general object clases
 +# such as person.
 +$EXTENDED_SCHEMA = 0;
 +
 +#
 +# allow environment variables to override predefines
 +#
 +if (defined($ENV{'​LDAP_BASEDN'​})) {
 + $DEFAULT_BASE = $ENV{'​LDAP_BASEDN'​};​
 +}
 +
 +if (defined($ENV{'​LDAP_DEFAULT_MAIL_DOMAIN'​})) {
 + $DEFAULT_MAIL_DOMAIN = $ENV{'​LDAP_DEFAULT_MAIL_DOMAIN'​};​
 +}
 +
 +if (defined($ENV{'​LDAP_DEFAULT_MAIL_HOST'​})) {
 + $DEFAULT_MAIL_HOST = $ENV{'​LDAP_DEFAULT_MAIL_HOST'​};​
 +}
 +
 +# binddn used for alias owner (otherwise uid=root,​...)
 +if (defined($ENV{'​LDAP_BINDDN'​})) {
 + $DEFAULT_OWNER = $ENV{'​LDAP_BINDDN'​};​
 +}
 +
 +if (defined($ENV{'​LDAP_EXTENDED_SCHEMA'​})) {
 + $EXTENDED_SCHEMA = $ENV{'​LDAP_EXTENDED_SCHEMA'​};​
 +}
 +
 +# If we haven'​t set the default base, guess it automagically.
 +if (!defined($DEFAULT_BASE)) {
 + $DEFAULT_BASE = &​domain_expand($DEFAULT_MAIL_DOMAIN);​
 + $DEFAULT_BASE =~ s/,$//o;
 +}
 +
 +# Default Kerberos realm
 +#if ($EXTENDED_SCHEMA) {
 +#​ $DEFAULT_REALM = $DEFAULT_MAIL_DOMAIN;​
 +#​ $DEFAULT_REALM =~ tr/​a-z/​A-Z/;​
 +#}
 +
 +if (-x "/​usr/​sbin/​revnetgroup"​) {
 + $REVNETGROUP = "/​usr/​sbin/​revnetgroup";​
 +} elsif (-x "/​usr/​lib/​yp/​revnetgroup"​) {
 + $REVNETGROUP = "/​usr/​lib/​yp/​revnetgroup";​
 +}
 +
 +$classmap{'​o'​} = '​organization';​
 +$classmap{'​dc'​} = '​domain';​
 +$classmap{'​l'​} = '​locality';​
 +$classmap{'​ou'​} = '​organizationalUnit';​
 +$classmap{'​c'​} = '​country';​
 +$classmap{'​nismapname'​} = '​nisMap';​
 +$classmap{'​cn'​} = '​container';​
 +
 +sub parse_args
 +{
 + if ($#ARGV < 0) {
 + print STDERR "​Usage:​ $PROGRAM infile [outfile]\n";​
 + exit 1;
 + }
 +
 + $INFILE = $ARGV[0];
 +
 + if ($#ARGV > 0) {
 + $OUTFILE = $ARGV[1];
 + }
 +}
 +
 +sub open_files
 +{
 + open(INFILE);​
 + if ($OUTFILE) {
 + open(OUTFILE,">​$OUTFILE"​);​
 + $use_stdout = 0;
 + } else {
 + $use_stdout = 1;
 + }
 +}
 +
 +# moved from migrate_hosts.pl
 +# lukeh 10/30/97
 +sub domain_expand
 +{
 + local($first) = 1;
 + local($dn);​
 + local(@namecomponents) = split(/\./, $_[0]);
 + foreach $_ (@namecomponents) {
 + $first = 0;
 + $dn .= "​dc=$_,";​
 + }
 + $dn .= $DEFAULT_BASE;​
 + return $dn;
 +}
 +
 +# case insensitive unique
 +sub uniq
 +{
 + local($name) = shift(@_);
 + local(@vec) = sort {uc($a) cmp uc($b)} @_;
 + local(@ret);​
 + local($next,​ $last);
 + foreach $next (@vec) {
 + if ((uc($next) ne uc($last)) &&
 + (uc($next) ne uc($name))) {
 + push (@ret, $next);
 + }
 + $last = $next;
 + }
 + return @ret;
 +}
 +
 +# concatenate naming context and 
 +# organizational base
 +sub getsuffix
 +{
 + local($program) = shift(@_);
 + local($nc);​
 + $program =~ s/​^migrate_(.*)\.pl$/​$1/;​
 + $nc = $NAMINGCONTEXT{$program};​
 + if ($nc eq ""​) {
 + return $DEFAULT_BASE;​
 + } else {
 + return $nc . ','​ . $DEFAULT_BASE;​
 + }
 +}
 +
 +sub ldif_entry
 +{
 +# remove leading, trailing whitespace
 + local ($HANDLE, $lhs, $rhs) = @_;
 + local ($type, $val) = split(/\=/, $lhs);
 + local ($dn);
 +
 + if ($rhs ne ""​) {
 + $dn = $lhs . ','​ . $rhs;
 + } else {
 + $dn = $lhs;
 + }
 +
 + $type =~ s/\s*$//o;
 + $type =~ s/^\s*//o;
 + $type =~ tr/​A-Z/​a-z/;​
 + $val =~ s/\s*$//o;
 + $val =~ s/^\s*//o;
 +
 + print $HANDLE "dn: $dn\n";​
 + print $HANDLE "​$type:​ $val\n";​
 + print $HANDLE "​objectClass:​ top\n";​
 + print $HANDLE "​objectClass:​ $classmap{$type}\n";​
 + if ($EXTENDED_SCHEMA) {
 + if ($DEFAULT_MAIL_DOMAIN) {
 + print $HANDLE "​objectClass:​ domainRelatedObject\n";​
 + print $HANDLE "​associatedDomain:​ $DEFAULT_MAIL_DOMAIN\n";​
 + }
 + }
 +
 + print $HANDLE "​\n";​
 +}
 +
 +# Added Thu Jun 20 16:40:28 CDT 2002 by Bob Apthorpe
 +# <​apthorpe@cynistar.net>​ to solve problems with embedded plusses in
 +# protocols and mail aliases.
 +sub escape_metacharacters
 +{
 + local($name) = @_;
 +
 + # From Table 3.1 "​Characters Requiring Quoting When Contained
 + # in Distinguished Names",​ p87 "​Understanding and Deploying LDAP
 + # Directory Services",​ Howes, Smith, & Good.
 +
 + # 1) Quote backslash
 + # Note: none of these are very elegant or robust and may cause
 + # more trouble than they'​re worth. That's why they'​re disabled.
 + # 1.a) naive (escape all backslashes)
 + # $name =~ s#​\\#​\\\\#​og;​
 + #
 + # 1.b) mostly naive (escape all backslashes not followed by
 + # a backslash)
 + # $name =~ s#​\\(?​!\\)#​\\\\#​og;​
 + #
 + # 1.c) less naive and utterly gruesome (replace solitary
 + # backslashes)
 + # $name =~ s{ # Replace
 + #​ (?<​!\\) # negative lookbehind (no preceding backslash)
 + # \\ # a single backslash
 + #​ (?​!\\) #​ negative lookahead (no following backslash)
 + # }
 + # { # With
 + # \\\\ # a pair of backslashes
 + # }gx;
 + # Ugh. Note that s#​(?:​[^\\])\\(?:​[^\\])#////#​g fails if $name
 + # starts or ends with a backslash. This expression won't work
 + # under perl4 because the /x flag and negative lookahead and
 + # lookbehind operations aren't supported. Sorry. Also note that
 + # s#​(?:​[^\\]*)\\(?:​[^\\]*)#////#​g won't work either. ​ Of course,
 + # this is all broken if $name is already escaped before we get
 + # to it. Best to throw a warning and make the user import these
 + # records by hand.
 +
 + # 2) Quote leading and trailing spaces
 + local($leader,​ $body, $trailer) = ();
 + if (($leader, $body, $trailer) = ($name =~ m#^( *)(.*\S)( *)$#o)) {
 + $leader =~ s# #\\ #og;
 + $trailer =~ s# #\\ #og;
 + $name = $leader . $body . $trailer;
 + }
 +
 + # 3) Quote leading octothorpe (#)
 + $name =~ s/^#/\\#/o;
 +
 + # 4) Quote comma, plus, double-quote,​ less-than, greater-than,​
 + # and semicolon
 + $name =~ s#​([,​+"<>;​])#​\\$1#​g;​
 +
 + return $name;
 +}
 +
 +1;
 +
 +</​file>​
 +==== Datenselektion ====
 +Bevor wir nun im Detail beginnen werden unsere Userdaten in den DIT zu übernehmen,​ beenden wir erst einmal unseren eventuell noch laufenden slapd-Dämon.
 +   # service slapd status
 +
 +   slapd (pid  2024) is running...
 +
 +   # service slapd stop
 +
 +   ​Stopping slapd: ​                                           [  OK  ]
 +
 +Da wir nicht alle Nutzer, sondern nur die realen Benutzer in den DIT übernehmen wollen, extrahieren wir alle Nutzer aus der //​**/​etc/​group**//​ und //​**/​etc/​passwd**//​ deren **UID** größer oder gleich **500** ist und legen diesen in zwei eigenen Dateien ab.
 +   # grep ":​5[0-9][0-9]"​ /etc/group > /​etc/​openldap/​ldif/​group
 +
 +   # grep ":​5[0-9][0-9]"​ /etc/passwd > /​etc/​openldap/​ldif/​passwd
 +
 +==== Datenmigration ====
 +Nun ist es an der Zeit unsere Nutzerdaten aus den zuvor angelegten temporären Dateien in entsprechende .ldif Dateien zu konvertieren. Hierzu nutzen wir die Hilfsprogramme aus dem zuvor installiertem RPM Paket **migrationtools**:​
 +  * **migrate_passwd.pl**
 +  * **migrate_group.pl**
 +
 +Wir erstellen also nun die beiden .ldif-Dateien.
 +   # /​usr/​share/​migrationtools/​migrate_passwd.pl /​etc/​openldap/​ldif/​passwd > /​etc/​openldap/​ldif/​passwd.ldif
 +
 +   # /​usr/​share/​migrationtools/​migrate_group.pl /​etc/​openldap/​ldif/​group > /​etc/​openldap/​ldif/​group.ldif
 +
 +Aus der Datei //​**/​etc/​openldap/​ldif/​passwd**//​ mit dem Inhalt <​code>​django:​x:​500:​500:​Django:/​home/​django:/​bin/​bash
 +bigchief:​x:​501:​501:​BigChief:/​home/​bigchief:/​bin/​bash</​code>​ wurde also die Datei //​**/​etc/​openldap/​ldif/​passwd.ldif**//​ mit dem Inhalt <​code>​dn:​ uid=django,​ou=People,​dc=nausch,​dc=org
 +uid: django
 +cn: Django
 +objectClass:​ account
 +objectClass:​ posixAccount
 +objectClass:​ top
 +objectClass:​ shadowAccount
 +userPassword:​ {crypt}$6$CgkuPTZe$4bOl/​GgR1H89iqB4miN2aSyVwGQa6IYnmn4xiFw2dV4lmcJjDhc9qwkEabPu6T/​PHMcWqaKmoJRwz6XpU7wVm1
 +shadowLastChange:​ 15272
 +shadowMin: 0
 +shadowMax: 99999
 +shadowWarning:​ 7
 +loginShell: /bin/bash
 +uidNumber: 500
 +gidNumber: 500
 +homeDirectory:​ /​home/​django
 +gecos: Django
 +
 +dn: uid=bigchief,​ou=People,​dc=nausch,​dc=org
 +uid: bigchief
 +cn: BigChief
 +objectClass:​ account
 +objectClass:​ posixAccount
 +objectClass:​ top
 +objectClass:​ shadowAccount
 +userPassword:​ {crypt}$6$j5rlaJGu$iOVKzOjp9GNIjO41LaYiO1qNOksHklT5xjSsJ108cgmfVpndyXKuPVKX8Ph8exnfelRchPR9IX9tfjUqnmIeh.
 +shadowLastChange:​ 15274
 +shadowMin: 0
 +shadowMax: 99999
 +shadowWarning:​ 7
 +loginShell: /bin/bash
 +uidNumber: 501
 +gidNumber: 501
 +homeDirectory:​ /​home/​bigchief
 +gecos: BigChief
 +
 +</​code>​ generiert.
 +
 +Aus der Datei //​**/​etc/​openldap/​ldif/​group**//​ mit dem Inhalt <​code>​django:​x:​500:​
 +bigchief:​x:​501:</​code>​ wurde die Datei //​**/​etc/​openldap/​ldif/​group.ldif**//​ mit dem Inhalt <​code>​dn:​ cn=django,​ou=Group,​dc=nausch,​dc=org
 +objectClass:​ posixGroup
 +objectClass:​ top
 +cn: django
 +userPassword:​ {crypt}x
 +gidNumber: 500
 +
 +dn: cn=bigchief,​ou=Group,​dc=nausch,​dc=org
 +objectClass:​ posixGroup
 +objectClass:​ top
 +cn: bigchief
 +userPassword:​ {crypt}x
 +gidNumber: 501
 +
 +</​code>​ generiert.
 +
 +==== Datenübernahme in den DIT ====
 +Im nun folgenden Schritt werden wir die Daten aus den zuvor generierten .ldif-Dateien in den DIT übernehmen.
 +Vor dem Import passen wir noch die Nutzerrechte unserer .ldif-Dateien an.
 +   # chown ldap:ldap /​etc/​openldap/​ldif/​*.ldif
 +Zu erst importieren wir die Inhalte aus der //​**passwd.ldif**//​
 +   # slapadd -v -l /​etc/​openldap/​ldif/​passwd.ldif
 +<​code>​added:​ "​uid=django,​ou=People,​dc=nausch,​dc=org"​ (00000005)
 +_####################​ 100.00% eta   none elapsed ​           none fast!         
 +added: "​uid=bigchief,​ou=People,​dc=nausch,​dc=org"​ (00000006)
 +.####################​ 100.00% eta   none elapsed ​           none fast!         
 +Closing DB...
 +</​code>​
 +Anschließend importieren wir die Inhalte aus der //​**group.ldif**//​
 +   # slapadd -v -l /​etc/​openldap/​ldif/​group.ldif
 +<​code>​added:​ "​cn=django,​ou=Group,​dc=nausch,​dc=org"​ (00000007)
 +added: "​cn=bigchief,​ou=Group,​dc=nausch,​dc=org"​ (00000008)
 +_####################​ 100.00% eta   none elapsed ​           none fast!         
 +Closing DB...
 +</​code>​
 +Bevor wir nun unseren OpenLDAP-Server wieder starten korrigieren wir noch die Nutzerrechte der neu angelegten Dateien im Verzeichnis **/​var/​lib/​ldap**. ​
 +==== abschließender Test  ====
 +Damit wir den gerade durchgeführten User- und Gruppendaten-Import in den DIT auch überprüfen können, müssen wir unseren OpenLDAP-Server wieder starten.
 +   # service slapd start
 +
 +   ​Starting slapd: ​                                           [  OK  ]
 +Der erfolgreiche Start wurde im ldap-Logfile //​**/​var/​log/​ldap.log**//​ auch entsprechend quittiert.
 +<​code>​Oct 27 13:41:22 vml000030 slapd[8239]:​ @(#) $OpenLDAP: slapd 2.4.19 (Jun 25 2011 11:27:10) $#​012#​011mockbuild@c6b6.bsys.dev.centos.org:/​builddir/​build/​BUILD/​openldap-2.4.19/​openldap-2.4.19/​build-servers/​servers/​slapd
 +Oct 27 13:41:22 vml000030 slapd[8240]:​ slapd starting
 +</​code>​
 +Für den abschließenden Test, ob die Datenmigration aus den filebasierenden Dateien in den DIT unseres OpenLADP-Servers geklappt hat, befragen wir unseren LDAP-Server nach den Daten zum User //django//.
 +   # ldapsearch -x -b "​uid=django,​ou=People,​dc=nausch,​dc=org"​ "​(objectclass=*)"​
 +<​code>#​ extended LDIF
 +#
 +# LDAPv3
 +# base <​uid=django,​ou=People,​dc=nausch,​dc=org>​ with scope subtree
 +# filter: (objectclass=*)
 +# requesting: ALL
 +#
 +
 +# django, People, nausch.org
 +dn: uid=django,​ou=People,​dc=nausch,​dc=org
 +uid: django
 +cn: Django
 +objectClass:​ account
 +objectClass:​ posixAccount
 +objectClass:​ top
 +objectClass:​ shadowAccount
 +shadowLastChange:​ 15272
 +shadowMin: 0
 +shadowMax: 99999
 +shadowWarning:​ 7
 +loginShell: /bin/bash
 +uidNumber: 500
 +gidNumber: 500
 +homeDirectory:​ /​home/​django
 +gecos: Django
 +
 +# search result
 +search: 2
 +result: 0 Success
 +
 +# numResponses:​ 2
 +# numEntries: 1
 +</​code>​
 +Unsere erfolgreiche Abfrage erzeugt einen entsprechendnen Eintrag im Logfile des slapd-Daemon.
 +<​code>​Oct 27 13:43:30 vml000030 slapd[8240]:​ conn=0 fd=12 ACCEPT from IP=[::​1]:​44777 (IP=[::​]:​389)
 +Oct 27 13:43:30 vml000030 slapd[8240]:​ conn=0 op=0 BIND dn=""​ method=128
 +Oct 27 13:43:30 vml000030 slapd[8240]:​ conn=0 op=0 RESULT tag=97 err=0 text=
 +Oct 27 13:43:30 vml000030 slapd[8240]:​ conn=0 op=1 SRCH base="​uid=django,​ou=People,​dc=nausch,​dc=org"​ scope=2 deref=0 filter="​(objectClass=*)"​
 +Oct 27 13:43:30 vml000030 slapd[8240]:​ conn=0 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
 +Oct 27 13:43:30 vml000030 slapd[8240]:​ conn=0 op=2 UNBIND
 +Oct 27 13:43:30 vml000030 slapd[8240]:​ conn=0 fd=12 closed
 +</​code>​
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +====== Links ======
 +  * **[[centos:​ldap:​start|Zurück zum Kapitel >>​OpenLDAP Server unter CentOS 6.x<<​]]**
 +  * **[[wiki:​start|Zurück zu >>​Projekte und Themenkapitel<<​]]**
 +  * **[[http://​dokuwiki.nausch.org/​doku.php/​|Zurück zur Startseite]]**
 +
 +
 +
 +
 +
 +
 +
 +
  
  • centos/ldap/data.txt
  • Zuletzt geändert: 20.04.2018 10:49.
  • (Externe Bearbeitung)