系统环境是CentOS 5.5 64bit


第一步,当然是安装open***和openldap:

# rpm -ivh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm

# yum install -y open*** open***-auth-ldap openldap openldap-servers openldap-clients


第二步,配置open***:

cp -R /usr/share/open***/easy-rsa/ /etc/open***

编辑 /etc/open***/easy-rsa/2.0/vars:

 

export KEY_COUNTRY="CN"

export KEY_PROVINCE="GD"

export KEY_CITY="Guangzhou"

export KEY_ORG="NETOCOOL"

export KEY_EMAIL="[email protected]"

创建公共密钥:

 

cd /etc/open***/easy-rsa/2.0/
chmod +rwx * 
source ./vars 
./clean-all
./pkitool --initca

创建服务器密钥:

 

./pkitool --server server

./build-dh

cp keys/{ca.crt,ca.key,server.crt,server.key,dh1024.pem} /etc/open***/

Open***服务器配置:

/etc/open***/server.conf

 

 
  
  1. port 1194 

  2. # TCP or UDP server? 

  3. proto tcp 

  4. ;proto udp 

  5. dev tap 

  6. ;dev tun 

  7. ca ca.crt 

  8. cert server.crt 

  9. key server.key  # This file should be kept secret 

  10. dh dh1024.pem 

  11. server 10.8.0.0 255.255.255.0 

  12. ifconfig-pool-persist ipp.txt 

  13. ;push "route 192.168.10.0 255.255.255.0" 

  14. ;push "route 192.168.20.0 255.255.255.0" 

  15. ;push "route 172.16.6.0 255.255.255.0" 

  16. ;push "route 218.213.250.20 255.255.255.255" 

  17. ;client-config-dir ccd 

  18. ;route 192.168.40.128 255.255.255.248 

  19. push "dhcp-option DNS 8.8.8.8" 

  20. ;client-to-client 

  21. ;duplicate-cn 

  22. keepalive 10 120 

  23. ;tls-auth ta.key 0 # This file is secret 

  24. comp-lzo 

  25. ;max-clients 100 

  26. ;user nobody 

  27. ;group nobody 

  28. persist-key 

  29. persist-tun 

  30. status open***-status.log 

  31. log         open***.log 

  32. log-append  open***.log 

  33. # Set the appropriate level of log 

  34. # file verbosity. 

  35. # 0 is silent, except for fatal errors 

  36. # 4 is reasonable for general usage 

  37. # 5 and 6 can help to debug connection problems 

  38. # 9 is extremely verbose 

  39. verb 3 

  40. # Silence repeating messages.  At most 20 

  41. # sequential messages of the same message 

  42. # category will be output to the log. 

  43. ;mute 20 

  44. #plugin /usr/lib/open***/open***-auth-ldap.so /etc/open***/auth/ldap.conf 

  45. plugin /usr/lib64/open***/plugin/lib/open***-auth-ldap.so /etc/open***/auth/ldap.conf 

  46. client-cert-not-required 

 

openldap服务器配置:

/etc/openldap/slapd.conf

 

 
  
  1. include         /etc/openldap/schema/core.schema 

  2. include         /etc/openldap/schema/cosine.schema 

  3. include         /etc/openldap/schema/inetorgperson.schema 

  4. include         /etc/openldap/schema/nis.schema 

  5. schemacheck     on 

  6. idletimeout     60 

  7. timelimit       60 

  8. sizelimit       1000 

  9. allow bind_v2 

  10. pidfile         /var/run/openldap/slapd.pid 

  11. argsfile        /var/run/openldap/slapd.args 

  12. database        bdb 

  13. suffix          "o=open***

  14. rootdn          "cn=Manager,o=open***

  15. rootpw          123456 

  16. directory       /var/lib/ldap 

  17. index objectClass                       eq,pres 

  18. index uid                               eq,sub 

  19. index cn,sn,mail,mailAlternateAddress   pres,eq,approx,sub 

  20. loglevel 256 

 

openldap 数据初始化:

top.ldif

 

 
  
  1. dn: o=open***

  2. o: open*** 

  3. objectClass: top 

  4. objectClass: organization 

  5. dn: ou=open***.netocool.com,o=open***

  6. ou: open***.netocool.com 

  7. objectClass: top 

  8. objectClass: organizationalUnit 

  9. structuralObjectClass: organizationalUnit 

# ldapadd -f top.ldif -x -D cn=Manager,o=open*** -h localhost

 

open*** 用户管理script:

/usr/bin/open***_provisioning.sh

#!/bin/bash 

open***_config_dir=/etc/open*** 
keys_bin=$open***_config_dir/easy-rsa/2.0 
keys_dir=$keys_bin/keys 
random=`date +%s` 
random1=`echo $[RANDOM%10000]` 
ldap_host="localhost" 
***_host="202.70.X.X" 
***_port="1194" 
rootdn="cn=Manager,o=open***" 
base="o=open***" 
rootpw="123456" 
ou="open***.netocool.com" 
#user_name="$2" 

check_user () 

user_name="$1" 
/usr/bin/ldapsearch -x -D "$rootdn" -b "uid=$user_name@$ou,ou=$ou,$base" -w$rootpw -h $ldap_host | grep -q "No such object" 
if [ $? = 1 ];then 
echo "User account $user_name exist, exit ..." 
exit 1 
fi 


list_user () 

