第 7 堂課 - 身份識別伺服器與內部檔案系統伺服器
上次更新日期 2022/11/03
如果你有一群員工大家彼此共用數台電腦,你應該會期望每個員工都可以使用自己的帳號與密碼登入系統,然後在每台電腦上面都能夠取得前一次登入時的工作環境。 這時你就需要一台統一管理帳密的伺服器,以及一台提供登入後取得家目錄的檔案伺服器,當然,這兩台也可以是同一部伺服器系統就是了。 然後讓所有的員工電腦以這兩個服務來管理帳號與檔案系統,那就可以達成你的願望了!這也是目前本單位電腦教室裡面的實做結果喔!
學習目標
- 了解 LDAP 的節點與屬性之間的非關聯性資料庫
- 學會如何設定 ldap 與操作 ldapmodify, ldapadd 等重要指令
- 了解如何讓 linux 系統與 ldap 身份驗證連動,包括設定 sssd.conf 設定檔
- 讓 ldap 搭配 NFS 提供 workstation 各種需要的供能。
- 7.1: 身份識別與檔案系統間的關係
- 7.2: LDAP 簡介
- 7.3: LDAP 的實際設定流程
- 7.4: LDAP 資料庫簡易管理 (新增/刪除/修改用戶參數)
- 7.5: 分享檔案系統的 NFS 伺服器
- 7.6: 課後練習
7.1: 身份識別與檔案系統間的關係
以電腦教室為例,如果讓每個學生預設都以同一個帳號登入,那麼學生在座位上面的調整就會比較沒有彈性,如果課程是有延續性質的, 那學生就得要坐到前一次上課的座位,否則就無法取得上次操作的環境與檔案。因此,許多電腦教室或辦公室,可能都會提供一個檔案伺服器來給學生或員工掛載使用, 例如底下的圖示,就是以 NFS 服務來提供檔案系統的範例:
不過檔案系統也是需要驗證的,否則所有人都可以讀取任何人的檔案資料,那就天下大亂了!因此就需要有身份驗證系統才行。 所以,我們也才能夠透過身份驗證系統登入每一部主機,這樣在出問題時,也比較好查詢到到底是那一位學生或員工惡意使用所造成的問題, 比較好釐清責任歸屬囉。
總結說明身份識別與檔案系統間的關係就是:在一組或一間伺服器機房內,所有的伺服器均需要使用同一組帳號與密碼來登入, 並取得相同家目錄時,就需要這樣的設備需求。此種狀況常見的環境有:
- 在大型數值模式模擬中,經常需要跨不同的運算節點 (computing node) 來操作,以讓一個模擬的工作,可以透過多台高性能的系統共同運作, 以期待快速達成模式運算的結果。因為每台 node 都需要讀取相同的檔案系統 (連檔名都要相同),且操作的程序 (process) 也需要相同的帳號 (連同 UID/GID 最好都相同), 因此,在這些運算節點中,每部系統的帳號以及檔案系統,就都得要同步才行。
- 在崑山資傳系操作電腦教室的電腦時,所有的電腦均可以使用你的學號登入,並且可以取得你的個人桌面與額外的三個檔案系統 (是檔案系統,不是檔案而已喔!)。因此在資傳系上課時,你可以在五間電腦教室的任何一間,使用相同的帳密登入,並可取得前一次上課的桌面與工作家目錄。 所以如果對當前的座位不滿意,可以立刻換座位,也不會影響到你的正常操作。
再次強調該功能就得要有兩個元件:
- 使用身份識別功能:就是 ID 認證的服務。常見的服務有: NIS, LDAP, AD(windows), Kerboros...
- 使用者家目錄的取得:就是個人檔案資料。常見的服務有: NFS, SMB(網芳), AD(windows)...
以純粹 linux 的伺服器環境來說,最容易設定的其實是 NIS 與 NFS 兩者的搭配,不過 NIS 對於 windows 的支援較差,所以如果考量到未來的系統規劃, 建議是可以使用跨平台的 LDAP 來取代 NIS 作為身份識別系統較佳。至於檔案系統方面,雖然 SAMBA 才是預設可以提供跨平台的檔案系統, 不過在運作的效能方面,還是以 NFS 較為強大,因此作為 Server 的環境來說,當然首選還是使用 NFS 的。故底下將以 LDAP 搭配 NFS 來進行整體系統架構的設定。
7.2: LDAP 簡介
LDAP 全名: Lightweight Directory Access Protocol,主要的功能在於『目錄服務 (directory service)』的提供!什麼是『目錄服務』呢? 從 wiki 上的說明來看,目錄服務指的是:
目錄服務是一個儲存、組織和提供資訊存取服務的軟體系統,在軟體工程中,一個目錄是指一組名字和值的對映。它允許根據一個給出的名字來尋找對應的值,與詞典相似。 像詞典中每一個詞也許會有多個詞義,在一個目錄中,一個名字也許會與多個不同的資訊相關聯。 類似地,就像一個詞會有多個不同的發音和多個不同的詞義,目錄中的一個名字可能會有多個不同類型的值。
目錄也許只提供範圍非常小的節點類型和數值類型,也可能對任意的或可延伸的一組類型提供支援。在一個電話目錄中,節點就是姓名而數值項就是電話號碼。 在DNS中,節點是域名而數值項是IP位址(還有別名,郵件伺服器名等等)。 在一個網路作業系統的目錄中,節點是那些由作業系統所管理的資源,包括用戶、電腦、印表機和其它共享資源。
簡單的說,就是你可以提供一個查詢的資料對應的內容,舉例來說,你可以提供一個『帳號名稱』,而在這個帳號名稱底下給予對應了密碼、UID、GID、真實姓名等資訊, 若用戶端使用帳號名稱來查詢目錄服務,則可以得到該帳號的密碼、UID等等資訊就是了。而且目錄服務還不只提供這些資料,你想要額外增加什麼節點都可以! 所以用途相當廣泛。
- LDAP 的組成
基本上,你就將 LDAP 想成是一個目錄,而每個目錄都有個目錄名稱,然後根據不同需求,可以給予更多的目錄節點。 至於目錄的內容,則根據目錄的定義來給予鄉對應的內容就是了。至於目錄的節點還是需要根據不同的層級給予不同的設定才行。 單純以節點的角度來看,以一個公司名稱為『 example.com 』的位置來說,該公司的相關部門位置節點有點像這樣:
圖示來源:http://dbaontap.com/2016/07/20/oem-13c-ldap-authentication/
如上所示,公司底下有兩個部門 (organization unit),一個是伺服器部門 (Servers) 一個是人資部門 (People) ,其中人資部門底下管理著員工證號 (Person, udid), 大概就是這樣一層一層的分配下來~而每一個節點底下可以搭配不同的資料給予特別的任務就是了。而如果是不同部門的相似架構呢?則可以用底下圖示來說明:
圖示來源:http://dbaontap.com/2016/07/20/oem-13c-ldap-authentication/
在公司 (company.com) 內部的兩大部門 (location1, location2) 個別提供了各自的帳號密碼管理機制之類的,可以再細分下去之意。 因此,只要找尋不同的 location 即可取得各自部門的人資訊息。
在比較學理的組成說明如下:
- 可以提供非關聯性的資料庫環境,而每一筆資料則透過判別名稱 (distinguished name, DN) 來提示定義。 例如上圖的 Organization unit 可以分別是兩者無關的部門 (People 與 Servers 明顯就是不同且無關的部門定義)
- 每一個組織均需要定義最頂層的判別名稱,就被稱為 baseDN,這也是整個 LDAP 系統最先要設定的項目。 例如上圖的『 dc=exmpale,dc=com 』以及底下的『 dc=company,dc=com 』都是所謂的 baseDN !你可以猜測在組織 (Organization) 那一層的名稱, 就是 baseDN 的意思了。
- 每一筆查詢資料稱為 DN (Distinguished Name),而 DN 就是呼叫出目錄節點的位置所在。 例如上面提到的 baseDN 就是一例。他的展現方式就是『 dc=exmaple,dc=com 』,從小範圍寫起直到最頂層 (dc=com) 為止。 事實上,DN 的展示方式其實有點像 DNS,不過需要使用 dc, ou, cn 等來進行名稱的指定。dc (domain component) 一般用在公司或最頂層 DN 的設定, ou (organization unit) 一般用在大部門的設定上, cn (common name) 一般用在非上述兩個用途的其他應用上。
- 每個 baseDN 底下還有附屬組織單位,那就是 organization unit 的概念。例如人事部門可以使用類似: 『 dn: ou=People,dc=example,dc=com 』之類的方式來命名。而該 DN 底下就會有多種屬性定義!這些屬性定義就牽涉到每一個 LDAP 的用途為何。
- 因為 LDAP 僅是一個『目錄服務』的提供者,但這些目錄底下資料的定義使用的功能為何,就是透過預先定義的綱要檔 (Schema) 來定義。 舉例來說, Linux 與 Windows 的帳號所需要的項目並不相同,因此使用 LDAP 作為 Linux 的帳號認證來源時,就得要使用 LDAP 提供的 Linux 帳號所需綱要檔 (schema)
- LDAP 的架設流程簡介
如果確定要架設 LDAP 作為你的身份驗證來源,那麼你得要事先規劃好這部 LDAP 所提供的 baseDN、相關的管理者密碼、相關的帳號 UID 起始號碼、 相關的使用者家目錄 (最好不要跟系統預設的 /home 相同位置,否則容易造成本機帳號與網路帳號衝突的狀況)等等。至於一般的架設流程大概是這樣的:
- 安裝好 LDAP 伺服器軟體,並且提供登入 LDAP 功能的 RootDN 密碼
- 載入 LDAP 所需要的環境設定參數檔
- 啟動 LDAP 服務,並觀察 LDAP 服務的埠口,以啟用防火牆放行的功能
- 預先指定好自己公司即將使用的 baseDN 環境 (最好與 DNS 系統相同即可),同時規劃好即將要使用的用戶端作業系統有哪些
- 開始載入基本的 baseDN 功能
- 開始載入用戶端作業系統所需要的綱要檔 (schema)
- 嘗試取得用戶端所需要的帳號參數範例檔,變轉為 LDAP 所需要的格式 (LDAP Data Interchange Format, LDIF) ,然後載入到 LDAP 伺服器內
- 若需要加密環境,請前往 /etc/pki/tls/certs 目錄下進行所需要的 key 建制
- 依據你的主機名稱的網域名稱,定義你的 baseDN 為何?
- 依據上述 baseDN 的指定,定義出管理 RootDN 的管理員密碼為 cn=Manager,(baseDN) (Manager 為管理部份的意思)
7.3: LDAP 的實際設定流程
為了避免 Server/client 之間名稱解析產生的連線延遲,因此 IP 對應主機名稱最好還是寫入 /etc/hosts 較佳。所以,先檢查一下你的 Server/client 的設定是否已經正確設定在 /etc/hosts 了呢?基本上,相關的設定在前幾周都已經完成,我們還是來持續檢查一下:
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.254.xxx pcxxx.dic.ksu pcxxx
192.168.254.254 pc254.dic.ksu pc254
10.255.xxx.254 server.lanxxx.dic.ksu server <==這個項目
10.255.xxx.1 client.lanxxx.dic.ksu client <==這個項目
上面的設定是相當重要的!這是因為如果我們想要使用加密過後的 LDAP 加密傳輸連線,那麼就得要建立金鑰系統,而金鑰系統裡面會建立一隻憑證, 該憑證就只能使用對應的主機名稱而已!因此,如果我們未來使用的主機名稱無法在這個檔案內找到正確的 IP,那就會無法連線成功的! 這裡請特別特別留意!否則會出大事情!
- 再次使用 hostnamectl 查看自己的主機名稱
- 再次分析 Server/Client 系統上,針對目前這部主機名稱都可以找到正確的 IP
- Step 1、安裝 LDAP 相關軟體、啟動 slapd 服務以及了解 LDIF 格式與匯入 LDIF 檔案
要能夠執行 LDAP server 至少也需要 openldap-servers, openldap-clients, openldap 等軟體才行~不過,目前 RockyLinux 並沒有提供 openldap-servers。不過,還好, EPEL 倉儲是有提供該軟體的!因此,我們在安裝時, 要加上 epel 的軟體倉儲名稱,這才有辦法安裝妥當。
安裝完畢之後,我們就可以啟動一個名為 slapd (standard alone ldap daemon) 的服務,啟動這個服務之後,系統會多出一個 port 389 的埠口喔! 你應該使用 netstat 去觀察一下該埠口是否順利啟動為宜。同時也要能夠處理防火牆才好。
- 先使用 yum repolist --all 列出所有軟體倉儲,並嘗試找到 epel 倉儲!
- 只有這次安裝時,加入上述倉儲,安裝好 openldap 的三個軟體
- 啟動、開機啟動 slapd 服務,同時觀察一下該服務!
- 觀察埠口,是否有 port 389 的產生?
- 觀察防火牆,僅針對內部網路 (10.xxx) 來說,是否還需要額外放行防火牆規則?
因為 LDAP 控制了帳號與密碼等相關資料,因此,要管理這個系統,當然需要管理員的身份。所以,軟體安裝完成之後, 可以透過 openldap 提供的『 slappasswd 』來取得加密後的密碼文字資料,並將加密過後的密碼寫入到設定檔中!那麼設定檔在哪裡呢? 大部分的設定檔放置在 /etc/openldap/slapd.d/cn=config/ 目錄下,你可以自行查閱相關資訊。 跟整個系統運作比較有關係的僅有『 olcDatabase={2}mdb.ldif 』 『 olcDatabase={1}monitor.ldif 』而已!其他的檔案都暫時不要理他!
[root@localhost ~]# ll /etc/openldap/slapd.d/cn=config
drwxr-x---. 2 ldap ldap 29 11月 19 09:18 'cn=schema'
-rw-------. 1 ldap ldap 378 11月 19 09:18 'cn=schema.ldif'
-rw-------. 1 ldap ldap 513 11月 19 09:18 'olcDatabase={0}config.ldif'
-rw-------. 1 ldap ldap 412 11月 19 09:18 'olcDatabase={-1}frontend.ldif'
-rw-------. 1 ldap ldap 562 11月 19 09:18 'olcDatabase={1}monitor.ldif' <==次重要,設定 baseDN
-rw-------. 1 ldap ldap 609 11月 19 09:18 'olcDatabase={2}mdb.ldif' <==最重要!設定 RooDN,密碼
我們可以先觀察一下 olcDatabase={2}mdb.ldif 這個檔案,這個檔案的內容有點像這樣:
[root@localhost ~]# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}mdb.ldif # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. <==警告你不要亂動! # CRC32 19835607 dn: olcDatabase={2}mdb <==由 dn: 開始規範! objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: {2}mdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=my-domain,dc=com <==這個需要修改 olcRootDN: cn=Manager,dc=my-domain,dc=com <==這個需要修改 olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub structuralObjectClass: olcMdbConfig entryUUID: 8429b38c-ed65-103c-8c49-dfba18331669 creatorsName: cn=config createTimestamp: 20221031124434Z entryCSN: 20221031124434.244457Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20221031124434Z
上面的檔案格式我們稱為 LDAP 的資料交換格式檔 (LDAP Data Interchange Format, LDIF),基本規則是:
- 撰寫時,以冒號 (:) 隔開節點名稱與相對應的值;
- 冒號左側不能有空白,右側需要保留一個空白後,才填寫資料。
- 每一個節點,都是由 dn: 開頭,且需要完整的寫入該節點 (連同 baseDN 的資料)
- 在 dn 之後寫入你想要影響的項目,然後底下加入所需要的動作或者是資料
- 若資料延伸到第二行,則需要在行首保留一個空白字元
- 最終需要保留一個空白行
如上所述,其實我們的 baseDN (就是那個 olcSuffix) 以及 RootDN 都需要改變!因此接下來要進行的是:
- 先設計出一個 LDIF 格式的檔案;
- 再以 ldapmodify 來匯入該筆紀錄。
如上所述,我們要修改兩個項目,可以使用 basedn.ldif 這樣的檔名來處理即可!另外,請記得我們要改的檔案檔名: /etc/openldap/slapd.d/cn=config/olcDatabase={2}mdb.ldif 其中 cn=config 是上層目錄 (所以寫在後面),olcDatabase=(2)mdb.ldif 則寫在前面!因此可以這樣來設計:
# 進入 ldap 目錄,統一放置 LDAP 相關的資料,保持家目錄的乾淨! [root@localhost ~]# mkdir ldap [root@localhost ~]# cd ldap # 取得 root 管理員的加密密碼文字 [root@localhost ldap]# slappasswd New password: <==輸入你的密碼 Re-enter new password: <==輸入你的密碼 {SSHA}mJnkkDx4NacnPwPkdEQ/a+Fh6WPQEGEM <==這一段文字複製下來 [root@localhost ldap]# vim basedn.ldif dn: olcDatabase={2}mdb,cn=config <==就是這個 dn 的設計! changetype: modify <==動作是修改! replace: olcSuffix <==取代這個項目 olcSuffix: ${basedn} <==實際的值! dn: olcDatabase={2}mdb,cn=config changetype: modify replace: olcRootDN olcRootDN: ${rootdn} dn: olcDatabase={2}mdb,cn=config changetype: modify replace: olcRootPW olcRootPW: ${rootdn_password} # 開始匯入資料。這個動作可以反覆做不要緊,因為是『取代』的功能! [root@localhost ldap]# ldapmodify -Y EXTERNAL -H ldapi:/// -f basedn.ldif
當然!上述的 ${basedn} 與 ${rootdn} 是需要實際帶入你的設定值的。最後,因為 RootDN 的管理員最好是需要密碼的,我們可以使用 slappasswd 來設定好加密的密碼, 然後修改上面畫面中的 ${rootdn_password} 項目即可!
- 建立 LDAP 的系統管理員操作密碼為 2727175,同時將密碼、RootDN, BaseDN 寫入於 basedn.ldif 檔案內
- 使用『 ldapmodify -Y EXTERNAL -H ldapi:/// -f basedn.ldif 』匯入 basedn.ldif 的內容,如果一切順利,應該會看到類似底下的輸出:
SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={2}mdb,cn=config" modifying entry "olcDatabase={2}mdb,cn=config" modifying entry "olcDatabase={2}mdb,cn=config"
- 修改完成之後,再查詢一下 /etc/openldap/slapd.d/cn=config 內容是否順利修訂成功了。
設定好該項目後,接下來得要修改另一個檔案,那就是 cn=config/olcDatabase={1}monitor.ldif 囉!這個檔案的內容有點像這樣:
[root@localhost ldap]# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. # CRC32 969d0269 dn: olcDatabase={1}monitor objectClass: olcDatabaseConfig olcDatabase: {1}monitor olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern al,cn=auth" read by dn.base="cn=Manager,dc=my-domain,dc=com" read by * none structuralObjectClass: olcDatabaseConfig entryUUID: e34a0218-be50-103a-8688-57eb5ce90f91 creatorsName: cn=config createTimestamp: 20201119011834Z entryCSN: 20201119011834.415737Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20201119011834Z
如同前面提到的 LDIF 撰寫格式,上面特殊字體的部份其實是一個名為 olcAccess 的屬性項目,這個屬性項目資料比較長, 因此分兩行來撰寫,第二行就加上一個空白來指定。我們需要整行都複製下來,然後將上面底線的部份修改成為我們自己的 RootDN 即可。 我們可以繼續修改 basedn.ldif 新增一個項目 (雖然如此一來,前面三個資訊會被重複覆蓋就是了!),該項目內容有點像這樣:
dn: olcDatabase={1}monitor,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern al,cn=auth" read by dn.base="${RootDN}" read by * none
然後重複匯入即可!
- 修改 basedn.ldif 檔案,將上述的『 dn: olcDatabase={1}monitor,cn=config 』加入
- 使用『 ldapmodify -Y EXTERNAL -H ldapi:/// -f basedn.ldif 』匯入 basedn.ldif 的內容
- 修改完成之後,再查詢一下 /etc/openldap/slapd.d/cn=config 內容是否順利修訂成功了。
這樣就讓我們的 LDAP 目前擁有正確的 baseDN, RootDN, 管理員密碼等重要的參數設定。上面這些資料都只是在設定 LDAP server 的相關資料, 還沒有進入到 LDAP 的資料庫系統,亦即還沒有實際管理 LDAP 內部的節點資訊喔!
- Step 2、修改資料庫,並載入 cosine, nis 等綱要檔
前一步驟完成了 LDAP server 的設定,現在開始在 LDAP server 裡面建立好資料庫,然後載入我們需要用到的綱要檔 (schema) 囉! Open LDAP 預設的 /var/lib/ldap/ 目錄管理位置並沒有任何設定檔,所以管理員可以複製 OpenLDAP 提供的預設檔案來使用。
如前所述,LDAP 僅是一個提供目錄功能的服務,如果需要特定的帳號管理機制,可以透過系統預設提供的綱要檔 (schema) 來處理! 針對 Linux 帳號常用的綱要檔主要有:
- cosine.ldif
- nis.ldif
- inetorgperson.ldif
這些檔案都放置在 /etc/openldap/schema/ 中,然後需要注意的是,剛剛我們是『修改 LDAP server』內容,所以使用的是 ldapmodify, 但現在是載入不存在 LDAP 內部的綱要檔 (schema),因此要改用 ldapadd 來進行『新增』的處理才行!處理的方法跟 ldapmodify 很類似:
[root@localhost ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f ${filename} [root@localhost ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f .../nis.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=cosine,cn=schema,cn=config" <==一定要看到這行,且沒有錯誤才對!
- 匯入上述的三個綱要檔案,請務必小心,這三個綱要檔載入也有順序之分,要先載入 cosine 才行!
如果一切設定都順利搞定,那麼使用底下的指令查詢時,就會出現成功的樣式!
[root@localhost ~]# slaptest -u
config file testing succeeded
- Step 3、建置 Linux 帳號系統所需要的節點
完成上述的 LDAP 基礎資訊之後,接下來要處理的就是建置 Linux 帳號所需要的基礎節點了,這部份就需要動到 LDAP 的資料庫。由於 Linux 帳號主要分為 1)帳號與 2)群組,所以我們需要在 LDAP 目錄設定內規範好這兩項資料! 基本上,我們需要在 base.ldif 這個檔案內宣告好我們所需要的帳號與密碼是在哪個節點上,一般來說,主要的節點會有:
- dn: dc=dic,dc=ksu(最頂層設定)
- dn: cn=Manager,dc=dic,dc=ksu(管理員節點)
- dn: ou=People,dc=dic,dc=ksu(帳號與密碼)
- dn: ou=Group,dc=dic,dc=ksu(群組項目)
繪製成為相關圖示,可以是底下這樣。要注意,Manager 這個 RootDN 的目的是在提供管理 LDAP 的管理員身份,所以他會是個特定的節點 (cn 的屬性), 而 People, Group 則是眾多帳號、群組的節點,因此是單位特性 (ou),設計上是不一樣的。
dc=dic,dc=ksu ----------- cn=Manager,dc=dic,dc=ksu | ------------------------- | | ou=People,dc=dic,dc=ksu ou=Group,dc=dic,dc=ksu
了解了上述的節點功能之後,再來就是要寫成 LDIF 格式,好讓 LDAP server 能夠匯入這些資料到 /var/lib/ldap 的資料庫內。 你可以寫一個名為 base.ldif 的檔案來處理:
[root@localhost ldap]# vim base.ldif
dn: dc=dic,dc=ksu
objectClass: top
objectClass: dcObject
objectclass: organization
o: dic ksu
dc: dic
dn: cn=Manager,dc=dic,dc=ksu
objectClass: organizationalRole
cn: Manager
description: Directory Manager
dn: ou=People,dc=dic,dc=ksu
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=dic,dc=ksu
objectClass: organizationalUnit
ou: Group
依據你不同的設定項目,只要修改『 dc=dic,dc=ksu 』這一串數值即可!當然,也能用取代的方式處理掉~總之,最終你要將這個 base.ldif 匯入到你的 LDAP 資料庫才行。 接下來,使用 ldapadd 指令,並且透過管理員密碼的節點來管理,然後匯入的是 ldap 資料庫內!所以,不再是使用 -Y EXTERNAL 的參數喔! 如下所示,主要在匯入資料庫:
[root@localhost ~]# ldapadd -x -W -D "${RootDN}" -f LDIf_filename [root@localhost ~]# ldapadd -x -W -D "cn=Manager,dc=dic,dc=ksu" -f /root/ldap/base.ldif
- 依據上面的說明,建置好你的 base.ldif 檔案內容
- 使用 ldapadd 的功能來匯入這個檔案的內容,若一切順利,應該會看到如下的狀態:
[root@localhost ~]# ldapadd -x -W -D "cn=Manager,dc=dic,dc=ksu" -f base.ldif Enter LDAP Password: <==這裡輸入你的 RootDN 密碼! adding new entry "dc=dic,dc=ksu" adding new entry "cn=Manager,dc=dic,dc=ksu" adding new entry "ou=People,dc=dic,dc=ksu" adding new entry "ou=Group,dc=dic,dc=ksu"
- Step 4、設計好 Linux 帳號,並使用該預設帳號轉成範例資訊,以腳本大量建置 LDAP 帳號
如果要手動一個一個輸入 LDAP 帳號,確實有點麻煩!我們能不能將 Linux 帳號轉出來呢?當然可以!這就是重點項目啊! 不過,要將目前 Linux 帳號的資訊轉成 LDIF 的格式,需要有其他轉換軟體工具的支援才行。目前 RockyLinux 已經取消了 migrationtools 的提供, 好消息是,該軟體使用的是 python 的模組,因此不是編譯過後的可執行檔,故可由 CentOS 7 的系統中去獲取軟體即可,底下為相關的網站:
- pkgs.org 網站:https://centos.pkgs.org/
- 站上的 migrationtools:https://centos.pkgs.org/7/centos-x86_64/migrationtools-47-15.el7.noarch.rpm.html
請依據上面第二個連結當中的『 Download 』項目內,取得 Binary Package 的網址列,直接透過 wget 來下載即可:
[root@localhost ~]# wget \ > http://mirror.centos.org/centos/7/os/x86_64/Packages/migrationtools-47-15.el7.noarch.rpm [root@localhost ~]# yum install ./migrationtools-47-15.el7.noarch.rpm
為了擔心本地帳號與網路帳號相互重疊,因此我們可能會有幾個打算:
- 假設使用者名稱為 ldapuser1 ~ ldapuser10
- 預設使用者密碼為 mypassword123 這個密碼
- 假設使用者的 UID 從 6001 開始編號
- 假設使用者的 GID 也是從 6001 開始編號,且有對應的私有群組
- 假設使用者的預設家目錄在 /home/rhome/ 底下
所以我們要先手動處理前一個帳號來交互比對看看:
[root@localhost ~]# mkdir /home/rhome [root@localhost ~]# useradd -d /home/rhome/ldapuser1 -u 6001 ldapuser1 [root@localhost ~]# echo "mypassword123" | passwd --stdin ldapuser1 [root@localhost ~]# id ldapuser1 uid=6001(ldapuser1) gid=6001(ldapuser1) groups=6001(ldapuser1) [root@localhost ~]# ll /home/rhome drwx------. 2 ldapuser1 ldapuser1 62 11月 19 10:14 ldapuser1
要開始進行 Linux 帳號轉成 LDAP 帳號的腳本之前,得要先修改一下系統預設的 baseDN 設定才行!所以你可能要修改一下底下的幾個位置:
[root@localhost ~]# vim /usr/share/migrationtools/migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "dic.ksu"; # 71 行左右
$DEFAULT_BASE = "dc=dic,dc=ksu"; # 74 行左右
$EXTENDED_SCHEMA = 1; # 90 行左右
處理完畢之後,接下來我們得要將轉換的帳號清理一下~因為我們只想要轉換 ldap 的使用者與群組,因此先將重要資訊抽出來到 /root/ldap 目錄下, 簡易的動作如下:
[root@localhost ldap]# grep ldapuser /etc/passwd > user.txt [root@localhost ldap]# grep ldapuser /etc/group > group.txt
最後使用 migrationtools 指令,將帳號與群組轉成 LDIF 格式如下:
[root@localhost ldap]# /usr/share/migrationtools/migrate_passwd.pl user.txt > user.ldif [root@localhost ldap]# /usr/share/migrationtools/migrate_group.pl group.txt > group.ldif [root@localhost ldap]# cat user.ldif dn: uid=ldapuser1,ou=People,dc=dic,dc=ksu uid: ldapuser1 cn: ldapuser1 sn: ldapuser1 mail: ldapuser1@dic.ksu objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword: {crypt}$6$VgCD309ydL0MCTXB$uoq08FV.nuWif4KFa1lBREOi...eT.Uj70b6WJRIHU5. shadowLastChange: 18585 shadowMin: 0 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 6001 gidNumber: 6001 homeDirectory: /home/rhome/ldapuser1 [root@localhost ldap]# cat group.ldif dn: cn=ldapuser1,ou=Group,dc=dic,dc=ksu objectClass: posixGroup objectClass: top cn: ldapuser1 userPassword: {crypt}x gidNumber: 6001
雖然接下來只要匯入這兩個檔案就可以建置好 LDAP 的資料,但是我們需要的帳號共有 10 個之多,因此上述的方式實在不太適合。因此, 先不要急著匯入~請改用底下的練習題來處理相關的任務!
- 先將剛剛建立的兩個測試帳號完整的刪除 (userdel -r ...)
- 寫一隻名為 /root/ldap/adduser.sh 的腳本,在這裡面以迴圈的方式來建置所有帳號所需要的資訊!因為密碼是相同的,
所以密碼可以複製。不過其他的項目請用變數來處理妥當。
- 規範出最小 UID 與 GID 的號碼,變數定義為 minuid,依據上述設定,此數值應為 6000
- 規範用戶家目錄為 home 變數,位於 /home/rhome 目錄下 (需要判定目錄存在否)
- 規範用戶 LDIF 檔名為 /root/ldap/ldapuser.ldif, 群組檔名 /root/ldap/ldapgroup.ldif
- 建立今日密碼日期,使用 $(( $(date +%s)/60/60/24 + 1 )) 決定
- 建立迴圈,使用 for i in $( seq 1 100) 建置,內容為:
- 使用者與群組名稱 username 為 ldapuser${i}
- uid 與 guid 為 userid 數值為 minuid + i
- 帶入上述轉換得來的兩個區段內容,將該內容變化,以變數處理之
- 最終分別帶入兩個檔案中!
- 複製由 /etc/skel 來的家目錄,請使用 chmod 修改權限為 700,再以 chown uid:uid 的方式以數值的方式來修改正規權限。
- 可以參考這裡的連結來參考,但請不要照抄!
- 記得執行完這個指令會產生 ldapuser.ldif, ldapgroup.ldif 檔案
- 最後再以『ldapadd -x -W -D "cn=Manager,dc=dic,dc=ksu" -f /root/ldap/ldap{user|group}.ldif』的方式來分別載入帳號、群組資訊。
- Step 5、使用 ldapsearch 檢驗 LDAP 的查詢功能
如果一切順利,在上面的動作完成之後,基本上,我們的 LDAP 就已經完全設定好了。那麼如果我想要根據上述的設定查詢一下是否有問題, 該如何進行呢?簡單的處理方案,可以透過 ldapsearch 來處理。基本的 ldapsearch 語法有點像這樣:
# ldapsearch [-x] [-b baseDN] [-W -D "RootDN"] [-H ldap://hostname] [-ZZ] [查詢值] [-d1]
上述的選項與參數簡介如下:
- -x :使用簡易認證,幾乎所有的 ldapsearch 都要使用到這個選項才能順利運作!
- -b baseDN :如果有不同的幾個 ldapserver 的存在,那需要使用確切的 baseDN 時,才加這個項目。例如我們的環境為 dc=dic,dc=ksu, 則這個項目會是『 -b "dc=dic,dc=ksu" 』的操作情況。
- -W -D "RootDN" :如果有需要增加 (ldapadd) 或者是操作資料庫等行為時,才需要使用這個項目,且需要輸入密碼才行。 以我們為例,那就是『 -W -D "cn=Manager,dc=dic,dc=ksu" 』的操作行為
- -H ldap://hostname :指定到某個位置去搜尋 LDAP 資料,例如『 -H ldap://127.0.0.1 』這樣的操作。
- -ZZ :目前用不到,後續步驟才會使用。這個是強迫 ldapsearch 使用加密的 TLS 來處理的意思。
- -d1 :是偵錯模式,如果你搜尋出問題,加上這個項目,可以得到很多有用的資訊來解釋問題!
- 查詢值 :例如想要找 ldapuser1 時,可以使用 cn=ldapuser1 之類的方式來處理!
# 以明碼方式查詢所有資料庫的內容 [root@localhost ~]# ldapsearch -x -H ldap://127.0.0.1 -b "dc=dic,dc=ksu" # extended LDIF # # LDAPv3 # base <dc=dic,dc=ksu> with scope subtree # filter: (objectclass=*) <==這裡顯示所有的資料都要展示出來的意思! # requesting: ALL # # dic.ksu dn: dc=dic,dc=ksu objectClass: top objectClass: dcObject objectClass: organization o: dic ksu dc: dic .... # 只找出與 uid 為 ldapuser1 的資訊: [root@localhost ~]# ldapsearch -x -H ldap://127.0.0.1 -b "dc=dic,dc=ksu" uid=ldapuser1 # extended LDIF # # LDAPv3 # base <dc=dic,dc=ksu> with scope subtree # filter: uid=ldapuser1 <==顯示僅有 ldapuser1 的訊息! # requesting: ALL # # ldapuser1, People, dic.ksu dn: uid=ldapuser1,ou=People,dc=dic,dc=ksu uid: ldapuser1 cn: ldapuser1 sn: ldapuser1 mail: ldapuser1@dic.ksu objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword:: e2NyeXB0fSQ2JFZnQ0QzMDl5ZEwwTUNUWEIkdW9xMDhGVi5udVdpZjRLRmExbEJ SRU9peGZKZVZ0Z1RsWW5Scy5LSjhyNFVONkZTYTRuazN5Mjd4R2RMNFZGZjRwN2JtZVQuVWo3MGI2 V0pSSUhVNS4= shadowLastChange: 18585 shadowMin: 0 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 6001 gidNumber: 6001 homeDirectory: /home/rhome/ldapuser1 # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1 # 嘗試使用 TLS 的方式查詢 [root@localhost ~]# ldapsearch -x -H ldap://127.0.0.1 -b "dc=dic,dc=ksu" uid=ldapuser1 -ZZ ldap_start_tls: Protocol error (2) additional info: unsupported extended operation
你可以發現到,如果使用明碼查詢資料,一切都順暢!但是如果使用 TLS 加密機制查詢,那就出問題了! 顯示的結果是不支援的延伸參數!這是因為這一版的 LDAP 預設將 TLS 加密支援的設定值取消了!所以,我們需要額外的參數設定才行! 否則就會發生這個問題。
事實上,如果不需要加密的 LDAP 連線,那麼到目前這個步驟為止,整個 LDAP 就搞定了。但是我們知道 LDAP 的查詢甚至可以傳輸密碼! 所以當然最好在網路上傳輸得加密比較妥當的!而同時 LDAP server 是可以接受明碼與 TLS 加密傳輸的!因此,底下我們來處理,讓 LDAP 一定要使用加密傳輸才行!
- Step 6、建立 LDAP Server / Client 連線時所需要的公私鑰檔案:
在第六章過後你應該知道什麼是公鑰與私鑰。因為你的 LDAP 會在 Server/client 之間傳送帳號參數與密碼參數,所以,兩者之間當然有加密的效果會比較妥當。 建立的方法可以使用 RockyLinux 預設提供的金鑰建置方式來處理,也能夠自己使用 openssl 這個指令來處理。因為 openldap 預設的 keys 都放在 /etc/openldap/certs 目錄內, 所以建議你前往該目錄去建置所需要的金鑰檔即可。至於建置的方法如下:
[root@localhost ~]# cd /etc/openldap/certs [root@localhost certs]# openssl req -new -x509 -nodes -out {公鑰檔名}.crt \ > -keyout {私鑰檔名}.key -days 3650 Generating a RSA private key ............................................................................+++++ ...........................................+++++ writing new private key to '{私鑰檔名}.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:TW State or Province Name (full name) []:Tainan Locality Name (eg, city) [Default City]:Tainan Organization Name (eg, company) [Default Company Ltd]:ksu Organizational Unit Name (eg, section) []:dic Common Name (eg, your name or your server's hostname) []:pc200.dic.ksu Email Address []:root@pc200.dic.ksu # hostname 很重要!一定要跟你的主機名稱一致才行!!! [root@localhost certs]# chown ldap:ldap {公鑰檔名}.crt {私鑰檔名}.key
這會建置出一對以 RSA 加密且可以用 10 年不會過期的金鑰系統出來!然後記得這個檔名就是了!
- 憑證: /etc/openldap/certs/dicksu.crt
- 私鑰: /etc/openldap/certs/dicksu.key
接下來繼續將上述兩個檔案加入 /etc/openldap/slapd.d/cn=config.ldif 檔案當中!同時請注意,我們預計讓 LDAP 只支援加密傳輸,而經過上面的 openssl 指令輸出, 我們知道了加密使用 RSA 的方式來處置的!因此就使用底下的 LDIF 格式檔案來修改設定囉!
[root@localhost ldap]# vim certs.ldif # 特別注意,這幾筆紀錄的順序不能改變!一改變就會無法匯入喔! dn: cn=config add: olcTLSCACertificatePath olcTLSCACertificatePath: /etc/openldap/certs dn: cn=config add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/openldap/certs/dicksu.key dn: cn=config add: olcTLSCertificateFile olcTLSCertificateFile: /etc/openldap/certs/dicksu.crt [root@localhost ldap]# ll /etc/openldap/certs # 請務必確定檔案使用者與群組都屬於 ldap 才行! [root@localhost ldap]# ldapmodify -Y EXTERNAL -H ldapi:/// -f certs.ldif
接下來,因為 LDAP 可以支援有加密與未加密的連線,如果我們沒有指定,那麼不論有沒有加密,其連線都會出現在 389 這個埠口。 不過因為我們想要讓用戶不能使用明碼傳輸,因此建議可以讓加密與未加密的連線分開。處理的方式也挺簡單的,確認 /usr/lib/systemd/system/slapd.service 檔案的內容即可:
[root@localhost ~]# cat /usr/lib/systemd/system/slapd.service [Unit] Description=OpenLDAP Server Daemon After=syslog.target network-online.target Documentation=man:slapd Documentation=man:slapd-config Documentation=man:slapd-hdb Documentation=man:slapd-mdb Documentation=file:///usr/share/doc/openldap-servers/guide.html [Service] Type=forking ExecStartPre=/usr/libexec/openldap/check-config.sh ExecStart=/usr/sbin/slapd -u ldap -h "ldap:/// ldaps:/// ldapi:///" [Install] WantedBy=multi-user.target Alias=openldap.service [root@localhost ~]# systemctl restart slapd [root@localhost ~]# netstat -tlunp | grep slapd tcp 0 0 0.0.0.0:636 0.0.0.0:* LISTEN 753/slapd tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 753/slapd tcp6 0 0 :::636 :::* LISTEN 753/slapd tcp6 0 0 :::389 :::* LISTEN 753/slapd
這樣就出現了 636 這個需要連線加密的埠口囉。
- 將金鑰憑證系統匯入 LDAP 設定當中:
- 建立 certs.ldif 檔案,將上述的資訊複製進來,然後改寫完整的檔名;
- 將該檔案匯入系統中 (ldapmodify -Y EXTERNAL -H ldapi:/// -f ...)
- 查看 /etc/openldap/slapd.d/cn=config.ldif 是否修改成功。
- 使用 slaptest -u 測試設定檔是否成功。
- 讓加密與不加密的 LDAP 連線分開,最終重新啟動 slapd 時,會有兩個不同的埠口在監聽。
- Step 7、讓用戶端可以使用 TLS 連線通道進行查詢
預設 ldapsearch 是透過明碼來傳輸的,如果需要透過 TLS 加密的話,那就得要修改設定檔,讓 ldapsearch 的查詢可以支援憑證的檢查才行。 這個屬於用戶端功能的設定位於 /etc/openldap/ldap.conf 當中,在該檔案內加入這行:
[root@localhost ~]# vim /etc/openldap/ldap.conf TLS_REQCERT allow
修改完成後儲存離開,接下來開始查詢一下 port 636 的功能!依舊查詢 ldapuser1 的資訊來看看:
[root@localhost ~]# ldapsearch -x -H ldaps://pc200.dic.ksu -b "dc=dic,dc=ksu" uid=ldapuser1 # 1. ...輸出訊息要是正確的 ldapuser1 資訊才行!這邊我省略輸出!.... # 2. 要注意,上面已經變成 ldaps 喔!有個 s 在結尾! [root@localhost ~]# journalctl | grep slap | tail -n 20 slapd[27551]: conn=1003 fd=15 ACCEPT from IP=192.168.254.200:42838 (IP=0.0.0.0:636) slapd[27551]: conn=1003 fd=15 TLS established tls_ssf=256 ssf=256 slapd[27551]: conn=1003 op=0 BIND dn="" method=128 slapd[27551]: conn=1003 op=0 RESULT tag=97 err=0 text= slapd[27551]: conn=1003 op=1 SRCH base="dc=dic,dc=ksu" scope=2 deref=0 filter="(uid=ldapuser1)" slapd[27551]: <= mdb_equality_candidates: (uid) not indexed slapd[27551]: conn=1003 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text= slapd[27551]: conn=1003 op=2 UNBIND slapd[27551]: conn=1003 fd=15 closed
記得查詢的時候使用 ldaps:// 喔!與 ldap:// 比較是多了個 s 的不同!加上 ldaps:// 之後,就不必使用 -ZZ 來強迫啟用 TLS 了! 因為預設就是會使用 TLS 之意。
- Step 8、伺服器本機也使用 LDAP 作為帳號驗證
一般來說,我們登入 Linux 伺服器的時候,驗證帳號密碼通常是由 /etc/nsswitch.conf 這個檔案的設計來決定登入的方法, 這個登入的方法主要記載了 password 與 shadow 的方式,亦即使用 /etc/passwd 以及 /etc/shadow 作為帳號密碼驗證的來源。
不過,這個方法似乎沒有辦法提供 LDAP 的驗證,因此,RockyLinux 建議使用 sssd 這個服務來處理驗證的事宜。 而我們得要安裝適當的軟體才有辦法讓 sssd 服務支援 LDAP 喔!基本需要安裝的軟體有:
[root@localhost ~]# yum install sssd sssd-ldap sssd-tools
安裝完畢之後,我們就得要重新設定好 sssd 的設定檔,這個設定檔預設是不存在的,所以,我們要自己去建立起這個設定檔。 底下的資料你可以先照抄,之後再做簡單的微調即可:
[root@localhost ~]# vim /etc/sssd/sssd.conf # 針對 sssd 的服務設定,記得 domains 設定要與底下的 [domain/LDAP] 相符合 [sssd] services = nss, pam domains = LDAP [nss] [pam] [domain/LDAP] ldap_id_use_start_tls = true id_provider = ldap auth_provider = ldap # 這裡最重要!需要設定 ldaps 之外,主機名稱必需要寫當初在建立金鑰時的主機名稱!! ldap_uri = ldaps://pc200.dic.ksu ldap_search_base = dc=dic,dc=ksu ldap_tls_reqcert = demand cache_credentials = true # 填寫放置金鑰的目錄即可!不需要額外寫憑證檔名! ldap_tls_cacertdir = /etc/openldap/certs [root@localhost ~]# sssctl config-check File ownership and permissions check failed. Expected root:root and 0600. [root@localhost ~]# ll /etc/sssd/sssd.conf -rw-r--r--. 1 root root 575 11月 19 14:15 /etc/sssd/sssd.conf [root@localhost ~]# chmod 600 /etc/sssd/sssd.conf [root@localhost ~]# sssctl config-check Issues identified by validators: 0 Messages generated during configuration merging: 0 Used configuration snippet files: 0 [root@localhost ~]# systemctl restart sssd
最後檢驗一下,如果出問題的情境都是 0 (如上所示),那麼就表示應該沒啥大問題了。不過,即使如此, sssd 還是得要透過 ldap 用戶端軟體去查詢! 因此,我們還是得要回頭去處理 ldap.conf 這個設定檔才行!
[root@localhost ~]# vim /etc/openldap/ldap.conf TLS_REQCERT allow BASE dc=dic,dc=ksu URI ldaps://127.0.0.1 TLS_CACERT /etc/openldap/certs/dicksu.crt [root@localhost ~]# ldapsearch -x 'uid=ldapuser1'
因為我們在 ldap.conf 裡面規範了查詢的主機位置與 baseDN 了,因此查詢時,只要輸入想要查詢的項目即可,其他的參數,系統都會自動幫你帶入! 接下來,看看 slapd 內容寫了些什麼?看看是否查詢到正確的協定了?
[root@localhost ~]# systemctl status slapd ● slapd.service - OpenLDAP Server Daemon Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2020-11-19 11:26:32 CST; 3h 3min ago Docs: man:slapd man:slapd-config man:slapd-hdb man:slapd-mdb file:///usr/share/doc/openldap-servers/guide.html Main PID: 27551 (slapd) Tasks: 4 (limit: 12505) Memory: 16.7M CGroup: /system.slice/slapd.service └─27551 /usr/sbin/slapd -u ldap -h ldap:/// ldaps:/// ldapi:/// conn=1027 fd=18 closed conn=1028 fd=18 ACCEPT from IP=127.0.0.1:40372 (IP=0.0.0.0:636) conn=1028 fd=18 TLS established tls_ssf=256 ssf=256 conn=1028 op=0 BIND dn="" method=128 conn=1028 op=0 RESULT tag=97 err=0 text= conn=1028 op=1 SRCH base="dc=dic,dc=ksu" scope=2 deref=0 filter="(uid=ldapuser1)" <= mdb_equality_candidates: (uid) not indexed conn=1028 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text= conn=1028 op=2 UNBIND conn=1028 fd=18 closed
可以確定 ldap.conf 設定內容應該是沒錯了!這時,就準備來讓系統未來的驗證都使用 sssd 這個服務!請使用 authselect 的項目來設定:
[root@localhost ~]# authselect select sssd --force 介“sssd“被選中了。 以下nsswitch映射將被配置文件覆蓋: - passwd - group - netgroup - automount - services Make sure that SSSD service is configured and enabled. See SSSD documentation for more information. [root@localhost ~]# authselect current 設定檔 ID:sssd 啟用的功能: 無 [root@localhost ~]# authselect check 目前的組態有效。 [root@localhost ~]# systemctl restart sssd [root@localhost ~]# id ldapuser1; id ldapuser2; ..
最後如果可以查詢到 ldapuser1 ~ ldapuser10 的帳號存在,而且也能夠順利的使用 su - ldapuser2 ,並在 tty3 以後的終端機, 用這個帳號來順利的登入,那就代表 LDAP 的設定是成功了。
- Step 9、讓用戶端使用 LDAP Server 作為帳號驗證來源之一
用戶端如果也需要用到 server 的 LDAP 服務時,雖然不用安裝 openldap-servers,但是 sssd-ldap 與 openldap-clients 還是得安裝喔! 否則還是無法取得與 LDPA 的 server 連動的。另外,也需要 openldap 的憑證檔,那個東西也很重要!用來處理連線加密的功能。底下一步一步分別動作。
- 再次確認在你的 /etc/hosts 裡面,是否有搭配 LDAP server 的主機名稱了!
- 先安裝 openldap-clients。
- 再安裝所需要的數個軟體,包括 sssd, sssd-ldap, sssd-tools 等
- 用戶端要複製來自 Server 的憑證 (公鑰檔案),同樣放置在 /etc/openldap/certs 目錄下即可。
- 設定 /etc/sssd/sssd.conf,內容與上一步驟相同即可
- 重新啟動 sssd 服務
- 使用 authselect 選定使用 sssd 為預定的帳號身份驗證協定
- 修改 /etc/openldap/ldap.conf 的內容,與 server 的設定相同,但是 URI 的網址要修改一下。 改完使用 ldapsearch -x 測試看看即可。
- 再次重新啟動 sssd 服務
- 最後『 id ldapuser1 』確認用戶存在即可!
透過這長長一大串的資料,你的 LDAP server 現在應該可以順暢的運作了!不論加密還是不加密,LDAP 的查詢應該都沒問題了才對喔!
7.4: LDAP 資料庫簡易管理 (新增/刪除/修改用戶參數)
LDAP 管理帳號密碼確實比較麻煩!因為都得要先建立 LDIF 資料後,才有辦法進行匯入的行為,相當麻煩!不過,這也沒辦法! 就讓我們來了解一下基本的帳號管理方式吧!
- 新增用戶
如果在建置好了 LDAP 系統後,若需要增加其他用戶或群組,那就直接修改 ldapuser.ldif 以及 ldapgroup.ldif 後,再以 ldapadd 加入即可! 如下的範例可以來持續進行:
# 先來建立 ldapuser11 這個帳號與群組的 LDIF 資料,假設檔名為 newuser.ldif [root@localhost ldap]# vim newuser.ldif dn: uid=ldapuser11,ou=People,dc=dic,dc=ksu uid: ldapuser11 cn: ldapuser11 sn: ldapuser11 mail: ldapuser11@dic.ksu objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword: {crypt}$6$VgCD309ydL0MCTXB$uoq08FV.nuWif4KFa1lBREOixfJeVtgT...meT.Uj70b6WJRIHU5. shadowLastChange: 18585 shadowMin: 0 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 6011 gidNumber: 6011 homeDirectory: /home/rhome/ldapuser11 dn: cn=ldapuser11,ou=Group,dc=dic,dc=ksu objectClass: posixGroup objectClass: top cn: ldapuser11 userPassword: {crypt}x gidNumber: 6011 # 接著將這個資料匯入 LDAP 資料庫當中! [root@localhost ldap]# ldapadd -x -W -D 'cn=Manager,dc=dic,dc=ksu' -H ldaps://127.0.0.1 \ > -f newuser.ldif Enter LDAP Password: adding new entry "uid=ldapuser11,ou=People,dc=dic,dc=ksu" adding new entry "cn=ldapuser11,ou=Group,dc=dic,dc=ksu" [root@localhost ldap]# id ldapuser11 uid=6011(ldapuser11) gid=6011(ldapuser11) groups=6011(ldapuser11) # 當然還是得要建置用戶的家目錄與相關權限才行! [root@localhost ldap]# cp -a /etc/skel /home/rhome/ldapuser11 [root@localhost ldap]# chown ldapuser11:ldapuser11 -Rv /home/rhome/ldapuser11 [root@localhost ldap]# chmod 700 /home/rhome/ldapuser11
- 刪除用戶
如果是想要刪除用戶,那直接透過 ldapdelete 來處置即可!
# 假設刪除掉 ldapuser8 這個帳號,這個帳號的 dn 為 uid=ldapuser8,ou=People,dc=dic,dc=ksu [root@localhost ldap]# ldapdelete -x -W -D 'cn=Manager,dc=dic,dc=ksu' -H ldaps://127.0.0.1 \ > uid=ldapuser8,ou=People,dc=dic,dc=ksu Enter LDAP Password: [root@localhost ldap]# ldapdelete -x -W -D 'cn=Manager,dc=dic,dc=ksu' -H ldaps://127.0.0.1 \ > cn=ldapuser8,ou=Group,dc=dic,dc=ksu [root@localhost ldap]# sss_cache -E [root@localhost ldap]# id ldapuser8 id: ldapuser8: no such user [root@localhost ldap]# ll -d /home/rhome/ldapuser8 drwx------. 2 6008 6008 62 Sep 7 12:01 /home/rhome/ldapuser8
當然啦!那個 /home/rhome/ldapuser8 的使用者家目錄,就得要手動移除才行!另外,上面的使用者與群組資料中, 有可能因為 sssd 快取的關係,立刻查詢時,還是會看到相對帳號/群組的資料,我們可以透過 sss_cache -E 清除所有的快取, 讓 sssd 去更新所有資訊,那就比較不會有問題!
- 修改用戶參數
那如果是想要修改參數呢?舉例來說,想要將 ldapuser1 的密碼由原先的密碼變更為新的密碼,假設密碼為 qqq123ddd 的話,那可以怎麼做呢?簡單的作法如下:
# 先取得加密過後的密碼樣式: [root@localhost ldap]# slappasswd New password: Re-enter new password: {SSHA}RbrP717EPR3XGOtGRMaVvhPiICd5Pi0E # 開始建立一個名為 changepw.ldif 的檔案,內容如下: [root@localhost ldap]# vim changepw.ldif dn: uid=ldapuser1,ou=People,dc=dic,dc=ksu changetype: modify replace: userPassword userPassword: {SSHA}RbrP717EPR3XGOtGRMaVvhPiICd5Pi0E # 匯入上面這個 LDIF 檔案來更新! [root@localhost ldap]# ldapmodify -W -D 'cn=Manager,dc=dic,dc=ksu' -H ldaps://127.0.0.1 \ > -f changepw.ldif Enter LDAP Password: modifying entry "uid=ldapuser1,ou=People,dc=dic,dc=ksu" [root@localhost ldap]# sss_cache -E
在 Server 上面想要確認這個密碼是否生效?可以到 tty2 去使用 ldapuser1 登入就知道了!
7.5: 分享檔案系統的 NFS 伺服器
- 什麼是 NFS 與 RPC server
NFS 為 Network Filesystem 的縮寫,主要的目的在於分享伺服器的檔案系統給用戶端使用。但 NFS 主要是架構於 RPC server 底下的一個服務, 因此啟動 NFS 之前,需要啟動 RPC server。事實上檔案系統的運作是相當複雜的,因此過去有所謂的遠端程序呼叫在負責很多 Server/Client 的溝通與資訊傳遞,所以附掛在 RPC 之上的服務,我們就稱為 RPC service 了。
RPC (Remote Procedure Call) 最主要的功能就是在指定每個 NFS 功能所對應的 port number ,並且回報給用戶端,讓用戶端可以連結到正確的埠口上去。 那 RPC 又是如何知道每個 NFS 的埠口呢?這是因為當伺服器在啟動 NFS 時會隨機取用數個埠口,並主動的向 RPC 註冊,因此 RPC 可以知道每個埠口對應的 NFS 功能,然後 RPC 又是固定使用 port 111 來監聽用戶端的需求並回報用戶端正確的埠口, 所以當然可以讓 NFS 的啟動更為輕鬆愉快了!簡單的說:
- NFS 會用到的服務很多,包括 rpc.mountd, rpc.nfsd, rpc.rquotad...,這些服務啟動時,預設為隨機啟動任意埠口。
- 但是 NFS 用戶端是直接連線到上述服務的埠口,因此就需要有一隻總管程式來管理這些服務的埠口
- 這個總管的角色就是 RPC 了!
- RockyLinux 使用的 RPC server 為 rpcbind 這個服務
- 用戶端會向伺服器端的 RPC (port 111) 發出 NFS 檔案存取功能的詢問要求;
- 伺服器端找到對應的已註冊的 NFS daemon 埠口後,會回報給用戶端;
- 用戶端瞭解正確的埠口後,就可以直接與 NFS daemon 來連線。
NFS 僅提供檔案系統的分享,本身並不理會帳號的驗證喔!基本上使用 NFS 會有底下的狀況:
由於 server/client 都是用『自己的帳號去看待檔案系統』,但是『檔案系統記載的是 UID/GID 資訊』,因此若 server/client 帳號不同步, 那可能會產生很大的問題。這也是本章前幾個小節要先介紹 LDAP 的主因!
- 簡易的 NFS 設定
NFS 的設定相當簡單!設定檔位於 /etc/exports,該檔案的格式大致為:
/dir/path IP(permission) network/netmask(permission)
/dir/path 指的是你要分享出去的目錄
IP, Network/netmask 的寫法可以是:
- 單獨的IP: 192.168.1.1
- 一整個網段: 192.168.1.0/24
- 可以找到 IP 的主機名稱: station100.dic.ksu
至於常見的權限則有底下幾種:
- rw/ro:可讀寫或唯讀
- sync/async:同步或非同步檔案系統。建議一定要 async !效能差很多!
- no_root_squash/root_squash:是否壓縮 root 權限,預設為 root_squash
- all_squash, anonuid, anongid:若身份全部壓縮,亦即讓登入者全部變某個匿名者之意。
- insecure:使用非加密的傳輸方式,速度會比較快。
假設我想要分享出 /mnt 給 192.168.254.0/24 唯讀使用,基本寫法就會是: (務必記得, /mnt 得要先存在才行!)
/mnt 192.168.254.0/24(ro,async)
- 讓 10.255.XXX.0/24 的整個網段都可以使用 /home/rhome 目錄,且為可讀寫,且為非加密的環境
- 讓 10.255.XXX.0/24 的整個網段都可以使用 /srv/project 目錄,且為可讀寫,且為非加密的環境
- 讓 10.255.XXX.0/24 的整個網段都可以使用 /srv/public 目錄,且為唯讀,且為非加密的環境
- 讓 10.255.XXX.1 的這個 IP 可以使用 /srv/root 目錄,且為可讀寫,且 root 可保有權限,且為非加密的環境
- 上述的目錄均放行一份給 127.0.0.0/8 的整個網段使用
- 建立好 /srv/project /srv/public /srv/root 三個目錄備用
- NFS 服務的啟動與觀察
NFS 目前有兩種服務,一種要加密傳輸一種則是非加密傳輸。本章主要討論區網內使用的非加密傳輸機制~因此啟動的服務名稱就會是 nfs-server, 如果是加密傳輸,則是啟動 nfs-secure-server 才對。
- NFS 提供者為 nfs-utils,請先安裝這軟體才行!
- 啟動 nfs-server 服務,且該服務下次開機也會啟動
- 另外,亦請使用 systemctl 觀察一下 nfs-server 的狀態,如果忘記建置目錄,該狀態會告知!
- 使用 netstat 觀察 nfs 啟動的埠口在幾號?
- 使用 rpcinfo -p 查閱一下各啟動的埠口是否已經跟 rpcbind 註冊了。
- 使用 showmount -e localhost 可以查詢該 Server 分享的目錄與分享的用戶範圍。
- 前往查看 /var/lib/nfs/etab 會得到更詳細的分享的權限參數!
- NFS 用戶端的觀察與使用
用戶端設定很簡單,就只要去查閱伺服器端有沒有提供相對應的服務,然後掛載這樣而已。一般來說,常見的流程會是這樣:
- 在用戶端嘗試使用 showmount -e ServerIP 來看伺服器有沒有提供相關的掛載服務
- 使用 mount -t nfs IP:/share/mount /local/path 來將伺服器的目錄手動掛載到系統上,卸載同樣使用 umount
- 若開機就需要掛載,直接寫入 /etc/fstab 當中,但要注意檔案系統參數 (第四欄位) 要加上『 _netdev 』較佳!
- 先安裝 nfs-utils 軟體。
- 用 su - ldapuser1 測試用戶能不能取得家目錄?然後 exit 回到 root 身份。
- 嘗試使用 showmount 查詢 server 分享的目錄有哪些?
- 手動嘗試將 Server:/home/rhome 掛載到本機的 /home/rhome 上,測試完畢請卸載
- 將設定值寫入 /etc/fstab 當中,並使用 mount -a 測試
- 使用 nfsstate -m 查閱掛載的詳細參數
- 使用 su - ldapuser1 看看,是否可以取得正確的家目錄與權限。
- 請使用 root 的身份進入 /home/rhome,測試能否建置/修改檔案在該目錄下?
在正規的設定行為中,我們有 LDAP 的 ID 認證,搭配 NFS 的掛載,這樣就已經完成了大部分的需求了!不過未來請注意,關機時, 一定要先關用戶端再關 server,否則擔心 NFS 檔案系統的卸載會影響到你的關機情況。因此,還是建議使用 autofs 來進行登入時的掛載較佳。
- NFS 用戶端的檔案系統自動掛載
其實上學期的網路檔案系統內就有講過了!直接查閱 /etc/auto.master 就能夠想起來如何處理囉!不過,由於 RockyLinux 9 改用了 sssd 管理各項資料, 因此,我們還是得要額外安裝名為 libsss_autofs 的軟體,提供 sssd 的 API 之後,才能夠順利使用 autofs 喔!
- 先卸載 /home/rhome,同時取消 /etc/fstab 內的開機掛載項目
- 刪除 /home/rhome 目錄
- 先安裝 autofs, libsss_autofs 軟體,才會有自動掛載的功能!
- 編輯 /etc/auto.master ,加入『 /home/rhome /etc/auto.rhome 』一行
- 編輯 /etc/auto.rhome,加入『* -rw,soft server:/home/rhome/& 』
- 啟動 autofs 服務,並且下次開機這個服務也會啟動
- 再次使用 su - ldapuser1 看看能不能讓系統自動掛載相對的家目錄?
- 使用 nfsstate -m 查詢更多掛載參數。
- (Option):如果出現失敗,可能要在 /etc/sssd/sssd.conf 裡面的 service 增加 autofs 的項目喔!
- NFS 用戶端的 root 權限保留
我們知道 server 的 /srv/root 是可以使用 root 身份操作系統的。現在請實際實施看看結果為何!
- 建立 /srv/root
- 以手動方式將 server:/srv/root 掛載到本地端的 /srv/root
- 以 root 身份進入 /srv/root,是否可以順利的進行操作?
7.6: 課後練習
- (60%)實作題:啟動 Server 作業硬碟 - unit07
- 網路參數的設定,請依據底下的方式來設定好你的網路環境:
- 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- IPv4 的 IP位址: 172.18.255.*/24 ,其中 * 為老師規定的 IP 尾數
- gateway 為 172.18.255.254
- DNS 為 172.16.200.254 以及 168.95.1.1
- 使用 teamd 的機制建立內部區域網路的備援功能:
- team 的界面使用 team0 卡號,且連線名稱請命名為 team0
- team 使用 activebackup 備援功能,不要使用 loadbalance
- team 的實體網卡 (team slave) 請使用 ens7 及 ens8 ,且其連線名稱名稱亦請命名為 ens7, ens8
- team0 網路參數為: 172.19.*.254/24,不需要 gateway
- 主機名稱指定為: server*.example.dic
- 最終你的主機名稱與 IP 的對應為:
server*.example.dic 172.18.255.* 別名為 server* server254.example.dic 172.18.255.254 別名為 server254 server.lan*.example.dic 172.19.*.254 別名為 server client.lan*.example.dic 172.19.*.1 別名為 client
- 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- 基本的伺服器作業系統設定行為:
- 依據底下的說明,選擇距離我們最近的成大網站來作為 yum server 的來源:
成大 ccns 網站: https://mirror.ccns.ncku.edu.tw/howto/#rocky-linux
請記得修改過設定檔,應該要將清單清除 (yum clean all) 較佳。 - 安裝相關的軟體,至少須安裝 vim-enhanced, bash-completion, net-tools, bind-utils, kernel
- 全系統自動升級,且每天凌晨 3 點也會自動升級一次。(請寫入 /etc/crontab 為主)
- 將 SELinux 修改成為 Enforcing 模式,且未來每次開機都自動為 Enforcing 才行
- 依據底下的說明,選擇距離我們最近的成大網站來作為 yum server 的來源:
- 實際設定好本機防火牆
- 請關閉 firewalld 服務,並且自行安裝、啟動 iptables 服務
- 將預設的規則轉存到 /root/firewall.sh 這個檔案內
- 首先將全部的規則刪除 (應該有三條指令)
- 設定好預設政策,讓 INPUT 成為 DROP 而 OUTPUT 與 FORWARD 成為 ACCEPT
- 針對 INPUT 前三條規則為 (1)回應封包 (2)放行 lo 界面 (3)放行 icmp 封包
- 放行你自己的內部區域網路那個網域的連線要求 (針對 LAN 的信任設定)
- 讓 ssh 只對外部的區網放行,不會對 Internet 放行 (對 ssh 連線做限制較佳)
- 讓 http 針對整個 Internet 放行 (一般公開的服務設計)
- 最後讓確定的規則轉存到 /etc/sysconfig/iptables 這個設定檔
- 重新啟動 iptables 服務,然後觀察規則是否正確
- 實際設定好 Server 的路由功能
- 讓核心支援 IP 轉遞的功能,並且每次重新開機都可以自動生效
- 修改 /root/firewall.sh ,在該檔案加入清除 nat 表格的規則與自訂鏈的設定
- 增加規則:讓來自內部網路的封包,在路由判斷後,並預計由 ens3 對外網卡出去的封包,全部偽裝成為 ens3 的 IP 位址 (一般在數據機上面的就是 public IP)
- 在 /etc/sysconfig/iptables-config 當中增加 nf_nat_ftp 及 nf_conntrack_ftp 模組功能
- 上述功能在開機後依舊能夠順利啟動
- 建置專屬你區域網路的 LDAP 服務
- 安裝相關的軟體功能:
- RockyLinux 9 要使用 openldap-servers 需要 EPEL 軟體倉儲的支援,請自行安裝 EPEL 倉儲, 並安裝 openldap, servers 與 clients 等軟體。
- 請前往 centos.pkgs.org 網站,查詢 centos 7 的 mirgrationtools 軟體,下載後自行安裝該軟體。
- 安裝 sssd, sssd-tools, sssd-ldap 等身份認證所需要的軟體
- 安裝完畢 openldap-server 等軟體之後,請啟動名為 slapd 的服務,並且開機自動啟動。
- 修改 LDAP server 的設定檔節點,包括 cn=config 等重要系統節點,完成底下所需要的設定值:
- baseDN 設定為: dc=example,dc=dic
- RootDN 設定為: cn=Manager,dc=example,dc=dic
- RootDN 的密碼設定為: 2727175
- 因為預計要作為 Linux 的帳號驗證功能,因此請載入與 Linux 帳號相關的三個主要綱要檔 (schema)
- 開始設定 LDAP 非關聯性資料庫的資料庫內容:
規劃的基礎 LDAP 資料庫節點設計中,至少應具有底下的節點存在,請將這些節點匯入到資料庫內:
- dn: dc=example,dc=dic
- dn: cn=Manager,dc=example,dc=dic
- dn: ou=People,dc=example,dc=dic
- dn: ou=Group,dc=example,dc=dic
- 建立 10 個 LDAP 所管理的相關帳號,帳號相關資訊如下,請將該資訊匯入 LDAP 資料庫中:
- 假設使用者名稱為 webuser1 ~ webuser10
- 預設使用者密碼為 webpasswd 這個密碼
- 假設使用者的 UID 從 8001 開始編號
- 假設使用者的 GID 也是從 8001 開始編號,且有對應的私有群組
- 假設使用者的預設家目錄在 /rhome/ 底下
- 承上,這 10 個用戶的家目錄亦請自行設定好相關的位置與權限
- 由於 sssd 服務僅支援 TLS 等加密機制,因此, LDAP server 必須要完成 TLS 等加密動作,
否則會讓後續的身份驗證出問題。請使用 TLS 搭配 port 636 來操作,請完成底下工作:
- 成對金鑰系統檔名請設定為 exampledic.crt 與 exampledic.key,建置時,主機名稱的全名必須指定為: server*.example.dic 這一個才行!且要求金鑰檔案務必放置於 /etc/openldap/certs 目錄內
- 匯入金鑰系統時,應該要增加三個金鑰的屬性 (attribute) 到 LDAP 設定檔當中, 請使用 LDIF 的格式新增這三個屬性 (主要在 cn=config.ldif 檔案中)
- 啟動 slapd 時,務必讓用戶端可以使用 ldap:/// 以及 ldaps:/// 兩種網址
- 讓 server 自己可以使用 ldapsearch 查詢 ldaps:/// 的資料
- 讓 server 自己使用 LDAP 服務的帳號:
- 選擇 sssd 的身份驗證機制
- 請依據本章的介紹,自行設定好 /etc/sssd/sssd.conf 內容,並啟用 sssd 服務。
- 最終使用 id webuser1 ~ id webuser10 會顯示正確的 UID 與 GID 即可。
- 安裝相關的軟體功能:
- 建置 NFS 檔案伺服器
- 讓你的 /rhome 針對你的區域網路分享,權限請設定為可讀寫、不加密。
- 網路參數的設定,請依據底下的方式來設定好你的網路環境:
- (30%)實作題:啟動 client 作業硬碟
- 網路參數的設定,請依據底下的方式來設定好:
- 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- IPv4 的 IP位址: 172.19.*.1/24 ,其中 * 為老師規定的 IP 尾數
- gateway 為 172.19.*.254
- DNS 為 172.16.200.254 以及 168.95.1.1
- 主機名稱指定為: client.lan*.example.dic
- 最終你的主機名稱與 IP 的對應為:
server*.example.dic 172.18.255.* 別名為 server* server254.example.dic 172.18.255.254 別名為 server254 server.lan*.example.dic 172.19.*.254 別名為 server client.lan*.example.dic 172.19.*.1 別名為 client
- 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- 實際設定好本機防火牆
- 預設請使用 firewalld 防火牆服務,不要使用 iptables 服務!
- 請將預設的領域 (zone) 改為 work 領域,且 ens3 為其管理之界面網卡
- 預計放行的服務主要有 ssh 與 http 兩個服務,其他還可能有預設會啟用的 dhcp 用戶端服務。
- 查詢 rich rule (man firewalld.richlanguage),確認來自本機同一個 LAN 網段的封包,通通給予放行。
- 上述放行的防火牆服務,在下次重新開機後,依舊會存在才行
- 讓你的用戶端主機也能夠支援 LDAP 的帳號驗證,並且使用的是 ldaps:/// 的網址功能
- 需要能夠使用 ldapsearch 等指令,注意需要的軟體有哪些。
- 需要能夠透過 sssd 查詢來自 server 的 LDAP 資訊
- 請使用 autofs 的機制,讓網路用戶登入時,能夠透過 NFS 取得自己的家目錄
- 網路參數的設定,請依據底下的方式來設定好:
- (10%)簡易問答題:
從具有 GUI 及中文的用戶端 Linux ,使用『 ssh root@172.19.*.254 』登入你的 Server ,之後建立 /root/ans.txt 的檔案,並將底下各題目的答案寫入你 server 當中!
- 請說明 LDAP 的 BaseDN, RootDN, RootPW, schema 的意義各為何?
- 在 Linux 帳號的 schema 當中,匯入 nis.ldif 之後,應該要有那兩個 ou (organization unit) 的存在。
- 在 RockyLinux 9 上面,架設 LDAP server 與 LDAP client 功能,各需要哪個軟體?
- slapd 啟動後,若將 TLS 的連線通道分開,則 ldap:///, ldaps:/// 各預設啟動在哪個埠口?
- NFS server 預設啟動在哪個埠口上?可以使用那一個指令觀察 (不是 netstat 喔!)?
- 上傳成績
- 請將 Server/Client 的硬碟通通啟動,並且確認兩者間的連線沒有問題;
- 在 Server 硬碟上面登入,然後用 root 的身份執行 vbird_server_check_unit ,並依據提示資料填寫你的學號與 IP 尾數
- 該程式會偵測你的系統,並且通知你哪個部份可能有問題,你需要持續觀察或者重新處理的部份會交代妥當。
- 若一切沒問題,螢幕就會出現如下的字樣,然後你就能夠使用 links 去檢查你的檔案是否有順利的上傳了!
- Please use links http://172.18.255.250/upload/unit07 to check your filename
內容修改紀錄
- 2021/12/01:在 7.3 的 step8 當中,有個同學說,一直無法順利連線上!狀態是:
- ldapsearch 無論加密、未加密,都可以搜尋到 ldapuser1
- sssd 設定資訊已經完全按照網站上面資料設定妥當
- 一直無法使用 id ldapuser1 找到這個用戶。
# sssctl domain-list implicit_files LDAP # sssctl domain-status LDAP Online status: Offline Active servers: LDAP: not connected Discovered LDAP servers: - pc62.dic.ksu
查了好久!竟然發現,原來是最源頭的 /etc/hosts 裡面,沒有將 pc62.dic.ksu 加入而已!會發現可能的問題, 當然就是上面出現 LDAP: not connected 的狀況!最終加上 /etc/hosts 紀錄,重啟動 sssd 之後,就可以順利使用 ldapuser1 囉! - 2019/11/13:LDAP 的 TLS 建置中, Key 的匯入順序有差別喔!所以重新修改匯入的順序,參考這裡
- 2020/11/19:LDAP 已經不被 CentOS 8.2 以後支援,請使用 symas.com 公司出版的軟體:https://repo.symas.com/sofl/rhel8/
- 2020/11/19:大致修改完畢整份資料,已經可以在 CentOS 8 上面順利運作!就剩下硬碟了~
- 2022/11/03:終於完成整體流程的順暢性!改到 RockyLinux 9 上面了!原來果然需要 EPEL 啊!