OSWikiHK: 請協力 GPLv3 的中文翻譯工作。
SlapdChangeRoot
OSWikiHK,自由中文開源知識庫
目录 |
編寫文件目的
我們聽得太多 bind 用 chroot 模式來運行,我們卻很少留意其它伺服器能否也使用 chroot 模式來運行!其實我可以告訴你任何伺服器皆可以,問題是如何作出合理的設定吧了。
使用 change root 的好處
問下你的 bind 伺服器為什麼要在 chroot 模式下執行,你就知道使用 change root 模式來執行伺服器有什麼好處了。
在 chroot 模式下執行 slapd
slapd 最常被提及的執行方法,就是 chroot 。 bind 的 chroot 模式最被管理者接受,也有被指定執行 bind 時一定要執行 chroot 模式!
想更進一步了解 bind 在 debian 下的 chroot 執行方法,你可以留意以下網址。
http://www.howtoforge.com/howto_bind_chroot_debian
那麼在 OpenLDAP 下可否也使用 chroot 模式來執行 slapd 呢?!
我們需要一些幫助
在我們要嘗試用 chroot 模式來執行 slapd 的時候,我們需要了解 slapd 執行時的 debug 模式。
- -d 這個 option 需要加上一個值,我最常用的是 3 。
slapd 的 debug 模式
當你使用 slapd 的 debug 模式來執行 slapd 時候, slapd 的 daemon 會保留在前景執行,這會使你更容易地看見執行結果。
$ /usr/sbin/slapd -h ldap://localhost:1025 -f ./slapd.conf ... Expect poor performance for suffix dc=swpearl,dc=com. bdb_db_open: dbenv_open(./ldap-data) slapd starting
如果你看見 slapd starting 的字樣,則表示你的 slapd 起動完成,而等待客戶端的連接,提供 LDAP 的查詢工作。
slapd 的 chroot 模式與 root
- -r 來設定 chroot 的目錄。
當我們設定了 chroot 目錄後,我們使用普通使用者的身份來起動 slapd ,得出的結果如下:
chroot: Operation not permitted slapd stopped.
因為要使用 chroot 的話,必須是 root 才可以。
設定我們的 chroot 目錄
我們會使用 /var/startldap 目錄作為 chroot 的目錄。
修改我們的 slapd.conf 檔案
我們也使用以前的 slapd.conf ,但是會加以少許的修改。
include /core.schema pidfile /slapd.pid
modulepath /lib/ldap moduleload back_bdb
backend bdb database bdb
suffix "dc=swpearl,dc=com" rootdn "cn=admin,dc=swpearl,dc=com" directory /ldap-data
這裡最大的分別在於 modulepath 的路徑指定,為了方便起見;我們把它放在 /var/startldap/lib 下。
back_bdb.so 和 libdb-4.2.so
我們需要分別把以下兩個檔案從 file:////usr/lib/ 和 file:////usr/lib/ldap 目錄下抄到這裡。
# cp /usr/lib/libdb-4.2.so startldap/lib/ # cp /usr/lib/ldap/back_bdb.so startldap/lib/
之後我們就可以起動 slapd 了。(我們會先進入 startldap 目錄下。)
# slapd -r . -f /slapd.conf -d 3 ... slapd starting
你可以看見你的 slapd 被成功地起動了。不過起動了,但是離能用還有一些很大的距離。
Chroot slapd 的 debug
現在最大的問題是你不能使用 ldapsearch 連接 slapd 伺服器,連認証也有問題。那如何 debug 呢?!
使用 busybox 來認識 chroot
首先讓我們先了解 chroot 是什麼?!我想可以從 busybox 來看看它,首先 busybox 是一個工具盒,內部有很多有用的功具,只要你這產生了應有的連結就可以好好地使用它了。
使用 busybox
把 busybox 抄到 startldap 目錄下。你可以使用 chroot 來執行它!
<bash>
~/startldap$ mkdir bin ~/startldap$ cp /bin/busybox bin/ ~/startldap# chroot . /bin/busybox chroot: cannot run command `/bin/busybox': No such file or directory
</bash>
在這個情況下你是無法執行 busybox 的。
使用 ldd 來認識 busybox
你可以使用 ldd 來認識 busybox ,這會令到你理解到 busybox 所連結的程式庫。
<bash>
# ldd busybox
linux-gate.so.1 => (0xffffe000)
libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xb7f1d000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7ef6000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7db5000)
/lib/ld-linux.so.2 (0xb7f5a000)
#
</bash>
把這些程式庫放到 lib/ 下。
<bash>
# mkdir lib # cp /lib/tls/i686/cmov/libcrypt.so.1 lib/ # cp /lib/tls/i686/cmov/libm.so.6 lib/ # cp /lib/tls/i686/cmov/libc.so.6 lib/ # cp /lib/ld-linux.so.2 lib/
</bash>
你可以看見 busybox 是需要 libcrypt.so.1 libm.so.6 libc.so.6 ld-linux.so.2 這幾個檔案。這時我們需要這幾個檔案放到 lib/ 目錄下。
這時你可以在 chroot 模式下執行 busybox 了。
<bash>
# chroot . /bin/busybox BusyBox v1.1.3 (Debian 1:1.1.3-3ubuntu3) multi-call binary
Usage: busybox [function] [arguments]... or: [function] [arguments]... ....
</bash>
你也可以獲得 shell 。
<bash>
# chroot . /bin/busybox sh
BusyBox v1.1.3 (Debian 1:1.1.3-3ubuntu3) Built-in shell (ash) Enter 'help' for a list of built-in commands.
/ # ls bin lib / # cd /bin/ /bin # ls -la drwxr-xr-x 2 1000 1000 4096 May 29 07:00 . drwxr-xr-x 4 1000 1000 4096 May 29 07:07 .. -rwxr-xr-x 1 1000 1000 422320 May 29 06:57 busybox /bin #
</bash>
這就是 chroot 模式了。由這個道理,你可以嘗試設定 slapd 的 chroot 模式了。
停掉你的 slapd 伺服器
當你停掉你的 slapd 伺服器的時候,而你又嘗試使用 ldapsearch 來連接時,你會得到另一個錯誤信息。
<bash>
slapd shutdown: waiting for 0 threads to terminate
libgcc_s.so.1 must be installed for pthread_cancel to work
已經終止
</bash>
這告訴你也需要把 libgcc_s.so.1 放到 lib/ 下。
<bash>
- cp /lib/libgcc_s.so.1 lib/
</bash>
而且在運行的時候也可以給 ldapsearch 來連接,但是如果你還希望玩 -u -g 的 options 的話,甚至 ssl 的加密連接的話,你要在 startldap 目錄下還要做更多的設定工作。(因為太長篇了,這裡作結。)
認識 slapd 相倚的程式庫
我們需要使用 ldd 這個指令來認識我們的 slapd 連結了什麼程式庫。
<bash>
$ ldd /usr/local/libexec/slapd
linux-gate.so.1 => (0xffffe000)
libdb-4.2.so => /usr/lib/libdb-4.2.so (0xb7e5a000)
libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0xb7e44000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7e40000)
libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7e01000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb7cc7000)
libresolv.so.2 => /lib/tls/i686/cmov/libresolv.so.2 (0xb7cb3000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7ca1000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7b70000)
/lib/ld-linux.so.2 (0xb7f36000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7b5c000)
$
</bash>
這是以我們之前所編譯的 slapd 作為例子。如果不同方法編譯的 slapd ,它所連結的資料庫也有分別。 當然和 busybox 一樣,也把這些程式庫放到 lib/ 下。然後你就可以再次執行 slapd 了!
<bash>
startldap# /usr/local/libexec/slapd -r . -d 3 -f slapd.conf .... slapd starting
</bash>

