




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 稅收籌劃承兌擔(dān)保補(bǔ)充合同
- 家電更換質(zhì)保服務(wù)協(xié)議書
- 國際化股權(quán)并購項(xiàng)目合作協(xié)議書
- 地鐵BIM運(yùn)維模型交付與后期維護(hù)及驗(yàn)收標(biāo)準(zhǔn)合同
- 知識產(chǎn)權(quán)代理合伙人知識產(chǎn)權(quán)保護(hù)技術(shù)合作協(xié)議
- 高效能固態(tài)電池生產(chǎn)線投資合作股權(quán)協(xié)議
- 數(shù)據(jù)中心IT設(shè)備運(yùn)維與升級服務(wù)合同
- 離婚糾紛中游戲賬號分割及權(quán)益分配協(xié)議
- 醫(yī)療健康產(chǎn)業(yè)投資合規(guī)性審查與風(fēng)險(xiǎn)管理服務(wù)合同
- 復(fù)合材料生產(chǎn)流程優(yōu)化與改進(jìn)合同
- 《基于西門子S7-1200PLC的四層電梯控制系統(tǒng)設(shè)計(jì)》8900字
- 汽車維修服務(wù)客戶滿意度提升流程
- 2024人教版七年級下冊生物第三單元 植物的生活 單元測試卷(含答案)
- 2025年部編版新教材語文一年級下冊第六單元復(fù)習(xí)課教案
- 辦公場地租賃合同示范文本
- 水利工程檔案管理簡單培訓(xùn)
- 中國慢性冠脈綜合征患者診斷及管理指南2024版解讀
- 活躍課堂氣氛+激發(fā)學(xué)習(xí)興趣
- 基于區(qū)塊鏈技術(shù)的供應(yīng)鏈管理平臺構(gòu)建
- 家居安全監(jiān)測報(bào)警系統(tǒng)答辯
- 心梗的預(yù)防指南
評論
0/150
提交評論