安裝 LDAP Account Manager

LDAP Account Manager 是一套可以利用網頁來管理 LDAP 帳號的工具,可以管理 LDAP 目錄上的 Unix / Samba 帳號, 並能同時建立 / 刪除使用者家目錄。
LDAP Account Manager 官方網站:https://www.ldap-account-manager.org/lamcms/

安裝參考文件:在 CentOS 5.1 安裝 LDAP Account Manager « Jamyy’s Weblog
                              Linux 技術文件: 安裝LAM做為LDAP管理工具
1. 安裝所需的套件
# yum install php-ldap

2. 下載 LDAP Account Manager:https://www.ldap-account-manager.org/lamcms/releases

請選擇適合的版本,這裡用的是 CentOS,所以下載的是 For Fedora 的版本
# wget http://prdownloads.sourceforge.net/lam/ldap-account-manager-4.4-0.fedora.1.noarch.rpm[@more@]3. 安裝套件
# rpm -ivh ldap-account-manager-4.4-0.fedora.1.noarch.rpm

4. 設定 LDAP Account Manager
建立所需目錄
# mkdir /usr/share/ldap-account-manager/config/profiles/lam
# mkdir -p /usr/share/ldap-account-manager/config/pdf/lam/logos

5. 改變目錄擁有者
# cd /usr/share/ldap-account-manager
# chown -Rf apache.apache sess/* tmp/* lib/* config/*

6. 修改 /etc/php.ini
# sed -i ‘s/memory_limit = 128M/memory_limit = 64M/’ /etc/php.ini

7. 重新啟動 Apache Web Server
# service httpd restart

8. 開啟瀏覽器在網址列輸入 http://Server’s IP/lam
出現登入畫面,輸入設定的密碼,語言選 繁體中文(台灣)

9.登入後畫面

10. 列出使用者

11. 列出群組

12. 新增使用者

13. 新增群組

大批產生學生帳號的 LDIF 格式檔

每學年初都會由校務行政系統由擷取新的學生資料,並搭配亂數密碼,使用 awk 來大批產生學生帳號,在建立學生帳號時,可以建立硬碟容量限制 Quota、建立 Samba 密碼、建立學生個人網頁、設定帳號使用期限、初始化個人目錄設定…….等等,一些瑣碎的事都可以一個步驟完成。
在處理 Open LDAP Server 時,也想要利用這樣的方式來處理這個部份,稍微試了一下,看起來應該是沒有太大的問題。
底下是實驗的學生資料,以 csv 格式,每個學生一列資料,以空格當做欄位間隔
欄位分別是 班級 座號 姓名 帳號 密碼 群組
# head -2 102_class41.lst
四忠 01 蔡中火 s0990499 123456 s0990
四忠 02 陳大水 s0990999 234567 s0990[@more@]建立 LDAP 密碼檔
# vim mkldifpw.awk
# 產生密碼
{print “slappasswd -s “$5 }

測試
# awk -f mkldifpw.awk 102_class41.lst | sh
{SSHA}CmIwt8puhug01FSBsdqVSpQgMkkuuQWv
{SSHA}9sgDt6+WDZG4y9nZasVL5jRgpbkMq3AU

輸出成密碼檔
# awk -f mkldifpw.awk 102_class41.lst | sh > /root/102_class41_ldifpw.lst

把 102_class41.lst 和 102_class41_ldifpw.lst 組合起來
# paste -d ” ” 102_class41.lst 102_class41_ldifpw.lst > 102_class41_ldap.lst
四忠 01 蔡中火 s0990499 123456 s0990 {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN
四忠 02 陳大水 s0990999 234567 s0990  {SSHA}WqVy40LfOfoRV1KBwlJFPpfGNgnkIbtr

建立產生 ldif 的 awk 檔
# vim mkldif.awk
# 帳號密碼檔格式
四忠 01 蔡中火 s0990499 123456 s0990 {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN

{print “dn: uid=”$4″,ou=”$6″,ou=Student,dc=ldap,dc=tces.ilc.edu.tw” }
{print “uid: “$4 }
{print “cn: “$1$2$3 }
{print “sn: “$1$2$3 }
{print “mail: “$4″@tces.ilc.edu.tw” }
{print “objectClass: person” }
{print “objectClass: organizationalPerson” }
{print “objectClass: inetOrgPerson” }
{print “objectClass: posixAccount” }
{print “objectClass: top” }
{print “userPassword: “$7 }
{print “loginShell: /sbin/nologin” }
{print “uidNumber: 500” }
{print “gidNumber: 500” }
{print “homeDirectory: /home/”$6″/”$4 }
{print “gecos: “$1$2$3 }
{print “” }

測試一下
# awk -f mkldif.awk 102_class41_ldap.lst
dn: uid=s0990499,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990499
cn: 四忠01蔡中火
sn: 四忠01蔡中火
mail: s0990499@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990499
gecos: 四忠01蔡中火

dn: uid=s0990999,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990999
cn: 四忠02陳大水
sn: 四忠02陳大水
mail: s0990999@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}WqVy40LfOfoRV1KBwlJFPpfGNgnkIbtr
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990999
gecos: 四忠02陳大水

最後可能比較麻煩的是 uidNumber 的部份,因為 uidNumber 是建立帳號時,系統依帳號的使用而自動編號產生的,當然也可以在建立學生帳號時,直接指定使用者的 uidNumber
# useradd
-u, –uid UID                 user ID of the new account

Apache 伺服器使用 LDAP 認證

Apache 網頁除了可以使用 .htaccess 和 MySQL 的認證外,也可以使用 LDAP Server 來做使用者的認證。

1. 安裝所需的套件
# yum install mod_authz_ldap php-ldap

2. 建立測試目錄及檔案
# mkid /var/www/html/testldap
# echo “Test LDAP” > /var/www/html/testldap/index.html
[@more@]3. 修改設定檔
# vim /etc/httpd/conf.d/authz_ldap.conf
LoadModule authz_ldap_module modules/mod_authz_ldap.so

<IfModule mod_authz_ldap.c>

<Directory “/var/www/html/testldap”>
      AuthzLDAPMethod ldap
      # 192.168.154.167 為 LDAP Server IP
      AuthzLDAPServer 192.168.154.167
      AuthzLDAPUserBase ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw
      AuthzLDAPUserKey uid
      AuthzLDAPUserScope base
#
      AuthType Basic
      AuthName “Test LDAP”
      require valid-user
#
</Directory>

4. 重新啟動 Apache Web Server
# service httpd restart

5. 進行測試

輸入正確的帳號及密碼,就可以看到測試的網頁

OpenLDAP Server 的備份與還原

將整個 OpenLDAP 資料庫匯出:
# /usr/sbin/slapcat -b “dc=ldap,dc=tces.ilc.edu.tw” -l /root/ldap_backup_`date +%F`.ldif

將備份資料檔案匯入:
# /usr/sbin/slapadd -l /root/ldap_backup_2013-12-27.ldif

要注意檔案屬性與擁有者的問題:
# chown -R ldap.ldap /var/lib/ldap

也可以直接備份 /var/lib/ldap 整個目錄
# tar cvJf /root/ldap_backup_`date +%F`.tar.xz /var/lib/ldap

LDAP Client

JXplorer – A Java Ldap Browser
JXplorer 是一個 base on Java 的 LDAP Browser,支援多種平台 Windows / Linux / …..
JXplorer 官方網站:http://jxplorer.org/
[@more@]GQ LDAP client
官方網站:http://sourceforge.net/projects/gqclient/
圖取自 http://ict.udlap.mx/people/carlos/is346/admon05_ldap.html

LDAP Explorer Tool
官方網站:http://sourceforge.net/projects/ldaptool/?source=recommended

Luma – LDAP browser and administration utility
官方網站:http://sourceforge.net/projects/luma/?source=recommended
                    http://luma.sourceforge.net/

Windows 平台版本需要先安裝 Python 才可以正常執行
下面的圖取自官方網站:http://luma.sourceforge.net/screenshots.html

LDAP Browser/Editor 是一套 base on Java 的 LDAP Browser/Editor
下載網站:https://www.netiq.com/communities/cool-solutions/cool_tools/gawors-excellent-ldap-browsereditor-v282/
下圖取自 Opends: Wiki: 2_4_LDAPBrowserEditor — Project Kenai

Softerra LDAP Browser 是一套免費 base on Windows 使用的 LDAP Browser
官方網站:http://www.ldapadministrator.com/
下載網站:http://www.ldapadministrator.com/download.htm
LDAP Browser 4.5 是免費的,而 LDAP Administrator 2013.2 是要收費的

將 ldapsearch 輸出內容 (LDIF) 轉 UTF-8 編碼

雖然在 ldapadd 匯入 LDIF 格式檔時,已經將檔案內容轉換 UTF-8 格式,可常匯入了,但是在 ldapsearch 搜尋資料時,看到的卻是亂碼
cn 的部分應該是正常的中文字,但現在顯示的卻是亂碼
# /usr/bin/ldapsearch -x -b “ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw” uid=*
# extended LDIF
#
# LDAPv3
# base <ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw> with scope subtree
# filter: uid=*
# requesting: ALL
#

# t850008, Teacher, ldap.tces.ilc.edu.tw
dn: uid=t850008,ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw
uid: t850008
cn:: 5p6X5pit5ZCN
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword:: e2
loginShell: /bin/bash
uidNumber: 953
gidNumber: 500
homeDirectory: /home/t850008

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1 [@more@]底下的內容參考 PHP 程式: ldapsearch 輸出內容 (LDIF) 轉 UTF-8 編碼 « Jamyy’s Weblog
# 建立 php 的轉換檔
# vim /root/utf8ldif.php

<?php

function fn_output($str) {
if (strpos($str,":: ") > 0) {
//解 Base64 編碼
//當 ldap 欄位名稱後面接的是兩個冒號即表示該欄位內容為 Base64 編碼
$head = substr($str,0,strpos($str," ")-1);
$body = substr($str,strpos($str," ")+1);
$str = $head . " " . base64_decode($body) . "n";
} else if (preg_match('/x5c[A-F0-9][A-F0-9]x5c[A-F0-9][A-F0-9]/',$str)) {
//解 URL 編碼
//URL 編碼出現在註解 (#), ldapsearch -LLL 可取消輸出註解內容
$str = urldecode(str_replace("","%",$str));
}
if (!preg_match('/n$/',$str)) {
//如果處理過後的字串沒有換行符號 (n) 就塞一個給他
$str .= "n";
}
return($str);
}

$line_old = "";
$line_merge = "";
$params = count($argv);
if ($params == 1) {
//未給參數時, 開啟 STDIN 串流
$f = fopen("php://stdin","r");
} else {
//開啟指定檔案
$f = fopen("$argv[1]","r");
}
while (!feof($f)) {
$line = fgets($f);
if (substr($line,0,1) == " ") {
//若該行行首為空白字元, 表示因內容過長而斷行
//以 line_merge 變數合併各段落
if ($line_merge == "") {
$line_merge = trim($line_old) . trim($line);
} else {
$line_merge .= trim($line);
}
} else if ($line_merge > "") {
//輸出合併好的內容
echo fn_output($line_merge);
$line_merge = "";
} else {
//輸出一般內容
echo fn_output($line_old);
}
$line_old = $line;
}
fclose($f);
?>

使用方式
# /usr/bin/ldapsearch -x -b “ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw” uid=* | php /root/utf8ldif.php

# extended LDIF
#
# LDAPv3
# base <ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw> with scope subtree
# filter: uid=*
# requesting: ALL
#

# t850008, Teacher, ldap.tces.ilc.edu.tw
dn: uid=t850008,ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw
uid: t850008
cn: 林昭名
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword:: e2
loginShell: /bin/bash
uidNumber: 953
gidNumber: 500
homeDirectory: /home/t850008

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries:

中文字的部分就可以正常顯示了!

在 CentOS 6.x 上安裝 phpLDAPAdmin

phpLDAPAdmin 是一套以網頁介面來管理 LDAP Server 的 PHP 程式,功能和 phpMyAdmin 類似。
phpLDAPAdmin 官方網站:http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page

安裝方式:
1. 增加 EPEL 套件庫
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm

2. 更新套件庫
# yum update[@more@]3. 搜尋 phpLDAPAdmin 套件
# yum search phpLDAPAdmin
phpldapadmin.noarch : Web-based tool for managing LDAP servers

4. 進行安裝
# yum install phpLDAPAdmin

5. 限定可以連線的 IP 網頁
# vim /etc/httpd/conf.d/phpldapadmin.conf
<Directory /usr/share/phpldapadmin/htdocs>
  Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1 192.168.1.0/24
    Allow from ::1
</Directory>

6. 重新啟動 Web Server
# service httpd restart

7. 進行連線

使用 TLS/SSL 的方式查詢做 LDAP 資料的查詢

在本機上查詢
-ZZ TLS 方式查詢
-x 使用 SASL 認證
ldapsearch -x -ZZ -h localhost -b “ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw” uid=t850008
# extended LDIF
#
# LDAPv3
# base <ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw> with scope subtree
# filter: uid=t850008
# requesting: ALL
#

# t850008, Teacher, ldap.tces.ilc.edu.tw
dn: uid=t850008,ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw
uid: t850008
cn:: 5p6X5pit5ZCN
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword:: e2Nye
loginShell: /bin/bash
uidNumber: 953
gidNumber: 500
homeDirectory: /home/t850008

# search result
search: 3
result: 0 Success

# numResponses: 2
# numEntries: 1
[@more@]以 SSL 方式查詢
# ldapsearch -x -H ldaps://localhost -b “ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw” uid=t850008
# extended LDIF
#
# LDAPv3
# base <ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw> with scope subtree
# filter: uid=t850008
# requesting: ALL
#

# t850008, Teacher, ldap.tces.ilc.edu.tw
dn: uid=t850008,ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw
uid: t850008
cn:: 5p6X5pit5ZCN
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword:: e2Nye
loginShell: /bin/bash
uidNumber: 953
gidNumber: 500
homeDirectory: /home/t850008

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

啟用 Open LDAP Server 加密傳輸

為了安全的因素,所以啟用 Open LDAP Server 加密傳輸,讓資料在傳輸時能更加的安全。
文章內容參考 八克里: CENTOS 6 LDAP server設定 – 轉移使用者帳號資訊到 LDAP
切換目錄
# cd /etc/pki/tls/certs
刪除原有的憑證
# rm -rf slapd.pem
產生新的憑證
# make slapd.pem
更改檔案權限
# chmod 640 slapd.pem
更改檔案擁有的使用者及群組
# chown ldap:ldap slapd.pem
將 slapd.pem 連結到 /etc/openldap/cacerts 目錄下提供憑證認證使用
# ln -s /etc/pki/tls/certs/slapd.pem /etc/openldap/certs/slapd.pem
[@more@]修改系統的啟動設定檔,開啟 LDAPS 的功能
# vim /etc/sysconfig/ldap

SLAPD_LDAPS=yes

修改 /etc/openldap/slapd.conf 設定檔,加入憑證路徑
# vim /etc/openldap/slapd.conf

取消註解以下內容:
TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
TLSCertificateFile /etc/pki/tls/certs/slapd.pem
TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem

修改 /etc/openldap.ldap.conf 設定檔
# vim /etc/openldap/ldap.conf

#加入以下內容:
TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT never

重新初始化 Open LDAP Server
# rm -rf /etc/openldap/slapd.d/*
# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
# chown -R ldap:ldap /etc/openldap/slapd.d
# service slapd restart

檢查是否有啟動 636 Port
# netstat -ntulp | egrep ‘389|636’
tcp 0 0 0.0.0.0:636 0.0.0.0:* LISTEN 38883/slapd
tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 38883/slapd
tcp 0 0 :::636 :::* LISTEN 38883/slapd
tcp 0 0 :::389 :::* LISTEN 38883/slapd

設定防火牆
# iptables -A INPUT -p tcp -s 192.168.1.0/24 -m state –state NEW –dport 389 -j ACCEPT
# iptables -A INPUT -p tcp -s 192.168.1.0/24 -m state –state NEW –dport 636 -j ACCEPT

# iptables -A INPUT -p tcp -s 192.168.1.0/24 -m state –state NEW -m multiport –dports 389,636 -j ACCEPT

將 LDAP Server 的 log 記錄到 Log Server

底下文章參考 【Linux】在 CentOS 上安裝 LDAP Server 2.4 @ 有為青年生活札記 :: 痞客邦 PIXNET ::

1. 修改設定檔
# vim /etc/openldap/slapd.conf
loglevel        256
logfile         /var/log/slapd/ldap.log

2. 設定將 LDAP 的 log 寫入 /var/log/slapd
# vim /etc/rsyslog.conf
加入下面的設定
# Save LDAP Server log to ldap.log
local4.*                                                /var/log/slapd/ldap.log

3. 重新啟動 Log Server 和 LDAP Server
# service rsyslog restart
正在關閉系統記錄器:                                       [  確定  ]
正在啟動系統記錄器:                                       [  確定  ]
# service slapd restart
正在停止 slapd:                                           [  確定  ]
正在啟動 slapd:                                           [  確定  ]