Ubuntu

如何針對 Active Directory 驗證 Linux 帳戶並在登錄時掛載 Windows 共享?

  • June 20, 2013

我正在使用 Ubuntu 10.04 伺服器。

$$ Edit $$ 我已經測試了這個完整版本的Ubuntu 10.04 Server (21/May/2010)。 我已經將駐留在 Windows 網路上的Ubuntu 10.04 Server LTS配置為使用活動目錄對登錄進行身份驗證,然後掛載一個 Windows 共享作為主目錄。

這是我從 Ubuntu 的初始安裝開始所做的。

  1. 下載並安裝Ubuntu Server 10.04 LTS
  2. 獲取更新

# 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. 做一些基本的網路清理工作,為即將到來的特定包配置做準備。

  1. 確定活動目錄伺服器(用於 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 installKerberos 期間您有洞察力正確回答“預設域”問題,那麼,對您有好處,否則您必須執行以下操作。

  1. 編輯(之前安裝在上面的)/etc/krb5.conf文件。

    1. 找到該[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

  2. 配置桑巴。

根據以下內容: 有時無法使用 CIFS 或其他網路文件系統選擇更好。如果需要 kerberos (krb5/SPNEGO) 身份驗證支持以增加安全性,則必須使用 Samba 的 smbclient 或 smbfs 代替 cifs

唉,cifs核心中對 ubuntu 10.04(基於核心版本 2.6.32.9)的支持在 1.61 版,並且根據核心文件,實驗性 kerberos 實現自 1.54 版以來就已存在。

所以你來了。我不知道是否cifs可行,所以我給你 samba 配置:

  1. 替換/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. 設置身份驗證。

  1. 編輯/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 出現故障。

此時我可以登錄(可能在重新啟動後),主目錄不存在,但我可以登錄。

  1. 登錄時安裝 CIFS

下一步對我來說很重要。我不想負責備份每個人的工作目錄,而 Ubuntu 執行的機器在可靠性方面值得懷疑。通過執行以下操作,使用者可以自動登錄並查看他們的 windows 使用者目錄。

  1. 下載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)

引用自:https://serverfault.com/questions/135396