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>

  1. 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>

Personal tools
廣告橫額