最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Go語言實(shí)現(xiàn)輕量級OpenLdap弱密碼檢測工具

 更新時間:2022年09月13日 14:31:28   作者:Marionxue  
這篇文章主要為大家詳細(xì)介紹了如何利用Go語言實(shí)現(xiàn)輕量級OpenLdap弱密碼檢測工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下

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

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

2.下載

go?get?github.com/go-ldap/ldap/v3
go?get?github.com/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=devopsman.cn"
??????-?"LDAP_BASE_DN=dc=devopsman,dc=cn"
??????-?"LDAP_ADMIN_PASSWORD=admin123"
????ports:
??????-?389:389
??????-?636:636

可以按需修改對應(yīng)的環(huán)境變量信息.可以在hub.docker.com找到指定版本的鏡像信息. 現(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="@qq.com"

?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,
??0,
??0,
??false,
??"(objectClass=*)",
??[]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檢索BaseDBdc=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.Println("V")
??fmt.Println(err)
?}
?employees,?err?:=?GetEmployees(con)
?if?err?!=?nil?{
??fmt.Println(err)
?}
?Whitelist?:=?[]string{"zhangsan","lisi"}
?for?_,?employe?:=?range?employees?{
??fmt.Println("Starting?check:?",?employe)
??index?:=?arrays.ContainsString(Whitelist,?employe)
??if?index?==?-1?{
???CheckPassword(employe)
??}?else?{
???fmt.Println(employe?+?"?in?whitelist.?skiping...")
??}
??fmt.Println(employe)
?}
}

但是這樣實(shí)際就是在攻擊自己的服務(wù),這里就會產(chǎn)生兩個問題:

  • 用戶越多,弱密碼字典里面的密碼越多,檢查的次數(shù)也就越多,耗時也就越長
  • 每次模擬登錄,實(shí)際上就會創(chuàng)建一個連接,雖然連接認(rèn)證失敗,但是也無疑加重服務(wù)器連接創(chuàng)建和銷毀的資源損耗,你有調(diào)優(yōu)思路沒?

以上就是利用Go語言實(shí)現(xiàn)輕量級OpenLdap弱密碼檢測工具的詳細(xì)內(nèi)容,更多關(guān)于Go OpenLdap弱密碼檢測工具的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang 編譯成DLL文件的操作

    Golang 編譯成DLL文件的操作

    這篇文章主要介紹了Golang 編譯成DLL文件的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go逃逸分析示例詳解

    Go逃逸分析示例詳解

    這篇文章主要為大家介紹了Go逃逸分析示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • ubuntu下搭建Go語言(golang)環(huán)境

    ubuntu下搭建Go語言(golang)環(huán)境

    這篇文章主要介紹了ubuntu下搭建Go語言(golang)環(huán)境,需要的朋友可以參考下
    2015-01-01
  • 以go為例探究beyla從環(huán)境變量BEYLA_OPEN_PORT發(fā)現(xiàn)進(jìn)程原理

    以go為例探究beyla從環(huán)境變量BEYLA_OPEN_PORT發(fā)現(xiàn)進(jìn)程原理

    這篇文章主要為大家介紹了以golang進(jìn)程為例,研究beyla從環(huán)境變量BEYLA_OPEN_PORT(即通過端口)發(fā)現(xiàn)進(jìn)程的原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語言使用templ實(shí)現(xiàn)編寫HTML用戶界面

    Go語言使用templ實(shí)現(xiàn)編寫HTML用戶界面

    templ是一個在 Go 中編寫 HTML 用戶界面的語言,使用 templ,我們可以創(chuàng)建可呈現(xiàn) HTML 片段的組件,下面就跟隨小編一起了解一下具體的實(shí)現(xiàn)方法吧
    2023-12-12
  • Go語言中g(shù)oroutine的使用

    Go語言中g(shù)oroutine的使用

    本文主要介紹了Go語言中g(shù)oroutine的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Go語言基礎(chǔ)學(xué)習(xí)之Context的使用詳解

    Go語言基礎(chǔ)學(xué)習(xí)之Context的使用詳解

    在Go語言中,Context是一個非常重要的概念,它用于在不同的?goroutine?之間傳遞請求域的相關(guān)數(shù)據(jù),本文將深入探討Go語言中?Context特性和Context的高級使用方法,希望對大家有所幫助
    2023-05-05
  • 一文詳解Go語言中Mutex互斥鎖

    一文詳解Go語言中Mutex互斥鎖

    Golang中的Mutex互斥鎖是一種常用的并發(fā)控制機(jī)制,用于保護(hù)共享資源的訪問,在本文中,我們將深入探討Mutex互斥鎖的原理、日常使用、鎖結(jié)構(gòu)以及運(yùn)行機(jī)制,需要的朋友可以參考下
    2023-12-12
  • Go語言下載網(wǎng)絡(luò)圖片或文件的方法示例

    Go語言下載網(wǎng)絡(luò)圖片或文件的方法示例

    這篇文章主要介紹了Go語言下載網(wǎng)絡(luò)圖片或文件的方法示例,文中通過示例代碼介紹的非常詳細(xì),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 在Go語言中使用JSON的方法

    在Go語言中使用JSON的方法

    這篇文章主要介紹了在Go語言中使用JSON的相關(guān)資料,需要的朋友可以參考下
    2018-02-02

最新評論

小金县| 全南县| 论坛| 太仓市| 日土县| 洛南县| 静安区| 建瓯市| 宝鸡市| 策勒县| 新疆| 洛南县| 千阳县| 屏东县| 万宁市| 叙永县| 德兴市| 滨海县| 伊金霍洛旗| 乌苏市| 玛曲县| 华池县| 宜宾县| 昌图县| 万山特区| 荔波县| 阿巴嘎旗| 定州市| 新邵县| 长子县| 辉县市| 彝良县| 怀来县| 安化县| 南江县| 北京市| 乌兰察布市| 中西区| 清丰县| 南澳县| 宝应县|