LDAP學習小結【僅原理和基礎篇】

  此篇文章花費了好幾個晚上,大部分是軟件翻譯的英文文檔,加上本身的理解所寫,但願學習者能尊重每一個人的努力.html

  我有句話想送給每一個看我文章的人:java

    慢就是快,快就是慢!!!node

  另外更但願更多人能從認真從原理學習,分享更多有質量的文章,而不是僅僅轉載別人的文章.數據庫

  如下僅介紹了OpenLDAP的基本原理和基本配置,至於更高級的配置,還需自行學習,由於有了如下基礎,再去建樓,就會vim

  更加容易,網上有太多文章都太老舊,實在難以讓初學者對OpenLDAP有一個全面的基礎認識,總搞的人云裏霧裏,這篇文章windows

  但願對想學習OpenLDAP的人,打一個好的基礎,從而能深刻了解它.基本命令我就不貼出來了,但願想深刻學習的人,自行學習api

  man手冊.安全

        --------------馬幫弟子:zcfbash

 

LDAP:
  原理:
  http://www.javashuo.com/article/p-tseelloq-ec.html

LDAP:
    它是用來作統一用戶身份認證的.即: 你訪問CSDN它說你能夠用微信登陸,你登陸微博,它也支持微信登陸等,
  這就是一種目錄服務, 固然它們不必定用LDAP來作爲他們的目錄服務.
  LDAP(Light Directory Access Portocol),它是基於X.500標準的輕量級目錄訪問協議。
  Linux上實現LDAP的工具是 openladp, 經過配置ldap服務器,將用戶信息存儲在其中,就可使用ldap協議,
  訪問用戶數據庫,來實現LDAP用戶認證.

基本概念:
  目錄樹概念
    1. 目錄樹:在一個目錄服務系統中,整個目錄信息集能夠表示爲一個目錄信息樹,樹中的每一個節點是一個條目。
    2. 條目:每一個條目就是一條記錄,每一個條目有本身的惟一可區別的名稱(DN)。
    3. 對象類:與某個實體類型對應的一組屬性,對象類是能夠繼承的,這樣父類的必須屬性也會被繼承下來。
    4. 屬性:描述條目的某個方面的信息,一個屬性由一個屬性類型和一個或多個屬性值組成,屬性有必須屬性和非必須屬性。

  名詞:
    dn(Distinguished Name): 「uid=songtao.xu,ou=oa組,dc=example,dc=com」,一條記錄的位置(惟一)
    uid(User Id): 用戶ID songtao.xu(一條記錄的ID)
    ou(Organization Unit): 組織單位,組織單位能夠包含其餘各類對象(包括其餘組織單元),如「oa組」(一條記錄的所屬組織)
    dc(Domain Component) :域名的部分,其格式是將完整的域名分紅幾部分,如域名爲example.com變成dc=example,dc=com(一條記錄的所屬位置)服務器

    cn(Common Name): 公共名稱,如「Thomas Johansson」(一條記錄的名稱)
    sn(Surname): 姓,如「許」
    rdn(Relative dn): 相對辨別名,相似於文件系統中的相對路徑,它是與目錄樹結構無關的部分,如「uid=tom」或「cn= Thomas Johansson」

配置openLDAP有兩種方式:
  slapd.conf
    修改它,須要從新生成數據庫文件, 生成後須要從新賦予權限屬主屬組ldap.ldap .
    接着從新加載slapd 進程, 配置纔會生效.若使用單機版,不推薦。
  cn=config:
    修改後,當即生效, 它屬於熱部署.

    從16年開始OpenLDAP官方都不推薦使用slapd.conf來配置LDAP,由於它太繁瑣,修改完配置必須從新生成OpenLDAP數據庫,

    這就意味着,OpenLDAP服務器必須停機!!

  LDAP初始化
    [root@rnode6 ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG   #用何種方式都須要.
    [root@rnode6 ~]# cp /usr/share/openldap-servers/slapd.ldif /etc/openldap/slapd.conf
    [root@rnode6 ~]# chown -R ldap.ldap /etc/openldap/
    [root@rnode6 ~]# chown -R ldap.ldap /var/lib/ldap/

    /etc/openldap/
      check_password.conf :   用於密碼生成
      ldap.conf:         可支持匿名方式訪問LDAP
      slapd.d :     此目錄就是cn=config方式管理LDAP所需的目錄.
      slapd.ldif :     若須要使用slapd.conf管理LDAP,則須要將此ldif複製到這裏,更名爲slapd.conf

    /etc/openldap/slapd.d/cn=config/
      olcDatabase={2}hdb.ldif    #CentOS6是bdb CentOS7是 hdb


  編譯安裝:
    1. yum install openssl-devel gcc libtool-ltdl-devel libtool-ltdl -y

    2. 先編譯安裝Berkeley DB 5.3.28
      Berkeley DBv6.0.20後不在被openldap支持, 由於Berkeley如今是Oracle公司的.
      cd   berkeley的安裝目錄/build_unix/      #必需要先進到此目錄下,不然編譯時會總報錯
      ../src/dbinc/configure --prefix=/usr/local/berkeley-db-5.3.28
      make
      make install

    3. 編譯openldap
      cd openldap源碼目錄/
      ./configure --enable-wrappers \      #啓用TCP-Wrapper
      CPPFLAGS="-I/usr/local/berkeley-db-5.3.28/include" \
      LDFLAGS="-L/usr/local/berkeley-db-5.3.28/lib -Wl,-rpath,/usr/local/berkeley-db-5.3.28/lib" \
      --prefix=/usr/local/openldap2.4.44

      make
      make install


    LDAP的目錄信息:

      
  它一般就如上圖這樣組織, 它是倒樹結構, 樹根通常是 國家(如:c=CN) 或 域名(dc=zcf,dc=com),
  其次通常定義一個或多個組織(Organization, 簡稱 o) 或 組織單元(Organization Unit, ou)
  一個組織單元中可包含: 員工, 設備信息(PC/打印機等)相關信息.
  Entry(條目):
    uid=tom,ou=People,dc=example,dc=com      #這稱爲一個DN, 也叫一個entry(條目)


    

  目前比較知名的目錄服務產品:
    SUN: SUNONE Directory Server, 特色: 基於文本數據的存儲,速度塊.
    IBM: IBM Directory Server: 基於DB2數據庫存儲, 速度通常.
    Oracle: Oracle Internet Directory: 基於Oracle的數據庫, 速度通常.
    Mircrosoft:AD :基於Windows系統用戶, 數據管理/權限不靈活.
    OpenLDAP: 開源項目,速度快,應用普遍.

   Schema:
    它是基本數據模式, LDIF語法, LDAP管理,是目錄中存儲數據的規則的集合, 它是一種規範, 或一種數據存儲標準.
  Schema根據本身內部規範,保證整個目錄樹的完整性, 無非法數據, 當你須要在LDAP中添加一些自定義的屬性時,
  你就須要自定義Schema了, 若使用默認Schema你就 沒法添加這些本身所獨有的屬性, 由於,若沒有Schema這些規範,
  隨便添加屬性, 整個目錄樹將變的毫無章法,沒法管理!
    Schema是一個標準,定義了OpenLDAP目錄樹讀寫和屬性存取方式,這也是OpenLDAP可以存儲什麼數據類型,
  數據有何屬性等 均是根據Schema來定義的. OpenLDAP默認的schema文件通常在安裝在/etc/openldap/schema/下,
  此目錄下每一個文件定義了不一樣的對象和不一樣的屬性. 若想使用schema只須要在配置文件中經過include包含便可.
    grep '*.schema' /etc/openldap/slapd.conf

    /etc/openldap/schema/
    core.schema:     OpenLDAP的核心schema.【它是必須加載的】
    inetorgperson.schema : 它僅次於core, 咱們添加帳號時,不少要使用到它裏面定義的objectClass.
    dyngroup.schema : 這是定義組時使用的schema,包括要使用sudo.schema時,也須要它。
    ppolicy.schema:     若須要作密碼策略時,須要導入此schema.
    nis.schema: 網絡信息服務(FYI),也是一種集中帳號管理實現.
    java.schema: 若須要使用Java程序來操做openLDAP時,須要使用它,讓OpenLDAP支持Java.
    cosine.schema : Cosine 和 Internet X.500 (比較有用, 不太懂.)
    misc.schema : Assorted (experimental)
    openldap.schema : OpenLDAP Project(experimental)
    sudo.schema: 定義sudo規則

    在OpenLDAP目錄樹中,Schema用來指定一個目錄中所包含的對象(Objects)的類型(ObjectClass),
  以及每個對象類型(ObjectClass)中必須提供的屬性(Atrribute)和可選屬性及對應的屬性值.
  在LDIF文件中的數據條目, 可理解爲一個具體的對象,是經過Schema來規劃建立的, 符合Schema
  標準. 所以Schema是一個數據模型, 用來決定數據按什麼方式存儲, 並定義存儲在OpenLDAP目錄樹中
  不一樣條目(entry)下的數據之間的關係,schema須要OpenLDAP配置文件(Slapd.conf 或 cn=config)來
  指定. 以保證當前OpenLDAP服務器可在目錄樹中定義那些對象類型(objectClass).

  ObjectClass:
    在OpenLDAP目錄樹中, 每一個條目必須包含一個ObjectClass屬性,,或多個非必要的ObjectClass,及對應的值,
  有且需至少給一個ObjectClass賦一個值!
    每個值將用做每一個條目在目錄樹中存儲信息的標準,如 可包含哪些屬性信息, 咱們可將ObjectClass屬性值
  理解爲一種模板,模板定義哪些信息可存取, 哪些信息不可在目錄樹中存儲.
    ObjectClass和Attribute是由Schema文件來規定的, Schema文件規範ObjectClass的構成、Attribute格式
  以及繼承關係.

  ObjectClass可分爲三類:
    1. 結構型(Structural) : person 和 organizationUnit
      如person: 它可定義一我的的相關屬性,如:他的住址,電話,公司,職位等..
    2. 輔助型(Auxiliary) : extensibeObject
      如:之後若想限制登陸,就須要經過藉助此objectClass來定義.
    3. 抽象型(Abstract): top, 抽象型的ObjectClass不能直接使用.

  Attribute(屬性):
    一個ObjectClass節點具備一系列的Attribute, Attribute可理解爲Linux系統當中的變量, 那麼變量都有
  相應的值, 那麼Attribute也是由相關的值,這些屬性的對應值表示每一個對象的特色, 但有些條目當中的屬性
  是必須指定的(如: 有MUST標記的), 有些是非必要的(如: 由MAY標記的).
  在目錄樹中經常使用的Attribute有:
    uid, sn, giveName, I, ObjectClass, dc, ou, cn, mail, telephoneNumber, c 等.
  注意:
    uid: 這裏的UID不是Linux系統上的UID,這裏的UID是用戶登陸LDAP的帳號.
    sn: 只能寫姓.
    giveName: 只能寫名字

  ObjectClass示例:
    objectClass: ( 2.5.6.6 NAME 'person'
    SUP top STRUCTURAL
    MUST (sn $ cn)
    MAY (userPassword $ telephoneNumber $ seeAlso $ description))

  說明:
    2.5.6.6 : 這稱爲Object ID
    若要定義 person 屬性, 頂級必須爲 top, 由於其屬性類型爲STRUCTURAL, 必須定義 sn 和 cn 屬性.
  MAY定義的userPassword, telephoneNumber, seeAlse, description等4個屬性是無關緊要的.
  若要定義郵件地址, 國家等屬性, 是不能夠定義的, 除非你本身定義了相關的
    ObjectClass條目.
      對於此person類型的ObjectClass,後期你要調用,就必須提供sn 和 cn, 查詢也同樣, 不然Schema檢查
    將保錯.


  ObjectClass案例2:
    objectClass: (2.5.6.0 NAME 'top'
    ABSTRACT
    MUST (objectClass) )

    objectClass: ( 2.5.6.6 NAME 'person'
    SUP top STRUCTURAL
    MUST (sn $ cn)
    MAY (userPassword $ telephoneNumber $ seeAlso $ description))

    說明:
    此案例,若要定義 top 屬性, 必須定義一個objectClass屬性. 且此案例中還定義了person屬性, 因此要必須定義
    sn 和 cn屬性, 以及可附加的屬性( userPassword, telephoneNumber, seeAlse, description), 因此此案例中
    必需要定義 3 必要個屬性, 即objectClass, sn, cn .
    此案例的下一級 objectClass 能夠繼承上一級的 objectClass 的屬性信息.
    注:
      ObjectClass類型定義的不一樣,則其屬性的相關值信息也是不一樣的.


    Openldap配置:
      Slapd.conf方式配置Openldap的步驟:
      》slaptest :測試對slapd.conf的配置文件.
      》service slapd restart

    olcLogLevel: <日誌級別>

LDIF格式:
    LDIF(LDAP Data Interchanged Format)的輕量級目錄交換格式.
    它是存儲LDAP配置信息及目錄內容的標準文本文件格式, 之因此使用文本文件來存儲這些信息,是爲了方便
  讀取和修改,這也是其它大多數服務配置文件所採用的格式.
    LDIF一般用來交換數據並在OpenLDAP服務器之間互相交換數據, 而且可經過LDIF實現數據文件的導入,
  導出及數據文件的增長, 修改, 重命名等一些操做, 這些信息須要按照LDAP中schema的規範進行操做, 並
  會接受schema的檢查, 若不符合OpenLDAP Schema規範要求, 則會提示相關語法錯誤信息.

LDIF文件格式:
  LDIF 文件每行的結尾是不容許有空格或者製表符存在.
  LDIF 文件容許相關屬性可被重複賦值並使用.
  LDIF 文件以 # 號行爲註釋行.
  LDIF 文件全部賦值方式爲: 屬性:[空格]屬性值.
  LDIF 文件經過空行來區分兩條條目.

    注意: 若須要手動定義LDIF文件,添加相關條目,須要瞭解以上相關特色.
  在OpenLDAP服務器中定義LDIF文件,每一個條目中必須包含一個ObjectClass屬性, 並賦值!!
  ObjectClass屬性有頂級之分, 定義時要了解ObjectClass的相關依賴類型, 不然在添加或
  修改時,也同樣會語法報錯!!

LDIF文件語法:
  基本語法:
  dn: <distinguished name> #首先要指定要修改那個DN(條目)
  <attrdesc>: <attrvalue> #最經常使用的attrdesc是changetype: 其值最經常使用的是 modify
  <attrdesc>: <attrvalue>
  <attrdesc>:: <base64-encoded-value>
  <attrdesc>:< <URL>
  ...

  #: 井號開頭行爲註釋.

  1. 可用空格或製表符開始一個新行
    dn: cn=Barbara J Jensen,dc=exam
    ple,dc=com        #注意: example是分行寫了,必定要注意寫法,不要在它中間加任何非空字符!!

  2. 多個屬性值在單獨的行中指定
    cn: Barbara J Jensen
    cn: Babs Jensen

  3.以冒號+空格開頭的表示,這是一個Base64編碼的字符串.
    cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U=

  4.從文件中獲取屬性值,固然它還支持ftp,http等.
    cn:< file:///tmp/value


  下面是三個LDAP條目,每一個條目要用空行分割
    dn: cn=Barbara J Jensen,dc=example,dc=com
    cn: Barbara J Jensen
    cn: Babs Jensen
    objectclass: person
    description:< file:///tmp/babs
    sn: Jensen

    dn: cn=Bjorn J Jensen,dc=example,dc=com
    cn: Bjorn J Jensen
    cn: Bjorn Jensen
    objectclass: person
    sn: Jensen

    dn: cn=Jennifer J Jensen,dc=example,dc=com
    cn: Jennifer J Jensen
    cn: Jennifer Jensen
    objectclass: person
    sn: Jensen
    jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD
      A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ
      ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG
    ...


  5.修改記錄格式
    dn: <DistinguishedName>
    changetype: <[modify|add|delete|modrdn]>
    add |delete |replace: <attributetype>

    dn: DN
    changetype: add
    <attrdesc1>: <value1>
    <attrdesc1>: <value2>
    ...
    <attrdescN>: <value1>
    <attrdescN>: <value2>
    ...
    -    #注意: 他是Entry之間的分隔符!!!
    示例:
      dn: cn=Babs Jensen,dc=example,dc=com
      changetype: add
      objectclass: person
      objectclass: extensibleObject
      cn: babs
      cn: babs jensen
      sn: jensen


      dn: DN
      changetype: modify
      add: <attributetype>
      <attrdesc>: <value1>
      <attrdesc>: <value2>
      ...
      -
      replace: <attributetype>    #在進行替換操做時,若要替換的DN不存在,它會提示你添加.
      <attrdesc>: <value1>
      <attrdesc>: <value2>
      ...
      -
      delete: <attributetype> #若不提供<attributeType>則刪除整個dn屬性集.
      <attrdesc>: <value1>
      <attrdesc>: <value2>
      ...
      -
  示例:
    dn: cn=Barbara J Jensen,ou=People,dc=example,dc=com
    changetype: delete

  以上add,replace,delete綜合示例:
    dn: cn=Babs Jensen,dc=example,dc=com
    changetype: modify
    add: givenName
    givenName: Barbara
    givenName: babs
       -
    replace: description
    description: the fabulous babs
    -
    delete: sn
    sn: jensen
    -

    dn: DN
    changetype: [modrdn | moddn]
    newrdn: <newrdn>
    deleteoldrdn: 0 | 1      #1:從條目中刪除舊的rdn,0:保留,但修該爲非區分屬性.
    newsuperior: <DN>    #若存在,則將條目移動到新上級.
    ...
    -
  示例:
    dn: cn=Babs Jensen,dc=example,dc=com
    changetype: modrdn
    newrdn: cn=Barbara J Jensen
    deleteoldrdn: 0
    newsuperior: ou=People,dc=example,dc=com

    dn: cn=Barbara J Jensen,ou=People,dc=example,dc=com
    changetype: delete #這樣寫,將刪除dn這個準確名屬性集.


  6.包含外部LDIF文件.
    dn: dc=example,dc=com
    objectclass: domain
    dc: example

    include: file:///tmp/example.com.ldif

    dn: dc=example,dc=org
    objectclass: domain
    dc: example

  服務端命令和客戶端命令:
    slap[passwd|...]      #凡是slap開頭的命令都是服務端命令.
    ldap[passwd|add|..]    #客戶端命令

  LDIF 示例:
    dn: uid=Green Tom,ou=people,dc=test,dc=com    #DN描述項,在整個目錄樹上是惟一的.
    objectClass: top
    objectClass: posixAccount
    objectClass: shadowAccount
    ojbectClass: person
    objectClass: inetOrgPerson
    objectClass: hostObject
    sn: Green
    cn: Green Tom
    telephoneNumber: 010 12345678
    mail: dayong_guo@126.com
    注:
    冒號後面必須有一個空格, 而後纔是屬性值, schema規範定義要求很嚴格!!


openLDAP的使用
    openLDAP它能夠幫助咱們構建本身的企業目錄服務, 所謂目錄服務,其實就是將一個組織的內部,
  各個部門等,使用一種結構構建出來,方便咱們來管理整個公司內的全部事物, 包括員工, PC, 打印機
  等等... 目錄服務幫咱們構建的組織架構就以下圖:
  什麼是組織架構?
    抽象圖:

      第一張圖就是抽象概念,第二張圖就是實際工做中會使用的.
    此圖是OpenLDAP的倒樹架構圖
    樹根: dc=com 這是頂級域
    dc=example 這是二級域,也就是咱們組織機構的根.
    ou=People, ou=Servers 這都是組織內部的組織單元,可理解爲部門.
    其中ou=Servers,它是一個特殊ou,通常使用它表示,它下面能夠有不少子ou.
    uid=babs 這是一個用戶相關的條目

    企業組織架構圖:
      這張圖中是企業中真正使用的架構圖
      dc=zcf,dc=com #這就是zcf.com域
      它下面有不少ou, 每一個ou下面是具體的用戶.
      注意:
        在建立組織架構時, 用戶和組是分開的,就相似於MS AD(活動目錄).


  使用yum安裝的openldap作基本初始化步驟

    一. 首先配置主機名可被解析
      #由於openLDAP執行命令時,它須要解析主機名, 若不能成功解析,它將一直等到解析超時纔會
      #將命令的執行結果返回.
        echo IP HostName >> /etc/hosts

    二. 導入必要的schema:
      cd /etc/openldap/slapd.d/cn=config/cn=schema
      ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
      ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
      ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
      注:
        additional info: olcObjectClasses: AttributeType not found: "audio"
          若出現這個錯誤, 就是cosine.ldif尚未導入致使的.
      ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
      注:
        additional info: olcObjectClasses: AttributeType not found: "manager"
        若出現這個錯誤, 就是cosine.ldif尚未導入致使的.
      ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif

      ls #導入成功後,會有這些文件.

    三. 修改域名, 管理員賬戶, 禁止匿名查詢
      cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
      olcSuffix: dc=my-domain,dc=com
      olcRootDN: cn=Manager,dc=my-domain,dc=com
        #要將這些信息修改成,本身的域名和RootDN, RootDN就是openldap的管理員帳號名.

      cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif
        olcAccess: ....
        #這裏定義了openldap的監控信息, 須要修改成適合本身須要的內容.

      vim moddomain.ldif
        dn: olcDatabase={1}monitor,cn=config
        changetype: modify
        replace: olcAccess
        olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
        al,cn=auth" read by dn.base="cn=Manager,dc=zczf,dc=com" read by * none

        dn: olcDatabase={2}hdb,cn=config
        changetype: modify
        replace: olcSuffix
        olcSuffix: dc=zczf,dc=com

        dn: olcDatabase={2}hdb,cn=config
        changetype: modify
        replace: olcRootDN
        olcRootDN: cn=Manager,dc=zczf,dc=com

        dn: olcDatabase={2}hdb,cn=config
        changetype: modify
        add: olcRootPW
        olcRootPW: {SSHA}GqkPrqlMNqjZVxcRqHPcwqc3usvzYmyd

        dn: cn=config
        changetype: modify
        add: olcDisallows
        olcDisallows: bind_anon
    注: 這裏修改了兩個文件, 分別是olcDatabase={1}monitor.ldif 和 olcDatabase={2}hdb.ldif
  在monitor文件中修改了 olcAccess: 這個字段, 修改方式是替換(replace), 主要是修改值中的域名, 其它字段不變.
  數據庫文件hdb中是修改了olcSuffix 和 olcRootDN, 修改類型也是替換, 主要是修改爲本身的域名.
  因爲數據庫hdb中沒有root密碼字段, 因此要先添加 olcRootPW, 再賦值爲新密碼.
  最後一個 olcDisallows 是定義禁止登陸, 這裏是設置匿名用戶不能登陸LDAP.

  執行修改:
    ldapadd -Y EXTERNAL -H ldapi:/// -f moddomain.ldif


    四. 建立本身的組織架構
      下面將建立的組織架構圖:

        

    1. 建立先建立頂級域 和 兩個ou(people, group)組織架構:

    vim newZCFcom.ldif
      dn: dc=zcf,dc=com
      objectClass: dcObject
      objectClass: organization
      dc: zcf
      o: zcf.com
      注: 這裏先定義了一個頂級域zcf.com
    並配置了兩個objectClass, 這兩個對象要引用,必須提供dc 和 o 這兩個屬性.
    由於包含它們的schema定義文件中是這麼定義的,你要引用該ObjectClass,
    就必須遵照這些規則. 我看到objectClass一般寫一塊,而這些對象所必須的屬性
    寫一塊, 因此,具體dc和o是被他倆誰要求,必須提供的,我還不清楚.

      dn: ou=People,dc=zcf,dc=com
      objectClass: organizationalUnit
      objectClass: top
      ou: People

      dn: ou=Group,dc=zcf,dc=com
      objectClass: organizationalUnit
      ou: Group

      dn: cn=Manager,dc=zcf,dc=com    #Manger: 是默認管理員的cn名,建議修改.
      objectClass: organizationalRole
      cn: Manager           #cn: 公共名, 須要注意:冒號前有空格, 結尾不能有空格
    這裏定義管理員的RootDN.即管理員賬戶

      dn: cn=appteam,ou=Group,dc=zcf,dc=com
      objectClass: posixGroup
      cn: Host
      gidNumber: 1010
      #這裏引用了一個posixGroup的對象, 它須要提供cn 和 gidNumber.

      dn: cn=dbateam,ou=Group,dc=zcf,dc=com
      objectClass: posixGroup
      cn: Host
      gidNumber: 1011

      dn: cn=host,ou=Group,dc=zcf,dc=com
      objectClass: posixGroup
      cn: Host
      gidNumber: 1012
      #多加一個組,圖中沒畫出來, 它用來存放全部PC的信息.

  2. 執行添加:
    ldapadd -x -D cn=Manager,dc=zcf,dc=com -W -f newZCFcom.ldif
    #-x: 使用SASL作簡單認證. -W: 提示輸入密碼 -D: 指明LDAP的管理員帳號名,即rootdn

  3. 接下來對剛建立的組織架構作查詢 並 驗證:
    建議每次配置完成後,都要作驗證!
    查詢可經過GUI工具 或 命令.
    1. 命令方式:
      vim /etc/openldap/ldap.conf
        BASE   dc=zcf,dc=com
        URI     ldap://      #當前主機OpenLDAPServer的IP或主機名

      ldapsearch -x -LLL        #這樣就能夠直接獲取剛添加的條目信息了

    2. GUI工具
      ldapadmin    #這是一個windows上的綠色小工具,它雖小,但功能卻很是強大!

    4. 建立要添加的用戶:
      cat addUser.ldif
        dn: uid=zhangchaofeng,ou=People,dc=zcf,dc=com
        objectClass: inetOrgPerson
        objectClass: posixAccount
        objectClass: shadowAccount
        homeDirectory: /home/zhangchaofeng
        userPassword: {SSHA}78DMFNXKLvUl+tjCi2haD+U0DASQ/MJK
        loginShell: /bin/bash
        cn: zhangchaofeng
        uidNumber: 2000
        gidNumber: 1010
        sn: System Administrator
        mail: zhangcf9988@aliyun.com
        postalAddress: Beijing
        mobile: 12345678900

        dn: uid=ldap01,ou=People,dc=zczf,dc=com
        objectClass: inetOrgPerson
        objectClass: posixAccount
        objectClass: shadowAccount
        homeDirectory: /home/ldap01
        userPassword: {SSHA}78DMFNXKLvUl+tjCi2haD+U0DASQ/MJK
        loginShell: /bin/bash
        cn: ldap01
        uidNumber: 2001
        gidNumber: 1011
        sn: dba
        mail: ldap01@aliyun.com
        postalAddress: Beijing
        mobile: 12345678901

    注: 以上添加了兩個條目(entry), 條目和條目之間要用空行隔開!!

    5. 執行添加:
      ldapadd -x -D 'cn=Manager,dc=zcf,dc=com' -W -f addUser.ldif

    6. 驗證是否添加成功
      ldapsearch -x -D 'cn=Manager,dc=zcf,dc=com' -W -LLL 'uid=ldap01'
        #具體語法參見下文
        # -x: 使用SASL作簡單認證, SASL是將用戶名和密碼直接加到URL中傳輸,
          只是它會預先使用共享密鑰對密碼作加密.
        #-D 和 -W 要配合使用, -D指明以什麼身份登陸查詢,默認是匿名身份,但前面
          經過cn=config方式關閉了匿名,因此必須指明身份, -W:提示輸入密碼.
        #-LLL: 這是查詢級別, 分三級, -L, -LL, -LLL

 五. 配置TLS方式對外提供目錄服務
    測試環境爲RHEL7.4, 客戶端爲CentOS7.6 , 客戶端在鏈接服務端認證時,若不是安全鏈接,
  將致使客戶端可以獲取 ldap用戶的賬戶信息, 但沒法獲取密碼,致使登陸失敗!!

  OpenLDAP 向cn=config中添加TLS證書認證的方式:
    A. 建立CA:
      1. 建立的CA的私鑰
        openssl genrsa -out cakey.pem 2048
      2. 建立CA的自簽發證書
        openssl req -new -x509 -key cakey.pem -out cacert.pem \
          -subj /C=CN/ST=Beijing/L=Changping/O=zczf/CN=ca.zczf.com
      3. 建立CA簽發證書的工做目錄:
        mkdir certs newcerts crl private
        echo 01 > serial ---->建立證書生成列表的序列號文件
        echo 01 > crlnumber ---->建立證書吊銷列表的序列號文件;【注意:若不須要吊銷證書也可不建立】
        mv cakey.pem private/
        cp /etc/pki/tls/openssl.cnf .
        vim openssl.cnf
          dir = 當前目錄的絕對路徑.

   B. 簽發證書:
      4. 建立LDAPServer的私鑰
        openssl genrsa -out ldap.key 2048
      5. 建立LDAPServer向CA申請簽發證書的請求
        openssl req -new -key ldap.key -out ldap.csr \
          -subj /C=CN/ST=Beijing/L=Changping/O=zczf/CN=ldap.zczf.com
      6. 使用CA的私鑰簽發此證書申請
        openssl ca -in ldap.csr -out ldap.crt -days 365 -config openssl.cnf

  C. 配置LDAP支持證書:
    1.將生成的證書複製到:
      cp ldap.key ldap.crt cacert.pem /etc/openldap/cacerts/

    2. 編寫下面的LDIF文件:
      如下內容主要是在/etc/openldap/slapd.d/cn=config.ldif 文件添加系統配置.
      如下添加的了 OpenLDAP Server將啓用TLS功能, 告訴OpenLDAP Server
      olcTLSCACertificatePath: CA的證書目錄在哪裏.
      olcTLSCACertificateFile: CA的證書文件叫什麼, 這裏建議寫絕對路徑.
      olcTLSCertificateFile: 指明OpenLDAP Server的證書在哪裏.
      olcTLSCertificateKeyFile: 指明OpenLDAP Server的Key在哪裏
      olcTLSVerifyClient: never: 表示歷來不對客戶端作證書驗證.
    vim updateldapTLS.ldif
      dn: cn=config
      changetype: modify
      replace: olcTLSCACertificatePath
      olcTLSCACertificatePath: /etc/openldap/cacerts
      -
      add: olcTLSCACertificateFile
      olcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pem
      -
      replace: olcTLSCertificateFile
      olcTLSCertificateFile: /etc/openldap/cacerts/ldap.crt
      -
      replace: olcTLSCertificateKeyFile
      olcTLSCertificateKeyFile: /etc/openldap/cacerts/ldap.key
      -
      add: olcTLSVerifyClient
      olcTLSVerifyClient: never

   3.執行添加, 將自動將上面的條目添加/etc/openldap/slapd.d/cn=config.ldif
      ldapmodify -Y EXTERNAL -H ldapi:/// -f updateldapTLS.ldif
      注: -Y EXTERNAL :這個我還不清楚是什麼意思.

     4. 修改slapd.service腳本的啓動參數文件
      vim /etc/sysconfig/slapd
        #若用不到非加密的方式,也能夠去掉 ldap:/// (389)
        #添加ldaps:/// 後,slapd就會監聽默認TLS端口636.
        # ldapi:// : 這個是Socket方式鏈接.
        SLAPD_URLS="ldapi:/// ldaps:/// ldap:///"

    5. 重啓slapd服務
      systemctl restart slapd

   6. TLS證書添加完成後,還須要在服務器端配置本地openldap 客戶端與slapd交互使用的TLS證書.
      cat   /etc/openldap/ldap.conf
        BASE dc=zcf,dc=com
        URI ldaps://ldap.zczf.com
        TLS_CACERT /etc/openldap/cacerts/cacert.pem
        TLS_CACERTDIR /etc/openldap/cacerts
        TLS_REQCERT allow
        注:
          URI: 要使用ldaps://
          TLS_CACERT: 指名CA的證書在哪裏.
          TSL_CACERTDIR: 指明CA證書所在目錄
          TLS_REQCERT:
          allow: 若服務器端證書驗證失敗,也依然容許鏈接.
      此配置文件修改好後:
        ldapsearch -D 'cn=admin,dc=zcf,dc=com' -W -LLL
        #輸入密碼後, 命令能執行成, 則說明ldaps已經配置成功。


  以上全部配置就完成了LDAP Server端的配置.

       D. 接下來就須要配置客戶端訪問了:
      1. 安裝客戶端支持包
        yum install openldap-clients nss-pam-ldapd authconfig

      2. 在作如下配置前, 先作備份
        由於openldap認證配置要修改不少系統文件, 爲了不配置錯誤,而致使手工查找這些
        配置文件,去刪除,因此建議必定要備份!!
        它大概會修改如下文件:
          CentOS7.6和以前的版本修改的文件多少是不一樣!!!
        相同的文件:
          /etc/nslcd.conf
          /etc/openldap/ldap.conf
          /etc/pam.d/system-auth-ac
          /etc/nsswitch.conf
        不一樣的文件:
          /etc/pam.d/password-auth-ac
        還有些其餘文件, 我沒徹底測試到.

        authconfig --savebackup=openldapconf.bak
          #若須要恢復:
            authconfig --restorebakcup=openldapconf.bak
            或
            authconfig --restorelastbakcup
            #這是在第一次操做時忘記備份了,可用它來恢復到
              最進一次操做前的狀態, 由於是第一次操做,最近
              一次就是系統安裝好時的狀態!!

       3. 接下來就能夠配置客戶端使用LDAP認證了.
      authconfig --enableldap --enableldapauth \
        --ldapserver=ldaps://ldap.zcf.com \
        --ldapbasedn="dc=zcf,dc=com" \
        --enableldaptls \
        --ldaploadcacert=http://ldap.zczf.com/cacert.pem \
        --enablemkhomedir \       #RHCE考試題,中不要加此選項!!
        --update
      注:
        啓用LDAP, 啓用LDAP認證,是必需要有的.
      雖而後面指明瞭要使用TLS,但ldapserver的地址依然不能直接寫,
      必需要加上ldaps:// 這個協議頭部, 另外CA證書必須提供URL地址,
      讓authconfig本身下載; enablemkhomedir: 若你須要使用autofs,
      來自動管理用戶家目錄的建立,掛載,就不能使用此選項.
      另注:
        authconfig-gtk          #這是authconfig的圖像工具, 也可以使用它來配置LDAP.

    4. 在客戶端驗證是否學習到LDAP服務器上的用戶信息:
      id ldapuser01
      getent passwd ldapuser01
      getent shadow ldapuser01 #這個好像不能在返回用戶密碼了.
        另外: CentOS7.6上配置LDAP客戶端時,若不支持TLS或SSL,
          將不容許LDAP用戶登陸系統.

    5. 驗證登陸
      ssh ldapuser01@IP



  六. 配置容許用戶修改本身的密碼
    vim allowModPasswd.ldif
      dn: olcDatabase={2}hdb,cn=config
      changetype: modify
      add: olcAccess
      olcAccess: {0}to attrs=userPassword,shadowLastChange by
      dn="cn=admin,dc=zczf,dc=com" write by anonymous auth by self write by * none
      olcAccess: {1}to dn.base="" by * read
      olcAccess: {2}to * by dn="cn=admin,dc=zczf,dc=com" write by * read

    ldapmodify -Y EXTERNAL -H ldapi:/// -f allowModPasswd.ldif

    驗證用戶是否能夠修改本身的密碼.

  七. 配置ldap用戶在登陸時, 使用autofs來自動掛載家目錄

   NFS Server:
      1. mkdir -pv /ldaphome/ldap0{1,2,3}
      2. chmod o+w -R /ldaphome/

      3, yum install nfs-utils
      4, vim /etc/exports
        /ldaphome/ldapadmin 192.168.10.0/24(rw,sync)
        /ldaphome/ldap01 192.168.10.0/24(rw,sync)
        /ldaphome/ldap02 192.168.10.0/24(rw,sync)

      5. systemctl restart nfs
      6. showmount -e localhost

  

  Client:
    1. yum install autofs sssd
      注:
      sssd: (System Security Services Dameon)
        https://blog.csdn.net/liu16659/article/details/80997333

    2. vim /etc/auto.master
      /home/ldap      /etc/auto.misc

      3.mkdir  /home/ldap       #這個目錄必須存在!!!

      4.vim /etc/auto.misc
      *       -rw,vers=3,soft,intr      nfs.server.com:/userhome/&

        注: &可匹配到的ldap用戶名,* 是前向引用.引用匹配到的用戶名.

         -fstype=nfs,soft,intr,vers,sync都非必須,但rw是必須的!!

     5. 配置LDAP認證

    authconfig --savebackup=ldap.bak
    authconfig --enableldap --enableldapauth  \

      --ldapserver=ldap://server.group8.example.com  --ldapbasedn="dc=group8,dc=example,dc=com" \

        --enableldaptls  --ldaploadcacert=http://172.25.0.254/pub/cacert.pem --update

   6. 測試su登陸

      若能正常掛載NFS共享,並看到其中的文件,則說明成功.

    

    7.若出現autofs掛載失敗的狀況,可參考:【坑好多,請注意!!!】

        1. nfs導出配置是否正確, IP, 權限.
      2. autofs中auto.master中填寫的目錄,必須存在.
      3. auto.misc中的配置必定要有rw。
      4. 系統時間是否同步


    緣由不明:
      autofs 服務啓動時報了一個錯誤:
      automount[20951]: setautomntent: lookup(sss): setautomntent: No such file or directory
        但網上查詢,沒有找到答案, 我在另外一臺別人配置好的VM中,查看,他的autofs也報這個錯誤,但ldap
        用戶卻能夠正確自動掛載nfs共享的家目錄. 不清楚緣由.但最近作成功後,沒有這個錯誤了!!

    以上配置完成後, openLDAP的基本使用已經完成!


OpenLDAP修改管理員密碼
  1. 直接回車輸入密碼,它會生成密碼字符串.
    slappasswd
    注:
      echo 123456 |xargs slappasswd -s
        #-s: 指定要生成的明文密碼

  2. 建立一個ldif 文件,來修改管理員密碼
    vim modrootpw.ldif
      dn: olcDatabase={0}config,cn=config
      changetype: modify
      add: olcRootPW
      olcRootPW: {SSHA}xxxx

   3. 執行修改命令
    ldapadd -Y EXTERNAL -H ldapi:/// -f modrootpw.ldif
    或
      ldapmodify -a -Y EXTERNAL -H ldapi:/// -f modrootpw.ldif
        #-a: 其實就是 ldapadd, 由於ldapadd是ldapmodify的硬連接
      注:
      [root@rnode6 ~]# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
        # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
        # CRC32 ba5c9427
        dn: olcDatabase={0}config
        objectClass: olcDatabaseConfig
        olcDatabase: {0}config
        olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
        al,cn=auth" manage by * none
        structuralObjectClass: olcDatabaseConfig
        entryUUID: ec40f8c2-e643-1038-8c1d-e1c3847c1ae1
        .......
        查看openldap的olcDatabase={0}config.ldif 這個配置文件,發現其中沒有olcRootPW字段,因此
        要修改管理員密碼,須要先添加該字段才能夠.
        如:
          上面示例中:
          dn: olcDatabase={0}config,cn=config
            #這段是告訴,openLDAP,要操做的dn是 olcDatabase={0}config這個配置文件,
               它的上級目錄是cn=config
          changetype: modify         # 這是告訴openLDAP,我要作修改操做.
          add: olcRootPW          # 這是告訴openLDAP,我要添加一個字段叫 olcRootPW
          olcRootPW: {SSHA}xx      # 這是給olcRootPW 字段 賦值,要注意: 屬性必需要有值!!
            另外: 屬性名: 後必需要有一個空格!!

      當執行完成後, cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
      就會發現修改了,並且時間戳也修改了.


ldap日誌:
  查看日誌級別:
    slapd -d ?
    或
      查看官網的說明.

    debug level:
      -1: 安裝調試時,開啓,輸出全部信息.
      0: 關閉debug
      1: 跟蹤函數調用
      2:跟蹤一個包


   啓用 OpenLDAP 的日誌功能:
    1. 默認openLDAP使用的rsyslog來處理本身的日誌, 它會將日誌發送給 local4 這個設備, 來接受.
      vim /etc/rsyslog.conf
        local4.* /var/log/ldap.log

    2. 使用cn=config方式來管理啓用日誌
    默認openLDAP是不開啓日誌的, 須要須要首先添加在olcLoglevel對象,並給它賦值.
      cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:///
        dn: cn=config
        changetype: modify
        add: olcLoglevel
        olcLoglevel: -1
      EOF

  3. 重啓rsyslog 和 slapd便可.

    注: 如果使用的是slapd.conf 則可以使用如下方式來開啓.

    此方式僅作參考,它是slapd.conf配置openLDAP的方式,如今已不建議使用:
      vim slapd.conf
        loglevel [-1 | any]
      

      slaptest -f  /etc/openldap/slapd.conf      #測試配置文件是否有語法錯誤.       rm -rf /etc/openldap/slapd.d/*           #從新生成slapd.d這些系統數據庫配置文件.       slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/       chown -R ldap.ldap /etc/openldap       #最後仍是重啓 rsyslog 和 slapd

相關文章
相關標籤/搜索