echo 
echo "Check user list as below:" 
echo 
/usr/bin/ldapsearch -x -D "$rootdn" -b "ou=$ou,$base" -w$rootpw -h $ldap_host | awk '$1~/^uid/{print $2}' | awk -F@ '{print $1}' 


delete_user () 

user_name="$1" 
/usr/bin/ldapsearch -x -D "$rootdn" -b "uid=$user_name@$ou,ou=$ou,$base" -w$rootpw -h $ldap_host | grep -q "No such object" 
if [ $? = 0 ];then 
echo "User account $user_name do not exist, exiting ..." 
exit 1 
fi 
echo 
echo "User account $user_name will be delete from system:" 
sleep 3 
echo 
/usr/bin/ldapdelete -x -D "$rootdn" -w$rootpw -h $ldap_host "uid=$user_name@$ou,ou=$ou,$base" 

rm -rf `cat /etc/open***/user_list | awk -F, -v var="$user_name" '$2==var{print}' | awk -F, '{print $4}'` 2>&1 >> /var/log/open***_provisioning.log 
sed -i '/\<'$user_name'\>/d' /etc/open***/user_list 2>&1 >> /var/log/open***_provisioning.log 


# initial 
initial () 

user_name="$1" 
echo >> /var/log/open***_provisioning.log 
echo `date` >> /var/log/open***_provisioning.log 
cd $keys_bin; source ./vars >> /var/log/open***_provisioning.log 
cd $keys_bin; ./pkitool ${random}_$user_name >> /var/log/open***_provisioning.log 


# zip files 

cat < $keys_dir/${random}_connect_to_tws.o*** 
client 
dev tap 
proto tcp 
remote $***_host $***_port 
resolv-retry infinite 
persist-key 
persist-tun 
ca ca_connect_to_tws.crt 
cert ${random}_$user_name.crt 
key ${random}_$user_name.key 
auth-user-pass 
comp-lzo 
verb 3 
EOF 

cat < $keys_dir/${random}_${user_name}_README_FIRST 
Dear Customer, 

The ××× login user name: ${user_name}@$ou 
Password: ${random1}${user_name} 

Best regard. 
EOF 

cd $keys_dir; zip ${random}_${user_name}_***_config.zip ${random}_${user_name}_README_FIRST ${random}_connect_.o*** ca_connect_.crt ${random}_$user_name.crt ${random}_$user_name.key >> 
/var/log/open***_provisioning.log 
cd $keys_dir; rm -rf ${random}_connect_.o*** ${random}_$user_name.crt ${random}_$user_name.key ${random}_${user_name}_README_FIRST >> /var/log/open***_provisioning.log 



# send configure file to user 

send () 

user_name=$1 
profile=`cat /etc/open***/user_list | awk -F, -v var="$user_name" '$2==var{print}' | awk -F, '{print $4}'` 
/usr/bin/ldapsearch -x -D "$rootdn" -b "uid=$user_name@$ou,ou=$ou,$base" -w$rootpw -h $ldap_host | grep -q "No such object" 
if [ $? = 0 ];then 
echo 
echo "User account $user_name do not exist, exiting ..." 
exit 1 
fi 
echo 
echo "Sending out the *** profile for user ...." 
mutt -s "××× client config files" -a $profile $2 < /usr/share/doc/open***-2.1.4/README 
echo 
echo "The *** profile $profile for user $user_name have been sent to $2." 


create_user () 

user_name=$1 
cat </tmp/${random}_$user_name.ldif 
dn: uid=$user_name@$ou,ou=$ou,o=open*** 
mailMessageStore: /store/$ou/users/$user_name 
givenName: $user_name 
sn: $user_name 
mail: $user_name@$ou 
objectClass: top 
objectClass: inetOrgPerson 
uid: $user_name@$ou 
cn: $user_name 
userPassword: ${random1}$user_name 
accountStatus: active 
mailQuotaSize: 10485760 
mailHost: 127.0.0.1 
EOF 

ldapadd -f /tmp/${random}_$user_name.ldif -x -D "$rootdn" -w$rootpw -h $ldap_host >> /var/log/open***_provisioning.log 
rm -rf /tmp/${random}_$user_name.ldif 
echo "`date "+%F %H:%M:%S"`,$user_name,${random}_$user_name,$keys_dir/${random}_${user_name}_***_config.zip,$2" >> /etc/open***/user_list 


help_ () 

echo 
echo "Usage:" 
echo "$0 [ -c USER_NAME EMAIL_ADDRESS ] create user account and send *** profile to the user's mailbox." 
echo " [ -l ] list user account." 
echo " [ -d USER_NAME ] delete user account." 
echo " [ -s USER_NAME EMAIL_ADDRESS ] resend *** profile to the user." 
echo " [ -h ] print help menu." 
echo 


check_email () 

if ( ! echo $1 | egrep -q '\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*' );then 
echo 
echo "Incorrect email address, exiting ..." 
help_ 
exit 1 
fi 

##################### 

if [ $# = 0 ];then 
help_ 
exit 1 
fi 

case $1 in 
-c) if [ $# != 3 ]; then 
help_ 
exit 1 
fi 
check_email $3 
check_user $2 
initial $2 
create_user $2 $3 
send $2 $3;; 
-l) if [ $# != 1 ]; then 
help_ 
exit 1 
fi 
list_user;; 

-d) if [ $# != 2 ]; then 
help_ 
exit 1 
fi 
delete_user $2;; 
-h) help_;; 
-s) if [ $# != 3 ]; then 
help_ 
exit 1 
fi 
send $2 $3;; 
esac