公司內部會有許多第三方系統或服務,例如Svn,Git,VPN,Jira,Jenkins等等,每個系統都需要維護一份賬號密碼以支持用戶認證,當然公司也會有許多的主機或服務器,需要開放登錄權限給用戶登錄使用,每台主機需要添加登錄的賬號密碼,這些操作不僅繁瑣且不方便管理,密碼記錯或遺忘的情況時有發生。
引入一套支持各系統、服務、主機單點認證的服務就顯得尤其迫切和重要。LDAP服務正是為此而生,且經過長時間市場檢驗,安全穩定,文檔也比較豐富,方便上手。
LDAP
可以通過以下三句話快速的認識一下LDAP:
- LDAP:Lightweight Directory Access Protocol,輕量目錄訪問協議。
- LDAP服務是一個為只讀(查詢、瀏覽、搜索)訪問而優化的非關系型數據庫,呈樹狀結構組織數據。
- LDAP主要用做用戶信息查詢(如郵箱、電話等)或對各種服務訪問做后台認證以及用戶數據權限管控。
名詞解釋
- DC:domain component一般為公司名,例如:dc=163,dc=com
- OU:organization unit為組織單元,最多可以有四級,每級最長32個字符,可以為中文
- CN:common name為用戶名或者服務器名,最長可以到80個字符,可以為中文
- DN:distinguished name為一條LDAP記錄項的名字,有唯一性,例如:dc:"cn=admin,ou=developer,dc=163,dc=com"
圖形示例
上邊來了一堆的名詞解釋,看的雲里霧里,還不是很明白,怎么跟自己的組織架構對應起來呢?看看下邊的圖是不是清晰明了
OpenLDAP
上邊介紹了LDAP只是一個協議,基於這個協議實現服務器端程序有OpenLDAP、Active Directory(微軟的域控制器)等等。
部署OpenLDAP
部署環境:Debian 8.4
1.安裝OpenLDAP,OpenLDAP服務端程序叫slapd
# apt-get install -y slapd
2.安裝完成之后,會自動生成一個OpenLDAP的系統賬號
# cat /etc/passwd
openldap:x:110:115:OpenLDAP Server Account,,,:/var/lib/ldap:/bin/false
3.生成OpenLDAP管理員賬號的密碼(后邊修改配置文件需要使用)
# slappasswd
New password:
Re-enter new password:
{SSHA}TpWoSebaT5gKy2Y3EHmZh+Wc0hJaFp7y
4.新建OpenLDAP配置文件
# cp /usr/share/slapd/slapd.conf /etc/ldap/
# 配置文件中有很多@xxx@的配置替換為真實配置
# slaptest -f /etc/ldap/slapd.conf
5ad9b19d /etc/ldap/slapd.conf: line 105: rootdn is always granted unlimited privileges.
5ad9b19d /etc/ldap/slapd.conf: line 122: rootdn is always granted unlimited privileges.
config file testing succeeded
配置文件重要參數說明(需要自己修改的,其他未提到的可以不修改):
database bdb
:定義使用的后端數據存儲格式,數據庫默認采用了berkeley db,其后可以跟的值有bdb、ldbm、passwd、shell。bdb指使用Berkley DB 4數據庫suffix "dc=163,dc=com"
:suffix是"LDAP基准名",它是LDAP名字空間在這里的根。設置想要創建的子樹的根DNrootdn "cn=admin,dc=163,dc=com"
:設置管理LDAP目錄的超級用戶的DN。這個用戶名不要出現在/etc/passwd文件里rootpw {SSHA}TpWoSebaT5gKy2Y3EHmZh+Wc0hJaFp7y
:設置這個數據庫的超級用戶的口令驗證方式。也就是上邊rootdn設置的用戶的密碼。一定要用加密的口令存儲,可以使用的加密方式有:CRYPT、MD5、SMD5、SHA和SSHA,就是我們第三部生成的密碼directory /var/lib/ldap
:設置LDAP數據庫和索引文件所在的目錄access to
:權限配置下邊詳細說明
5.刪除原配置,生成新配置
# rm -rf /etc/ldap/slapd.d/*
# slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d/
# 給新生成的配置文件賦予openldap的權限
# chown -R openldap.openldap /etc/ldap/slapd.d/
6.重啟openldap
# /etc/init.d/slapd restart
ACL權限控制
ACL訪問指令的格式:
access to [what]
by [who] [control]
簡單解釋:通過access to約束我們訪問的范圍(what),通過by設定哪個用戶(who)有什么權限(control)
ACL的詳細配置還是比較復雜的,可以看下下邊參考文檔的第三篇,寫的比較詳細,這里都不再贅述。
線上ACL控制配置解析
為了用戶能夠自主修改密碼,部署了lam給用戶使用(見下文lam介紹)。希望能達到的效果是:
- 管理員能夠有全部權限,包含新建用戶,修改用戶屬性,充值用戶密碼等
- 普通用戶只能修改自己的密碼,別的權限都沒有
配置如下:
# access to attrs=userPassword通過屬性找到訪問范圍密碼,
# 超級管理員也就是我們ldap配置文件里寫的rootdn:"cn=admin,dc=163,dc=com"有寫(write)權限;
# 由於管理員可能不止一個,我創建了個管理員組"ou=Admin,dc=163,dc=com"把管理員統一都放到這個組下,管理員組下的所有用戶(dn.children)有寫權限;
# 匿名用戶(anonymous)要通過驗證(auth);
# 自己(self)有對自己密碼的寫(write)權限,其他人(*)都沒有權限(none).
access to attrs=userPassword,shadowLastChange
by dn="cn=admin,dc=163,dc=com" write
by dn.children="ou=Admin,dc=163,dc=com" write
by anonymous auth
by self write
by * none
# access to * 所有其他屬性,
# 超級管理員rootdn:"cn=admin,dc=163,dc=com"有寫(write)權限;
# 管理員"ou=Admin,dc=163,dc=com"成員有寫(write)權限;
# 其他人(*)只有讀(read)權限
access to *
by dn="cn=admin,dc=163,dc=com" write
by dn.children="ou=Admin,dc=163,dc=com" write
by * read
備份和還原
備份
# ldapsearch -x -b "dc=163,dc=com" -D "uid=authz,ou=Public,dc=163,dc=com" -w "AzdfD863M4" > ldap.20180626.ldif
參數說明:
-x
:進行簡單的驗證-D
:用來綁定服務器的DN-w
:綁定DN的密碼-b
:要查詢的根節點
authz賬號要有"dc=163,dc=com"
的查詢權限
還原
# ldapadd -x -c -D "cn=admin,dc=163,dc=com" -w "smile" -f ldap.20180626.ldif
參數說明:
-c
:出錯后繼續執行程序不終止,默認出錯即停止-f
:從文件內讀取信息還原,而不是標准輸入
還原的DN最好為管理員賬號,至少也要有要LDAP的寫入權限
web管理工具
用了phpldapadmin和ldap-account-management(簡稱lam)兩款web管理工具,強烈推薦lam,所以這里就不介紹其他的了
ldap-account-manager
安裝
1.安裝ldap-account-management
# apt-get install ldap-account-manager
2.瀏覽器訪問
http://ip/lam
配置
lam的所有配置都可以在web端配置,不需要去服務器上修改一行代碼,這個太好用了。
- 瀏覽器訪問后進入登錄頁面,我們點擊右上角"LAM configuratrion"來在線編輯配置文件
文章未完,全部內容請關注公眾號【運維咖啡吧】或個人網站https://ops-coffee.cn查看,運維咖啡吧專注於原創精品內容分享,感謝您的支持
相關文章推薦閱讀: