網站伺服器建置與管理上課補充教材
- 最新消息:
- 每週都有可能會有上機實作,要等老師檢查完畢才能夠下課!否則就不算有來上課!
- 回首頁
- 舊版進度介紹
Chapter 07:身份識別伺服器與內部檔案系統伺服器
- ID server and filesystem server
- 在一組或一間伺服器機房內,所有的伺服器均需要使用同一組帳號與密碼來登入,並取得相同家目錄時,就需要這樣的設備需求。
- 最簡單的案例,在崑山資傳系操作電腦教室的電腦時,所有的電腦均可以使用你的學號登入,並且可以取得你的個人桌面與額外的三個檔案系統。
- 該功能就得要有兩個元件:
- 使用身份識別功能:就是 ID 認證的服務。常見的服務有: NIS, LDAP, AD(windows), Kerboros...
- 使用者家目錄的取得:就是個人檔案資料。常見的服務有: NFS, SMB(網芳), AD(windows)...
- 可用的參考資料:點這裡來查看英文, 有人翻譯成中文
- 使用 LDAP 進行 ID 身份的控制
- LDAP 全名: Lightweight Directory Access Protocol,主要的功能在於『目錄服務』的提供!其實就有點像電話簿啦!
- LDAP 的組成:
- 可以提供非關聯性的資料庫環境,而每一筆資料則透過判別名稱 (distinguished name, DN) 來提示定義
- 每一個組織均需要定義最頂層的判別名稱,就被稱為 RootDN,這也是整個 LDAP 系統最先要設定的項目
- DN 的展示方式其實有點像 DNS,不過需要使用 dc, cn, ou 等來進行名稱的指定,例如『 dc=dic,dc=ksu 』就是一筆 DN 的解釋
- 每個 RootDN 底下還有附屬組織,例如人事部門可以使用類似:『 ou=peoeple,dc=dic,dc=ksu 』之類的方式來命名。
而該 DN 底下就會有多種屬性定義!這些屬性定義就牽涉到每一個 LDAP 的用途為何。
- 因為 LDAP 僅是一個『目錄服務』的提供者,但這些目錄底下資料的定義使用的功能為何,就是透過預先定義的綱要檔 (Schema) 來定義。
舉例來說, Linux 與 Windows 的帳號所需要的項目並不相同,因此使用 LDAP 作為 Linux 的帳號認證來源時,就得要使用 LDAP 提供的 Linux 帳號所需綱要檔 (schema)
- 因此,如果你要在伺服器組之間設定一台 ID 驗證伺服器,並且使用 LDAP 服務時,就得要進行:
- 安裝好 LDAP 伺服器軟體,並且提供登入 LDAP 功能的 RootDN 密碼
- 載入 LDAP 所需要的環境設定參數檔
- 啟動 LDAP 服務,並觀察 LDAP 服務的埠口,以啟用防火牆放行的功能
- 預先指定好自己公司即將使用的 RootDN 環境 (最好與 DNS 系統相同即可),同時規劃好即將要使用的用戶端作業系統有哪些
- 開始載入基本的 RootDN 功能 (baseDN)
- 開始載入用戶端作業系統所需要的綱要檔 (schema)
- 嘗試取得用戶端所需要的帳號參數範例檔,變轉為 LDAP 所需要的格式 (LDAP Data Interchange Format, LDIF) ,然後載入到 LDAP 伺服器內
- 若需要加密環境,請前往 /etc/pki/tls/certs 目錄下進行所需要的 key 建制
- 練習:
- 規範你的基本 DN 成為 dc=dic,dc=ksu (通常組織規模越右邊越大)
- 一般管理基本 DN 的 RootDN 可以是: cn=Manager,dc=dic,dc=ksu (Manager 為管理部份的意思)
- LDAP 伺服器事先安裝與簡易設定
- 最好 server 與 client 都樣彼此認識,因此 /etc/hosts 裡面需要填寫兩者的主機名稱與 IP 的對應較佳
- 帳號與密碼最好使用加密的連線機制,因此需要 key pair 的處理。CentOS 7 預設在 /etc/pki/tls/certs
目錄下提供了相對應的方式來建立好你的 private key 與 public key,因此你可以到該目錄下去建立新的 key pair,以提供加密應用。
# openssl req -new -x509 -nodes -out /etc/pki/tls/certs/{公鑰檔名}.crt \
> -keyout /etc/pki/tls/certs/{私鑰檔名}.key -days 3650
Generating a 2048 bit 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) []:dic.ksu
Email Address []:root@dic.ksu
- 安裝 CentOS 提供的 openldap 的軟體,包括 openldap-servers, openldap-clients, openldap 等軟體,
最好也是先安裝上 unix 帳號轉 ldap 帳號的轉換腳本 migrationtools 這個軟體
- 因為 LDAP 還是得要做好保護,因此建議使用 LDAP 需要用密碼!此時請以 slappasswd 進行 LDAP 密碼的生成,記得將該密碼記錄下來,
等待過一陣子的設定使用。(slapd 為 standard alone ldap daemon 的縮寫)
# slappasswd
New password:
Re-enter new password:
{SSHA}4K0zNCOplK6kWIvvD9IojNIud1z+gjyo
- OpenLDAP 的主要設定檔位於 /etc/openldap/slapd.d/cn=config/ 目錄內,跟整個系統運作比較有關係的僅有『 olcDatabase={2}hdb.ldif 』『
olcDatabase={1}monitor.ldif 』而已!其他的檔案都暫時不要理他!
- 在 olcDatabase={2}hdb.ldif 檔案中,應該要加入 baseDN, RootDN, 管理員密碼以及金鑰系統的檔案建置,基本上,修改與加入的設定會有:
(前面兩個是修改,後面三個是新增在最後面)
olcSuffix: dc=dic,dc=ksu
olcRootDN: cn=Manager,dc=dic,dc=ksu
olcRootPW: {SSHA}4K0zNCOplK6kWIvvD9IojNIud1z+gjyo
olcTLSCertificateFile: /etc/pki/tls/certs/{公鑰檔案}.crt
olcTLSCertificateKeyFile: /etc/pki/tls/certs/{私鑰檔案}.key
- 接下來需要將監測功能的設定處理成你的 baseDN 才行,修改 olcDatabase={1}monitor.ldif 檔案,將 olcAccess 的項目內的 dn.base= 項目修訂!
- 預設 /var/lib/ldap/ 目錄管理位置並沒有任何設定檔,所以管理員可以複製 OpenLDAP 提供的預設檔案來使用。
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap:ldap /var/lib/ldap/DB_CONFIG
- 練習:
- 讓 server/client 的 /etc/hosts 都填寫上自己內部的 IP 對應!
- 根據上述 B 的說名,前往 /etc/pki/tls/certs 建立名為 myldappub.crt 的公鑰以及成對的 myldappri.key 私鑰!
- 請在 server 上,線上安裝所需要的各項軟體 (應該有 3 個)
- 建立 LDAP 的系統管理員操作密碼為 2727175,同時將密碼、RootDN, BaseDN 以及金鑰檔名通通寫入於 olcDatabase={2}hdb.ldif 檔案內
- 將 olcDatabase={1}monitor.ldif 內,關於 dn.base 的項目修改成你的 RootDN 設定值!
- 將系統提供的預設設定值 DB_CONFIG.example 複製到 /var/lib/ldap/DB_CONFIG !記得檔名不一樣喔!
- 準備啟動 LDAP 前,請先使用 slaptest -u 測試設定檔是否有錯誤!若有錯誤,請自行處理各項錯誤克服!
(由於我們是手動修改設定檔,因此出現 checksum error 的指紋碼錯誤時,可以略過不理)
- 通過設定檔檢查沒問題,即可啟動 slapd 這個服務了 (start and enable)
- 查看一下系統是否有啟動 389 這個埠口,同時注意你的 client 能否存取該埠口喔! (iptables-save)
- 針對 Linux 系統的帳號/密碼/群組,轉成 LDAP 的 LDIF 格式檔案
- 如前所述,LDAP 僅是一個提供目錄功能的服務,如果需要特定的帳號管理機制,可以透過系統預設提供的綱要檔 (schema) 來處理!
針對 Linux 帳號常用的綱要檔主要有:cosine.ldif, nis.ldif, inetorgperson.ldif ,這些檔案都放置在 /etc/openldap/schema/ 中,
然後可以透過底下的指令來持續載入這些綱要檔:
# ldapadd -Y EXTERNAL -H ldapi:/// -f {檔名}
- 練習:
- 由於 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(群組項目)
- 上述的 base.ldif 檔案內容一般來說有點像這樣 (可以複製到你的系統中再修改即可)
# vim /root/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
- 過去帳號與密碼的建立都需要透過記憶 LDIF 的格式來建立,新版 OpenLDAP 提供了轉換腳本來將 Linux 用戶資料轉成 LDIF 格式!
那就是前一個步驟安裝的 migrationtools 的功能。我們為了將本機帳號與網路帳號做分別,因此預先建立兩個帳號,設計的情況是這樣的:
- 帳號/UID/密碼/家目錄:ldapuser1/6001/mypassword/(/home/rhome/ldapuser1)
- 帳號/UID/密碼/家目錄:ldapuser2/6002/mypassword/(/home/rhome/ldapuser2)
建立的方式就簡單了:
# mkdir /home/rhome
# useradd -d /home/rhome/ldapuser1 -u 6001 ldapuser1
# useradd -d /home/rhome/ldapuser2 -u 6002 ldapuser2
# echo mypassword | passwd --stdin ldapuser1
# echo mypassword | passwd --stdin ldapuser2
- 開始進行帳號的轉換動作!由於預設的轉換項目沒有針對我們的 baseDN (dc=dic,dc=ksu),因此需要修訂一下整體設定檔!
請修改 /usr/share/migrationtools/migrate_common.ph 檔案內容,改掉三個設定項目即可!
# vim /usr/share/migrationtools/migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "dic.ksu"; # 71 行左右
$DEFAULT_BASE = "dc=dic,dc=ksu"; # 74 行左右
$EXTENDED_SCHEMA = 1; # 90 行左右
相關說明都可以查看該檔案內的該設定項目上方的註解說明。接下來,我們將 ldapuser 這個關鍵字從帳號/群組設定檔中抓出來,
暫時放置到 /root/user.txt 及 /root/group.txt 檔案內,處理的方式很簡單:
# grep ldapuser /etc/passwd > /root/user.txt
# grep ldapuser /etc/group > /root/group.txt
最後將這兩份資料轉成 LDIF 的格式吧!
# /usr/share/migrationtools/migrate_passwd.pl /root/user.txt > /root/user.ldif
# /usr/share/migrationtools/migrate_group.pl /root/group.txt > /root/group.ldif
參考一下轉換後的使用者資訊與群組資訊如下所示:
# cat /root/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$K5PDVPpY$5RPYsmLcSybNiKSKm1IO4UOnE5m8/ebc2yUU8x4TYrqhq5OaSmIT2VdAKKfQDS3S1In3mg1O1vzvSFZrkgq8j.
shadowLastChange: 17106
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 6001
gidNumber: 6001
homeDirectory: /home/rhome/ldapuser1
# cat /root/group.ldif
dn: cn=ldapuser1,ou=Group,dc=dic,dc=ksu
objectClass: posixGroup
objectClass: top
cn: ldapuser1
userPassword: {crypt}x
gidNumber: 6001
- 練習:
- 以完整的方法 (userdel -r) 刪除剛剛建立的測試帳號 (ldapuser1, ldapuser2)
- 透過上面的 ldapuser1 的帳號與群組的 LDIF 格式資料,請寫一隻腳本,檔名為 /root/add_ldapuser.sh ,
可以在裡面規範 1)最小的 UID 號碼 2)建立所需要的家目錄 3)修改密碼建立日期為當日的日期 4)會主動的建立用戶的家目錄 (預設在 /home/rhome 底下)。
- 執行該指令後,會建立 /root/ldapuser.ldif 檔案,以及 /root/ldapgroup.ldif 兩個檔案
- 執行該指令後,會在 /home/rhome 底下建立 10 個使用者的家目錄。但由於實際並沒有該帳號,所以 user/group 的欄位會以 UID/GID 呈現。
- 可參考這裡的寫法!但不要照抄!
- LDAP 的帳號匯入與搜尋觀察
- 依據 LDAP 的 LDIF 格式建置好所需要的三個檔案後,未來就可以持續新增/管理帳號與密碼了。不過需要留意的是,系統的基本檔案 (base.ldif)
只需要匯入一次即可!其他兩個有需要就可以持續匯入!
- base.ldif
- ldapuser.ldif
- ldapgroup.ldif
- 開始匯入,匯入的方式如下:
# ldapadd -x -W -D "cn=Manager,dc=dic,dc=ksu" -f /root/base.ldif
Enter LDAP Password: # 需要輸入管理員密碼
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"
# ldapadd -x -W -D "cn=Manager,dc=dic,dc=ksu" -f /root/ldapuser.ldif
# ldapadd -x -W -D "cn=Manager,dc=dic,dc=ksu" -f /root/ldapgroup.ldif
因為我們使用的是管理員的身份 (Manager) 來處理這部份的任務,因此上頭就會出現 Manager 的字樣!
- 匯入完畢就可以開始嘗試在本機先搜尋看看 LDAP 的設定結果:
# ldapsearch -x cn=ldapuser1 -b dc=dic,dc=ksu
# extended LDIF
#
# LDAPv3
# base <dc=dic,dc=ksu> with scope subtree
# filter: cn=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:: e2NyeXB0fSQ2JEs1UERWUHBZJDVSUFlzbUxjU3liTmlLU0ttMUlPNFVPbkU1bTg
vZWJjMnlVVTh4NFRZcnFocTVPYVNtSVQyVmRBS0tmUURTM1MxSW4zbWcxTzF2enZTRlpya2dxOGou
shadowLastChange: 17107
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 6001
gidNumber: 6001
homeDirectory: /home/rhome/ldapuser1
# ldapuser1, Group, dic.ksu
dn: cn=ldapuser1,ou=Group,dc=dic,dc=ksu
objectClass: posixGroup
objectClass: top
cn: ldapuser1
userPassword:: e2NyeXB0fXg=
gidNumber: 6001
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
- LDAP 的用戶端功能
- 開始嘗試在本機使用 LDAP 用戶登入。但本機使用 ldap 燈入時,需要額外的使用 nss-pam-ldapd 軟體,因此請先安裝該軟體
# yum install nss-pam-ldapd
再來需要將公鑰檔 (憑證檔) 複製到 /etc/openldap/cacerts 目錄下才行。我們有提供憑證檔案在 /etc/pki/tls/certs 當中,
請複製過去!
# mkdir /etc/openldap/cacerts
# cp /etc/pki/tls/certs/myldappub.crt /etc/openldap/cacerts
- 由於 CentOS 7 主要是透過 nslcd 這個服務來管理遠端驗證的功能,但是這個服務預設並不啟用 TLS 加密機制!
因此我們需要手動將這個加密機制打開才行!
# echo "tls_reqcert allow" >> /etc/nslcd.conf
- 最後執行 setup 或 authconfig-tui 來進行設定!在第一個視窗當中請用『空白鍵』句選底下兩個項目
然後在下一步後,三個項目的資料填寫:
- [*]使用 TLS
- 伺服器:ldap://127.0.0.1/
- 基底 DN: dc=dic,dc=ksu
按下確定後,應該就能夠連接上 LDAP 了!不過為了安心,請確認一下 nslcd 這個服務的輸出是否如下?
# systemctl status nslcd
● nslcd.service - Naming services LDAP client daemon.
Loaded: loaded (/usr/lib/systemd/system/nslcd.service; enabled; vendor preset: disabled)
Active: active (running) since 二 2016-11-01 23:51:09 CST; 8s ago
Process: 7176 ExecStart=/usr/sbin/nslcd (code=exited, status=0/SUCCESS)
Main PID: 7179 (nslcd)
CGroup: /system.slice/nslcd.service
└─7179 /usr/sbin/nslcd
11月 01 23:51:08 station6-11.gocloud.vm systemd[1]: Starting Naming services LDAP client daemon....
11月 01 23:51:08 station6-11.gocloud.vm nslcd[7179]: version 0.8.13 starting
11月 01 23:51:08 station6-11.gocloud.vm nslcd[7179]: accepting connections
11月 01 23:51:09 station6-11.gocloud.vm systemd[1]: Started Naming services LDAP client daemon..
- 接下來就可以在你的系統 上面使用 id 來檢查一下是否存在 ldapuser1~ldapuser10了!
# id ldapuser1
若有出現使用者的相關資訊~那就是成功了!
- 本機成功後,請在用戶端電腦上面進行上述動作。但請注意:
- myldappub.crt 的複製,需要使用 scp 來從 server 下載到用戶端電腦了!
- LDAP server 需要填寫你的伺服器 IP 而不是 127.0.0.1 喔!
- 如果使用 su - ldapuser1 時,應該已經可以切換成為該使用者,但是可能還無法取得相對應的家目錄,這是正常的!請參考後續的任務!
- 檔案分享的 NFS 伺服器
- NFS 為 Network Filesystem 的縮寫,主要的目的在於分享伺服器的檔案系統給用戶端使用。但 NFS 主要是架構於 RPC server 底下的一個服務,
因此啟動 NFS 之前,需要啟動 RPC server。
- NFS 會用到的服務相當多,包括 rpc.mountd, rpc.nfsd, rpc.rquotad...,這些服務啟動時,預設為隨機啟動任意埠口。
- 但是 NFS 用戶端是直接連線到上述服務的埠口,因此就需要有一隻總管程式來管理這些服務的埠口
- 這個總管的角色就是 RPC 了!
- CentOS 7 使用的 RPC server 為 rpcbind 這個服務。
- NFS 與 RPC 的關係如下:
- 用戶端會向伺服器端的 RPC (port 111) 發出 NFS 檔案存取功能的詢問要求;
- 伺服器端找到對應的已註冊的 NFS daemon 埠口後,會回報給用戶端;
- 用戶端瞭解正確的埠口後,就可以直接與 NFS daemon 來連線。
- NFS 僅提供檔案系統的分享,本身並不理會帳號的驗證喔!基本上使用 NFS 會有底下的狀況:
由於 server/client 都是用『自己的帳號去看待檔案系統』,但是『檔案系統記載的是 UID/GID 資訊』,因此若 server/client 帳號不同步,
那可能會產生很大的問題。這也是本章前幾個小節要先介紹 LDAP 的主因!
- NFS 設定分享的方式
- 設定檔位於 /etc/exports
- 檔案內容格式為
# /dir/path IP(permission) network/netmask(permission)
- IP 的寫法可以是:
- 單獨的IP: 192.168.1.1
- 一整個網段: 192.168.1.0/24
- 可以找到 IP 的主機名稱: station100.dic.ksu
- 常見的權限 (permission) 有底下幾個:
- rw/ro:可讀寫或唯讀
- sync/async:同步或非同步檔案系統。建議一定要 async !效能差很多!
- no_root_squash/root_squash:是否壓縮 root 權限,預設為 root_squash
- all_squash, anonuid, anongid:若身份全部壓縮,亦即讓登入者全部變某個匿名者之意。
- insecure:使用非加密的傳輸方式,速度會比較快。
- 練習:
- 讓 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 可保有權限,且為非加密的環境
- 要啟動 NFS 很簡單,只需要 systemctl {start/enable} nfs-server 即可。
- 可以使用 rpcinfo -p 查閱一下目前啟動的 RPC services 以及各個服務所啟用的埠口
- 可以使用 showmount -e localhost 查看一下目前的分享檔案系統狀況
- (Optional)若有特殊需求,可以參考 /etc/sysconfig/nfs 這個設定內的資料!
- NFS 用戶端設定
- 用戶端設定很簡單,就只要去查閱伺服器端有沒有提供相對應的服務,然後掛載這樣而已。
- 練習:
- 在用戶端嘗試使用 showmount -e ServerIP 來看伺服器有沒有提供相關的掛載服務
- 使用 mount -t nfs IP:/share/mount /local/path 來掛載,例如將伺服器提供的 /srv/public 掛載到本機端的 /srv/serverpub 目錄
# mkdir /srv/serverpub
# mount -t nfs 10.255.XXX.254:/srv/public /srv/public
# df
# nfsstat -m
- 若有需要寫入 /etc/fstab 時,例如將 /home/rhome 掛載到本機的 /home/rhome 時,應該要這樣做:
# mkdir /home/rhome
# vim /etc/fstab
10.255.XXX.254:/home/rhome /home/rhome nfs defaults,_netdev,intr 0 0
# mount -a
- 現在請再次在用戶端使用 su - ldapuser1 ,看看能不能取得用戶端的家目錄了?