如何針對 Active Directory 驗證 Linux 帳戶並在登錄時掛載 Windows 共享?
我正在使用 Ubuntu 10.04 伺服器。
$$ Edit $$ 我已經測試了這個完整版本的Ubuntu 10.04 Server (21/May/2010)。 我已經將駐留在 Windows 網路上的Ubuntu 10.04 Server LTS配置為使用活動目錄對登錄進行身份驗證,然後掛載一個 Windows 共享作為主目錄。
這是我從 Ubuntu 的初始安裝開始所做的。
- 下載並安裝Ubuntu Server 10.04 LTS
- 獲取更新
# sudo apt-get update && sudo apt-get upgrade
3. 安裝 SSH 伺服器 (sshd
)
# sudo apt-get install openssh-server
有些人會爭辯說,您應該通過禁用 root 登錄來“鎖定 sshd”。我想如果您足夠聰明,可以破解 ssh 會話以獲得 root 密碼,那麼您可能不會因
PermitRootLogin no
在/etc/ssh/sshd_config
文件中添加而受阻。如果您的偏執狂或根本不相信,請編輯文件或試一試:
# (grep PermitRootLogin /etc/ssh/sshd_config && sudo sed -ri 's/PermitRootLogin ).+/\1no/' /etc/ssh/sshd_conifg) || echo "PermitRootLogin not found. Add it manually."
4. 安裝所需的軟體包
# sudo apt-get install winbind samba smbfs smbclient ntp krb5-user
5. 做一些基本的網路清理工作,為即將到來的特定包配置做準備。
- 確定活動目錄伺服器(用於 samba)的 Windows 域名、DNS 伺服器名稱和 IP 地址。為方便起見,我為 windows 域和 DNS 伺服器設置了環境變數。對我來說是(我的 AD IP 地址是 192.168.20.11):
# WINDOMAIN=mydomain.local && WINDNS=srv1.$WINDOMAIN && WINDNS_IP=192.168.20.11
如果您想弄清楚您的域和 DNS 伺服器是什麼(我是承包商並且不知道網路),請查看這個有用的參考。 2. 我們需要在新網路上命名 Linux 機器,這是通過編輯主機文件來完成的(將 DNS 替換為 windows DNS 的 FQDN):
# sudo sed -ri "s/^(127\.0\.[01]\.1[ \t]).*/\1$(hostname).$WINDOMAIN localhost $(hostname)/" /etc/hosts
3. 我們還應該告訴即將安裝的服務他們可以在哪裡找到領導者:某些網路將具有 netbios 名稱查找服務,但以防萬一,在您的/etc/hosts
文件中添加一個顯式條目,在我的配置中,我在第三個 (3) 上添加了條目線:
# sudo sed -ri "3 i $WINDNS_IP $WINDNS" /etc/hosts
4. Windows 和 Linux 機器的身份驗證和文件共享過程需要它們的時鐘一致。使用 NTP 服務執行此操作,並且在 Ubuntu 的伺服器版本上,安裝並配置了 NTP 服務並配置了一(1) 個 NTP 伺服器。在 Ubuntu 之前添加你的(或完全替換它)。我加入的網路也有提供 NTP 服務的 DNS 伺服器。
# sudo sed -ri "s/^(server[ \t]+)(.+)/\1$WINDNS\n\1\2/" /etc/ntp.conf
重新啟動 NTP 守護程序:
# sudo /etc/init.d/ntp restart
6. Kerberos 配置。此處的說明不應按字面意思理解:編輯文件時需要將
MYDOMAIN.LOCAL
和的值srv1.mydomain.local
替換為適合您網路的值,但請注意使用大寫的地方需要大寫。如果在
apt-get install
Kerberos 期間您有洞察力正確回答“預設域”問題,那麼,對您有好處,否則您必須執行以下操作。
編輯(之前安裝在上面的)
/etc/krb5.conf
文件。
- 找到該
[libdefaults]
部分並更改鍵值對:
[libdefaults]
default_realm = MYDOMAIN.LOCAL
2. 將以下內容添加到[realms]
文件的部分:
MYDOMAIN.LOCAL = {
kdc = srv1.mydomain.local
admin_server = srv1.mydomain.local
default_domain = MYDOMAIN.LOCAL
}
3. 將以下內容添加到[domain_realm]
文件的部分:
.mydomain.local = MYDOMAIN.LOCAL
mydomain.local = MYDOMAIN.LOCAL
4. 此時的一個很好的測試是查看您的 AD 控制器是否會向您發出 kerberos 票證。這不是必需的,但它會使你們中的一些人頭暈目眩:
# kinit <some_windows_domain_user>
然後查看票:
# klist
您將看到有關票記憶體以及到期和續訂的內容。一旦頭暈消退,您也可以釋放/銷毀票:
# kdestroy
配置桑巴。
唉,
cifs
核心中對 ubuntu 10.04(基於核心版本 2.6.32.9)的支持在 1.61 版,並且根據核心文件,實驗性 kerberos 實現自 1.54 版以來就已存在。所以你來了。我不知道是否
cifs
可行,所以我給你 samba 配置:
- 替換
/etc/samba/smb.conf
(記住我是在一個乾淨的 Ubuntu 發行版上工作,所以我不擔心會破壞任何東西):
[global]
security = ads
realm = MYDOMAIN.LOCAL
password server = 192.168.20.11
workgroup = MYDOMAIN
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
template homedir = /home/%U
template shell = /bin/bash
client use spnego = yes
client ntlmv2 auth = yes
encrypt passwords = yes
winbind use default domain = yes
restrict anonymous = 2
2. 啟動和停止各種服務。
# sudo /etc/init.d/winbind stop
# sudo service smbd restart
# sudo /etc/init.d/winbind start
8. 設置身份驗證。
- 編輯
/etc/nsswitch.conf
. 我能夠執行以下命令來獲得所需
# sed -ri 's/(compat)/\1 winbind/' /etc/nsswitch.conf
的內容:這是我的
/etc/nsswitch.conf
文件的內容:
passwd: compat winbind
group: compat winbind
shadow: compat winbind
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
2. 啟動和停止各種服務。
# sudo /etc/init.d/winbind stop
# sudo service smbd restart
# sudo /etc/init.d/winbind start
9. 將電腦加入域。我不相信這是必要的。特別是因為smb.conf
文件 (security = ads
) 中的安全選項。也許有人可以對此進行權衡……
# sudo net ads join -U any_domain_user_account
您可能會收到一個錯誤
DNS update failed!
,但您將加入該域。如果您收到有關無法找到伺服器的錯誤,則需要修改您的 DNS 記錄。在 Ubuntu 安裝期間,名稱伺服器通常會指向您的網關:大多數路由器都會提供 DNS 服務。Windows 伺服器管理的最佳實踐是 ADC 也應該執行 DNS。在我的情況下,我/etc/resolve.conf
看起來像這樣:
nameserver 192.168.20.11
nameserver 8.8.8.8
這
8.8.8.8
是一個Google DNS,一個相當可靠的備份,以防 Windows 出現故障。此時我可以登錄(可能在重新啟動後),主目錄不存在,但我可以登錄。
- 登錄時安裝 CIFS
下一步對我來說很重要。我不想負責備份每個人的工作目錄,而 Ubuntu 執行的機器在可靠性方面值得懷疑。通過執行以下操作,使用者可以自動登錄並查看他們的 windows 使用者目錄。
- 下載
pam_mount
模組:
# sudo apt-get install libpam-mount
我希望掛載點指向傳統
/home/<user>
位置:這部分由/etc/samba/smb.conf
文件(template homedir = /home/%U
)配置。但我需要它來鑽取共享並指向他們自己的 windows 目錄。這是通過編輯/etc/security/pam_mount.conf.xml
文件來完成的(儘管它是有意的,但 XML不是人類可讀的): 2. 添加以下內容/etc/security/pam_mount.conf.xml
並進行更改以適應:
<volume
user="*"
server="srv1.mydomain.local"
path="UserShares"
mountpoint="home"
fstype="cifs"
/>
<cifsmount>mount -t cifs //%(SERVER)/%(VOLUME)/%(USER) %(MNTPT)/%(USER) -o "user=%(USER),uid=%(USERUID),gid=%(USERGID)%(before=\",\" OPTIONS)"</cifsmount>
由於我愚蠢的安裝點,我也不得不添加這一行:
<umount>umount %(MNTPT)/%(USER)</umount>
這樣使用者目錄(用於掛載點)將自動創建找到該行並使其成為:
<mkmountpoint enable="1" remove="false" />
該
remove="false"
位非常重要:如果設置為 true,pam_mount.so
則嘗試刪除目錄掛載點,如果使用者已多次登錄,則無法執行此操作。在這種情況下,您最終得到的是系統上的大量雜散安裝。***
pam_mount.so
仍然沒有像承諾的那樣傳遞。在目前的形式中,掛載不斷堆積,並且沒有創建主目錄。在此處和之前的 10.04 伺服器的 Beta 2 版本之間的某個地方,它正在工作。我無法重新創建這個。與此同時,我依賴於創建目錄
pam_mkhomedir.so
,並在該行之前插入pam_mount.so
一行以適應。我仍然沒有解決多重安裝問題。但在
pam_mount.so
修復之前,這就是我在/etc/pam.d/common-session
文件中的內容:***session [default=1] pam_permit.so session requisite pam_deny.so session required pam_permit.so session required pam_unix.so session optional pam_winbind.so session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 session optional pam_mount.so
而已。它對我有用,我希望你覺得它有用。 考慮了許多資源,所以我可以弄清楚這一點。這是一個簡短的列表(其中一些連結指向我自己關於該主題的問題): * [Samba Kerberos](https://help.ubuntu.com/community/Samba/Kerberos) * [活動目錄 WinBind](https://help.ubuntu.com/community/ActiveDirectoryWinbindHowto) * [在 CIFS 伺服器上掛載 Linux 使用者主目錄](https://serverfault.com/questions/13430/mounting-linux-user-home-directories-on-cifs-server) * [針對 Active Directory 對 OpenBSD 進行身份驗證](https://serverfault.com/questions/20202/authenticating-openbsd-against-active-directory) * [如何使用 Active Directory 對 linux 使用者進行身份驗證](https://serverfault.com/questions/23632/how-to-use-active-directory-to-authenticate-linux-users) * [使用 Active Directory 權限裝載 Windows 共享](https://serverfault.com/questions/134976/mounting-windows-shares-with-active-directory-permissions) * [在 Ubuntu 9.10 伺服器 64 位上通過 Samba 使用 Active Directory 身份驗證](https://serverfault.com/questions/110199/using-active-directory-authentication-with-samba-on-ubuntu-9-10-server-64bit) * [針對 AD 對 Linux 伺服器進行身份驗證有多實用?](https://serverfault.com/questions/15626/how-practical-is-to-authenticate-a-linux-server-against-ad) * [在 Linux AD 登錄時自動掛載 Windows 共享](https://serverfault.com/questions/134533/auto-mounting-a-windows-share-on-linux-ad-login)