LDAP

来源:

http://jianshi-dlw.iteye.com/blog/1557846

https://segmentfault.com/a/1190000002607130

http://blog.csdn.net/qq_27376871/article/details/52037317

http://www.turbolinux.co.jp/products/server/11s/user_guide/openldapdirtree.html

docker pull osixia/openldap:1.1.9
docker tag osixia/openldap:1.1.9 hyperledger/fabric-openldap

dn是唯一的
LDAP采用服务器/客户端模式,支持分布式结构

认证方式:

根据用户ID进行过滤,找到用户信息entry,同时获得DN。利用DN和用户密码进行最终确认。

OpenLDAP使用的监听端口是389,通过netstat命令查看该端口是否处于监听状态,可了解slapd进程是否在工作
##查看监听端口
netstat –tnlp | grep 389 
##命令进行搜索
ldapsearch -x -b '' -s base '(objectclass=*)' 

OpenLDAP的配置文件位于/etc/openldap/slapd.conf
LDAP目录中保存的信息格式是LDIF
在LDAP中,schema用来指定一个目录中所包含的对象(objects)的类型(objectClass),
以及每一个类型(objectClass)中必须提供的属性(Atrribute)和可选的属性。
可将schema理解为面向对象程序设计中的类,通过类定义一个具体的对象。
LDIF中的数据条目可理解为是一个具体的对象,是通过schema来规划创建的。
因此,schema是一个数据模型,用来决定数据按什么方式存储,并定义存储在不同的条目(Entry)下的数据之间的关系。
schema需要在主配置文件slapd.conf中指定,以用来决定在目录中可以使用哪些objectClass
在/etc/openldap/schema/目录中提供了许多schema文件,只需要在配置文件slapd.conf中使用include命令将需要使用的schema包含即可

#把ldif文件添加到ldap数据库
ldapadd -x -D "cn=root,dc=dlw,dc=com" -w secret -f dlw.com.ldif
#修改条目(交互式修改)
ldapmodify -x -D "cn=root,dc=dlw,dc=com" -W secret
#修改条目(文件修改)
ldapmodify -x -D "cn=root,dc=dlw,dc=com" -w secret -f modify
#删除条目(使用ldapdelete命令只能删除树形结构中的叶结点条目)
ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret "cn=test,ou=managers,dc=dlw,dc=com"
#数据导出
slapcat -l export.ldif

------------------------------------------------------------------------------------------

使用LDAP做身份验正

验正主要是用来确定一次会话中客户端用户所具有的权利,
即用来确立用户能否登录以及登录具有使用哪些资源以及如何使用资源的权限。
验正过程中的修改、查询等操作由认证级别来控制。
objectClass中的person可以用来作linux系统中用户登入的身份验正,此时需要指定userPassword属性的值,
即指定用户登入时使用的密码。密码可以使用的加密方式有MD5、CRYPT、SHA、SSHA等。
在LDAP V3中,验正客户端时可以使用的验正机制有匿名验正、简单验正、基于SSL/TLS的验正和基于SASL的验正等四种方

------------------------------------------------------------------------------------------

osixia / OpenLDAP

启动容器
docker run --name my-openldap-container --detach hyperledger/fabric-openldap

执行一个简单的检索
docker exec 423778afec81 ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin

更改默认设置,创建新的ldap服务器
LDAP_ORGANISATION:公司名字
LDAP_DOMAIN:公司domain
LDAP_ADMIN_PASSWORD:管理员密码

docker run -d --name "ldap01" \
--env LDAP_ORGANISATION="My Company" \
--env LDAP_DOMAIN="my-company.com" \
--env LDAP_ADMIN_PASSWORD="1234" \
hyperledger/fabric-openldap:latest

------------------------------------------------------------------------------------------------

把alpha的run_ldap_tests复制到/opt/gopath/src/github.com/hyperledger/fabric-ca/scripts

./run_ldap_tests的tls设定

docker run -p 10389:389 -p 10636:636 --name $OLC \
      --volume /home/ubuntu/go/src/github.com/hyperledger/fabric-ca/testdata:/container/service/slapd/assets/certs \
      --env LDAP_TLS_CRT_FILENAME=tls_server-cert.pem \
      --env LDAP_TLS_KEY_FILENAME=tls_server-key.pem \
      --env LDAP_TLS_CA_CRT_FILENAME=root.pem \
      --detach $IMAGE

执行./run_ldap_tests

修改fabric-ca/lib/ldap/client_test.go由于版本有问题,按照下面修改很多东西

