利用Go語言實(shí)現(xiàn)輕量級OpenLdap弱密碼檢測工具_(dá)第1頁
利用Go語言實(shí)現(xiàn)輕量級OpenLdap弱密碼檢測工具_(dá)第2頁
利用Go語言實(shí)現(xiàn)輕量級OpenLdap弱密碼檢測工具_(dá)第3頁
利用Go語言實(shí)現(xiàn)輕量級OpenLdap弱密碼檢測工具_(dá)第4頁
利用Go語言實(shí)現(xiàn)輕量級OpenLdap弱密碼檢測工具_(dá)第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第利用Go語言實(shí)現(xiàn)輕量級OpenLdap弱密碼檢測工具目錄1.Go連接LDAP服務(wù)2.下載3.準(zhǔn)備LDAP環(huán)境4.GO-LDAP案例實(shí)踐創(chuàng)建用戶遍歷用戶刪除賬號弱密碼檢查

1.Go連接LDAP服務(wù)

通過go操作的ldap,這里使用到的是go-ldap包,該包基本上實(shí)現(xiàn)了ldapv3的基本功能.比如連接ldap服務(wù)、新增、刪除、修改用戶信息等,支持條件檢索的ldap庫中存儲的數(shù)據(jù)信息。

2.下載

go

get

/go-ldap/ldap/v3

go

get

/wxnacy/wgo/arrays

使用go-ldap包,可以在gopkg.in/ldap.v3@v3.1.0#section-readme查看說明文檔

3.準(zhǔn)備LDAP環(huán)境

這里通過docker-compose運(yùn)行一個臨時的ldap實(shí)驗(yàn)環(huán)境,

version:

"3"

services:

ldap:

image:

osixia/openldap:latest

container_name:

openldap

hostname:

openldap

restart:

always

environment:

-

"LDAP_ORGANISATION=devopsman"

-

"LDAP_DOMAIN="

-

"LDAP_BASE_DN=dc=devopsman,dc=cn"

-

"LDAP_ADMIN_PASSWORD=admin123"

ports:

-

389:389

-

636:636

可以按需修改對應(yīng)的環(huán)境變量信息.可以在找到指定版本的鏡像信息.現(xiàn)在創(chuàng)建一下openldap并且檢查一下服務(wù)的是否正常:

4.GO-LDAP案例實(shí)踐

創(chuàng)建用戶

在pkg.go.dev文檔中查看,有一個Add方法可以完成創(chuàng)建用戶的操作,但是需要一個AddRequest參數(shù),而NewAddRequest方法可以返回AddRequest,于是按照此思路梳理一下。

首先要建立與openldap之間的連接,驗(yàn)證賬號是否正常,同時此賬號要有創(chuàng)建的權(quán)限。

//

LoginBind

connection

ldap

server

and

binding

ldap

server

func

LoginBind(ldapUser,

ldapPassword

string)

(*ldap.Conn,

error)

