今天架設了壹台次要 DNS 伺服器 (Slave DNS) 起來,不過設定完成之後卻一直無法正確寫入 Zone File,系統記錄一直出現 permission denied 的錯誤訊息,不過我再三檢查後確定檔案與目錄權限是沒問題的,詭異的就是一直無法正確建立起 Slave 的 Zone 檔案,我查過了 Primary DNS 的 Log 已經確定資料正確傳回 Slave 了,到底是什麼問題呢?原來是寫入的目錄被 AppArmor 系統保護住了!
§ 以下是錯誤示範,僅提供情境描述之用 §
事情是這樣發生的,我原本有壹台非常老舊的 DNS 伺服器是用 Fedora Core 3 架設的,現在把設定檔全部都到新安裝的 Ubuntu 10.04,Ubuntu 的 DNS 主要設定放在 /etc/bind 目錄下,我把 master 與 slave 的檔案全部都分別寫入到 /etc/bind/master 與 /etc/bind/slave 目錄下。
在 named.conf.local 裡指定的檔案路徑用的是絕對路徑,移過來之後並沒有注意用相對路徑就能設定,因此不懷疑有他的繼續沿用,改路徑而已:
不過當我利用 /etc/init.d/bind9 restart 重新啟動後,卻在 /var/log/syslog 系統記錄檔中發現以下錯誤:
- Jan 10 13:15:08 XXX named[23349]: zone example.com/IN: Transfer started.
- Jan 10 13:15:08 XXX named[23349]: transfer of 'example.com/IN' from 172.16.100.53#53: connected using 172.16.100.1#59972
- Jan 10 13:15:08 XXX named[23349]: dumping master file: /etc/bind/slave/tmp-3qrrrWGEq6: open: permission denied
- Jan 10 13:15:08 XXX named[23349]: transfer of 'example.com/IN' from 172.16.100.53#53: failed while receiving responses: permission denied
- Jan 10 13:15:08 XXX named[23349]: transfer of 'example.com/IN' from 172.16.100.53#53: Transfer completed: 0 messages, 14 records, 0 bytes, 0.007 secs (0 bytes/sec)
從上述訊息可以判斷出應該是 Zone Transfer 已經完成而且有 14 筆紀錄,但是在本地端卻無法儲存檔案的權限問題,進一步瞭解後才得知原來是寫入的目錄被 AppArmor 系統保護住了,必須手動將特定目錄加入寫入權限才行。
§ 以下是正確設定方式,有兩種方式,二選一即可 § (推薦使用方法二進行設定)
方法一:修改 /etc/apparmor.d/usr.sbin.named 設定檔
如下圖示,加上一行 /etc/bind/slave/** rw, 進去,記得要設定 rw 才是代表「可讀可寫」的意思。
方法二:在 /etc/bind/named.conf.local 設定相對路徑
其實從方法一的圖示可以看出 /var/cache/bind 目錄早就已經設定開啟了可讀可寫的設定,而且我們在 /etc/bind/named.conf.options 設定檔也定義了 named 的開始目錄就是在 /var/cache/bind 這裡。
所以,我最後修改 /etc/bind/named.conf.local 設定檔如下(請注意我從絕對路徑改成相對路徑了):
而這些設定好的 Slave Zone 檔案就會自動建立在 /var/cache/bind 目錄下!
如果你想將 master 與 slave 的 zone file 分開而想將檔案建立在 /var/cache/bind 下的子目錄的話,則必須注意目錄的寫入權限與擁有者資訊,請透過以下指令進行目錄建立:
mkdir /var/cache/bind/slave
chmod g+w /var/cache/bind/slave
chgrp bind /var/cache/bind/slave
設定好之後你一樣可以在 /etc/bind/named.conf.local 設定檔裡使用相對路徑即可:
補充說明
- 如果你用的是 RedHat Linux 可以修改 /etc/sysconfig/named 設定檔,並加上以下設定:
相關連結