/*
Copyright IBM Corp. 2016 All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

		 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package ldap

import (
	"fmt"
	"testing"
        "github.com/hyperledger/fabric/bccsp"
        "github.com/hyperledger/fabric/bccsp/factory"
)

func TestLDAP(t *testing.T) {
	testLDAP("ldap", 10389, t)
	//testLDAP("ldaps", 10636, t)
	testLDAPNegative(t)
}

func testLDAP(proto string, port int, t *testing.T) {
	//dn := "uid=admin,ou=system"
	//pwd := "secret"
	dn := "cn=admin,dc=example,dc=org"
	pwd := "admin"
	//host, err := os.Hostname()
	//if err != nil {
	//	t.Errorf("testLDAP os.Hostname failed: %s", err)
	//	return
	//}
	host := "localhost"
	base := "dc=example,dc=org"
	url := fmt.Sprintf("%s://%s:%s@%s:%d/%s", proto, dn, pwd, host, port, base)
        factory.InitFactories(nil)
        var bcc bccsp.BCCSP
	c, err := NewClient(&Config{URL: url},bcc)
        fmt.Println("a11111")
	if err != nil {
		t.Errorf("ldap.NewClient failure: %s", err)
		return
	}
        fmt.Println("a222222")
	user, err := c.GetUser("jsmith", []string{"mail"})
fmt.Println("a33333")
	if err != nil {
		t.Errorf("ldap.Client.GetUser failure: %s", err)
		return
	}
	err = user.Login("jsmithpw",10)
	if err != nil {
		t.Errorf("ldap.User.Login failure: %s", err)
	}
	path := user.GetAffiliationPath()
	if path == nil {
		t.Error("ldap.User.GetAffiliationPath is nil")
	}
	err = user.Login("bogus",10)
	if err == nil {
		t.Errorf("ldap.User.Login passed but should have failed")
	}
	email := user.GetAttribute("mail")
	if email == "" {
		t.Errorf("ldap.User.GetAttribute failed: no mail found")
	}
	t.Logf("email for user 'jsmith' is %s", email)
}

func testLDAPNegative(t *testing.T) {
        var bcc bccsp.BCCSP
	_, err := NewClient(nil,bcc)
	if err == nil {
		t.Errorf("ldap.NewClient(nil) passed but should have failed")
	}
	_, err = NewClient(&Config{URL: "bogus"},bcc)
	if err == nil {
		t.Errorf("ldap.NewClient(bogus) passed but should have failed")
	}
	_, err = NewClient(&Config{URL: "ldaps://localhost"},bcc)
	if err != nil {
		t.Errorf("ldap.NewClient(ldaps) failed: %s", err)
	}
	_, err = NewClient(&Config{URL: "ldap://localhost:badport"},bcc)
	if err == nil {
		t.Errorf("ldap.NewClient(badport) passed but should have failed")
	}
}

func TestLDAPTLS(t *testing.T) {
	proto := "ldaps"
	dn := "cn=admin,dc=example,dc=org"
	pwd := "admin"
	host := "localhost"
	base := "dc=example,dc=org"
	port := 10636
	url := fmt.Sprintf("%s://%s:%s@%s:%d/%s", proto, dn, pwd, host, port, base)
        var bcc bccsp.BCCSP
	c, err := NewClient(&Config{URL: url},bcc)
	if err != nil {
		t.Errorf("ldap.NewClient failure: %s", err)
		return
	}
	c.TLS.CertFiles = []string{"../../testdata/root.pem"}
	c.TLS.Client.CertFile = "../../testdata/tls_client-cert.pem"
	c.TLS.Client.KeyFile = "../../testdata/tls_client-key.pem"
	user, err := c.GetUser("jsmith", []string{"mail"})
	if err != nil {
		t.Errorf("ldap.Client.GetUser failure: %s", err)
		return
	}
	err = user.Login("jsmithpw",10)
	if err != nil {
		t.Errorf("ldap.User.Login failure: %s", err)
	}
	path := user.GetAffiliationPath()
	if path == nil {
		t.Error("ldap.User.GetAffiliationPath is nil")
	}
	err = user.Login("bogus",10)
	if err == nil {
		t.Errorf("ldap.User.Login passed but should have failed")
	}
	email := user.GetAttribute("mail")
	if email == "" {
		t.Errorf("ldap.User.GetAttribute failed: no mail found")
	}
	t.Logf("email for user 'jsmith' is %s", email)
}

------------------------------------------------------------------------------------------------------------

fabric-ca-server-config.yaml把ldap变成可用状态

###启动openldap

docker run -p 10389:389 -p 10636:636 --name fabric-openldap \
-d hyperledger/fabric-openldap:1.0.0

###启动ca

docker run -d --name fabric-ca -p 7054:7054 \
-e FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server \
-v /home/ubuntu/go/src/github.com/hyperledger/fabric-ca/fabric-ca-server-config.yaml:/home/ubuntu/go/src/github.com/hyperledger/fabric-ca/fabric-ca-server-config.yaml \
hyperledger/fabric-ca:x86_64-1.0.0-rc1 fabric-ca-server start \
-c /home/ubuntu/go/src/github.com/hyperledger/fabric-ca/fabric-ca-server-config.yaml 

###启动ca-cli

docker run -it --link fabric-ca:fabric-ca --name ca-client \

-w /etc/hyperledger \

-e FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-client \
hyperledger/fabric-ca:x86_64-1.0.0-rc1 bash

####openldap默认启动用户是admin,密码也是admin,修改admin的密码

docker run --env LDAP_ORGANISATION="My Company" --env LDAP_DOMAIN="my-company.com" \
--env LDAP_ADMIN_PASSWORD="JonSn0w" --detach osixia/openldap:1.1.9

##ca和ldap联动的规则

1。像run_ldap_tests里面adduser那样,把add-user.ldif导入ldap中

2。从ca-client或者sdk发出用户认证申请

fabric-ca-client enroll -u http://jsmith:jsmithpw@fabric-ca:7054 -M jsmith/msp

3。ca在认证申请的时候,先用默认账户admin去绑定ldap,如果绑定成功,再用jsmith用户继续绑定查询

得到ldap确认以后,ca会生成各种认证key返回给ca-client

你可能感兴趣的:(LDAP)