{

l,

err

:=

ldap.DialURL(ldapURL)

if

err

!=

nil

{

return

nil,

err

_,

err

=

l.SimpleBind(ldap.SimpleBindRequest{

Username:

fmt.Sprintf("cn=%s,dc=devopsman,dc=cn",

ldapUser),

Password:

ldapPassword,

if

err

!=

nil

{

fmt.Println("ldap

password

is

error:

",

ldap.LDAPResultInvalidCredentials)

return

nil,

err

fmt.Println(ldapUser,"登錄成功")

return

l,

nil

其次,創(chuàng)建用戶,需要準(zhǔn)備用戶的姓名、密碼、sn、uid、gid等信息,可以創(chuàng)建一個struct結(jié)構(gòu)

type

User

struct

{

username

string

password

string

telephone

string

emailSuffix

string

snUsername

string

uid

string

gid

string

通過go-ldap包提供的NewAddRequest方法,可以返回新增請求

func

(user

*User)

addUser(conn

*ldap.Conn)

error

{

ldaprow

:=

ldap.NewAddRequest(fmt.Sprintf("cn=%s,dc=devopsman,dc=cn",

user.username),

nil)

ldaprow.Attribute("userPassword",

[]string{user.password})

ldaprow.Attribute("homeDirectory",

[]string{fmt.Sprintf("/home/%s",

user.username)})

ldaprow.Attribute("cn",

[]string{user.username})

ldaprow.Attribute("uid",

[]string{user.username})

ldaprow.Attribute("objectClass",

[]string{"shadowAccount",

"posixAccount",

"account"})

ldaprow.Attribute("uidNumber",

[]string{"2201"})

ldaprow.Attribute("gidNumber",

[]string{"2201"})

ldaprow.Attribute("loginShell",

[]string{"/bin/bash"})

if

err

:=

conn.Add(ldaprow);

err

!=

nil

{

return

err

return

nil

最后,我們就可以通過實(shí)例化User這個對象,完成用戶的創(chuàng)建了:

func

main()

{

con,

err

:=

LoginBind("admin",

"admin123")

fmt.Println(con.IsClosing())

if

err

!=

nil

{

fmt.Println("V")

fmt.Println(err)

var

user

User

user.username="marionxue"

user.password="admin123"

user.snUsername="Marionxue"

user.uid="1000"

user.gid="1000"

user.emailSuffix="@"

if

err=user.addUser(con);err!=nil{

fmt.Println(err)

fmt.Println(user.username,"創(chuàng)建完成!")

最后運(yùn)行就可以創(chuàng)建用戶

...

/private/var/folders/jl/9zk5nj316rlg_0svp07w6btc0000gn/T/GoLand/___go_build_github_com_marionxue_go30_tools_go_openldap

admin登錄成功

marionxue

創(chuàng)建完成!

遍歷用戶

遍歷用戶依舊需要與openLDAP建立連接,因此我們復(fù)用LoginBind函數(shù),創(chuàng)建一個獲取賬號的函數(shù)GetEmployees

func

GetEmployees(con

*ldap.Conn)

([]string,

error)

{

var

employees

[]string

sql

:=

ldap.NewSearchRequest("dc=devopsman,dc=cn",

ldap.ScopeWholeSubtree,

ldap.NeverDerefAliases,

false,

"(object",

[]string{"dn",

"cn",

"objectClass"},

nil)

cur,

err

:=

con.Search(sql)

if

err

!=

nil

{

return

nil,

err

if

len(cur.Entries)

0

{

for

_,

item

:=

range

cur.Entries

{

cn

:=

item.GetAttributeValues("cn")

for

_,

iCn

:=

range

cn

{

employees

=

append(employees,

strings.Split(iCn,

"[")[0])

return

employees,

nil

return

nil,

nil

我們通過NewSearchRequest檢索BaseDB為dc=devopsman,dc=cn下的賬號信息,最后將用戶名cn打印出來

func

main()

{

con,

err

:=

LoginBind("admin",

"admin123")

if

err

!=

nil

{

fmt.Println("V")

fmt.Println(err)

employees,

err

:=

GetEmployees(con)

if

err

!=

nil

{

fmt.Println(err)

for

_,

employe

:=

range

employees

{

fmt.Println(employe)

結(jié)果就是我們前面創(chuàng)建的一個用戶

marionxue

刪除賬號

同樣的思路,然后創(chuàng)建一個刪除方法delUser

//

delUser

刪除用戶

func

(user

*User)

delUser(conn

*ldap.Conn)

error{

ldaprow

:=

ldap.NewDelRequest(fmt.Sprintf("cn=%s,dc=devopsman,dc=cn",user.username),nil)

if

err:=

conn.Del(ldaprow);err!=nil{

return

err

return

nil

然后在main函數(shù)中調(diào)用

func

main()

{

con,

err

:=

LoginBind("admin",

"admin123")

if

err

!=

nil

{

fmt.Println("V")

fmt.Println(err)

employees,

err

:=

GetEmployees(con)

if

err

!=

nil

{

fmt.Println(err)

var

user

User

user.username="marionxue"

if

err:=user.delUser(con);err!=nil{

fmt.Println("用戶刪除失敗")

fmt.Println(user.username,"用戶刪除成功!")

}

運(yùn)行結(jié)果:

admin登錄成功

marionxue用戶刪除成功!

弱密碼檢查

默認(rèn)情況下,在ldap中創(chuàng)建用戶,并沒有密碼復(fù)雜度的約束,因此對已存在ldap服務(wù)中使用弱密碼的賬號有什么好辦法能獲取出來嗎?ldap的賬號一旦創(chuàng)建,就看不到密碼了,如果用弱密碼字典模擬登錄的話,是否可行呢?

創(chuàng)建一個檢查密碼的函數(shù)CheckPassword,通過逐行讀取弱密碼詞典的數(shù)據(jù)進(jìn)行的模擬登錄,從而找到ldap中使用弱密碼的賬號:

func

CheckPassword(employe

string)

{

//

遍歷的弱密碼字典

f,

err

:=

os.Open("~/dict.txt")

if

err

!=

nil

{

fmt.Println("reading

dict.txt

error:

",

err)

defer

f.Close()

scanner

:=

bufio.NewScanner(f)

for

scanner.Scan()

{

weakpassword

:=

scanner.Text()

_,

err

:=

LoginBind(employe,

weakpassword)

if

err

==

nil

{

fmt.Println(employe

+

"

使用的密碼為:

"

+

weakpassword)

if

err

:=

scanner.Err();

err

!=

nil

{

fmt.Println(err)

fmt.Println(employe

+

"

check

have

aleardy

finished.

and

the

password

is

stronger

well.")

結(jié)合前面說的遍歷賬號,拿到所有的賬號的信息,然后模擬登錄,如果命中了弱密碼字典中的密碼,就打印出來

func

main()

{

con,

err

:=

LoginBind("admin",

"admin123")

if

err

!=

nil

{

fmt.Prin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論