samba
是一個神奇的東西,本來在我看來這是一個文件共享服務,到官網去一查,查出了大麻煩
Samba是用于Linux和Unix的標準Windows互操作性程序套件。
?
Samba是根據GNU通用公共許可證許可的自由軟件,Samba項目是Software Freedom Conservancy的成員。
?
自1992年以來,Samba便為使用SMB / CIFS協議的所有客戶端(包括所有版本的DOS和Windows,OS / 2,Linux等)提供安全,穩定和快速的文件和打印服務。
?
Samba是將Linux / Unix服務器和桌面無縫集成到Active Directory環境中的重要組件。它既可以充當域控制器,也可以充當常規域成員。
看到這里還沒有什么,再來看看用戶手冊
User Documentation
- Setting up Samba as an Active Directory Domain Controller
- Setting up Samba as a Domain Member
- Joining a Samba DC to an Existing Active Directory
- Updating Samba
- Setting up a Share Using POSIX ACLs
- Setting up a Share Using Windows ACLs
- Setting up Samba as a Print Server
- CTDB and Clustered Samba
- FAQ - Frequently Asked Questions
- more...
呵呵,全是和AD DC相關的,我那個去,本著
的原則,我照著做了一遍,這才知道平時使用samba來共享一下文件是多么的幸福...
===================================
-
先來說說文件共享
-
Centos 提供的rpm包
Red Hat Enterprise Linux / CentOS / Scientific Linux Version 7 and 8
Samba
rpm軟件包僅支持將Samba作為域成員和NT4 PDC或BDC。 Red Hat不提供用于將Samba作為AD DC運行的軟件包。可以使用其它方式來安裝:
- 編譯安裝Samba. For details, see Build Samba from Source.
- 從可信來源使用帶有AD支持的第三方軟件包。
-
安裝
yum insall samba
Setting up Samba as a Standalone Server
先看一個官方的配置文件。
[global]
map to guest = Bad User
log file = /var/log/samba/%m
log level = 1
[guest]
# This share allows anonymous (guest) access
# without authentication!
path = /srv/samba/guest/
read only = no
guest ok = yes
[demo]
# This share requires authentication to access
path = /srv/samba/demo/
read only = no
創建目錄
# mkdir -p /srv/samba/guest/
# mkdir -p /srv/samba/demo/
啟動服務
systemctl start nmb.service
systemctl start smb.service
這時你就會發現共享可以訪問了,
只是demo打不開,而且guest文件夾中也沒有寫權限
我們不是在上面寫了read only = no
嗎?
這就是共享文件系統中都有的問題:
[root@localhost ~]# ll -d /srv/samba/guest/
drwxr-xr-x. 2 root root 6 Oct 21 00:08 /srv/samba/guest/
[root@localhost ~]# chmod o+w /srv/samba/guest/
[root@localhost ~]# ll -d /srv/samba/guest/
drwxr-xrwx. 2 root root 6 Oct 21 00:08 /srv/samba/guest/
這樣就OK了,guest 文件就有了寫入的權限了(簡單粗暴,生產中不要這么做)
為什么demo文件夾不能訪問?
這是配置中沒有 guest ok = yes
是不是覺得好簡單,呵呵,怎么可能有這么簡單的東西
以上搞定了一個共享,有了信心,下面好好來說說,打擊一下
========================================
samba的基本架構
-
nmb
NetBIOS名稱服務器為客戶端提供基于IP的NetBIOS命名服務
開啟該服務后,和windows通信可以基于netbios名進行,只要開啟了nmb服務在windows的網絡中就能發現這個服務器 -
smb
UNIX的Windows AD和SMB / CIFS文件服務器 -
winbind-----加域后提供名稱解析服務
名稱服務守護進程,用于從NT服務器解析名稱
當加域后,可用于從Windows NT服務器解析用戶和組信息。該服務還可以通過關聯的PAM模塊提供身份驗證服務。應當注意,由于域控制器已經執行了訪問控制,因此帳戶模塊僅執行getpwnam()來驗證系統是否可以為用戶獲取uid。
/etc/nsswitch.conf
passwd: files winbind
"用戶名的解析,先/etc/passwd文件,后使用winbind"
group: files winbind
"組名的解析,先passwd文件,后使用winbind"
hosts: files dns wins
"主機名的解析,/etc/hosts --> dns --> wins服務器"
-
smb.conf 配置文件
整個Samba套件的配置文件
-
用戶
samba的用戶,有兩點要求:
-
那這里你就要說了,上面不是沒有將用戶加入到samba中嗎?怎么能訪問呢?
這是由于系統的默認配置
Default: guest account = nobody
默認將guest訪問,映射到系統nobody用戶的訪問
和我們設定的
map to guest = Bad User
使用無效密碼的用戶登錄將被拒絕,除非用戶名不存在,在這種情況下,它將被視為訪客登錄并映射到 guest account
共同作用的結果
所以上面的設定,是非常不安全的,除了自己玩玩,不建議使用,至少不能給寫權限,但要是每次訪問都要輸入密碼,這又會在工作中造成困難,特別是多個共享,又有不同的權限時,很多的用戶都是記不住密碼的,這時域就是一個好選擇了
-
用戶加入到samba用戶
[root@localhost ~]# rpm -ql samba-common-tools |less
/usr/bin/pdbedit
/usr/bin/smbpasswd
/usr/bin/testparm # 配置文件語法測試工具
...
pdbedit:
pdbedit:添加用戶帳戶,刪除用戶帳戶,修改用戶帳戶,列出用戶帳戶,導入用戶帳戶。
-a
: 添加一個用戶到samba用戶數據庫中,一般要同-u
一起使用,例如:
??pdbedit -a -u tom
??new password:
??retype new password
??加入時,會詢問加入用戶在samba中的密碼
-x|--delete
:
??從數據庫中刪除帳戶。它需要使用-u指定的用戶名。
??Example:pdbedit -x -u bob
-L
: 查看用戶,可以和-v一同使用查看更多信息
??pdbedit -L [-v]
-D
: 可以指定,用戶家目錄映射到windows系統中的驅動器號。
??如將tom的家目錄 /home/tom 映射到我的電腦中的 H:
??pdbedit -u tom -D "H:"
-S|--script script
:
??添加或修改用戶帳戶時可以使用。它將指定用戶的登錄腳本路徑。
??Example:-S "\\\\BERSERKER\\netlogon\\sorce.bat"
-p|--profile profile
:
??它將指定用戶的配置文件目錄。
??Example:-p "\\\\BERSERKER\\netlogon"
[root@localhost ~]# pdbedit -L -u tom
tom:1003:
[root@localhost ~]# pdbedit -u tom -D "H:"
Unix username: tom
NT username:
Account Flags: [U ]
User SID: S-1-5-21-2884529151-173602647-2571866911-1000
Primary Group SID: S-1-5-21-2884529151-173602647-2571866911-513
Full Name:
Home Directory: \\localhost\tom
HomeDir Drive: H:
Logon Script:
Profile Path: \\localhost\tom\profile
Domain: LOCALHOST
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: Wed, 06 Feb 2036 23:06:39 CST
Kickoff time: Wed, 06 Feb 2036 23:06:39 CST
Password last set: Mon, 21 Oct 2019 18:27:28 CST
Password can change: Mon, 21 Oct 2019 18:27:28 CST
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
smbpasswd --- 修改用戶的SMB密碼
smbpasswd [username]
??類似于系統中passwd的smb密碼工具
-
配置
這是一個大的話題。
smbd -b | grep "CONFIGFILE"
命令可得到smb.conf配置文件的路徑
smb.conf(5) 官方參考,也就是man smb.conf
這個文檔很好,內容也非常多,一次看完要把人搞瘋,還好我們一般用到的并不多
我們來看一個小一點的,Centos rpm安裝包,安裝后提供了/etc/samba/smb.conf.example參考說明文件
...........
是不是很長,如果是官方的smb.conf就更要瘋掉了,這個示例雖然不全,但基本夠日常使用了。
這個文件中:
- 使用“#”開頭和“;”開頭的都是注釋
- 整個配置文件分為兩個部分
-
[global]
全局配置部分
這中間包括了nmb,smb,winbind的相關設置
包括samba工作模式,是獨立服務器、域成員、域控、打印服務器等等 -
[Share Definitions]
共享設置部分
-
- 可以使用內置變量
變量 | 說明 |
---|---|
%U | 會話用戶名(客戶端所需的用戶名,不一定與他們獲得的用戶名相同)。 |
%G | %U的主要組名稱。 |
%h | 運行Samba的Internet主機名。hostname |
%m | 客戶端計算機的NetBIOS名稱(非常有用)。 |
%L | 服務器的NetBIOS名稱。 |
%M | 客戶端計算機的Internet名稱。hostname |
%d | 當前服務器進程的進程ID。 |
%I | 客戶端計算機的IP地址。 |
%J | 客戶端計算機的IP地址,用下劃線代替冒號/點。 |
%i | 客戶端連接到的本地IP地址 |
%j | 客戶端連接到的本地IP地址,用下劃線代替冒號/點。 |
%T | 當前日期和時間。 |
%t | 當前日期和時間,以不帶冒號分割的最小格式顯示。(YYYYYmmdd_HHMMSS) |
%D | 當前用戶的域或工作組的名稱。 |
%w | Winbind分隔符。 |
%$(envvar) | 環境變量envar的值。 |
%S | 當前服務的名稱(如果有)。當前服務名替換為%S。這在[homes]部分很有用。 |
%P | 當前服務的根目錄(如果有)。 |
%u | 當前服務的用戶名(如果有)。 |
%g | %u的主要組名稱。 |
%H | %u給出的用戶的主目錄。 |
%N | NIS主目錄服務器的名稱。這是從您的NIS auto.map條目獲得的。如果尚未使用--with-automount選項編譯Samba,則此值將與%L相同 |
%p | 服務主目錄的路徑,該路徑是從NIS auto.map條目獲得的。 NIS auto.map條目分為%N:%p。 |
%a | 遠程計算機的體系結構。它目前可以識別Samba(Samba),Linux CIFS文件系統(CIFSFS),OS / 2,(OS2),Mac OS X(OSX),Windows for Workgroups(WfWg),Windows 9x / ME(Win95),Windows NT( WinNT),Windows 2000(Win2K),Windows XP(WinXP),Windows XP 64位(WinXP64),Windows 2003(包括2003R2)(Win2K3)和Windows Vista(Vista)。其他任何東西都將被稱為未知。 |
%R | 協議協商后選定的協議級別。它可以是CORE,COREPLUS,LANMAN1,LANMAN2,NT1,SMB2_02,SMB2_10,SMB2_22,SMB2_24,SMB3_00,SMB3_02,SMB3_10,SMB3_11或SMB2_FF之一。 |
下面一個一個的說:
- 日志
log file = /var/log/samba/log.%m
max log size = 50
- 認證
-
security =
-
AUTO
(Default) -
USER
#因為這是最常見的設置,用于獨立文件服務器或DC。guest將失效 -
DOMAIN
#在這種模式下,Samba將充當Windows 域的成員 -
ADS
#在這種模式下,Samba將充當ADS域中的域成員。
-
-
map to guest = Never
-
Never
(Default) # 拒絕無效密碼的用戶登錄請求。 -
Bad User
# 使用無效密碼的用戶登錄將被拒絕,除非用戶名不存在,
?????在這種情況下,它將被視為訪客登錄并映射到訪客帳戶。
-
guest account = nobody
(Default) # 默認訪客帳戶映射到nobody用戶
-
- netbios
workgroup = WORKGROUP
# 工作組,客戶端查詢時服務器將顯示在哪個工作組中。
netbios name = MYCentos
# NetBIOS名稱,最大長度為15個字符。 - 本地數據庫(存儲用戶信息以及可能的組信息。)
passdb backend = tdbsam
-
smbpasswd
- 純文本passdb后端。不要使用 -
tdbsam
- 使用TDB數據庫存儲后端。(Default) -
ldapsam
- 基于LDAP的passdb后端。
-
- 共享部分
-
[home]
# 共享名,但它會被 %S 所重寫(替代) -
comment = Home Directories
# 注解信息 -
valid users = %S, %D%w%S
# 設置有效的用戶 -
browseable = No
#設置沒有權限的人 能不能瀏覽 -
read only = No
# 只讀 -
guest ok = yes
# 允許來賓訪問, -
write list = USER1, USER2, @USER...
# read only=no,列表的用戶、組都將有寫權限 -
read list =
# 與write list 相反 -
directory mask = 0755
(Default) # 默認只有文件屬主能修改刪除 -
hosts allow = # none
(Default) # 主機白名單,例如:- hosts allow = 150.203. EXCEPT 150.203.6.66 # 允許150.203.0.0網段,除了150.203.6.66
- hosts allow = 150.203.15.0/255.255.255.0 # 網段
- hosts allow = lapland, arvidsjaur # 幾個主機
- hosts allow = @foonet # 允許NIS網絡組“ foonet”中的主機
- hosts allow = 150.203.5. myhost.mynet.edu.au
-
hosts deny = # none
(Default) # 主機黑名單
-
OK,有了這些配置,也就可以配置一個獨立的samba文件服務器了
=============================
看了這么多的配置,是不是很頭疼,來,來,來,說點高興的 sambaGUI
https://www.samba.org/samba/GUI/
這個頁面提供了許多samba相關的圖形程序
http://www.webmin.com/tgz.html
這個是一個功能非常多的系統管理界面
Webmin是用于Unix的系統管理的基于Web的界面,使用任何的Web瀏覽器,您都可以設置用戶帳戶,Apache,DNS,文件共享等等。 Webmin解除了手動編輯Unix配置文件(如/etc/passwd)的需要,使您可以從控制臺或遠程管理系統,是不是很強大,給兩張圖給有需要的參考
=============================
是不是一下就覺得世界變得美好了,呵呵...
=============================
-
printers 打印機的共享
首先要安裝CUPS來管理和驅動打印機
yum install cups
vim /etc/cups/cupsd.conf
-------------------------------------
Listen localhost:631
改為自己要監聽的地址,如:
Listen 192.168.2.10:631
<Location />
Order Deny, ALlow
Deny From All
Allow From 192.168.2.*
</Location>
<Location /admin>
Order Deny, ALlow
Deny From All
Allow From 192.168.2.99
</Location>
啟動服務
systemctl start cups.service
添加打印機
編輯:smb.conf
[global]
printing = cups
printcap name = cups
load printers = yes
cups options = raw
map to guest = bad user #匿名登錄
[printers]
comment = All Printers
path = /var/tmp
printable = Yes
create mask = 0600
browseable = No
read only = yes
guest ok =yes
測試
=============================
注意:整個過程中都要考慮selinux、firewalld的權限問題
=============================
-
編譯安裝,使用AD DC
-
編譯安裝 需要的包
Red Hat Enterprise Linux 7 / CentOS 7 / Scientific Linux 7
Install the following packages to build Samba as an Active Directory (AD) domain controller (DC) on a minimal Red Hat Enterprise Linux 7, CentOS 7, or Scientific Linux 7 installation:
yum install attr bind-utils docbook-style-xsl gcc gdb krb5-workstation \
libsemanage-python libxslt perl perl-ExtUtils-MakeMaker \
perl-Parse-Yapp perl-Test-Base pkgconfig policycoreutils-python \
python2-crypto gnutls-devel libattr-devel keyutils-libs-devel \
libacl-devel libaio-devel libblkid-devel libxml2-devel openldap-devel \
pam-devel popt-devel python-devel readline-devel zlib-devel systemd-devel \
lmdb-devel jansson-devel gpgme-devel pygpgme libarchive-devel
為您的系統安裝Python 3.x開發包(例如python3-devel,python36-devel或python3-dev)
yum install python36-devel python36-dns lmdb-devel
過程都是跟著## User Documentation的說明在做:
-
Samba作為AD DC支持:
- 集成的LDAP服務器作為AD后端。
- Heimdal Kerberos密鑰分發中心(KDC)。
-
安裝前的準備工作:
- 為您的AD DC選擇一個的主機名。
- 選擇一個DNS,(為您的AD林選擇一個DNS域。該名稱還將用作AD Kerberos領域。)
- 在DC上使用靜態IP地址。
- 禁用諸如resolvconf之類的工具,這些工具會自動更新/etc/resolv.conf DNS解析器配置文件。
- 確認沒有Samba進程正在運行。
ps ax | egrep "samba|smbd|nmbd|winbindd"
- 確認DC上的/ etc / hosts文件正確將標準域名(FQDN)和簡短的主機名解析為DC的LAN IP地址。例如:
127.0.0.1 localhost localhost.localdomain
10.99.0.1 DC1.samdom.example.com DC1 - 如果之前安裝過samba
- 刪除
smb.conf
文件
smbd -b | grep "CONFIGFILE"
?CONFIGFILE: /usr/local/samba/etc/samba/smb.conf - 從下面文件夾中,刪除
*.tdb
和*.ldb
文件
smbd -b | egrep "LOCKDIR|STATEDIR|CACHEDIR|PRIVATE_DIR"
?LOCKDIR: /usr/local/samba/var/lock/
?STATEDIR: /usr/local/samba/var/locks/
?CACHEDIR: /usr/local/samba/var/cache/
?PRIVATE_DIR: /usr/local/samba/private/
- 刪除
- 刪除
/etc/krb5.conf
文件
rm /etc/krb5.conf
從干凈的環境來開始,有助于防止混淆,并確保任何以前的Samba安裝中的文件都不會與新的域DC安裝混在一起。
-
開始安裝:
$ wget https://download.samba.org/pub/samba/stable/samba-x.y.z.tar.gz
$ tar -zxf samba-x.y.z.tar.gz
$ cd samba-x.y.z/
$ ./configure
$ make
$ sudo make install
----
建議使用 ./configure --help 來查看一下 --enable/--disable and --with/--without options的參數
自己加上systemd相關的,可以生成systemd的服務腳本,安裝在/usr/local/samba/lib/systemd/system/下,
cp 到/etc/systemd/system/下就可使用
不要忘記了PATH
export PATH=/usr/local/samba/bin/:/usr/local/samba/sbin/:$PATH
接著:
samba-tool domain provision --use-rfc2307 --interactive
這個有很多的參數,可以直接安官方的做
`# samba-tool domain provision --use-rfc2307 --interactive
Realm [SAMDOM.EXAMPLE.COM]: SAMDOM.EXAMPLE.COM
Domain [SAMDOM]: SAMDOM
Server Role (dc, member, standalone) [dc]: dc
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: SAMBA_INTERNAL
DNS forwarder IP address (write 'none' to disable forwarding) [10.99.0.1]: 8.8.8.8
Administrator password: Passw0rd
Retype password: Passw0rd
Looking up IPv4 addresses
Looking up IPv6 addresses
No IPv6 address will be assigned
Setting up share.ldb
Setting up secrets.ldb
Setting up the registry
Setting up the privileges database
Setting up idmap db
Setting up SAM db
Setting up sam.ldb partitions and settings
Setting up sam.ldb rootDSE
Pre-loading the Samba 4 and AD schema
Adding DomainDN: DC=samdom,DC=example,DC=com
Adding configuration container
Setting up sam.ldb schema
Setting up sam.ldb configuration data
Setting up display specifiers
Modifying display specifiers
Adding users container
Modifying users container
Adding computers container
Modifying computers container
Setting up sam.ldb data
Setting up well known security principals
Setting up sam.ldb users and groups
Setting up self join
Adding DNS accounts
Creating CN=MicrosoftDNS,CN=System,DC=samdom,DC=example,DC=com
Creating DomainDnsZones and ForestDnsZones partitions
Populating DomainDnsZones and ForestDnsZones partitions
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba 4 has been generated at /usr/local/samba/private/krb5.conf
Setting up fake yp server settings
Once the above files are installed, your Samba4 server will be ready to use
Server Role: active directory domain controller
Hostname: DC1
NetBIOS Domain: SAMDOM
DNS Domain: samdom.example.com
DOMAIN SID: S-1-5-21-2614513918-2685075268-614796884
我的執行和這個有點不一樣,顯示了一大堆的python執行,最后的SID出現就好。
這里注意,使用的DNS backend 是SAMBA_INTERNAL這個samba內建的dns。官方建議的:BIND9_DLZ
和 SAMBA_INTERNAL
。
下面繼續說內建的:
- 編輯/etc/resolv.conf文件,設置dns服務器為自己
search samdom.example.com
nameserver 10.99.0.1
- 配置Kerberos
cp /usr/local/samba/private/krb5.conf /etc/krb5.conf
- 創建 systemd 腳本
vim /etc/systemd/system/samba.service
[Unit]
Description=Samba Active Directory Domain Controller
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/samba/sbin/samba -D
PIDFile=/usr/local/samba/var/run/samba.pid
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
- 啟動 samba
systemd start samba
驗證
- 驗證文件服務
$ smbclient -L localhost -U%
Domain=[SAMDOM] OS=[Unix] Server=[Samba x.y.z]
Sharename Type Comment
--------- ---- -------
netlogon Disk
sysvol Disk
IPC$ IPC IPC Service (Samba x.y.z)
Domain=[SAMDOM] OS=[Unix] Server=[Samba x.y.z]
Server Comment
--------- -------
Workgroup Master
--------- -------
=================================================
"身份驗證":要驗證身份驗證,使用域管理員帳戶連接到netlogon共享:
$ smbclient //localhost/netlogon -UAdministrator -c 'ls'
Enter Administrator's password:
Domain=[SAMDOM] OS=[Unix] Server=[Samba x.y.z]
. D 0 Tue Nov 1 08:40:00 2016
.. D 0 Tue Nov 1 08:40:00 2016
49386 blocks of size 524288. 42093 blocks available
- 驗證DNS服務
$ host -t A dc1.samdom.example.com.
dc1.samdom.example.com has address 10.99.0.1
$ host -t SRV _ldap._tcp.samdom.example.com.
_ldap._tcp.samdom.example.com has SRV record 0 100 389 dc1.samdom.example.com.
$ host -t SRV _kerberos._udp.samdom.example.com.
_kerberos._udp.samdom.example.com has SRV record 0 100 88 dc1.samdom.example.com.
- 驗證Kerberos
$ kinit administrator
Password for administrator@SAMDOM.EXAMPLE.COM:
==================================================
$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@SAMDOM.EXAMPLE.COM
Valid starting Expires Service principal
01.11.2016 08:45:00 12.11.2016 18:45:00 krbtgt/SAMDOM.EXAMPLE.COM@SAMDOM.EXAMPLE.COM
renew until 02.11.2016 08:44:59
=============================================
如果以上的沒有問題,那就可以試試加域了
- Joining a Windows Client or Server to a Domain
-
Joining a Linux or Unix Host to a Domain
這個的加域有多種方法,官方提供的是使用來進行相關配置DNS
Kerberos
make install
smb.conf 參考 idmap config ad
將域管理員帳戶映射到本地root用戶
smb.conf
username map = /usr/local/samba/etc/user.map
=====
/usr/local/samba/etc/user.map
!root = SAMDOM\Administrator加域
net ads join -U administrator
Enter administrator's password: Passw0rd
Using short domain name -- SAMDOM
Joined 'M1' to dns domain 'samdom.example.com'配置名稱服務
/etc/nsswitch.conf
passwd: files winbind
group: files winbind啟動服務
Setting up a Share Using POSIX ACLs 使用 POSIX ACLs 的共享服務
Setting up a Share Using Windows ACLs 使用 Windows ACLs 的共享服務
最后可以提一下的是:
可以從Windows管理Active Directory(AD),使用Microsoft遠程服務器管理工??具(RSAT)。
Installing RSAT
好了,域這個東西太復雜了,有時間慢慢看。
=============================
更多擴展閱讀
=============================
- linux加入windows AD 進行身份驗證
這是一篇 TechNet雜志 上2008.12月的文章,非常好
Authenticate and Integrate Linux with Active Directory
Windows 身份驗證
?
Windows 推出集成網絡身份驗證和單一登錄系統至今已有一段時間了。在 Windows 2000 之前,Windows NT 域控制器 (DC) 使用 NT LAN Manager (NTLM) 協議為 Windows 客戶端提供身份驗證服務。雖然 NTLM 不像當初想象的那樣安全,但它還是非常有用的,因為它完美地解決了需要在網絡上跨多個服務器維護重復用戶帳戶的問題。
?
自 Windows 2000 開始,Microsoft 便從 NTLM 移到了 Active Directory 及其集成 Kerberos 身份驗證服務。與 NTLM 相比,Kerberos 更安全,而且更適合調整。此外,Kerberos 更是 Linux 和 UNIX 系統早已采納的行業標準,從而為這些平臺打開了與 Windows 集成的大門。
?
Linux 身份驗證
?
Linux(以及在其上面運行的 GNU 工具和庫)當初并不是以單一身份驗證機制的設計理念進行構建的。因此,Linux 應用程序開發人員就逐漸養成了一種習慣,即創建他們自己的身份驗證方案。他們設法通過在 /etc/passwd(包含 Linux 用戶憑據的傳統文本文件)中查詢名稱和密碼哈希,或者提供截然不同(和個別)的機制,來實現這一目標。
?
由此產生了很多身份驗證機制,以至于無法對其進行管理。1995 年,Sun 提出了稱為“可插入身份驗證模塊”(Pluggable Authentication Modules, PAM) 的機制。PAM 提供了一組所有應用程序開發人員都可以使用的通用身份驗證 API,以及管理員配置的后端,允許多種“可插入”身份驗證方案。通過使用 PAM API 進行身份驗證以及使用 Name Server Switch (NSS) API 來查詢用戶信息,Linux 應用程序開發人員可以少編寫一些代碼,并且 Linux 管理員可從同一個地方配置和管理身份驗證過程。
?
大多數 Linux 發布版本都會隨附多個 PAM 身份驗證模塊,其中包括支持對 LDAP 目錄進行身份驗證和使用 Kerberos 進行身份驗證的模塊。您可以使用這些模塊對 Active Directory 進行身份驗證,但這其中存在一些明顯的限制。稍后,我將在本文中討論這些限制。
?
Samba 和 Winbind
?
Samba 是一種開放源代碼項目,旨在在 Windows 與 Linux 環境之間提供集成。Samba 包含的組件使 Linux 計算機有權訪問 Windows 文件和打印服務,同時還提供了基于 Linux 的服務來模擬 Windows NT 4.0 DC。使用 Samba 客戶端組件,Linux 計算機便可利用 Windows NT 和 Active Directory DC 所提供的 Windows 身份驗證服務。
?
Samba 在這個項目中對我們來說最有趣的一部分叫做 Winbind。Winbind 是在 Samba 客戶端上運行的后臺程序(在 Windows 中稱為服務),它的作用是充當在 Linux 計算機上運行的 PAM 和 NSS 與在 DC 上運行的 Active Directory 之間通信的代理。具體來說,Winbind 使用 Kerberos 來對 Active Directory 和 LDAP 進行身份驗證,以檢索用戶和組信息。Winbind 還提供其他服務,如使用類似于 Active Directory 中 DCLOCATOR 的算法來查找 DC 的功能,以及通過使用 RPC 與 DC 進行通信來重置 Active Directory 密碼的功能。
?
Winbind 解決了多個僅使用 Kerberos 和 PAM 無法解決的問題。具體來說,Winbind 并不是將 DC 進行硬編碼以便按照 PAM Kerberos 模塊的方式進行身份驗證,而是以類似于 Microsoft DC LOCATOR 模塊運行的方式通過搜索 DNS 定位程序記錄來選擇 DC。
?
三種身份驗證策略
?
假設 Linux 計算機上提供了 LDAP、Kerberos 和 Winbind 三種身份驗證,我們可以采用三種不同的實現策略允許 Linux 計算機使用 Active Directory 來進行身份驗證。
?
使用 LDAP 身份驗證使用 Active Directory 進行身份驗證的最簡單但成效最低的方法是,將 PAM 配置為使用 LDAP 身份驗證,如圖 1 所示。雖然 Active Directory 屬于 LDAPv3 服務,但 Windows 客戶端使用 Kerberos(回退到 NTLM)而不是 LDAP 進行身份驗證。
?
LDAP 身份驗證(稱為 LDAP 綁定)通過網絡以明文形式傳遞用戶名和密碼。對于大多數用途來說,這不僅不安全,而且也是無法接受的。
降低以明文形式傳遞憑據的風險的唯一方法是使用類似于 SSL 的協議加密客戶端與 Active Directory 進行通信所使用的通道。這絕對可行,但會增加在 DC 和 Linux 計算機上管理 SSL 證書的負擔。此外,使用 PAM LDAP 模塊并不支持更改已重置的或過期的密碼。
?
使用 LDAP 和 Kerberos 利用 Active Directory 進行 Linux 身份驗證的另一種策略是,將 PAM 配置為使用 Kerberos 身份驗證,以及將 NSS 配置為使用 LDAP 查找用戶和組信息,如圖 2 所示。此方案的優點是,它相對來說比較安全,而且它利用的是 Linux 的“內置”功能。但是它不利用 Active Directory DC 發布的 DNS 服務位置 (SRV) 記錄,所以您會被迫挑選一組特定的 DC 來進行身份驗證。對于管理即將過期的 Active Directory 密碼或是直至最近的適當組成員身份查詢,它提供的方法也不是很直觀。
使用 Winbind 使用 Active Directory 進行 Linux 身份驗證的第三種方法是,將 PAM 和 NSS 配置為調用 Winbind 后臺程序。Winbind 將使用 LDAP、Kerberos 或 RPC(使用其中最合適的一個),將不同的 PAM 和 NSS 請求轉換為相應的 Active Directory 調用。圖 3 說明了這一策略。
我們的實施計劃
?
由于與 Active Directory 的集成的增強,我選擇在 Red Hat Enterprise Linux 5 (RHEL5) 上使用 Winbind 來進行我的 Linux 與 Active Directory 集成項目。RHEL5 是最新的商用 Red Hat Linux 發布版本,而且它在企業數據中心中相當受歡迎。
?
使 RHEL5 對 Active Directory 進行身份驗證基本上需要下列五個不同的步驟:
?
- 查找并下載適當的 Samba 以及其他依存組件。
- 構建 Samba。
- 安裝并配置 Samba。
- 配置 Linux,特別是 PAM 和 NSS。
- 配置 Active Directory。
本文的下面幾節將詳細介紹這些步驟。
?
查找適當的軟件
?
Linux 與 Windows 之間最大的區別之一是,Linux 由一個小型操作系統內核和大型的可單獨下載和安裝的組件集構成。這雖然可以創建為某些任務而進行優化的特定 Linux 配置,但也會使服務器的配置和管理變得極為復雜。不同的發布版本處理這種情況的方式也不一樣。Red Hat(及其非商用版 Fedora)使用 Red Hat Package Manager (RPM) 來安裝和管理這些組件。
?
適用于 Red Hat 的 Linux 組件包含兩種形式。RPM 文件包含針對組件版本、Linux 發布版本和 CPU 體系結構的特定組合而預先編譯和構建的二進制文件。因此,您可以下載和安裝二進制文件,例如,針對在 Intel x86 體系結構 CPU 上運行的 Fedora 版本 10 構建的通用 UNIX 打印系統 (Common UNIX Printing System, CUPS) 的 1.3.8-5 版本。假如有十多種不同的 CPU 體系結構、100 多個 Linux 發布版本,還有上千個程序包和版本,則要選擇的二進制 RPM 的數量之多便可想而知。
?
另一方面,源 RPM 文件包含給定程序包的實際源代碼。但您需要自己下載和安裝源、配置構建選項,以及編譯和鏈接二進制文件。構建您自己的操作系統組件這一想法使習慣于 Microsoft 在 Windows 安裝 CD 上提供什么就安裝什么的 Windows 用戶十分畏怯,但是程序包管理器可使整個過程相當輕松,而且非??煽?。Samba 小組發布更新和安全修補程序的速度驚人,僅在 2008 年七、八月兩個月內,就發布了四個版本的 Samba 3.2,總共包含 100 多個錯誤和安全修補程序。對于此項目,我下載了最新的 Samba 穩定版本 3.0.31 版的源。
?
為什么要下載 Samba 源,而不下載預先編譯的二進制文件集呢?當然,我剛開始也嘗試過這么做,但在調試器上花了數小時之后,我發現下載的二進制文件并不是使用支持 Active Directory 身份驗證的正確選項構建而成的。具體來說,在 Active Directory 中支持 Linux ID 映射的代碼在默認版本中被關閉了,因此我必須使用適當的構建選項重建 Samba。稍后,我將在本文中詳細討論 ID 映射。
?
雖然 Linux 原本是小型內核,但 Red Hat Enterprise 發布版本預先安裝了許多程序包。這通常會使生活變得更輕松,因為您從完全正常運行的操作系統開始著手,但預先安裝的程序包有時會與您以后想要安裝的軟件發生沖突。
?
我在安裝 Red Hat 時,因為想要使用較新的版本,所以并沒有包含 Samba(通常會默認安裝 Samba)。但是,較新版本的 Samba 要求已安裝的幾個其他庫和實用工具也要使用新版本。這類的依賴問題非常煩人,不過,使用 RPM 就可以輕松解決。
?
承載二進制 RPM 程序包的網站很多。我使用的網站(勿庸置疑,是我找到的第一個網站)稱為 PBONE,網址為 rpm.pbone.net。該網站提供了搜索程序包的簡便方法,并且具有我的 CPU 體系結構 (i386) 和操作系統發布版本 (Red Hat Enterprise Linux 5/Fedora 7&8) 所需的所有二進制文件。
?
我必須下載和更新圖 4 中列出的程序包來構建和安裝最新的 3.0 版 Samba(但我從未嘗試過較新的 3.2 版)。請注意,這些程序包主要針對 Fedora Core (fc) 發布版本。Red Hat 以 Fedora 使用的相同源為基礎,而且完全可與它交互。針對 Fedora Core 7 及更高版本構建的程序包,不需要任何修改即可在 RHEL5 上運行。請將下載的 RPM 文件放在 /usr/src/redhat/RPMS 目錄中。
圖 4 構建和安裝 Samba 3.0.31 所需的程序包
?
構建 Samba
?
構建 Samba 的第一歩是下載適當的源 RPM。我從 PBONE 站點下載了 Samba 3.0.31 的源 RPM。然后,將下載的源 RPM 文件放到 /usr/src/redhat/SRPMS 中,這是構建過程中用于源 RPM 的標準目錄。
?
打開終端會話(在 Windows 中稱為命令行窗口)并移至 SRPMS 文件夾。完成后,使用該命令安裝源程序包,如圖 5 所示。
圖 5 安裝 Samba 源 RPM
如果您看到“用戶 mockbuild 不存在,請使用根”錯誤警告,請不要擔心。這個錯誤指出尚未安裝 Mock 構建實用工具,但沒有這些實用工具,構建過程也可以進行。
?
然后,移至 /usr/src/redhat/SPECS 目錄并編輯文件 SAMBA.SPEC,該文件包含了 Samba 構建選項。搜索以“CFLAGS=”開頭的那一行,并確保存在“--with-shared-modules=idmap_ad,idmap_rid”選項。此選項可確保構建過程包含將 Linux UID(唯一標識符)適當轉換到 Active Directory 的代碼。圖 6 顯示了此選項。
圖 6 with-shared-modules 構建選項
接下來,您可能必須更新計算機上的一些庫,才能適當構建和安裝 Samba,具體取決于您安裝的是哪個版本的庫。在我的例子中,我必須使用 rpm --install 命令安裝圖 4 中列出的程序包;在某些情況下,我必須使用 --force 選項來克服一些依賴問題。
?
要構建 Samba,請移至 /usr/src/redhat 目錄,并運行命令 rpmbuild –bb SPECS/samba.spec,如圖 7 所示。此過程將新的 samba-3.0.31-0.i386 RPM 文件留在 /usr/src/redhat/RPMS 目錄中。我們稍后將在此項目中安裝這個 RPM 文件。
圖 7 創建 Samba 二進制 RPM 文件
配置 Linux 網絡
?
為了使用 Active Directory 進行身份驗證,您的 Linux 計算機必須能夠與 DC 通信。您必須配置三個網絡設置才能與 DC 通信。
?
首先,重要的是通過使用動態主機配置協議 (DHCP) 或使用 ifconfig 命令為 Linux 計算機分配適當的 IP 地址和網絡掩碼,來確保適當配置該計算機的網絡接口。在 RHEL5 下,通過從“系統”|“管理”菜單中選擇“網絡”來配置網絡,如圖 8 所示。
圖 8 配置網絡
接著,確保將 Linux 計算機的 DNS 解析程序設置為與 DC 使用相同的 DNS 名稱服務器;在大多數情況下,假定您要使用 Active Directory 集成的 DNS,則該 DC 是您想要加入 Linux 計算機的域中的 DC。在用于配置網絡的相同網絡配置實用工具的 DNS 選項卡上,配置 DNS 解析程序,如圖 9 所示。
圖 9 設置主 DNS 解析程序
最后,完成上述步驟后,您必須設置 Linux 計算機的主機名稱以反映它在域中的名稱。雖然您可以使用網絡配置應用程序設置主機名稱,但這一方法不一定始終適用。
?
但是,可直接編輯 /etc/hosts 文件,并在具有 <IP 地址> <FQDN> <主機名稱> 形式的 localhost.localdomain 條目下添加條目。(例如,“10.7.5.2 rhel5.linuxauth.local linuxauth”)。請注意,如果不這么做,當您將 Linux 計算機加入到域后,會在目錄中創建錯誤的計算機對象。
?
配置 Linux 時間同步
?
Kerberos 協議需要身份驗證系統具有能在相對較小的時間內同步的時鐘。默認情況下,Active Directory 可允許的偏差時間最長為五分鐘。為了確保您的 Linux 系統與 DC 的系統時鐘維持在這個時間內,您應該將 Linux 系統配置為使用 DC 的網絡時間協議 (NTP) 服務。
?
然后,在 Linux 服務器上,從“系統”|“管理”菜單中運行日期與時間實用工具,然后單擊“網絡時間協議”選項卡。選中“啟用網絡時間協議”框,然后添加您要用作網絡時間源的 DC 的 IP 地址。請注意,這通常應該是在域中擔任主域控制器 (PDC) 仿真器靈活單主機操作 (FSMO) 角色的 DC。圖 10 顯示了如何設置 Linux 網絡時間源的一個示例。
圖 10 配置網絡時間協議
配置 PAM 和 NSS
?
PAM 和 NSS 提供 Linux 應用程序(如桌面)與 Winbind 之間的聯系媒介。與許多 Linux 服務一樣,您可以通過文本文件來配置 PAM 和 NSS。我們先來討論一下如何配置 PAM。
?
PAM 為使用它的應用程序提供了四個與身份驗證相關的功能。身份驗證設施允許應用程序確定使用它的用戶。帳戶設施提供的帳戶管理功能(如登錄時間限制)與身份驗證并不是特別相關。密碼設施提供請求和管理密碼的機制。會話設施執行與用戶相關的安裝和應用程序的拆卸任務,例如,在用戶特定的目錄中記錄或創建文件。
?
Red Hat 下的 PAM 將它的配置文件存儲在 /etc/pam.d 目錄中,其中包含使用 PAM 進行身份驗證的每個應用程序的文本文件。例如,文件 /etc/pam.d/gdm 包含 Gnome Desktop Manager (GDM) 的 PAM 配置信息,即 Red Hat 的默認窗口運行環境。每個 PAM 配置文件都包含多行內容,其中每行分別定義 PAM 身份驗證過程的某個方面。圖 11 顯示了 GDM 的 PAM 配置文件的內容。
圖 11 Gnome Desktop Manager 的 PAM 配置文件
PAM 配置文件中的每個項目都具有 <管理組> <控制> <模塊> <參數> 的形式,其中 <管理組> 對應于配置條目所屬的設施:身份驗證、帳戶、密碼或會話。圖 12 中描述的控制關鍵字可控制 PAM 處理配置條目的方式。該文件的第三欄包含 /lib/security 目錄中的 PAM 共享庫的名稱。共享庫包含可動態加載的可執行代碼,類似于 Windows 中的 DLL。模塊名稱后的其他術語都是 PAM 傳遞到共享庫的參數。
?
圖 12 PAM 控制關鍵字
您可以看到每個管理組都包含多個條目。PAM 按照調用命名的模塊的順序處理條目。然后,該模塊返回成功或失敗消息,而 PAM 將繼續根據控制關鍵字進行評估。
?
您可能會注意到,GDM 的 PAM 配置文件在它的所有管理組中都包含系統身份驗證。這正是 PAM 為 GDM 建立默認身份驗證行為的方式。通過修改系統身份驗證,您可以修改在其 PAM 配置中包含系統身份驗證文件的所有應用程序的身份驗證行為。圖 13 中介紹了默認系統身份驗證文件。
圖 13 PAM 系統身份驗證文件
Name Service Switch (NSS) 模塊將隱藏系統數據存儲的詳細信息以防應用程序開發人員看見,這與 PAM 隱藏身份驗證的詳細信息的方式大體相似。NSS 允許管理員指定存儲系統數據庫的方式。具體來說,管理員可以指定如何存儲用戶名和密碼信息。因為我們希望應用程序使用 Winbind 在 Active Directory 中查詢用戶信息,所以我們必須修改 NSS 配置文件才能顯示此信息。
?
Red Hat 包含一個小型的圖形小程序,可用來配置 PAM 和 NSS,稱為 system-config-authentication。它負責管理您需要對系統身份驗證和 nss.conf 文件進行的大部分(而非全部)更改。
?
運行 system-config-authentication 應用程序后,您會看到如圖 14 所示的對話框。選中“用戶信息”(用于配置 nss.conf 文件)和“身份驗證”(用于修改系統身份驗證文件)這兩個選項卡上的 Winbind 選項。
圖 14 systemconfig-authentication 對話框
單擊“配置 Winbind”按鈕,您將看到如圖 15 所示的對話框。在 Winbind 域字段中輸入要對用戶進行身份驗證的域的名稱,并選擇“ads”作為安全模式。在 Winbind ADS 領域字段中輸入 Active Directory 域的 DNS 域名稱。在 Winbind 域控制器字段中,輸入您希望該 Linux 系統對其進行身份驗證的 DC 的名稱,也可以輸入星號,表明 Winbind 應通過查詢 DNS SRV 記錄來選擇 DC。
圖 15 配置 Winbind 對話框
選擇您的 Active Directory 用戶應該具有的適當默認命令行界面,在本例中,我選擇的是 Bourne-again Shell 或 BASH。此時,不要按下“加入域”按鈕,稍后,再將此計算機加入到域。
?
在將 /etc/pam.d/system-auth 文件修改為支持 Winbind 后,還需要對其進行另一個更改。當 Linux 用戶登錄時,系統要求該用戶必須擁有主目錄。主目錄包含許多用戶特定的首選項和配置條目,與 Windows 注冊表非常相似。問題在于,因為您要在 Active Directory 中創建用戶,所以 Linux 不會自動為用戶創建主目錄。幸運的是,您可以將 PAM 配置為在其會話配置期間為用戶創建主目錄。
?
打開 /etc/pam.d/system-auth 文件,然后向下滾動到底部,在標有“session optional map_mkhomedir.so skel=/etc/skel umask=0644”會話部分中的最后一行之前插入一行(請參見圖 16)。這一行將 PAM 配置為創建用戶的主目錄(如果用戶沒有主目錄)。它將目錄 /etc/skel 用作“框架”或模板,而且將權限掩碼 0644(所有者具有的讀寫權限、主要組具有的讀取權限,以及其他人具有的讀取權限)分配給新文件夾。
圖 16 為用戶創建主目錄
安裝和配置 Samba
?
要安裝您剛剛創建的 Samba 二進制文件,請轉至 /usr/src/redhat/RPMS 目錄。由 rpmbuild 命令創建的所有 RPM 文件都會顯示在此目錄中。請記住,Samba 包括允許 Linux 客戶端訪問 Windows(或 Samba)文件共享的二進制文件,以及允許 Linux 系統充當 Windows 文件服務器、Windows 打印機服務器和 Windows NT 4.0-style DC 角色的代碼。
?
要讓 Linux 對 Active Directory 進行身份驗證,我們根本用不到這么多角色,其實我們只需要使用 Samba 公共文件和 Samba 客戶端二進制文件就可以了。為了方便起見,這些文件可為兩個 RPM 文件:samba-client-3.0.31-0.i386.rpm 和 samba-common-3.0.31-0.i386.rpm。使用 rpm --install 命令安裝 RPM 文件,請看下面的示例:rpm --install samba-common-3.0.31-0.i386.rpm。(請注意,您需要先安裝 –common RPM 文件。)
?
安裝了 Samba 客戶端二進制文件后,您必須修改默認 Samba 配置,以確保 Winbind 使用 Active Directory 適當處理身份驗證。所有 Samba 配置信息(包括客戶端和服務器)都可以在 smb.conf 文本文件中找到,該文件在默認情況下位于 /etc/samba 目錄中。Smb.conf 可能包含大量配置選項,本文只會對其內容進行簡要介紹。samba.org 網站和 Linux 主頁簡要討論了 smb.conf。
?
第一步是將 Winbind 配置為使用 Active Directory 進行身份驗證。您必須將 smb.conf 中的安全模式設置為“ads”。system-config-authentication 實用工具應該已經幫您設置好了,但檢查一下總是比較保險。編輯 smb.conf 文件,并搜索標有“域成員選項”的部分。找出以“security”開頭的那一行,并確定它的內容是“security = ads”。下一個配置步驟是確定 Winbind 如何將 Windows 安全主體(如用戶和組)映射到 Linux 標識符,這需要進行進一步的說明。
?
ID 映射問題
?
通過 Active Directory 對 Linux 用戶進行身份驗證時有個大問題我還沒有提到,那就是用戶和組的 UID 問題。Linux 和 Windows 在內部都不是根據用戶名來引用用戶的,而是使用唯一的內部標識符。Windows 使用安全標識符(即 SID),它能夠唯一標識 Windows 域中的每個用戶,其結構長度可以變化。SID 也包含唯一域標識符,以便 Windows 區別不同域中的用戶。
?
Linux 的方案則簡單得多,Linux 計算機上的每個用戶都有一個 UID,而此 UID 只是一個 32 位的整數。但是 UID 的范圍受限于計算機本身。在某臺 Linux 計算機上具有 UID 436 的用戶,不一定與另一臺 Linux 計算機上具有 UID 436 的用戶相同。因此,用戶必須登錄他需要訪問的每臺計算機,這顯然不是理想的情況。
?
Linux 網絡管理員解決此問題的常用方法是,使用 Network Information System (NIS) 或共享 LDAP 目錄來提供網絡身份驗證。網絡身份驗證系統提供用戶的 UID,而使用該身份驗證系統的所有 Linux 計算機都將共享相同的用戶和組標識符。在這種情況下,我將使用 Active Directory 來提供唯一的用戶和組標識符。
?
要解決此問題,我可以采用兩種策略。第一個(也是最明顯的)策略是,為每個用戶和組創建 UID,并將該標識符與各自的對象一起存儲到 Active Directory 中。這樣一來,當 Winbind 對用戶進行身份驗證時,它就可以查詢該用戶的 UID,然后將它提供給 Linux 作為該用戶的內部標識符。Winbind 將此方案稱為 Active Directory ID 映射,或 idmap_ad。圖 17 介紹了 Active Directory ID 映射的過程。
圖 17 Active Directory ID 映射
Active Directory ID 映射的唯一缺點是,我們必須提供一種機制來確保每個用戶和組都擁有標識符,而且這些標識符在林中都是唯一的。有關詳細信息,請參閱“針對 Active Directory ID 映射配置 Active Directory”邊欄。
?
幸好,還有另外一種 ID 映射策略,這種策略的管理負荷要少得多?;叵胍幌?,我們在前面曾提到過 Windows SID 可以唯一標識域中的用戶和域本身。SID 中能唯一標識域中用戶的部分稱為相對標識符(或 RID),而且這部分事實上是一個 32 位的整數。因此,Winbind 可在用戶登錄時直接從 SID 中提取 RID,然后將該 RID 用作唯一的內部 UID。Winbind 將此策略稱為 RID 映射,或 idmap_rid。圖 18 描述了 RID 映射的實際工作方式。
圖 18 RID 映射
RID 映射具有零管理負荷的優點,但是您不能將它用在多域的環境中,因為不同域中的用戶可能擁有相同的 RID 值。但是,如果您擁有單個 Active Directory 域,則可以使用 RID 映射。
?
要配置 Winbind ID 映射策略,請再次編輯 /etc/samba/smb.conf 文件,并且添加“idmap backend = ad”行來使用 Active Directory 映射策略;如果您要使用 RID 映射策略,請添加“idmap backend = rid”行。確保該文件中不存在任何其他指定映射策略的行。
?
對于 Winbind,我們還需要在 smb.conf 文件中添加其他配置選項。雖然我們已將 PAM 設置為在每個用戶登錄時為其創建主目錄,但是還需要告訴 Winbind 主目錄的名稱是什么。我們可以通過將“template homedir = /home/%U”行添加到 smb.conf 來執行此操作(請參見圖 19)。這會告訴 Winbind,使用 Active Directory 進行身份驗證的每個用戶的主目錄都將是 /home/<用戶名>。但務必要先創建好 /home 目錄。
圖 19 指定主目錄的名稱
加入域并登錄
?
既然網絡、PAM、NSS 和 Samba Winbind 都已配置成功,現在應該將 Linux 計算機加入到域中。可使用 Samba NET 命令來執行此操作。在外殼程序提示符下,運行“net ads join –U <管理員名稱>”。使用具有足夠權限來將計算機加入到域的帳戶名稱替換 <管理員名稱>。
?
net 命令會提示您輸入用戶的密碼。如果一切運行正常,net 命令會將您的計算機加入到域中。您可以使用 Active Directory 用戶和計算機來查找剛剛創建的計算機帳戶。
?
您可以使用稱為 wbinfo 的 Winbind 測試工具來測試加入的狀態。運行 wbinfo –t 將測試計算機與域之間的信任關系。運行 wbinfo –u 將列出域中的所有用戶,而運行 wbinfo –g 將列出域中的所有組。
?
如果您成功將 Linux 計算機加入到域中,則下一步是嘗試使用 Active Directory 用戶帳戶和密碼登錄。注銷 Linux 計算機,然后使用 Active Directory 用戶名登錄。如果一切運行正常,您應該能夠登錄。
?
針對 Active Directory ID 映射配置 Active Directory
?
此信息僅在您使用 Active Directoryy ID 映射時才適用。如果您決定使用 RID 映射,可隨時跳過此邊欄。
?
您必須先對 Active Directory 本身進行一些更改,然后才能使用 Active Directory 帳戶登錄到您的 Red Hat 服務器。首先,Active Directory 架構必須適合 Winbind 用來存儲用戶信息的屬性。如果您運行的是 Windows Server 2003 R2,則表示此架構已經準備就緒。如果您擁有 Active Directory 架構的早期版本,則必須使用 Microsoft Services for UNIX (SFU) 程序包對其進行擴展。
?
您可以在 Technet 上的 Services for UNIX 上找到更多信息。SFU 還包含另一個針對 Active Directory 用戶和計算機 Microsoft 管理控制臺 (MMC) 管理單元的屬性頁,用于管理 Linux 所需的用戶 ID 和組 ID 信息。
適當設置架構后,您必須為所有可能登錄您的 Linux 計算機的用戶(和他們所屬的組)提供 Linux 標識符。這表示您必須為可能登錄您的 Linux 計算機的用戶和組定義 uidNumber 和 gidNumber 屬性的值。但是您應該注意這些屬性的一些要求:
?
- Linux 要求要進行身份驗證的每個用戶都必須有 UID。由于您要管理 Active Directory 中的用戶信息,所以要登錄 Linux 計算機的每個用戶帳戶都必須具有唯一的 uidNumber 屬性。您用于 uidNumber 的特定值并不重要,但它在所有可能登錄 Linux 計算機的用戶中必須是唯一的。
- 每個 Linux 用戶也必須具有默認組標識符,因此,要登錄 Linux 計算機的每個 Active Directory 用戶也需要 gidNumber 屬性值。此值在用戶中不必是唯一的,但它必須唯一地標識組。
- Active Directory 中的每個組對于它的 gidNumber 屬性來說都應該具有唯一值。嚴格來講,組可以沒有 gidNumber 屬性值,但 Winbind 在對用戶進行身份驗證時,會希望用戶所屬的每個組都具有唯一的 gidNumber 值。最簡單的方法可能是確保每個組都具有唯一的 gidNumber 值。
- Winbind 希望它在 Active Directory 中查詢的每個用戶都是 Domain Users 組的成員,因此它也希望 Domain Users 組具有 gidNumber 屬性值。
要是行不通怎么辦?
使用 Winbind 設置 Linux 計算機以便使用 Active Directory 進行身份驗證并非易事。要配置的東西有很多,而且很多地方都可能會出錯,而 Linux 的每個版本和 Samba 的每個版本之間又都存在一些細微差別,這更是雪上加霜。但是您可以查找幾個地方,以幫助確定怎樣操作。
?
首先是 Linux 系統日志文件,它保存在 /var/log/messages 中。Samba 將重大事件的消息(例如,丟失文件或配置失?。┐鎯υ谶@個文件中。除了系統日志文件外,還有 Samba 和 Winbind 的日志文件。您可以在 /var/log/samba 中找到這些文件,而且它們還會為您提供一些其他信息。
?
您可以通過修改 Winbind 的啟動腳本來設置調試級別,來提高 Winbind 發出的日志消息的詳細程度(和數量)。編輯 /etc/init.d/winbind 外殼腳本,然后在 windbindd 命令中添加“-d 5”。這可將調試級別增加到 5(允許的值范圍為 1 至 10),使 Winbind 生成更詳細的錯誤消息。
?
如果 Winbind 最后可與 DC 通信,您可以運行網絡數據包捕獲實用工具,如 Netmon 3.1。這使您可以精確分析 Winbind 要進行的操作。而且,您還可以檢查 DC 上的 Windows 安全日志,此日志會顯示身份驗證嘗試。
?
如果行得通,您又應該做些什么呢?
?
如果一切都能順利進行,現在您就可以使用在 Active Directory 中保存的憑據登錄 Linux 系統中了。與在 Linux 計算機上本地管理標識,或與使用諸如 NIS 之類的不安全系統相比,這是一項重大改進。它使您可以將您的用戶管理任務集中到一個標識存儲上:Active Directory。
?
但是,要讓這套解決方案真正具備實際用途,還缺幾樣東西。首先,無法保證能獲得技術支持,有點像撞大運。大多數 Linux 組織對于 Active Directory 都不是很了解,而且您可以從 Linux 社區獲得的支持完全取決于誰剛好讀到您的帖子以及他們當天的心情。
?
Samba 也沒有遷移或部署工具。如果您具有現有的 Linux 帳戶及其相關的用戶 ID 和權限,則您在將它們遷移至 Active Directory 時,必須手動確保它們維護其 UID。
?
最后,Samba 仍然無法使用最重要的 Active Directory 應用程序之一,即組策略,盡管已經實施了此策略。雖然您可以使用 Samba 將 Linux 系統加入到 Active Directory 中,但無法使用組策略來管理它。
?
第三方解決方案
?
使用 Active Directory 對 Linux 計算機進行身份驗證顯然是件好事,但使用 Samba Winbind 推出您自己的解決方案,即使不把您累死,也會讓您感到枯燥無味。您可能會想,一些創新的軟件供應商可能會提出易于使用的解決方案,您猜得沒錯。
?
對于我在本文中演示的版本,有四家商用軟件供應商已經開發了易于安裝和使用的相應版本。它們幾乎為每個受歡迎的 Linux、UNIX 和 Apple Macintoshes 版本都提供了代碼和遷移工具,另外也支持使用組策略管理 Linux 計算機。
?
這四家公司分別為 Centrify、Likewise Software、Quest Software 和 Symark。這四家供應商都提供了相似的功能,其中包括跨越各個 Linux 發布版本的組策略管理。Likewise Software 最近還公開了它實現的開放源代碼,稱為 Likewise Open,但它的組策略組件仍舊是商用產品。Likewise Open 將可用于多個主要的 Linux 發布版本。(注:撰寫本文時,本人就職的公司 NetPro 已由 Quest Software 收購。)
?
有了可用的商用產品后,還有必要使用 Samba 和 Winbind 來構建自己的身份驗證系統嗎?如果花錢購買集成軟件不在預算之內,則可以利用免費的 Samba 開放源代碼路由。您還可以獲得所有的源代碼,這樣的好處真是令人難以抗拒。但是,遷移現有的 Linux 計算機及其現有的 UID 是非常棘手的問題。
?
另一方面,假如您想要省下安裝和實現的時間、需要遷移現有的 Linux 計算機,或是希望有人對您的問題提供權威性的解答,那么尋求其中的一種商用解決方案比較劃算。另外,如果您需要使用組策略管理功能,那么商用產品是您唯一的選擇。
?
但是,無論您采取哪種方式,將 Linux 身份驗證與 Active Directory 集成都可以減少您為管理多用戶帳戶投入的精力、增強系統安全性,并為您提供單一的標識存儲來進行管理和審核,而這些全都是相當吸引人的理由,值得試一試。
?
Gil Kirkpatrick 在他 30 年的職業生涯中設計或開發了十多種成功的商用軟件產品,而且他還是 Directory 專家會議(現在改名為專家會議)的創辦人。Gil 是《Active Directory Programming》的作者,并且經常為《Windows IT Pro》和《TechNet 雜志》撰寫文章。Gil 目前在 NetPro(現在是 Quest Software 的一部分)擔任常駐專家一職,他是各種安全性、標識和市場營銷項目的顧問,并且經常在全球各地的技術講座和會議中發表演說。
uid、gid 和 RID
您也許在 Samba 文檔或者可能是在 LDAP 帳戶的輸出中見到過對術語 RID 的引用。那么什么是 RID 呢?UNIX 操作系統(包括象 Linux 這樣的派生物)通過整數 uid(用戶標識,User ID)唯一地標識用戶,并通過整數 gid(組標識,Group ID)唯一地標識組。當以某一用戶登錄時,通過輸入 id 即可訪問這個信息。
?
當前的 Microsoft 操作系統通過稱為 RID 的值唯一地標識用戶和組,該值通常是一個用十六進制表示的整數。在 UNIX 下,用戶和組存在于獨立的名稱空間中。而在 Microsoft 操作系統上,用戶和組存在于一個名稱空間中。
?
Samba 使用下列公式將 UNIX uid 和 gid 映射為 RID:
?
rid = 2 (uid) + 1000
rid = 2 (gid) + 1001
因此,如果工作在 Red Hat 系統上的用戶 tom,其 uid 為 500,gid 為 500,則映射到 Microsoft 域中的 RID 分別為 2000 和 2001。